From 4b22fc14d5036994c51c02c68697ed08a0e2aa05 Mon Sep 17 00:00:00 2001 From: bobhan1 Date: Thu, 23 Nov 2023 16:23:31 +0800 Subject: [PATCH 01/64] [Feature](update) Support `update on current_timestamp` (#25884) --- .../Create/CREATE-TABLE.md | 7 +- .../Create/CREATE-TABLE.md | 7 +- .../org/apache/doris/nereids/DorisParser.g4 | 3 +- .../java/org/apache/doris/catalog/Column.java | 36 +++- .../doris/datasource/InternalCatalog.java | 10 + .../translator/PhysicalPlanTranslator.java | 22 -- .../nereids/parser/LogicalPlanBuilder.java | 18 +- .../nereids/rules/analysis/BindSink.java | 112 +++++++--- .../trees/plans/commands/UpdateCommand.java | 10 +- .../plans/commands/info/ColumnDefinition.java | 54 ++++- .../doris/planner/StreamLoadPlanner.java | 3 + .../update_on_current_timestamp.out | 62 ++++++ .../test_update_on_current_timestamp.out | 29 +++ .../update_on_current_timestamp1.csv | 2 + .../update_on_current_timestamp2.csv | 4 + .../update_on_current_timestamp3.csv | 2 + .../update_on_current_timestamp.groovy | 195 ++++++++++++++++++ .../test_update_on_current_timestamp.groovy | 88 ++++++++ 18 files changed, 605 insertions(+), 59 deletions(-) create mode 100644 regression-test/data/nereids_p0/insert_into_table/update_on_current_timestamp.out create mode 100644 regression-test/data/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.out create mode 100644 regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp1.csv create mode 100644 regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp2.csv create mode 100644 regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp3.csv create mode 100644 regression-test/suites/nereids_p0/insert_into_table/update_on_current_timestamp.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.groovy diff --git a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md index 97e9eed0d3f8bf..6aa9a4cbbb485d 100644 --- a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md +++ b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md @@ -58,7 +58,7 @@ Column definition list: Column definition: - `column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT] [default_value] [column_comment]` + `column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT] [default_value] [on update current_timestamp] [column_comment]` * `column_type` @@ -142,6 +142,10 @@ Column definition list: dt DATETIME DEFAULT CURRENT_TIMESTAMP ``` + * `on update current_timestamp` + + To indicate that whether the value of this column should be updated to the current timestamp (`current_timestamp`) when there is an update on the row. The feature is only available on unique table with merge-on-write enabled. Columns with this feature enabled must declare a default value, and the default value must be `current_timestamp`. If the precision of the timestamp is declared here, the timestamp precision in the default value of the column must be the same as the precision declared here." + Example: ``` @@ -152,6 +156,7 @@ Column definition list: v2 BITMAP BITMAP_UNION, v3 HLL HLL_UNION, v4 INT SUM NOT NULL DEFAULT "1" COMMENT "This is column v4" + dt datetime(6) default current_timestamp(6) on update current_timestamp(6) ``` #### index_definition_list diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md index 600859009d4ecf..6a9c63f8d6bc09 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE.md @@ -56,7 +56,7 @@ distribution_desc * `column_definition` 列定义: - `column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT] [default_value] [column_comment]` + `column_name column_type [KEY] [aggr_type] [NULL] [AUTO_INCREMENT] [default_value] [on update current_timestamp] [column_comment]` * `column_type` 列类型,支持以下类型: ``` @@ -129,6 +129,10 @@ distribution_desc // 只用于DATETIME类型,导入数据缺失该值时系统将赋予当前时间 dt DATETIME DEFAULT CURRENT_TIMESTAMP ``` + * `on update current_timestamp` + + 是否在该行有列更新时将该列的值更新为当前时间(`current_timestamp`)。该特性只能在开启了merge-on-write的unique表上使用,开启了这个特性的列必须声明默认值,且默认值必须为`current_timestamp`。如果此处声明了时间戳的精度,则该列默认值中的时间戳精度必须与该处的时间戳精度相同。 + 示例: @@ -140,6 +144,7 @@ distribution_desc v2 BITMAP BITMAP_UNION, v3 HLL HLL_UNION, v4 INT SUM NOT NULL DEFAULT "1" COMMENT "This is column v4" + dt datetime(6) default current_timestamp(6) on update current_timestamp(6) ``` #### index_definition_list 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 7e2f4237e14433..1dca96c1eca0a2 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 @@ -462,7 +462,8 @@ columnDef : colName=identifier type=dataType KEY? (aggType=aggTypeDef)? ((NOT NULL) | NULL)? (DEFAULT (nullValue=NULL | INTEGER_VALUE | stringValue=STRING_LITERAL - | CURRENT_TIMESTAMP (LEFT_PAREN precision=number RIGHT_PAREN)?))? + | CURRENT_TIMESTAMP (LEFT_PAREN defaultValuePrecision=number RIGHT_PAREN)?))? + (ON UPDATE CURRENT_TIMESTAMP (LEFT_PAREN onUpdateValuePrecision=number RIGHT_PAREN)?)? (COMMENT comment=STRING_LITERAL)? ; diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java index a85e4ec7d67bb3..81c1edc2e2505c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java @@ -130,6 +130,12 @@ public class Column implements Writable, GsonPostProcessable { private boolean isCompoundKey = false; + @SerializedName(value = "hasOnUpdateDefaultValue") + private boolean hasOnUpdateDefaultValue = false; + + @SerializedName(value = "onUpdateDefaultValueExprDef") + private DefaultValueExprDef onUpdateDefaultValueExprDef; + public Column() { this.name = ""; this.type = Type.NULL; @@ -170,24 +176,33 @@ public Column(String name, Type type, boolean isKey, AggregateType aggregateType public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, String defaultValue, String comment) { this(name, type, isKey, aggregateType, isAllowNull, false, defaultValue, comment, true, null, - COLUMN_UNIQUE_ID_INIT_VALUE, defaultValue); + COLUMN_UNIQUE_ID_INIT_VALUE, defaultValue, false, null); } public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, String comment, boolean visible, int colUniqueId) { - this(name, type, isKey, aggregateType, isAllowNull, false, null, comment, visible, null, colUniqueId, null); + this(name, type, isKey, aggregateType, isAllowNull, false, null, comment, visible, null, colUniqueId, null, + false, null); } public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, String defaultValue, String comment, boolean visible, DefaultValueExprDef defaultValueExprDef, int colUniqueId, String realDefaultValue) { this(name, type, isKey, aggregateType, isAllowNull, false, defaultValue, comment, visible, defaultValueExprDef, - colUniqueId, realDefaultValue); + colUniqueId, realDefaultValue, false, null); } public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, boolean isAutoInc, String defaultValue, String comment, boolean visible, DefaultValueExprDef defaultValueExprDef, int colUniqueId, String realDefaultValue) { + this(name, type, isKey, aggregateType, isAllowNull, isAutoInc, defaultValue, comment, visible, + defaultValueExprDef, colUniqueId, realDefaultValue, false, null); + } + + public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, + boolean isAutoInc, String defaultValue, String comment, boolean visible, + DefaultValueExprDef defaultValueExprDef, int colUniqueId, String realDefaultValue, + boolean hasOnUpdateDefaultValue, DefaultValueExprDef onUpdateDefaultValueExprDef) { this.name = name; if (this.name == null) { this.name = ""; @@ -212,6 +227,8 @@ public Column(String name, Type type, boolean isKey, AggregateType aggregateType this.children = new ArrayList<>(); createChildrenColumn(this.type, this); this.uniqueId = colUniqueId; + this.hasOnUpdateDefaultValue = hasOnUpdateDefaultValue; + this.onUpdateDefaultValueExprDef = onUpdateDefaultValueExprDef; if (type.isAggStateType()) { AggStateType aggState = (AggStateType) type; @@ -244,6 +261,8 @@ public Column(Column column) { this.uniqueId = column.getUniqueId(); this.defineExpr = column.getDefineExpr(); this.defineName = column.getDefineName(); + this.hasOnUpdateDefaultValue = column.hasOnUpdateDefaultValue; + this.onUpdateDefaultValueExprDef = column.onUpdateDefaultValueExprDef; } public void createChildrenColumn(Type type, Column column) { @@ -489,6 +508,14 @@ public int getOlapColumnIndexSize() { } } + public boolean hasOnUpdateDefaultValue() { + return hasOnUpdateDefaultValue; + } + + public Expr getOnUpdateDefaultValueExpr() { + return onUpdateDefaultValueExprDef.getExpr(type); + } + public TColumn toThrift() { TColumn tColumn = new TColumn(); tColumn.setColumnName(removeNamePrefix(this.name)); @@ -766,6 +793,9 @@ public String toSql(boolean isUniqueTable, boolean isCompatible) { sb.append(" DEFAULT \"").append(defaultValue).append("\""); } } + if (hasOnUpdateDefaultValue) { + sb.append(" ON UPDATE ").append(defaultValue).append(""); + } if (StringUtils.isNotBlank(comment)) { sb.append(" COMMENT '").append(getComment(true)).append("'"); } 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 6ab7dc2588a05d..aa8d40afc23164 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 @@ -2166,6 +2166,16 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep } olapTable.setEnableSingleReplicaCompaction(enableSingleReplicaCompaction); + // check `update on current_timestamp` + if (!enableUniqueKeyMergeOnWrite) { + for (Column column : baseSchema) { + if (column.hasOnUpdateDefaultValue()) { + throw new DdlException("'ON UPDATE CURRENT_TIMESTAMP' is only supportted" + + " in unique table with merge-on-write enabled."); + } + } + } + // analyze bloom filter columns Set bfColumns = null; double bfFpp = 0; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index 363637d70f6519..b488dbe926a1a4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -379,31 +379,9 @@ public PlanFragment visitPhysicalOlapTableSink(PhysicalOlapTableSink partialUpdateCols = new HashSet<>(); boolean isPartialUpdate = olapTableSink.isPartialUpdate(); if (isPartialUpdate) { - OlapTable olapTable = olapTableSink.getTargetTable(); - if (!olapTable.getEnableUniqueKeyMergeOnWrite()) { - throw new AnalysisException("Partial update is only allowed in" - + "unique table with merge-on-write enabled."); - } - for (Column col : olapTable.getFullSchema()) { - boolean exists = false; - for (Column insertCol : olapTableSink.getCols()) { - if (insertCol.getName() != null && insertCol.getName().equals(col.getName())) { - exists = true; - break; - } - } - if (col.isKey() && !exists) { - throw new AnalysisException("Partial update should include all key columns, missing: " - + col.getName()); - } - } for (Column col : olapTableSink.getCols()) { partialUpdateCols.add(col.getName()); } - if (olapTable.hasSequenceCol() && olapTable.getSequenceMapCol() != null - && partialUpdateCols.contains(olapTable.getSequenceMapCol())) { - partialUpdateCols.add(Column.SEQUENCE_COL); - } } TupleDescriptor olapTuple = context.generateTupleDesc(); List targetTableColumns = olapTableSink.getTargetTable().getFullSchema(); 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 bbec310e3df7d9..9fdb4635e7b564 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 @@ -2156,6 +2156,7 @@ public ColumnDefinition visitColumnDef(ColumnDefContext ctx) { boolean isNotNull = ctx.NOT() != null; String aggTypeString = ctx.aggType != null ? ctx.aggType.getText() : null; Optional defaultValue = Optional.empty(); + Optional onUpdateDefaultValue = Optional.empty(); if (ctx.DEFAULT() != null) { if (ctx.INTEGER_VALUE() != null) { defaultValue = Optional.of(new DefaultValue(ctx.INTEGER_VALUE().getText())); @@ -2164,14 +2165,24 @@ public ColumnDefinition visitColumnDef(ColumnDefContext ctx) { } else if (ctx.nullValue != null) { defaultValue = Optional.of(DefaultValue.NULL_DEFAULT_VALUE); } else if (ctx.CURRENT_TIMESTAMP() != null) { - if (ctx.precision == null) { + if (ctx.defaultValuePrecision == null) { defaultValue = Optional.of(DefaultValue.CURRENT_TIMESTAMP_DEFAULT_VALUE); } else { defaultValue = Optional.of(DefaultValue - .currentTimeStampDefaultValueWithPrecision(Long.valueOf(ctx.precision.getText()))); + .currentTimeStampDefaultValueWithPrecision( + Long.valueOf(ctx.defaultValuePrecision.getText()))); } } } + if (ctx.UPDATE() != null) { + if (ctx.onUpdateValuePrecision == null) { + onUpdateDefaultValue = Optional.of(DefaultValue.CURRENT_TIMESTAMP_DEFAULT_VALUE); + } else { + onUpdateDefaultValue = Optional.of(DefaultValue + .currentTimeStampDefaultValueWithPrecision( + Long.valueOf(ctx.onUpdateValuePrecision.getText()))); + } + } AggregateType aggType = null; if (aggTypeString != null) { try { @@ -2182,7 +2193,8 @@ public ColumnDefinition visitColumnDef(ColumnDefContext ctx) { } } String comment = ctx.comment != null ? ctx.comment.getText() : ""; - return new ColumnDefinition(colName, colType, isKey, aggType, !isNotNull, defaultValue, comment); + return new ColumnDefinition(colName, colType, isKey, aggType, !isNotNull, defaultValue, + onUpdateDefaultValue, comment); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java index f3c27f6c9b2d45..79504786cd1436 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java @@ -76,40 +76,70 @@ public List buildRules() { Pair pair = bind(ctx.cascadesContext, sink); Database database = pair.first; OlapTable table = pair.second; + boolean isPartialUpdate = sink.isPartialUpdate(); LogicalPlan child = ((LogicalPlan) sink.child()); - boolean isNeedSequenceCol = child.getOutput().stream() + boolean childHasSeqCol = child.getOutput().stream() .anyMatch(slot -> slot.getName().equals(Column.SEQUENCE_COL)); - - if (sink.getColNames().isEmpty() && sink.isFromNativeInsertStmt() - && sink.isPartialUpdate()) { - throw new AnalysisException("You must explicitly specify the columns to be updated when " - + "updating partial columns using the INSERT statement."); - } + boolean needExtraSeqCol = isPartialUpdate && !childHasSeqCol && table.hasSequenceCol() + && table.getSequenceMapCol() != null + && sink.getColNames().contains(table.getSequenceMapCol()); + Pair, Integer> bindColumnsResult = + bindTargetColumns(table, sink.getColNames(), childHasSeqCol, needExtraSeqCol); + List bindColumns = bindColumnsResult.first; + int extraColumnsNum = bindColumnsResult.second; LogicalOlapTableSink boundSink = new LogicalOlapTableSink<>( database, table, - bindTargetColumns(table, sink.getColNames(), isNeedSequenceCol), + bindColumns, bindPartitionIds(table, sink.getPartitions()), child.getOutput().stream() .map(NamedExpression.class::cast) .collect(ImmutableList.toImmutableList()), - sink.isPartialUpdate(), + isPartialUpdate, sink.isFromNativeInsertStmt(), sink.child()); + if (isPartialUpdate) { + // check the necessary conditions for partial updates + if (!table.getEnableUniqueKeyMergeOnWrite()) { + throw new AnalysisException("Partial update is only allowed in" + + "unique table with merge-on-write enabled."); + } + if (sink.getColNames().isEmpty() && sink.isFromNativeInsertStmt()) { + throw new AnalysisException("You must explicitly specify the columns to be updated when " + + "updating partial columns using the INSERT statement."); + } + for (Column col : table.getFullSchema()) { + boolean exists = false; + for (Column insertCol : boundSink.getCols()) { + if (insertCol.getName().equals(col.getName())) { + exists = true; + break; + } + } + if (col.isKey() && !exists) { + throw new AnalysisException("Partial update should include all key columns, missing: " + + col.getName()); + } + } + } + // we need to insert all the columns of the target table // although some columns are not mentions. // so we add a projects to supply the default value. - if (boundSink.getCols().size() != child.getOutput().size()) { + if (boundSink.getCols().size() != child.getOutput().size() + extraColumnsNum) { throw new AnalysisException("insert into cols should be corresponding to the query output"); } try { + // in upserts, users must specify the sequence mapping column explictly + // if the target table has sequence mapping column unless the sequence mapping + // column has the a default value of CURRENT_TIMESTAMP if (table.hasSequenceCol() && table.getSequenceMapCol() != null - && !sink.getColNames().isEmpty() && !boundSink.isPartialUpdate()) { + && !sink.getColNames().isEmpty() && !isPartialUpdate) { Column seqCol = table.getFullSchema().stream() .filter(col -> col.getName().equals(table.getSequenceMapCol())) .findFirst().get(); @@ -127,7 +157,7 @@ public List buildRules() { } Map columnToChildOutput = Maps.newHashMap(); - for (int i = 0; i < boundSink.getCols().size(); ++i) { + for (int i = 0; i < child.getOutput().size(); ++i) { columnToChildOutput.put(boundSink.getCols().get(i), child.getOutput().get(i)); } @@ -171,11 +201,24 @@ public List buildRules() { if (columnToOutput.get(seqCol.get().getName()) != null) { columnToOutput.put(column.getName(), columnToOutput.get(seqCol.get().getName())); } - } else if (sink.isPartialUpdate()) { + } else if (isPartialUpdate) { // If the current load is a partial update, the values of unmentioned // columns will be filled in SegmentWriter. And the output of sink node // should not contain these unmentioned columns, so we just skip them. - continue; + + // But if the column has 'on update value', we should unconditionally + // update the value of the column to the current timestamp whenever there + // is an update on the row + if (column.hasOnUpdateDefaultValue()) { + Expression defualtValueExpression = FunctionBinder.INSTANCE.rewrite( + new NereidsParser().parseExpression( + column.getOnUpdateDefaultValueExpr().toSqlWithoutTbl()), + new ExpressionRewriteContext(ctx.cascadesContext)); + columnToOutput.put(column.getName(), + new Alias(defualtValueExpression, column.getName())); + } else { + continue; + } } else if (column.getDefaultValue() == null) { // Otherwise, the unmentioned columns should be filled with default values // or null values @@ -291,20 +334,37 @@ private List bindPartitionIds(OlapTable table, List partitions) { }).collect(Collectors.toList()); } - private List bindTargetColumns(OlapTable table, List colsName, boolean isNeedSequenceCol) { + private Pair, Integer> bindTargetColumns(OlapTable table, List colsName, + boolean childHasSeqCol, boolean needExtraSeqCol) { // if the table set sequence column in stream load phase, the sequence map column is null, we query it. - return colsName.isEmpty() - ? table.getBaseSchema(true).stream() - .filter(c -> validColumn(c, isNeedSequenceCol)) - .collect(ImmutableList.toImmutableList()) - : colsName.stream().map(cn -> { - Column column = table.getColumn(cn); - if (column == null) { - throw new AnalysisException(String.format("column %s is not found in table %s", - cn, table.getName())); + if (colsName.isEmpty()) { + return Pair.of(table.getBaseSchema(true).stream() + .filter(c -> validColumn(c, childHasSeqCol)) + .collect(ImmutableList.toImmutableList()), 0); + } else { + int extraColumnsNum = (needExtraSeqCol ? 1 : 0); + List processedColsName = Lists.newArrayList(colsName); + for (Column col : table.getFullSchema()) { + if (col.hasOnUpdateDefaultValue()) { + Optional colName = colsName.stream().filter(c -> c.equals(col.getName())).findFirst(); + if (!colName.isPresent()) { + ++extraColumnsNum; + processedColsName.add(col.getName()); } - return column; - }).collect(ImmutableList.toImmutableList()); + } + } + if (!processedColsName.contains(Column.SEQUENCE_COL) && (childHasSeqCol || needExtraSeqCol)) { + processedColsName.add(Column.SEQUENCE_COL); + } + return Pair.of(processedColsName.stream().map(cn -> { + Column column = table.getColumn(cn); + if (column == null) { + throw new AnalysisException(String.format("column %s is not found in table %s", + cn, table.getName())); + } + return column; + }).collect(ImmutableList.toImmutableList()), extraColumnsNum); + } } private boolean isSourceAndTargetStringLikeType(DataType input, DataType target) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateCommand.java index 742b2ea801b85b..ece44cfcd9efad 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateCommand.java @@ -25,6 +25,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.nereids.analyzer.UnboundOlapTableSink; import org.apache.doris.nereids.analyzer.UnboundSlot; +import org.apache.doris.nereids.parser.NereidsParser; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; @@ -115,7 +116,14 @@ public LogicalPlan completeQueryPlan(ConnectContext ctx, LogicalPlan logicalQuer ? ((NamedExpression) expr) : new Alias(expr)); } else { - selectItems.add(new UnboundSlot(tableName, column.getName())); + if (column.hasOnUpdateDefaultValue()) { + Expression defualtValueExpression = + new NereidsParser().parseExpression(column.getOnUpdateDefaultValueExpr() + .toSqlWithoutTbl()); + selectItems.add(new Alias(defualtValueExpression, column.getName())); + } else { + selectItems.add(new UnboundSlot(tableName, column.getName())); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java index fba382e9140318..8b2a8df338d903 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java @@ -51,6 +51,7 @@ public class ColumnDefinition { private AggregateType aggType; private boolean isNullable; private Optional defaultValue; + private Optional onUpdateDefaultValue = Optional.empty(); private final String comment; private final boolean isVisible; private boolean aggTypeImplicit = false; @@ -60,6 +61,11 @@ public ColumnDefinition(String name, DataType type, boolean isKey, AggregateType this(name, type, isKey, aggType, isNullable, defaultValue, comment, true); } + public ColumnDefinition(String name, DataType type, boolean isKey, AggregateType aggType, boolean isNullable, + Optional defaultValue, Optional onUpdateDefaultValue, String comment) { + this(name, type, isKey, aggType, isNullable, defaultValue, onUpdateDefaultValue, comment, true); + } + /** * constructor */ @@ -75,6 +81,23 @@ public ColumnDefinition(String name, DataType type, boolean isKey, AggregateType this.isVisible = isVisible; } + /** + * constructor + */ + public ColumnDefinition(String name, DataType type, boolean isKey, AggregateType aggType, boolean isNullable, + Optional defaultValue, Optional onUpdateDefaultValue, String comment, + boolean isVisible) { + this.name = name; + this.type = type; + this.isKey = isKey; + this.aggType = aggType; + this.isNullable = isNullable; + this.defaultValue = defaultValue; + this.onUpdateDefaultValue = onUpdateDefaultValue; + this.comment = comment; + this.isVisible = isVisible; + } + public ColumnDefinition(String name, DataType type, boolean isNullable) { this(name, type, false, null, isNullable, Optional.empty(), ""); } @@ -198,6 +221,34 @@ public void validate(Set keysSet, boolean isEnableMergeOnWrite, KeysType throw new AnalysisException(e.getMessage(), e); } } + if (onUpdateDefaultValue.isPresent() + && onUpdateDefaultValue.get().getValue() != null + && type.toCatalogDataType().isScalarType()) { + try { + ColumnDef.validateDefaultValue(type.toCatalogDataType(), + onUpdateDefaultValue.get().getValue(), onUpdateDefaultValue.get().getDefaultValueExprDef()); + } catch (Exception e) { + throw new AnalysisException("meet error when validating the on update value of column[" + + name + "], reason: " + e.getMessage()); + } + if (onUpdateDefaultValue.get().isCurrentTimeStamp()) { + if (!defaultValue.isPresent() || !defaultValue.get().isCurrentTimeStamp()) { + throw new AnalysisException("You must set the default value of the column[" + + name + "] to CURRENT_TIMESTAMP when using 'ON UPDATE CURRENT_TIMESTAMP'."); + } + } else if (onUpdateDefaultValue.get().isCurrentTimeStampWithPrecision()) { + if (!defaultValue.isPresent() || !defaultValue.get().isCurrentTimeStampWithPrecision()) { + throw new AnalysisException("You must set the default value of the column[" + + name + "] to CURRENT_TIMESTAMP when using 'ON UPDATE CURRENT_TIMESTAMP'."); + } + long precision1 = onUpdateDefaultValue.get().getCurrentTimeStampPrecision(); + long precision2 = defaultValue.get().getCurrentTimeStampPrecision(); + if (precision1 != precision2) { + throw new AnalysisException("The precision of the default value of column[" + + name + "] should be the same with the precision in 'ON UPDATE CURRENT_TIMESTAMP'."); + } + } + } } /** @@ -231,7 +282,8 @@ public Column translateToCatalogStyle() { Column column = new Column(name, type.toCatalogDataType(), isKey, aggType, isNullable, false, defaultValue.map(DefaultValue::getRawValue).orElse(null), comment, isVisible, defaultValue.map(DefaultValue::getDefaultValueExprDef).orElse(null), Column.COLUMN_UNIQUE_ID_INIT_VALUE, - defaultValue.map(DefaultValue::getValue).orElse(null)); + defaultValue.map(DefaultValue::getValue).orElse(null), onUpdateDefaultValue.isPresent(), + onUpdateDefaultValue.map(DefaultValue::getDefaultValueExprDef).orElse(null)); column.setAggregationTypeImplicit(aggTypeImplicit); return column; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java index ce8b08086abb35..64e872125d4881 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java @@ -150,6 +150,9 @@ public TExecPlanFragmentParams plan(TUniqueId loadId, int fragmentInstanceIdInde if (isPartialUpdate) { for (Column col : destTable.getFullSchema()) { boolean existInExpr = false; + if (col.hasOnUpdateDefaultValue()) { + partialUpdateInputColumns.add(col.getName()); + } for (ImportColumnDesc importColumnDesc : taskInfo.getColumnExprDescs().descs) { if (importColumnDesc.getColumnName() != null && importColumnDesc.getColumnName().equals(col.getName())) { diff --git a/regression-test/data/nereids_p0/insert_into_table/update_on_current_timestamp.out b/regression-test/data/nereids_p0/insert_into_table/update_on_current_timestamp.out new file mode 100644 index 00000000000000..0b600e32cdbce2 --- /dev/null +++ b/regression-test/data/nereids_p0/insert_into_table/update_on_current_timestamp.out @@ -0,0 +1,62 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 doris 1000 123 1 +2 doris2 2000 223 1 + +-- !1 -- +1 + +-- !1 -- +1 + +-- !2 -- +1 doris 1999 123 1 +2 doris2 2999 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !2 -- +1 + +-- !2 -- +1 + +-- !3 -- +1 doris 1999 123 1 +2 doris2 2999 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !3 -- +1 + +-- !3 -- +3 + +-- !3 -- +2 + +-- !4 -- +1 doris 3998 123 1 +2 doris2 5998 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !4 -- +2 + +-- !4 -- +2 + +-- !5 -- +1 doris 3998 123 1 +2 doris2 5998 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !5 -- +3 + +-- !5 -- +3 + diff --git a/regression-test/data/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.out b/regression-test/data/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.out new file mode 100644 index 00000000000000..3b28009ccd0560 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.out @@ -0,0 +1,29 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 doris 1000 123 1 +2 doris2 2000 223 1 + +-- !sql -- +1 + +-- !sql -- +1 doris 1999 123 1 +2 doris2 2999 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !sql -- +1 + +-- !sql -- +1 doris 1999 123 1 +2 doris2 2999 223 1 +3 unknown 3999 \N 4321 +4 unknown 4999 \N 4321 + +-- !sql -- +1 + +-- !sql -- +3 + diff --git a/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp1.csv b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp1.csv new file mode 100644 index 00000000000000..01febb58f246ba --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp1.csv @@ -0,0 +1,2 @@ +2, doris2, 2000, 223, 1 +1, doris, 1000, 123, 1 diff --git a/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp2.csv b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp2.csv new file mode 100644 index 00000000000000..d8bdb172411fdb --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp2.csv @@ -0,0 +1,4 @@ +2, 2999 +1, 1999 +3, 3999 +4, 4999 diff --git a/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp3.csv b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp3.csv new file mode 100644 index 00000000000000..4cb6c424026381 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/partial_update/update_on_current_timestamp3.csv @@ -0,0 +1,2 @@ +1,2000-01-01 00:00:01 +2,2000-01-02 00:00:01 diff --git a/regression-test/suites/nereids_p0/insert_into_table/update_on_current_timestamp.groovy b/regression-test/suites/nereids_p0/insert_into_table/update_on_current_timestamp.groovy new file mode 100644 index 00000000000000..35a68338835a6f --- /dev/null +++ b/regression-test/suites/nereids_p0/insert_into_table/update_on_current_timestamp.groovy @@ -0,0 +1,195 @@ +// 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("nereids_update_on_current_timestamp") { + sql 'set experimental_enable_nereids_planner=true' + sql 'set enable_fallback_to_original_planner=false' + sql 'set enable_nereids_dml=true' + sql "sync;" + + + def t1 = "nereids_update_on_current_timestamp1" + sql """ DROP TABLE IF EXISTS ${t1};""" + sql """ CREATE TABLE ${t1} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime default current_timestamp on update current_timestamp, + `update_time2` datetime(6) default current_timestamp(5) on update current_timestamp(5)) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + );""" + + def res = sql "show create table ${t1};" + assertTrue(res.toString().containsIgnoreCase("`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) + assertTrue(res.toString().containsIgnoreCase("`update_time2` datetime(6) NULL DEFAULT CURRENT_TIMESTAMP(5) ON UPDATE CURRENT_TIMESTAMP(5)")) + + // set enable_unique_key_partial_update=false, it's a row update + sql "set enable_unique_key_partial_update=false;" + sql "sync;" + sql """ insert into ${t1}(id,name,score,test,dft) values + (2, "doris2", 2000, 223, 1), + (1, "doris", 1000, 123, 1);""" + qt_sql "select id,name,score,test,dft from ${t1} order by id;" + // rows with id=1 or id=2 will have the same value 't1' in `update_time` and `update_time2` + qt_1 "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" // 1 + qt_1 "select count(distinct update_time2) from ${t1} where update_time2 > '2023-10-01 00:00:00';" // 1 + sleep(2000) + + + // set enable_unique_key_partial_update=true, it's a partial update + // don't specify the `update_time` column + // it will be automatically updated to current_timestamp() + sql "set enable_unique_key_partial_update=true;" + sql "set enable_insert_strict=false;" + sql "sync;" + sql """ insert into ${t1}(id, score) values + (2, 2999), + (1, 1999), + (3, 3999), + (4, 4999);""" + qt_2 "select id,name,score,test,dft from ${t1} order by id;" + // the existing rows(id=1,2) and newly inserted rows(id=3,4) are updated at the same time + // so they will have the same value 't1 + 2000ms' in `update_time` and `update_time2` + qt_2 "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" // 1 + qt_2 "select count(distinct update_time2) from ${t1} where update_time2 > '2023-10-01 00:00:00';" // 1 + sleep(2000) + + // when user specify that column, it will be filled with the input value + sql """ insert into ${t1}(id, update_time) values + (1, "2000-01-01 00:00:01"), + (2, "2000-01-02 00:00:01");""" + qt_3 "select id,name,score,test,dft from ${t1} order by id;" + // rows with id=1,2 are updated, the value of `update_time2` will be updated to `t1 + 4000ms` + qt_3 "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" // 1 + qt_3 "select count(distinct update_time) from ${t1};" // 3 := (1)(2)(3,4) + qt_3 "select count(distinct update_time2) from ${t1} where update_time2 > '2023-10-01 00:00:00';" // 2 := (1,2)(3,4) + sleep(2000) + + // test update statement + sql """ update ${t1} set score = score * 2 where id < 3;""" + // rows with id=1,2 are updated, the value of `update_time`, `update_time2` will be updated to `t1 + 6000ms` + qt_4 "select id,name,score,test,dft from ${t1} order by id;" + qt_4 "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" // 2 := (1,2)(3,4) + qt_4 "select count(distinct update_time2) from ${t1} where update_time2 > '2023-10-01 00:00:00';" // 2 := (1,2)(3,4) + sleep(2000) + + sql """ update ${t1} set update_time = "2023-10-02 00:00:00" where id > 3;""" + // rows with id=4 are updated, the value of `update_time`, `update_time2` will be updated to `t1 + 8000ms` + qt_5 "select id,name,score,test,dft from ${t1} order by id;" + qt_5 "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" // 3 := (1,2)(3)(4) + qt_5 "select count(distinct update_time2) from ${t1} where update_time2 > '2023-10-01 00:00:00';" // 3 := (1,2)(3)(4) + + // illegal case 1: the default value is not current_timestamp + def illegal_t1 = "nereids_update_on_current_timestamp_illegal_1" + test { + sql """ DROP TABLE IF EXISTS ${illegal_t1} """ + sql """ CREATE TABLE ${illegal_t1} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime default "2020-01-01 00:00:00" on update current_timestamp) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true");""" + exception "You must set the default value of the column[update_time] to CURRENT_TIMESTAMP when using 'ON UPDATE CURRENT_TIMESTAMP'." + } + + // illegal case 2: the default value is not set + def illegal_t2 = "nereids_update_on_current_timestamp_illegal_2" + test { + sql """ DROP TABLE IF EXISTS ${illegal_t2} """ + sql """ CREATE TABLE ${illegal_t2} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime on update current_timestamp) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true");""" + exception "You must set the default value of the column[update_time] to CURRENT_TIMESTAMP when using 'ON UPDATE CURRENT_TIMESTAMP'." + } + + // illegal case 3: the precision of the default value is not the same + def illegal_t3 = "nereids_update_on_current_timestamp_illegal_3" + test { + sql """ DROP TABLE IF EXISTS ${illegal_t3} """ + sql """ CREATE TABLE ${illegal_t3} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime(6) default current_timestamp(4) on update current_timestamp(3)) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true");""" + exception "The precision of the default value of column[update_time] should be the same with the precision in 'ON UPDATE CURRENT_TIMESTAMP'." + } + + // illegal case 4: use 'update on current_timestamp' on incorrect table models + def illegal_t4 = "nereids_update_on_current_timestamp_illegal_4" + test { + sql """ DROP TABLE IF EXISTS ${illegal_t4} """ + sql """ CREATE TABLE ${illegal_t4} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime(6) default current_timestamp(3) on update current_timestamp(3)) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "false");""" + exception "'ON UPDATE CURRENT_TIMESTAMP' is only supportted in unique table with merge-on-write enabled." + } + + test { + sql """ DROP TABLE IF EXISTS ${illegal_t4} """ + sql """ CREATE TABLE ${illegal_t4} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime default current_timestamp on update current_timestamp) + DUPLICATE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES("replication_num" = "1");""" + exception "'ON UPDATE CURRENT_TIMESTAMP' is only supportted in unique table with merge-on-write enabled." + } + + test { + sql """ DROP TABLE IF EXISTS ${illegal_t4} """ + sql """ CREATE TABLE IF NOT EXISTS ${illegal_t4} ( + k int, + `update_time` datetime(6) default current_timestamp(4) on update current_timestamp(3)) replace, + ) AGGREGATE KEY(k) DISTRIBUTED BY HASH(k) BUCKETS 1 properties("replication_num" = "1");""" + exception "Syntax error" + } +} diff --git a/regression-test/suites/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.groovy b/regression-test/suites/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.groovy new file mode 100644 index 00000000000000..29f647fb7a779c --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/partial_update/test_update_on_current_timestamp.groovy @@ -0,0 +1,88 @@ + +// 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_mow_update_on_current_timestamp", "p0") { + sql 'set experimental_enable_nereids_planner=true' + sql 'set enable_fallback_to_original_planner=false' + sql 'set enable_nereids_dml=true' + sql "sync;" + + + def t1 = "test_mow_update_on_current_timestamp1" + sql """ DROP TABLE IF EXISTS ${t1};""" + sql """ CREATE TABLE ${t1} ( + `id` int(11) NOT NULL COMMENT "用户 ID", + `name` varchar(65533) DEFAULT "unknown" COMMENT "用户姓名", + `score` int(11) NOT NULL COMMENT "用户得分", + `test` int(11) NULL COMMENT "null test", + `dft` int(11) DEFAULT "4321", + `update_time` datetime default current_timestamp on update current_timestamp) + UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + );""" + + // don't set partial_columns header, it's a row update + streamLoad { + table "${t1}" + + set 'column_separator', ',' + set 'format', 'csv' + set 'columns', 'id,name,score,test,dft' + + file 'update_on_current_timestamp1.csv' + time 10000 // limit inflight 10s + } + qt_sql "select id,name,score,test,dft from ${t1} order by id;" + qt_sql "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" + + + // set partial columns header, it's a partial update + // don't specify the `update_time` column + // it will be automatically updated to current_timestamp() + streamLoad { + table "${t1}" + + set 'column_separator', ',' + set 'format', 'csv' + set 'partial_columns', 'true' + set 'columns', 'id,score' + + file 'update_on_current_timestamp2.csv' + time 10000 // limit inflight 10s + } + qt_sql "select id,name,score,test,dft from ${t1} order by id;" + qt_sql "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" + + // when user specify that column, it will be filled with the input value + streamLoad { + table "${t1}" + + set 'column_separator', ',' + set 'format', 'csv' + set 'partial_columns', 'true' + set 'columns', 'id,update_time' + + file 'update_on_current_timestamp3.csv' + time 10000 // limit inflight 10s + } + qt_sql "select id,name,score,test,dft from ${t1} order by id;" + qt_sql "select count(distinct update_time) from ${t1} where update_time > '2023-10-01 00:00:00';" + qt_sql "select count(distinct update_time) from ${t1};" +} From ca7dbc363603571d0bb35ce2c5fc5e306af89167 Mon Sep 17 00:00:00 2001 From: Mryange <59914473+Mryange@users.noreply.github.com> Date: Thu, 23 Nov 2023 16:28:32 +0800 Subject: [PATCH 02/64] [refactor](pipelineX) refine union dependency (#27348) --- .../exec/aggregation_sink_operator.cpp | 8 +++-- .../pipeline/exec/aggregation_sink_operator.h | 3 +- .../exec/aggregation_source_operator.cpp | 3 +- be/src/pipeline/exec/data_queue.cpp | 31 ++++++++++--------- be/src/pipeline/exec/data_queue.h | 12 +++++-- ...ct_streaming_aggregation_sink_operator.cpp | 3 +- .../streaming_aggregation_sink_operator.cpp | 2 +- be/src/pipeline/exec/union_sink_operator.cpp | 1 + .../pipeline/exec/union_source_operator.cpp | 5 ++- be/src/pipeline/exec/union_source_operator.h | 13 -------- 10 files changed, 43 insertions(+), 38 deletions(-) diff --git a/be/src/pipeline/exec/aggregation_sink_operator.cpp b/be/src/pipeline/exec/aggregation_sink_operator.cpp index dfde3a02998923..c2bb041abb268d 100644 --- a/be/src/pipeline/exec/aggregation_sink_operator.cpp +++ b/be/src/pipeline/exec/aggregation_sink_operator.cpp @@ -82,6 +82,9 @@ Status AggSinkLocalState::init(RuntimeState* state, Base::_shared_state->aggregate_evaluators.back()->set_timer(_exec_timer, _merge_timer, _expr_timer); } + if (p._is_streaming) { + Base::_shared_state->data_queue->set_sink_dependency(Base::_dependency, 0); + } Base::_shared_state->probe_expr_ctxs.resize(p._probe_expr_ctxs.size()); for (size_t i = 0; i < Base::_shared_state->probe_expr_ctxs.size(); i++) { RETURN_IF_ERROR( @@ -717,7 +720,7 @@ Status AggSinkLocalState::try_spill_disk(bool eos) { template AggSinkOperatorX::AggSinkOperatorX(ObjectPool* pool, int operator_id, const TPlanNode& tnode, - const DescriptorTbl& descs) + const DescriptorTbl& descs, bool is_streaming) : DataSinkOperatorX(operator_id, tnode.node_id), _intermediate_tuple_id(tnode.agg_node.intermediate_tuple_id), _intermediate_tuple_desc(nullptr), @@ -727,7 +730,8 @@ AggSinkOperatorX::AggSinkOperatorX(ObjectPool* pool, int operato _is_merge(false), _pool(pool), _limit(tnode.limit), - _have_conjuncts(tnode.__isset.vconjunct && !tnode.vconjunct.nodes.empty()) { + _have_conjuncts(tnode.__isset.vconjunct && !tnode.vconjunct.nodes.empty()), + _is_streaming(is_streaming) { _is_first_phase = tnode.agg_node.__isset.is_first_phase && tnode.agg_node.is_first_phase; } diff --git a/be/src/pipeline/exec/aggregation_sink_operator.h b/be/src/pipeline/exec/aggregation_sink_operator.h index 2d16df2be258ea..ec4bbe3bc709ef 100644 --- a/be/src/pipeline/exec/aggregation_sink_operator.h +++ b/be/src/pipeline/exec/aggregation_sink_operator.h @@ -351,7 +351,7 @@ template class AggSinkOperatorX : public DataSinkOperatorX { public: AggSinkOperatorX(ObjectPool* pool, int operator_id, const TPlanNode& tnode, - const DescriptorTbl& descs); + const DescriptorTbl& descs, bool is_streaming = false); ~AggSinkOperatorX() override = default; Status init(const TDataSink& tsink) override { return Status::InternalError("{} should not init with TPlanNode", @@ -404,6 +404,7 @@ class AggSinkOperatorX : public DataSinkOperatorX { size_t _spill_partition_count_bits; int64_t _limit; // -1: no limit bool _have_conjuncts; + const bool _is_streaming; }; } // namespace pipeline diff --git a/be/src/pipeline/exec/aggregation_source_operator.cpp b/be/src/pipeline/exec/aggregation_source_operator.cpp index dc09e8a268c2fc..6f0c071d3911e8 100644 --- a/be/src/pipeline/exec/aggregation_source_operator.cpp +++ b/be/src/pipeline/exec/aggregation_source_operator.cpp @@ -51,8 +51,7 @@ Status AggLocalState::init(RuntimeState* state, LocalStateInfo& info) { auto& p = _parent->template cast(); if (p._is_streaming) { _shared_state->data_queue.reset(new DataQueue(1)); - _shared_state->data_queue->set_dependency(_dependency, - info.upstream_dependencies.front().get()); + _shared_state->data_queue->set_source_dependency(_dependency); } if (p._without_key) { if (p._needs_finalize) { diff --git a/be/src/pipeline/exec/data_queue.cpp b/be/src/pipeline/exec/data_queue.cpp index 656db9cbe73061..680589ce2b1ad7 100644 --- a/be/src/pipeline/exec/data_queue.cpp +++ b/be/src/pipeline/exec/data_queue.cpp @@ -40,9 +40,7 @@ DataQueue::DataQueue(int child_count) _is_canceled(child_count), _cur_bytes_in_queue(child_count), _cur_blocks_nums_in_queue(child_count), - _flag_queue_idx(0), - _source_dependency(nullptr), - _sink_dependency(nullptr) { + _flag_queue_idx(0) { for (int i = 0; i < child_count; ++i) { _queue_blocks_lock[i].reset(new std::mutex()); _free_blocks_lock[i].reset(new std::mutex()); @@ -51,6 +49,8 @@ DataQueue::DataQueue(int child_count) _cur_bytes_in_queue[i] = 0; _cur_blocks_nums_in_queue[i] = 0; } + _un_finished_counter = child_count; + _sink_dependencies.resize(child_count, nullptr); } std::unique_ptr DataQueue::get_free_block(int child_idx) { @@ -118,11 +118,12 @@ Status DataQueue::get_block_from_queue(std::unique_ptr* outpu } _cur_bytes_in_queue[_flag_queue_idx] -= (*output_block)->allocated_bytes(); _cur_blocks_nums_in_queue[_flag_queue_idx] -= 1; - if (_sink_dependency) { - if (!_is_finished[_flag_queue_idx]) { + auto old_value = _cur_blocks_total_nums.fetch_sub(1); + if (old_value == 1 && _source_dependency) { + if (!is_all_finish()) { _source_dependency->block(); } - _sink_dependency->set_ready(); + _sink_dependencies[_flag_queue_idx]->set_ready(); } } else { if (_is_finished[_flag_queue_idx]) { @@ -142,9 +143,10 @@ void DataQueue::push_block(std::unique_ptr block, int child_i _cur_bytes_in_queue[child_idx] += block->allocated_bytes(); _queue_blocks[child_idx].emplace_back(std::move(block)); _cur_blocks_nums_in_queue[child_idx] += 1; - if (_sink_dependency) { + _cur_blocks_total_nums++; + if (_source_dependency) { _source_dependency->set_ready(); - _sink_dependency->block(); + _sink_dependencies[child_idx]->block(); } //this only use to record the queue[0] for profile _max_bytes_in_queue = std::max(_max_bytes_in_queue, _cur_bytes_in_queue[0].load()); @@ -154,10 +156,16 @@ void DataQueue::push_block(std::unique_ptr block, int child_i void DataQueue::set_finish(int child_idx) { std::lock_guard l(*_queue_blocks_lock[child_idx]); + if (_is_finished[child_idx]) { + return; + } _is_finished[child_idx] = true; if (_source_dependency) { _source_dependency->set_ready(); } + if (_un_finished_counter.fetch_sub(1) == 1) { + _is_all_finished = true; + } } void DataQueue::set_canceled(int child_idx) { @@ -175,12 +183,7 @@ bool DataQueue::is_finish(int child_idx) { } bool DataQueue::is_all_finish() { - for (int i = 0; i < _child_count; ++i) { - if (_is_finished[i] == false) { - return false; - } - } - return true; + return _is_all_finished; } } // namespace pipeline diff --git a/be/src/pipeline/exec/data_queue.h b/be/src/pipeline/exec/data_queue.h index f756ca7e621a13..d28fe5d8f012f8 100644 --- a/be/src/pipeline/exec/data_queue.h +++ b/be/src/pipeline/exec/data_queue.h @@ -60,9 +60,11 @@ class DataQueue { int64_t max_size_of_queue() const { return _max_size_of_queue; } bool data_exhausted() const { return _data_exhausted; } - void set_dependency(Dependency* source_dependency, Dependency* sink_dependency) { + void set_source_dependency(Dependency* source_dependency) { _source_dependency = source_dependency; - _sink_dependency = sink_dependency; + } + void set_sink_dependency(Dependency* sink_dependency, int child_idx) { + _sink_dependencies[child_idx] = sink_dependency; } private: @@ -80,10 +82,13 @@ class DataQueue { //how many deque will be init, always will be one int _child_count = 0; std::vector _is_finished; + std::atomic_uint32_t _un_finished_counter; + std::atomic_bool _is_all_finished = false; std::vector _is_canceled; // int64_t just for counter of profile std::vector _cur_bytes_in_queue; std::vector _cur_blocks_nums_in_queue; + std::atomic_uint32_t _cur_blocks_total_nums = 0; //this will be indicate which queue has data, it's useful when have many queues std::atomic_int _flag_queue_idx = 0; @@ -95,8 +100,9 @@ class DataQueue { int64_t _max_size_of_queue = 0; static constexpr int64_t MAX_BYTE_OF_QUEUE = 1024l * 1024 * 1024 / 10; + // data queue is multi sink one source Dependency* _source_dependency = nullptr; - Dependency* _sink_dependency = nullptr; + std::vector _sink_dependencies; }; } // namespace pipeline diff --git a/be/src/pipeline/exec/distinct_streaming_aggregation_sink_operator.cpp b/be/src/pipeline/exec/distinct_streaming_aggregation_sink_operator.cpp index 74cf655c3669c7..da4968025af81e 100644 --- a/be/src/pipeline/exec/distinct_streaming_aggregation_sink_operator.cpp +++ b/be/src/pipeline/exec/distinct_streaming_aggregation_sink_operator.cpp @@ -183,7 +183,8 @@ DistinctStreamingAggSinkOperatorX::DistinctStreamingAggSinkOperatorX(ObjectPool* int operator_id, const TPlanNode& tnode, const DescriptorTbl& descs) - : AggSinkOperatorX(pool, operator_id, tnode, descs) {} + : AggSinkOperatorX(pool, operator_id, tnode, descs, + true) {} Status DistinctStreamingAggSinkOperatorX::init(const TPlanNode& tnode, RuntimeState* state) { RETURN_IF_ERROR(AggSinkOperatorX::init(tnode, state)); diff --git a/be/src/pipeline/exec/streaming_aggregation_sink_operator.cpp b/be/src/pipeline/exec/streaming_aggregation_sink_operator.cpp index 17eb1b2db1ceec..2cc8b9efcaf22c 100644 --- a/be/src/pipeline/exec/streaming_aggregation_sink_operator.cpp +++ b/be/src/pipeline/exec/streaming_aggregation_sink_operator.cpp @@ -341,7 +341,7 @@ Status StreamingAggSinkLocalState::_pre_agg_with_serialized_key( StreamingAggSinkOperatorX::StreamingAggSinkOperatorX(ObjectPool* pool, int operator_id, const TPlanNode& tnode, const DescriptorTbl& descs) - : AggSinkOperatorX(pool, operator_id, tnode, descs) {} + : AggSinkOperatorX(pool, operator_id, tnode, descs, true) {} Status StreamingAggSinkOperatorX::init(const TPlanNode& tnode, RuntimeState* state) { RETURN_IF_ERROR(AggSinkOperatorX::init(tnode, state)); diff --git a/be/src/pipeline/exec/union_sink_operator.cpp b/be/src/pipeline/exec/union_sink_operator.cpp index 2a235123bdaf15..1ce3ef5c217590 100644 --- a/be/src/pipeline/exec/union_sink_operator.cpp +++ b/be/src/pipeline/exec/union_sink_operator.cpp @@ -99,6 +99,7 @@ Status UnionSinkLocalState::init(RuntimeState* state, LocalSinkStateInfo& info) SCOPED_TIMER(_open_timer); auto& p = _parent->cast(); _child_expr.resize(p._child_expr.size()); + _shared_state->data_queue.set_sink_dependency(_dependency, p._cur_child_id); for (size_t i = 0; i < p._child_expr.size(); i++) { RETURN_IF_ERROR(p._child_expr[i]->clone(state, _child_expr[i])); } diff --git a/be/src/pipeline/exec/union_source_operator.cpp b/be/src/pipeline/exec/union_source_operator.cpp index d824f9db7a0352..619b40f777b5cd 100644 --- a/be/src/pipeline/exec/union_source_operator.cpp +++ b/be/src/pipeline/exec/union_source_operator.cpp @@ -120,7 +120,7 @@ Status UnionSourceLocalState::init(RuntimeState* state, LocalStateInfo& info) { ((UnionSourceDependency*)deps.front().get())->set_shared_state(ss); } RETURN_IF_ERROR(Base::init(state, info)); - ss->data_queue.set_dependency(_dependency, info.upstream_dependencies.front().get()); + ss->data_queue.set_source_dependency(_dependency); SCOPED_TIMER(exec_time_counter()); SCOPED_TIMER(_open_timer); // Const exprs materialized by this node. These exprs don't refer to any children. @@ -141,6 +141,9 @@ Status UnionSourceLocalState::init(RuntimeState* state, LocalStateInfo& info) { RETURN_IF_ERROR(clone_expr_list(_const_expr_list, other_expr_list)); } } + if (child_count == 0) { + _dependency->set_ready(); + } return Status::OK(); } diff --git a/be/src/pipeline/exec/union_source_operator.h b/be/src/pipeline/exec/union_source_operator.h index 8b7060884e905c..c39ea3dbc43be2 100644 --- a/be/src/pipeline/exec/union_source_operator.h +++ b/be/src/pipeline/exec/union_source_operator.h @@ -75,19 +75,6 @@ class UnionSourceDependency final : public Dependency { UnionSourceDependency(int id, int node_id, QueryContext* query_ctx) : Dependency(id, node_id, "UnionSourceDependency", query_ctx) {} ~UnionSourceDependency() override = default; - - [[nodiscard]] Dependency* is_blocked_by(PipelineXTask* task) override { - if (((UnionSharedState*)_shared_state.get())->child_count() == 0) { - return nullptr; - } - if (((UnionSharedState*)_shared_state.get())->data_queue.is_all_finish() || - ((UnionSharedState*)_shared_state.get())->data_queue.remaining_has_data()) { - return nullptr; - } - return this; - } - bool push_to_blocking_queue() const override { return true; } - void block() override {} }; class UnionSourceOperatorX; From 772f181e9492676c463e0b65c3de20707e0c3966 Mon Sep 17 00:00:00 2001 From: AKIRA <33112463+Kikyou1997@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:18:19 +0900 Subject: [PATCH 03/64] [fix](stats) Fix thread leaks when doing checkpoint (#27334) --- .../org/apache/doris/statistics/AnalysisManager.java | 1 - .../apache/doris/statistics/AnalysisTaskExecutor.java | 11 ++--------- .../apache/doris/statistics/StatisticsCollector.java | 1 - 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java index c6deaf0268a041..73df00374e0ee9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java @@ -248,7 +248,6 @@ public AnalysisManager() { if (!Env.isCheckpointThread()) { this.taskExecutor = new AnalysisTaskExecutor(Config.statistics_simultaneously_running_task_num); this.statisticsCache = new StatisticsCache(); - taskExecutor.start(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java index 58bae9fe66b5ca..fb4530837e4afd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java @@ -32,7 +32,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -public class AnalysisTaskExecutor extends Thread { +public class AnalysisTaskExecutor { private static final Logger LOG = LogManager.getLogger(AnalysisTaskExecutor.class); @@ -50,19 +50,12 @@ public AnalysisTaskExecutor(int simultaneouslyRunningTaskNum) { TimeUnit.DAYS, new LinkedBlockingQueue<>(), new BlockedPolicy("Analysis Job Executor", Integer.MAX_VALUE), "Analysis Job Executor", true); + cancelExpiredTask(); } else { executors = null; } } - @Override - public void run() { - if (Env.isCheckpointThread()) { - return; - } - cancelExpiredTask(); - } - private void cancelExpiredTask() { String name = "Expired Analysis Task Killer"; Thread t = new Thread(this::doCancelExpiredJob, name); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCollector.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCollector.java index 4c77d42cfe09f0..f71d589d4ef537 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCollector.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCollector.java @@ -40,7 +40,6 @@ public abstract class StatisticsCollector extends MasterDaemon { public StatisticsCollector(String name, long intervalMs, AnalysisTaskExecutor analysisTaskExecutor) { super(name, intervalMs); this.analysisTaskExecutor = analysisTaskExecutor; - analysisTaskExecutor.start(); } @Override From 6fdaf2da6fb18c5f9cbd116bbe2e6012f6a6f957 Mon Sep 17 00:00:00 2001 From: Dongyang Li Date: Thu, 23 Nov 2023 18:11:29 +0800 Subject: [PATCH 04/64] [fix](ci) 1. if skip compile then skip p0 p1 external pipelinex_p0 also, (#27469) 1. if skip compile then skip p0 p1 external pipelinex_p0 also 2. if change files too many, export all_files may cause problem of 'Argument list too long', change to use file Co-authored-by: stephen --- .../pipeline/common/github-utils.sh | 31 +++++++++++++------ .../pipeline/common/teamcity-utils.sh | 7 +++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/regression-test/pipeline/common/github-utils.sh b/regression-test/pipeline/common/github-utils.sh index 4a7cfd4ed2656c..63481d1173427c 100644 --- a/regression-test/pipeline/common/github-utils.sh +++ b/regression-test/pipeline/common/github-utils.sh @@ -135,24 +135,34 @@ _get_pr_changed_files() { removed_files=$(jq -r '.[] | select(.status == "removed") | .filename' "${file_name}") rm "${file_name}" if [[ -z "${all_files}" ]]; then echo -e "\033[31m List pull request(${pr_url}) files FAIL... \033[0m" && return 1; fi + echo "${all_files}" >all_files + echo "${added_files}" >added_files + echo "${modified_files}" >modified_files + echo "${removed_files}" >removed_files echo -e " https://github.com/apache/doris/pull/${PULL_NUMBER}/files all change files: ---------------------------------------------------------------" if [[ "${which_file:-all}" == "all" ]]; then - echo -e "${all_files}\n" && export all_files + echo -e "${all_files}\n" elif [[ "${which_file}" == "added" ]]; then - echo -e "${added_files}\n" && export added_files + echo -e "${added_files}\n" elif [[ "${which_file}" == "modified" ]]; then - echo -e "${modified_files}\n" && export modified_files + echo -e "${modified_files}\n" elif [[ "${which_file}" == "removed" ]]; then - echo -e "${removed_files}\n" && export removed_files + echo -e "${removed_files}\n" else return 1 fi } _only_modified_regression_conf() { + local added_files + local removed_files + local modified_files + added_files=$(cat added_files) + removed_files=$(cat removed_files) + modified_files=$(cat modified_files) if [[ -n ${added_files} || -n ${removed_files} ]]; then # echo "Not only modified regression conf, find added/removed files" return 1 @@ -175,6 +185,8 @@ _only_modified_regression_conf() { } file_changed_fe_ut() { + local all_files + all_files=$(cat all_files) if _only_modified_regression_conf; then echo "return no need" && return 1; fi if [[ -z ${all_files} ]]; then echo "return need" && return 0; fi for af in ${all_files}; do @@ -190,6 +202,8 @@ file_changed_fe_ut() { } file_changed_be_ut() { + local all_files + all_files=$(cat all_files) if _only_modified_regression_conf; then echo "return no need" && return 1; fi if [[ -z ${all_files} ]]; then echo "return need" && return 0; fi for af in ${all_files}; do @@ -206,6 +220,8 @@ file_changed_be_ut() { } file_changed_regression_p0() { + local all_files + all_files=$(cat all_files) if _only_modified_regression_conf; then echo "return no need" && return 1; fi if [[ -z ${all_files} ]]; then echo "return need" && return 0; fi for af in ${all_files}; do @@ -234,12 +250,9 @@ file_changed_regression_p1() { file_changed_regression_p0 } -file_changed_arm_regression_p0() { - if [[ $(($1 % 2)) -eq 0 ]]; then echo "the pull request id is even, return no need" && return 1; fi - file_changed_regression_p0 -} - file_changed_ckb() { + local all_files + all_files=$(cat all_files) if _only_modified_regression_conf; then echo "return no need" && return 1; fi if [[ -z ${all_files} ]]; then echo "return need" && return 0; fi for af in ${all_files}; do diff --git a/regression-test/pipeline/common/teamcity-utils.sh b/regression-test/pipeline/common/teamcity-utils.sh index a25f00d5381fd8..57ae0925fd5cad 100644 --- a/regression-test/pipeline/common/teamcity-utils.sh +++ b/regression-test/pipeline/common/teamcity-utils.sh @@ -271,6 +271,13 @@ trigger_or_skip_build() { trigger_build "${PULL_REQUEST_NUM}" "${COMMIT_ID_FROM_TRIGGER}" "${COMMENT_TRIGGER_TYPE}" "${COMMENT_REPEAT_TIMES}" else skip_build "${COMMIT_ID_FROM_TRIGGER}" "${COMMENT_TRIGGER_TYPE}" + if [[ ${COMMENT_TRIGGER_TYPE} == "compile" ]]; then + # skip compile 的时候,也把 p0 p1 external pipelinex_p0 都 skip 了 + skip_build "${COMMIT_ID_FROM_TRIGGER}" "p0" + skip_build "${COMMIT_ID_FROM_TRIGGER}" "p1" + skip_build "${COMMIT_ID_FROM_TRIGGER}" "external" + skip_build "${COMMIT_ID_FROM_TRIGGER}" "pipelinex_p0" + fi fi } # trigger_or_skip_build "$1" "$2" "$3" "$4" "$5" From ab739a6cdc6be4e507faba544d758262876d84a2 Mon Sep 17 00:00:00 2001 From: Calvin Kirs Date: Thu, 23 Nov 2023 18:17:31 +0800 Subject: [PATCH 05/64] [Chore](workflow)Fix Pr comment not worker (#27400) --- .github/workflows/auto-pr-reply.yml | 38 +++++++++++++++++++++++------ .gitmodules | 2 +- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/.github/workflows/auto-pr-reply.yml b/.github/workflows/auto-pr-reply.yml index 3f1ce4d1152eda..b4c15061f2efaf 100644 --- a/.github/workflows/auto-pr-reply.yml +++ b/.github/workflows/auto-pr-reply.yml @@ -1,3 +1,20 @@ +# 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. + name: Auto Reply to PR on: @@ -8,11 +25,16 @@ jobs: comment: runs-on: ubuntu-latest steps: - - name: Comment on PR - uses: ./.github/actions/create-or-update-comment - with: - issue-number: ${{ github.event.pull_request.number }} - body: | - Thank you for your contribution to Apache Doris. - - Don't know what should be done next? See [How to process your PR](https://cwiki.apache.org/confluence/display/DORIS/How+to+process+your+PR) + - name: Checkout + uses: actions/checkout@v3 + with: + persist-credentials: false + submodules: recursive + - name: Comment on PR + uses: ./.github/actions/create-or-update-comment + with: + issue-number: ${{ github.event.pull_request.number }} + body: | + Thank you for your contribution to Apache Doris. + + Don't know what should be done next? See [How to process your PR](https://cwiki.apache.org/confluence/display/DORIS/How+to+process+your+PR) diff --git a/.gitmodules b/.gitmodules index a7439139147495..f092e8b8e5cff3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,4 +26,4 @@ branch = clucene [submodule ".github/actions/create-or-update-comment"] path = .github/actions/create-or-update-comment - url = https://github.com/peter-evans/create-or-update-comment + url = https://github.com/peter-evans/create-or-update-comment.git From 2ec33950879128ef6a5aeca2fa084e4346fc05b9 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:40:02 +0800 Subject: [PATCH 06/64] [fix](planner)the data type should be the same between input slot and sort slot (#27137) --- .../apache/doris/planner/AnalyticPlanner.java | 5 +++-- .../test_inlineview_with_window_function.out | 6 ++++++ .../test_inlineview_with_window_function.groovy | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticPlanner.java index 433fe76fd9ede1..7687b5812a459c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticPlanner.java @@ -313,9 +313,10 @@ private SortInfo createSortInfo( SlotDescriptor sortSlotDesc = analyzer.getDescTbl().addSlotDescriptor(sortTupleDesc); if (inputSlotDesc.getColumn() != null) { sortSlotDesc.setColumn(inputSlotDesc.getColumn()); - } else { - sortSlotDesc.setType(inputSlotDesc.getType()); } + // always set type as inputSlotDesc's type + sortSlotDesc.setType(inputSlotDesc.getType()); + // all output slots need to be materialized sortSlotDesc.setIsMaterialized(true); sortSlotDesc.setIsNullable(inputSlotDesc.getIsNullable()); diff --git a/regression-test/data/correctness_p0/test_inlineview_with_window_function.out b/regression-test/data/correctness_p0/test_inlineview_with_window_function.out index 281bf5dd1b2e76..778d5d8c716446 100644 --- a/regression-test/data/correctness_p0/test_inlineview_with_window_function.out +++ b/regression-test/data/correctness_p0/test_inlineview_with_window_function.out @@ -2,3 +2,9 @@ -- !order -- 2023-06-10 cib2205045_1_1s 0.0000 168939.0 0.0000 0.0 0.0000 0.0 0.0000 day +-- !order2 -- +1 1 1 +2 2 2 +3 3 3 +4 4 4 + diff --git a/regression-test/suites/correctness_p0/test_inlineview_with_window_function.groovy b/regression-test/suites/correctness_p0/test_inlineview_with_window_function.groovy index cdeb65e9ec5939..1d3c7fdf58f9dc 100644 --- a/regression-test/suites/correctness_p0/test_inlineview_with_window_function.groovy +++ b/regression-test/suites/correctness_p0/test_inlineview_with_window_function.groovy @@ -151,4 +151,20 @@ suite("test_inlineview_with_window_function") { group by ordernum )tmp1 on tmp.ordernum=tmp1.ordernum;""" + + sql """set enable_nereids_planner=false;""" + qt_order2 """ + SELECT + row_number() over(partition by add_date order by pc_num desc) + ,row_number() over(partition by add_date order by vc_num desc) + ,row_number() over(partition by add_date order by vt_num desc) + FROM ( + SELECT + cast(dnt as datev2) add_date + ,row_number() over(order by dnt) pc_num + ,row_number() over(order by dnt) vc_num + ,row_number() over(order by dnt) vt_num + FROM test_table_aaa + ) t; + """ } From 1555b11035e32dfab6debe18fe4e9e4d3e4f6d61 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:40:51 +0800 Subject: [PATCH 07/64] [fix](nereids)remove literal partition by and order by expression in window function (#26899) --- .../ExtractAndNormalizeWindowExpression.java | 13 ++++++++++++- .../window_functions/test_window_function.out | 11 +++++++++++ .../window_functions/test_window_function.groovy | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java index 10e256a132c4be..3f13f8bd3f363d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -52,14 +53,24 @@ public Rule build() { List outputs = ExpressionUtils.rewriteDownShortCircuit(project.getProjects(), output -> { if (output instanceof WindowExpression) { + WindowExpression windowExpression = (WindowExpression) output; Expression expression = ((WindowExpression) output).getFunction(); if (expression instanceof Sum || expression instanceof Max || expression instanceof Min || expression instanceof Avg) { // sum, max, min and avg in window function should be always nullable - return ((WindowExpression) output) + windowExpression = ((WindowExpression) output) .withFunction(((NullableAggregateFunction) expression) .withAlwaysNullable(true)); } + // remove literal partition by and order by keys + return windowExpression.withPartitionKeysOrderKeys( + windowExpression.getPartitionKeys().stream() + .filter(partitionExpr -> !partitionExpr.isConstant()) + .collect(Collectors.toList()), + windowExpression.getOrderKeys().stream() + .filter(orderExpression -> !orderExpression + .getOrderKey().getExpr().isConstant()) + .collect(Collectors.toList())); } return output; }); diff --git a/regression-test/data/nereids_p0/sql_functions/window_functions/test_window_function.out b/regression-test/data/nereids_p0/sql_functions/window_functions/test_window_function.out index 44dbf7c998d1fd..fe0ee1764e2409 100644 --- a/regression-test/data/nereids_p0/sql_functions/window_functions/test_window_function.out +++ b/regression-test/data/nereids_p0/sql_functions/window_functions/test_window_function.out @@ -1,4 +1,13 @@ -- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 +2 +3 +4 +5 +6 +7 + -- !sql -- JDR 2014-10-02T00:00 12.86 12.875 JDR 2014-10-03T00:00 12.89 12.896666667 @@ -609,3 +618,5 @@ USA Pete Hello 32767 6 12 32767 32767 6 6 32767 + + diff --git a/regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_function.groovy b/regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_function.groovy index d17dd8350e5234..26b770e8687ed1 100644 --- a/regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_function.groovy +++ b/regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_function.groovy @@ -24,6 +24,7 @@ suite("test_window_function") { sql """ INSERT INTO ${windowFunctionTable1} VALUES ('JDR',12.86,'2014-10-02 00:00:00','2014-10-02 00:00:00.111111','2014-10-02 00:00:00.111111','2014-10-02 00:00:00.111111'),('JDR',12.89,'2014-10-03 00:00:00','2014-10-03 00:00:00.111111','2014-10-03 00:00:00.111111','2014-10-03 00:00:00.111111'),('JDR',12.94,'2014-10-04 00:00:00','2014-10-04 00:00:00.111111','2014-10-04 00:00:00.111111','2014-10-04 00:00:00.111111'),('JDR',12.55,'2014-10-05 00:00:00','2014-10-05 00:00:00.111111','2014-10-05 00:00:00.111111','2014-10-05 00:00:00.111111'),('JDR',14.03,'2014-10-06 00:00:00','2014-10-06 00:00:00.111111','2014-10-06 00:00:00.111111','2014-10-06 00:00:00.111111'),('JDR',14.75,'2014-10-07 00:00:00','2014-10-07 00:00:00.111111','2014-10-07 00:00:00.111111','2014-10-07 00:00:00.111111'),('JDR',13.98,'2014-10-08 00:00:00','2014-10-08 00:00:00.111111','2014-10-08 00:00:00.111111','2014-10-08 00:00:00.111111') """ + qt_sql """SELECT row_number() OVER (partition by 1 order by 2) from ${windowFunctionTable1} order by 1; """ // Nereids does't support window function // qt_sql """ // SELECT /*+SET_VAR(parallel_fragment_exec_instance_num=1) */ From d9f6e51884e8f6f34c268b50eb4cd346556ea806 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:41:08 +0800 Subject: [PATCH 08/64] [fix](planner)output slot should be materialized as intermediate slot in agg node (#27282) --- .../apache/doris/analysis/AggregateInfo.java | 1 + .../correctness_p0/test_agg_materialize.out | 4 ++ .../test_agg_materialize.groovy | 69 +++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java index 87b3653a199fab..25851f4b0202fd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java @@ -911,6 +911,7 @@ public void materializeRequiredSlots(Analyzer analyzer, ExprSubstitutionMap smap continue; } + slotDesc.setIsMaterialized(true); intermediateSlotDesc.setIsMaterialized(true); exprs.add(functionCallExpr); materializedSlots.add(i); diff --git a/regression-test/data/correctness_p0/test_agg_materialize.out b/regression-test/data/correctness_p0/test_agg_materialize.out index 1969d634862791..26c36a0045e46b 100644 --- a/regression-test/data/correctness_p0/test_agg_materialize.out +++ b/regression-test/data/correctness_p0/test_agg_materialize.out @@ -2,3 +2,7 @@ -- !select -- 3 +-- !select2 -- +1 +qycs + diff --git a/regression-test/suites/correctness_p0/test_agg_materialize.groovy b/regression-test/suites/correctness_p0/test_agg_materialize.groovy index 7911231ed4080c..3f79013ea01712 100644 --- a/regression-test/suites/correctness_p0/test_agg_materialize.groovy +++ b/regression-test/suites/correctness_p0/test_agg_materialize.groovy @@ -31,4 +31,73 @@ suite("test_agg_materialize") { from tb1 where e1 = 1)tttt ; """ + sql """drop table if exists c5749_bug_t;""" + sql """CREATE TABLE `c5749_bug_t` ( + `org_code` varchar(255) NULL , + `cash_amt` decimal(27, 9) NULL , + + ) ENGINE=OLAP + DUPLICATE KEY(`org_code`) + DISTRIBUTED BY HASH(`org_code`) BUCKETS AUTO + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2", + "disable_auto_compaction" = "false" + );""" + sql """insert into c5749_bug_t values('1',1), ('1',2);""" + qt_select2 """with SPJ AS ( + WITH TOTAL AS ( + SELECT + t1.org_code, + round(ifnull(sum(t1.qty), 0) / 10000, 2) qty + FROM + ( + SELECT + parentOrg.org_code, + SUM(parentOrg.cash_amt) qty + FROM + c5749_bug_t parentOrg + GROUP BY + parentOrg.org_code + UNION + ALL + SELECT + parentOrg.org_code, + SUM(parentOrg.cash_amt) qty + FROM + c5749_bug_t parentOrg + GROUP BY + parentOrg.org_code + ) t1 + GROUP BY + t1.org_code + ), + AGG AS ( + SELECT + TOTAL.org_code, + TOTAL.qty totalQty + FROM + TOTAL + UNION + ALL + SELECT + 'qycs' org_code, + SUM(TOTAL.qty) totalQty + FROM + TOTAL + ) + SELECT + AGG.org_code, + AGG.totalQty AS totalQty + FROM + AGG + ) + SELECT + SPJ.org_code + FROM + SPJ + ORDER BY SPJ.org_code; + """ + sql """drop table if exists c5749_bug_t;""" } From 511eedb4ffd5167517ec80992b956d53d15cddf9 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:41:59 +0800 Subject: [PATCH 09/64] [fix](nereids)select base index if mv's data type is different from base table (#27387) normally, mv column's data type should be same as base table. This pr plays as a fail-safe, if mv column's data type is different from base table accidentally, fall back to select base table to make the query works. --- ...lectMaterializedIndexWithoutAggregate.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java index 7787df22c7f1e0..d5e9600579abb8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.MaterializedIndex; import org.apache.doris.catalog.OlapTable; +import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; @@ -32,12 +33,14 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; +import org.apache.doris.nereids.util.ExpressionUtils; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -184,6 +187,11 @@ private LogicalOlapScan select( default: throw new RuntimeException("Not supported keys type: " + keysType); } + + Set requiredSlots = new HashSet<>(); + requiredSlots.addAll(requiredScanOutputSupplier.get()); + requiredSlots.addAll(ExpressionUtils.getInputSlotSet(requiredExpr)); + requiredSlots.addAll(ExpressionUtils.getInputSlotSet(predicatesSupplier.get())); if (scan.getTable().isDupKeysOrMergeOnWrite()) { // Set pre-aggregation to `on` to keep consistency with legacy logic. List candidates = scan @@ -192,6 +200,9 @@ private LogicalOlapScan select( scan, requiredScanOutputSupplier.get(), requiredExpr, predicatesSupplier.get())) .collect(Collectors.toList()); long bestIndex = selectBestIndex(candidates, scan, predicatesSupplier.get()); + // this is fail-safe for select mv + // select baseIndex if bestIndex's slots' data types are different from baseIndex + bestIndex = isSameDataType(scan, bestIndex, requiredSlots) ? bestIndex : baseIndexId; return scan.withMaterializedIndexSelected(PreAggStatus.on(), bestIndex); } else { final PreAggStatus preAggStatus; @@ -219,12 +230,30 @@ private LogicalOlapScan select( // `candidates` only have base index. return scan.withMaterializedIndexSelected(preAggStatus, baseIndexId); } else { - return scan.withMaterializedIndexSelected(preAggStatus, - selectBestIndex(candidates, scan, predicatesSupplier.get())); + long bestIndex = selectBestIndex(candidates, scan, predicatesSupplier.get()); + // this is fail-safe for select mv + // select baseIndex if bestIndex's slots' data types are different from baseIndex + bestIndex = isSameDataType(scan, bestIndex, requiredSlots) ? bestIndex : baseIndexId; + return scan.withMaterializedIndexSelected(preAggStatus, bestIndex); } } } + private boolean isSameDataType(LogicalOlapScan scan, long selectIndex, Set slots) { + if (selectIndex != scan.getTable().getBaseIndexId()) { + Map columnTypes = + scan.getTable().getSchemaByIndexId(selectIndex).stream().collect(Collectors + .toMap(Column::getNameWithoutMvPrefix, column -> column.getDataType())); + return slots.stream().allMatch(slot -> { + PrimitiveType dataType = + columnTypes.getOrDefault(slot.getName(), PrimitiveType.NULL_TYPE); + return dataType == PrimitiveType.NULL_TYPE + || dataType == slot.getDataType().toCatalogDataType().getPrimitiveType(); + }); + } + return true; + } + private boolean indexHasAggregate(MaterializedIndex index, LogicalOlapScan scan) { return scan.getTable().getSchemaByIndexId(index.getId()) .stream() From 2ea33518b0b8657508f113ed7f17b5b2596a64ac Mon Sep 17 00:00:00 2001 From: zclllyybb Date: Thu, 23 Nov 2023 19:12:28 +0800 Subject: [PATCH 10/64] [Opt](load) use batching to optimize auto partition (#26915) use batching to optimize auto partition --- be/src/common/config.cpp | 3 +- be/src/common/config.h | 4 +- .../pipeline/exec/exchange_sink_operator.cpp | 2 +- .../exec/result_file_sink_operator.cpp | 2 +- be/src/runtime/plan_fragment_executor.cpp | 5 - be/src/vec/columns/column.h | 2 +- be/src/vec/columns/column_dummy.h | 2 + be/src/vec/core/block.cpp | 25 +++ be/src/vec/core/block.h | 12 +- be/src/vec/exec/scan/pip_scanner_context.h | 2 +- be/src/vec/sink/vdata_stream_sender.cpp | 8 +- be/src/vec/sink/vrow_distribution.cpp | 108 +++++++----- be/src/vec/sink/vrow_distribution.h | 101 ++++++----- be/src/vec/sink/vtablet_finder.h | 2 +- .../vec/sink/writer/async_result_writer.cpp | 10 +- be/src/vec/sink/writer/async_result_writer.h | 1 - be/src/vec/sink/writer/vtablet_writer.cpp | 161 +++++++++++------- be/src/vec/sink/writer/vtablet_writer.h | 32 ++-- be/src/vec/sink/writer/vtablet_writer_v2.cpp | 80 +++++---- be/src/vec/sink/writer/vtablet_writer_v2.h | 2 + docs/en/docs/admin-manual/config/be-config.md | 10 ++ .../docs/advanced/partition/auto-partition.md | 17 +- .../docs/admin-manual/config/be-config.md | 14 +- .../docs/advanced/partition/auto-partition.md | 17 +- .../apache/doris/planner/OlapTableSink.java | 13 +- .../test_auto_partition_load.out | 8 + .../test_auto_partition_load.groovy | 12 +- 27 files changed, 402 insertions(+), 253 deletions(-) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 2f52bd44173827..adbc61fe569d0a 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -505,7 +505,8 @@ DEFINE_Int64(stream_tvf_buffer_size, "1048576"); // 1MB // OlapTableSink sender's send interval, should be less than the real response time of a tablet writer rpc. // You may need to lower the speed when the sink receiver bes are too busy. -DEFINE_mInt32(olap_table_sink_send_interval_ms, "1"); +DEFINE_mInt32(olap_table_sink_send_interval_microseconds, "1000"); +DEFINE_mDouble(olap_table_sink_send_interval_auto_partition_factor, "0.001"); // Fragment thread pool DEFINE_Int32(fragment_pool_thread_num_min, "64"); diff --git a/be/src/common/config.h b/be/src/common/config.h index e13d6dcfd4a9ef..f616cfb6081baa 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -559,7 +559,9 @@ DECLARE_Int64(stream_tvf_buffer_size); // OlapTableSink sender's send interval, should be less than the real response time of a tablet writer rpc. // You may need to lower the speed when the sink receiver bes are too busy. -DECLARE_mInt32(olap_table_sink_send_interval_ms); +DECLARE_mInt32(olap_table_sink_send_interval_microseconds); +// For auto partition, the send interval will multiply the factor +DECLARE_mDouble(olap_table_sink_send_interval_auto_partition_factor); // Fragment thread pool DECLARE_Int32(fragment_pool_thread_num_min); diff --git a/be/src/pipeline/exec/exchange_sink_operator.cpp b/be/src/pipeline/exec/exchange_sink_operator.cpp index f0e03596cc1bfb..71517f377f02c4 100644 --- a/be/src/pipeline/exec/exchange_sink_operator.cpp +++ b/be/src/pipeline/exec/exchange_sink_operator.cpp @@ -375,7 +375,7 @@ Status ExchangeSinkOperatorX::sink(RuntimeState* state, vectorized::Block* block } } cur_block.clear_column_data(); - local_state._serializer.get_block()->set_muatable_columns( + local_state._serializer.get_block()->set_mutable_columns( cur_block.mutate_columns()); } } diff --git a/be/src/pipeline/exec/result_file_sink_operator.cpp b/be/src/pipeline/exec/result_file_sink_operator.cpp index 3193c1b07c4921..b19c93cd28cc89 100644 --- a/be/src/pipeline/exec/result_file_sink_operator.cpp +++ b/be/src/pipeline/exec/result_file_sink_operator.cpp @@ -247,7 +247,7 @@ Status ResultFileSinkLocalState::close(RuntimeState* state, Status exec_status) } } cur_block.clear_column_data(); - _serializer.get_block()->set_muatable_columns(cur_block.mutate_columns()); + _serializer.get_block()->set_mutable_columns(cur_block.mutate_columns()); } } } diff --git a/be/src/runtime/plan_fragment_executor.cpp b/be/src/runtime/plan_fragment_executor.cpp index 6359a2dbe60d15..dc7fb350b6c415 100644 --- a/be/src/runtime/plan_fragment_executor.cpp +++ b/be/src/runtime/plan_fragment_executor.cpp @@ -350,11 +350,6 @@ Status PlanFragmentExecutor::open_vectorized_internal() { if (!eos || block->rows() > 0) { st = _sink->send(runtime_state(), block.get()); - //TODO: Asynchronisation need refactor this - if (st.is()) { // created partition, do it again. - st = _sink->send(runtime_state(), block.get()); - DCHECK(!st.is()); - } handle_group_commit(); if (st.is()) { break; diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index 5202c51a3daa6c..58fe0cb87e3cf6 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -609,7 +609,7 @@ class IColumn : public COW { virtual bool is_exclusive() const { return use_count() == 1; } /// Clear data of column, just like vector clear - virtual void clear() {} + virtual void clear() = 0; /** Memory layout properties. * diff --git a/be/src/vec/columns/column_dummy.h b/be/src/vec/columns/column_dummy.h index a152dc9751a0e1..790c135889e78d 100644 --- a/be/src/vec/columns/column_dummy.h +++ b/be/src/vec/columns/column_dummy.h @@ -62,6 +62,8 @@ class IColumnDummy : public IColumn { void insert_data(const char*, size_t) override { ++s; } + void clear() override {}; + StringRef serialize_value_into_arena(size_t /*n*/, Arena& arena, char const*& begin) const override { return {arena.alloc_continue(0, begin), 0}; diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp index 779f214c97b7f2..0aef622870ca3a 100644 --- a/be/src/vec/core/block.cpp +++ b/be/src/vec/core/block.cpp @@ -21,6 +21,7 @@ #include "vec/core/block.h" #include +#include #include #include #include @@ -968,6 +969,22 @@ void MutableBlock::add_rows(const Block* block, size_t row_begin, size_t length) } } +void MutableBlock::add_rows(const Block* block, std::vector rows) { + DCHECK_LE(columns(), block->columns()); + const auto& block_data = block->get_columns_with_type_and_name(); + const size_t length = std::ranges::distance(rows); + for (size_t i = 0; i < _columns.size(); ++i) { + DCHECK_EQ(_data_types[i]->get_name(), block_data[i].type->get_name()); + auto& dst = _columns[i]; + const auto& src = *block_data[i].column.get(); + dst->reserve(dst->size() + length); + for (size_t row : rows) { + // we can introduce a new function like `insert_assume_reserved` for IColumn. + dst->insert_from(src, row); + } + } +} + void MutableBlock::erase(const String& name) { auto index_it = index_by_name.find(name); if (index_it == index_by_name.end()) { @@ -1100,6 +1117,14 @@ void MutableBlock::clear_column_data() noexcept { } } +void MutableBlock::reset_column_data() noexcept { + _columns.clear(); + for (int i = 0; i < _names.size(); i++) { + _columns.emplace_back(_data_types[i]->create_column()); + index_by_name[_names[i]] = i; + } +} + void MutableBlock::initialize_index_by_name() { for (size_t i = 0, size = _names.size(); i < size; ++i) { index_by_name[_names[i]] = i; diff --git a/be/src/vec/core/block.h b/be/src/vec/core/block.h index 927ed5c655c035..b03d9fa4e217e8 100644 --- a/be/src/vec/core/block.h +++ b/be/src/vec/core/block.h @@ -22,9 +22,9 @@ #include #include -#include -#include +#include +#include #include #include #include @@ -462,7 +462,7 @@ class MutableBlock { MutableColumns& mutable_columns() { return _columns; } - void set_muatable_columns(MutableColumns&& columns) { _columns = std::move(columns); } + void set_mutable_columns(MutableColumns&& columns) { _columns = std::move(columns); } DataTypes& data_types() { return _data_types; } @@ -583,8 +583,8 @@ class MutableBlock { return Status::OK(); } + // move to columns' data to a Block. this will invalidate Block to_block(int start_column = 0); - Block to_block(int start_column, int end_column); void swap(MutableBlock& other) noexcept; @@ -594,6 +594,7 @@ class MutableBlock { void add_row(const Block* block, int row); void add_rows(const Block* block, const int* row_begin, const int* row_end); void add_rows(const Block* block, size_t row_begin, size_t length); + void add_rows(const Block* block, std::vector rows); /// remove the column with the specified name void erase(const String& name); @@ -606,7 +607,10 @@ class MutableBlock { _names.clear(); } + // columns resist. columns' inner data removed. void clear_column_data() noexcept; + // reset columns by types and names. + void reset_column_data() noexcept; size_t allocated_bytes() const; diff --git a/be/src/vec/exec/scan/pip_scanner_context.h b/be/src/vec/exec/scan/pip_scanner_context.h index 111e6ea2ab9174..6c1f8e6325c61e 100644 --- a/be/src/vec/exec/scan/pip_scanner_context.h +++ b/be/src/vec/exec/scan/pip_scanner_context.h @@ -259,7 +259,7 @@ class PipScannerContext : public vectorized::ScannerContext { _dependency->set_ready(); } _colocate_blocks[loc] = get_free_block(); - _colocate_mutable_blocks[loc]->set_muatable_columns( + _colocate_mutable_blocks[loc]->set_mutable_columns( _colocate_blocks[loc]->mutate_columns()); } } diff --git a/be/src/vec/sink/vdata_stream_sender.cpp b/be/src/vec/sink/vdata_stream_sender.cpp index 128ad0b37f87c3..5bfec60d1f98d3 100644 --- a/be/src/vec/sink/vdata_stream_sender.cpp +++ b/be/src/vec/sink/vdata_stream_sender.cpp @@ -126,7 +126,7 @@ template Status Channel::send_local_block(Status exec_status, bool eos) { SCOPED_TIMER(_parent->local_send_timer()); Block block = _serializer.get_block()->to_block(); - _serializer.get_block()->set_muatable_columns(block.clone_empty_columns()); + _serializer.get_block()->set_mutable_columns(block.clone_empty_columns()); if (_recvr_is_valid()) { if constexpr (!std::is_same_v) { COUNTER_UPDATE(_parent->local_bytes_send_counter(), block.bytes()); @@ -568,7 +568,7 @@ Status VDataStreamSender::send(RuntimeState* state, Block* block, bool eos) { } } cur_block.clear_column_data(); - _serializer.get_block()->set_muatable_columns(cur_block.mutate_columns()); + _serializer.get_block()->set_mutable_columns(cur_block.mutate_columns()); } } } else { @@ -595,7 +595,7 @@ Status VDataStreamSender::send(RuntimeState* state, Block* block, bool eos) { } } cur_block.clear_column_data(); - _serializer.get_block()->set_muatable_columns(cur_block.mutate_columns()); + _serializer.get_block()->set_mutable_columns(cur_block.mutate_columns()); _roll_pb_block(); } } @@ -750,7 +750,7 @@ Status BlockSerializer::serialize_block(PBlock* dest, int num_receivers) auto block = _mutable_block->to_block(); RETURN_IF_ERROR(serialize_block(&block, dest, num_receivers)); block.clear_column_data(); - _mutable_block->set_muatable_columns(block.mutate_columns()); + _mutable_block->set_mutable_columns(block.mutate_columns()); } return Status::OK(); diff --git a/be/src/vec/sink/vrow_distribution.cpp b/be/src/vec/sink/vrow_distribution.cpp index 0071629175f3c8..74561594cfee4e 100644 --- a/be/src/vec/sink/vrow_distribution.cpp +++ b/be/src/vec/sink/vrow_distribution.cpp @@ -20,9 +20,11 @@ #include #include +#include "common/status.h" #include "runtime/client_cache.h" #include "runtime/exec_env.h" #include "runtime/runtime_state.h" +#include "util/doris_metrics.h" #include "util/thrift_rpc_helper.h" #include "vec/columns/column_const.h" #include "vec/columns/column_nullable.h" @@ -36,22 +38,37 @@ VRowDistribution::_get_partition_function() { return {_vpartition->get_part_func_ctx(), _vpartition->get_partition_function()}; } -void VRowDistribution::_save_missing_values(vectorized::ColumnPtr col, - vectorized::DataTypePtr value_type) { - _partitions_need_create.clear(); - std::set deduper; - // de-duplication - for (auto row : _missing_map) { - deduper.emplace(value_type->to_string(*col, row)); +Status VRowDistribution::_save_missing_values(vectorized::ColumnPtr col, + vectorized::DataTypePtr value_type, Block* block, + std::vector filter) { + // de-duplication for new partitions but save all rows. + _batching_block->add_rows(block, filter); + for (auto row : filter) { + auto val_str = value_type->to_string(*col, row); + if (!_deduper.contains(val_str)) { + _deduper.emplace(val_str); + TStringLiteral node; + node.value = std::move(val_str); + _partitions_need_create.emplace_back(std::vector {node}); // only 1 partition column now + } } - for (auto& value : deduper) { - TStringLiteral node; - node.value = value; - _partitions_need_create.emplace_back(std::vector {node}); // only 1 partition column now + + // to avoid too large mem use + if (_batching_rows > _batch_size) { + _deal_batched = true; } + + return Status::OK(); +} + +void VRowDistribution::clear_batching_stats() { + _partitions_need_create.clear(); + _deduper.clear(); + _batching_rows = 0; + _batching_bytes = 0; } -Status VRowDistribution::_automatic_create_partition() { +Status VRowDistribution::automatic_create_partition() { SCOPED_TIMER(_add_partition_request_timer); TCreatePartitionRequest request; TCreatePartitionResult result; @@ -75,7 +92,7 @@ Status VRowDistribution::_automatic_create_partition() { if (result.status.status_code == TStatusCode::OK) { // add new created partitions RETURN_IF_ERROR(_vpartition->add_partitions(result.partitions)); - RETURN_IF_ERROR(_on_partitions_created(_caller, &result)); + RETURN_IF_ERROR(_create_partition_callback(_caller, &result)); } return status; @@ -126,7 +143,7 @@ Status VRowDistribution::_filter_block_by_skip_and_where_clause( auto& row_ids = row_part_tablet_id.row_ids; auto& partition_ids = row_part_tablet_id.partition_ids; auto& tablet_ids = row_part_tablet_id.tablet_ids; - if (auto* nullable_column = + if (const auto* nullable_column = vectorized::check_and_get_column(*filter_column)) { for (size_t i = 0; i < block->rows(); i++) { if (nullable_column->get_bool_inline(i) && !_skip[i]) { @@ -135,7 +152,7 @@ Status VRowDistribution::_filter_block_by_skip_and_where_clause( tablet_ids.emplace_back(_tablet_ids[i]); } } - } else if (auto* const_column = + } else if (const auto* const_column = vectorized::check_and_get_column(*filter_column)) { bool ret = const_column->get_bool(0); if (!ret) { @@ -144,7 +161,7 @@ Status VRowDistribution::_filter_block_by_skip_and_where_clause( // should we optimize? _filter_block_by_skip(block, row_part_tablet_id); } else { - auto& filter = assert_cast(*filter_column).get_data(); + const auto& filter = assert_cast(*filter_column).get_data(); for (size_t i = 0; i < block->rows(); i++) { if (filter[i] != 0 && !_skip[i]) { row_ids.emplace_back(i); @@ -194,7 +211,7 @@ Status VRowDistribution::_generate_rows_distribution_for_non_auto_parititon( Status VRowDistribution::_generate_rows_distribution_for_auto_parititon( vectorized::Block* block, int partition_col_idx, bool has_filtered_rows, - std::vector& row_part_tablet_ids) { + std::vector& row_part_tablet_ids, int64_t& rows_stat_val) { auto num_rows = block->rows(); std::vector partition_keys = _vpartition->get_partition_keys(); @@ -204,22 +221,23 @@ Status VRowDistribution::_generate_rows_distribution_for_auto_parititon( _missing_map.clear(); _missing_map.reserve(partition_col.column->size()); bool stop_processing = false; - //TODO: we could use the buffer to save tablets we found so that no need to find them again when we created partitions and try to append block next time. + RETURN_IF_ERROR(_tablet_finder->find_tablets(_state, block, num_rows, _partitions, _tablet_indexes, stop_processing, _skip, &_missing_map)); - if (_missing_map.empty()) { - // we don't calculate it distribution when have missing values - if (has_filtered_rows) { - for (int i = 0; i < num_rows; i++) { - _skip[i] = _skip[i] || _block_convertor->filter_map()[i]; - } + + // the missing vals for auto partition are also skipped. + if (has_filtered_rows) { + for (int i = 0; i < num_rows; i++) { + _skip[i] = _skip[i] || _block_convertor->filter_map()[i]; } - RETURN_IF_ERROR(_filter_block(block, row_part_tablet_ids)); - } else { // for missing partition keys, calc the missing partition and save in _partitions_need_create + } + RETURN_IF_ERROR(_filter_block(block, row_part_tablet_ids)); + + if (!_missing_map.empty()) { + // for missing partition keys, calc the missing partition and save in _partitions_need_create auto [part_ctx, part_func] = _get_partition_function(); auto return_type = part_func->data_type(); - // expose the data column vectorized::ColumnPtr range_left_col = block->get_by_position(partition_col_idx).column; if (const auto* nullable = @@ -228,15 +246,19 @@ Status VRowDistribution::_generate_rows_distribution_for_auto_parititon( return_type = assert_cast(return_type.get()) ->get_nested_type(); } - // calc the end value and save them. - _save_missing_values(range_left_col, return_type); - // then call FE to create it. then FragmentExecutor will redo the load. - RETURN_IF_ERROR(_automatic_create_partition()); - // In the next round, we will _generate_rows_distribution_payload again to get right payload of new tablet - LOG(INFO) << "Auto created partition. Send block again."; - return Status::NeedSendAgain(""); - } // creating done - + // calc the end value and save them. in the end of sending, we will create partitions for them and deal them. + RETURN_IF_ERROR(_save_missing_values(range_left_col, return_type, block, _missing_map)); + + size_t new_bt_rows = _batching_block->rows(); + size_t new_bt_bytes = _batching_block->bytes(); + rows_stat_val -= new_bt_rows - _batching_rows; + _state->update_num_rows_load_total(_batching_rows - new_bt_rows); + _state->update_num_bytes_load_total(_batching_bytes - new_bt_bytes); + DorisMetrics::instance()->load_rows->increment(_batching_rows - new_bt_rows); + DorisMetrics::instance()->load_bytes->increment(_batching_bytes - new_bt_bytes); + _batching_rows = new_bt_rows; + _batching_bytes = new_bt_bytes; + } return Status::OK(); } @@ -251,6 +273,7 @@ void VRowDistribution::_reset_row_part_tablet_ids( row_ids.clear(); partition_ids.clear(); tablet_ids.clear(); + // This is important for performance. row_ids.reserve(rows); partition_ids.reserve(rows); tablet_ids.reserve(rows); @@ -260,7 +283,7 @@ void VRowDistribution::_reset_row_part_tablet_ids( Status VRowDistribution::generate_rows_distribution( vectorized::Block& input_block, std::shared_ptr& block, int64_t& filtered_rows, bool& has_filtered_rows, - std::vector& row_part_tablet_ids) { + std::vector& row_part_tablet_ids, int64_t& rows_stat_val) { auto input_rows = input_block.rows(); _reset_row_part_tablet_ids(row_part_tablet_ids, input_rows); @@ -269,6 +292,11 @@ Status VRowDistribution::generate_rows_distribution( RETURN_IF_ERROR(_block_convertor->validate_and_convert_block( _state, &input_block, block, *_vec_output_expr_ctxs, input_rows, has_filtered_rows)); + // batching block rows which need new partitions. deal together at finish. + if (!_batching_block) [[unlikely]] { + _batching_block = MutableBlock::create_unique(block->create_same_struct_block(0).release()); + } + _row_distribution_watch.start(); auto num_rows = block->rows(); _tablet_finder->filter_bitmap().Reset(num_rows); @@ -283,15 +311,17 @@ Status VRowDistribution::generate_rows_distribution( int partition_col_idx = -1; if (_vpartition->is_projection_partition()) { // calc the start value of missing partition ranges. + // in VNodeChannel's add_block. the spare columns will be erased. RETURN_IF_ERROR(part_func->execute(part_ctx.get(), block.get(), &partition_col_idx)); VLOG_DEBUG << "Partition-calculated block:" << block->dump_data(); // change the column to compare to transformed. _vpartition->set_transformed_slots({(uint16_t)partition_col_idx}); } - if (_vpartition->is_auto_partition()) { + if (_vpartition->is_auto_partition() && !_deal_batched) { RETURN_IF_ERROR(_generate_rows_distribution_for_auto_parititon( - block.get(), partition_col_idx, has_filtered_rows, row_part_tablet_ids)); + block.get(), partition_col_idx, has_filtered_rows, row_part_tablet_ids, + rows_stat_val)); } else { // not auto partition RETURN_IF_ERROR(_generate_rows_distribution_for_non_auto_parititon( block.get(), has_filtered_rows, row_part_tablet_ids)); diff --git a/be/src/vec/sink/vrow_distribution.h b/be/src/vec/sink/vrow_distribution.h index 3376eb5ab6fba2..77104ef26f48d1 100644 --- a/be/src/vec/sink/vrow_distribution.h +++ b/be/src/vec/sink/vrow_distribution.h @@ -22,12 +22,14 @@ #include #include +#include #include #include #include #include "common/status.h" #include "exec/tablet_info.h" +#include "runtime/runtime_state.h" #include "runtime/types.h" #include "util/runtime_profile.h" #include "util/stopwatch.hpp" @@ -50,42 +52,46 @@ class RowPartTabletIds { std::vector tablet_ids; }; -typedef Status (*OnPartitionsCreated)(void*, TCreatePartitionResult*); - -class VRowDistributionContext { -public: - RuntimeState* state = nullptr; - OlapTableBlockConvertor* block_convertor = nullptr; - OlapTabletFinder* tablet_finder = nullptr; - VOlapTablePartitionParam* vpartition = nullptr; - RuntimeProfile::Counter* add_partition_request_timer = nullptr; - int64_t txn_id = -1; - ObjectPool* pool; - OlapTableLocationParam* location; - const VExprContextSPtrs* vec_output_expr_ctxs; - OnPartitionsCreated on_partitions_created; - void* caller; - std::shared_ptr schema; -}; +// void* for caller +using CreatePartitionCallback = Status (*)(void*, TCreatePartitionResult*); class VRowDistribution { public: - VRowDistribution() {} - virtual ~VRowDistribution() {} - - void init(VRowDistributionContext* ctx) { - _state = ctx->state; - _block_convertor = ctx->block_convertor; - _tablet_finder = ctx->tablet_finder; - _vpartition = ctx->vpartition; - _add_partition_request_timer = ctx->add_partition_request_timer; - _txn_id = ctx->txn_id; - _pool = ctx->pool; - _location = ctx->location; - _vec_output_expr_ctxs = ctx->vec_output_expr_ctxs; - _on_partitions_created = ctx->on_partitions_created; - _caller = ctx->caller; - _schema = ctx->schema; + // only used to pass parameters for VRowDistribution + struct VRowDistributionContext { + RuntimeState* state; + OlapTableBlockConvertor* block_convertor; + OlapTabletFinder* tablet_finder; + VOlapTablePartitionParam* vpartition; + RuntimeProfile::Counter* add_partition_request_timer; + int64_t txn_id = -1; + ObjectPool* pool; + OlapTableLocationParam* location; + const VExprContextSPtrs* vec_output_expr_ctxs; + std::shared_ptr schema; + void* caller; + CreatePartitionCallback create_partition_callback; + }; + friend class VTabletWriter; + friend class VTabletWriterV2; + + VRowDistribution() = default; + virtual ~VRowDistribution() = default; + + void init(VRowDistributionContext ctx) { + _state = ctx.state; + _batch_size = std::max(_state->batch_size(), 8192); + _block_convertor = ctx.block_convertor; + _tablet_finder = ctx.tablet_finder; + _vpartition = ctx.vpartition; + _add_partition_request_timer = ctx.add_partition_request_timer; + _txn_id = ctx.txn_id; + _pool = ctx.pool; + _location = ctx.location; + _vec_output_expr_ctxs = ctx.vec_output_expr_ctxs; + _schema = ctx.schema; + _caller = ctx.caller; + _create_partition_callback = ctx.create_partition_callback; } Status open(RowDescriptor* output_row_desc) { @@ -111,15 +117,18 @@ class VRowDistribution { Status generate_rows_distribution(vectorized::Block& input_block, std::shared_ptr& block, int64_t& filtered_rows, bool& has_filtered_rows, - std::vector& row_part_tablet_ids); + std::vector& row_part_tablet_ids, + int64_t& rows_stat_val); + bool need_deal_batching() const { return _deal_batched && _batching_rows > 0; } + // create partitions when need for auto-partition table using #_partitions_need_create. + Status automatic_create_partition(); + void clear_batching_stats(); private: std::pair _get_partition_function(); - void _save_missing_values(vectorized::ColumnPtr col, vectorized::DataTypePtr value_type); - - // create partitions when need for auto-partition table using #_partitions_need_create. - Status _automatic_create_partition(); + Status _save_missing_values(vectorized::ColumnPtr col, vectorized::DataTypePtr value_type, + Block* block, std::vector filter); void _get_tablet_ids(vectorized::Block* block, int32_t index_idx, std::vector& tablet_ids); @@ -135,7 +144,7 @@ class VRowDistribution { Status _generate_rows_distribution_for_auto_parititon( vectorized::Block* block, int partition_col_idx, bool has_filtered_rows, - std::vector& row_part_tablet_ids); + std::vector& row_part_tablet_ids, int64_t& rows_stat_val); Status _generate_rows_distribution_for_non_auto_parititon( vectorized::Block* block, bool has_filtered_rows, @@ -144,11 +153,16 @@ class VRowDistribution { void _reset_row_part_tablet_ids(std::vector& row_part_tablet_ids, int64_t rows); -private: RuntimeState* _state = nullptr; + int _batch_size = 0; - // support only one partition column now - std::vector> _partitions_need_create; + // for auto partitions + std::vector> + _partitions_need_create; // support only one partition column now + std::unique_ptr _batching_block; + bool _deal_batched = false; // If true, send batched block before any block's append. + size_t _batching_rows = 0, _batching_bytes = 0; + std::set _deduper; MonotonicStopWatch _row_distribution_watch; OlapTableBlockConvertor* _block_convertor = nullptr; @@ -158,10 +172,9 @@ class VRowDistribution { int64_t _txn_id = -1; ObjectPool* _pool; OlapTableLocationParam* _location = nullptr; - // std::function _on_partition_created; // int64_t _number_output_rows = 0; const VExprContextSPtrs* _vec_output_expr_ctxs; - OnPartitionsCreated _on_partitions_created = nullptr; + CreatePartitionCallback _create_partition_callback = nullptr; void* _caller; std::shared_ptr _schema; diff --git a/be/src/vec/sink/vtablet_finder.h b/be/src/vec/sink/vtablet_finder.h index bccdc39a0669f6..375928473303b6 100644 --- a/be/src/vec/sink/vtablet_finder.h +++ b/be/src/vec/sink/vtablet_finder.h @@ -45,7 +45,7 @@ class OlapTabletFinder { Status find_tablets(RuntimeState* state, vectorized::Block* block, int rows, std::vector& partitions, std::vector& tablet_index, bool& filtered, - std::vector& is_continue, std::vector* miss_rows = nullptr); + std::vector& skip, std::vector* miss_rows = nullptr); bool is_find_tablet_every_sink() { return _find_tablet_mode == FindTabletMode::FIND_TABLET_EVERY_SINK; diff --git a/be/src/vec/sink/writer/async_result_writer.cpp b/be/src/vec/sink/writer/async_result_writer.cpp index d1fc46dc8d8815..8edde60adb40b4 100644 --- a/be/src/vec/sink/writer/async_result_writer.cpp +++ b/be/src/vec/sink/writer/async_result_writer.cpp @@ -86,11 +86,6 @@ std::unique_ptr AsyncResultWriter::_get_block_from_queue() { return block; } -void AsyncResultWriter::_return_block_to_queue(std::unique_ptr add_block) { - std::lock_guard l(_m); - _data_queue.emplace_back(std::move(add_block)); -} - void AsyncResultWriter::start_writer(RuntimeState* state, RuntimeProfile* profile) { static_cast(ExecEnv::GetInstance()->fragment_mgr()->get_thread_pool()->submit_func( [this, state, profile]() { this->process_block(state, profile); })); @@ -117,10 +112,7 @@ void AsyncResultWriter::process_block(RuntimeState* state, RuntimeProfile* profi auto block = _get_block_from_queue(); auto status = write(block); - if (status.is()) { - _return_block_to_queue(std::move(block)); - continue; - } else if (UNLIKELY(!status.ok())) { + if (!status.ok()) [[unlikely]] { std::unique_lock l(_m); _writer_status = status; if (_dependency && _is_finished()) { diff --git a/be/src/vec/sink/writer/async_result_writer.h b/be/src/vec/sink/writer/async_result_writer.h index a50b9296c7fbf4..0a217b34e6bb59 100644 --- a/be/src/vec/sink/writer/async_result_writer.h +++ b/be/src/vec/sink/writer/async_result_writer.h @@ -105,7 +105,6 @@ class AsyncResultWriter : public ResultWriter { [[nodiscard]] bool _is_finished() const { return !_writer_status.ok() || _eos; } std::unique_ptr _get_block_from_queue(); - void _return_block_to_queue(std::unique_ptr); static constexpr auto QUEUE_SIZE = 3; std::mutex _m; diff --git a/be/src/vec/sink/writer/vtablet_writer.cpp b/be/src/vec/sink/writer/vtablet_writer.cpp index 7138993732b7c5..1639703d98699f 100644 --- a/be/src/vec/sink/writer/vtablet_writer.cpp +++ b/be/src/vec/sink/writer/vtablet_writer.cpp @@ -46,11 +46,13 @@ #include #include +#include "common/config.h" #include "olap/wal_manager.h" #include "util/runtime_profile.h" #include "vec/data_types/data_type.h" #include "vec/exprs/vexpr_fwd.h" #include "vec/runtime/vdatetime_value.h" +#include "vec/sink/vrow_distribution.h" #include "vec/sink/vtablet_sink.h" #ifdef DEBUG @@ -110,9 +112,9 @@ bvar::PerSecond> g_sink_write_rows_per_second("sink_through Status IndexChannel::init(RuntimeState* state, const std::vector& tablets) { SCOPED_CONSUME_MEM_TRACKER(_index_channel_tracker.get()); - for (auto& tablet : tablets) { + for (const auto& tablet : tablets) { // First find the location BEs of this tablet - auto tablet_locations = _parent->_location->find_tablet(tablet.tablet_id); + auto* tablet_locations = _parent->_location->find_tablet(tablet.tablet_id); if (tablet_locations == nullptr) { return Status::InternalError("unknown tablet, tablet_id={}", tablet.tablet_id); } @@ -133,7 +135,7 @@ Status IndexChannel::init(RuntimeState* state, const std::vectoradd_tablet(tablet); if (_parent->_write_single_replica) { - auto slave_location = _parent->_slave_location->find_tablet(tablet.tablet_id); + auto* slave_location = _parent->_slave_location->find_tablet(tablet.tablet_id); if (slave_location != nullptr) { channel->add_slave_tablet_nodes(tablet.tablet_id, slave_location->node_ids); } @@ -267,6 +269,22 @@ Status IndexChannel::check_tablet_filtered_rows_consistency() { return Status::OK(); } +static Status none_of(std::initializer_list vars) { + bool none = std::none_of(vars.begin(), vars.end(), [](bool var) { return var; }); + Status st = Status::OK(); + if (!none) { + std::string vars_str; + std::for_each(vars.begin(), vars.end(), + [&vars_str](bool var) -> void { vars_str += (var ? "1/" : "0/"); }); + if (!vars_str.empty()) { + vars_str.pop_back(); // 0/1/0/ -> 0/1/0 + } + st = Status::Uninitialized(vars_str); + } + + return st; +} + VNodeChannel::VNodeChannel(VTabletWriter* parent, IndexChannel* index_channel, int64_t node_id, bool is_incremental) : _parent(parent), @@ -296,7 +314,7 @@ Status VNodeChannel::init(RuntimeState* state) { _tuple_desc = _parent->_output_tuple_desc; _state = state; // get corresponding BE node. - auto node = _parent->_nodes_info->find_node(_node_id); + const auto* node = _parent->_nodes_info->find_node(_node_id); if (node == nullptr) { _cancelled = true; return Status::InternalError("unknown node id, id={}", _node_id); @@ -306,7 +324,7 @@ Status VNodeChannel::init(RuntimeState* state) { _load_info = "load_id=" + print_id(_parent->_load_id) + ", txn_id=" + std::to_string(_parent->_txn_id); - _row_desc.reset(new RowDescriptor(_tuple_desc, false)); + _row_desc = std::make_unique(_tuple_desc, false); _batch_size = state->batch_size(); _stub = state->exec_env()->brpc_internal_client_cache()->get_client(_node_info.host, @@ -352,7 +370,7 @@ void VNodeChannel::_open_internal(bool is_incremental) { if (deduper.contains(tablet.tablet_id)) { continue; } - auto ptablet = request->add_tablets(); + auto* ptablet = request->add_tablets(); ptablet->set_partition_id(tablet.partition_id); ptablet->set_tablet_id(tablet.tablet_id); deduper.insert(tablet.tablet_id); @@ -556,22 +574,6 @@ void VNodeChannel::_cancel_with_msg(const std::string& msg) { _cancelled = true; } -Status VNodeChannel::none_of(std::initializer_list vars) { - bool none = std::none_of(vars.begin(), vars.end(), [](bool var) { return var; }); - Status st = Status::OK(); - if (!none) { - std::string vars_str; - std::for_each(vars.begin(), vars.end(), - [&vars_str](bool var) -> void { vars_str += (var ? "1/" : "0/"); }); - if (!vars_str.empty()) { - vars_str.pop_back(); // 0/1/0/ -> 0/1/0 - } - st = Status::Uninitialized(vars_str); - } - - return st; -} - void VNodeChannel::try_send_pending_block(RuntimeState* state) { SCOPED_ATTACH_TASK(state); SCOPED_CONSUME_MEM_TRACKER(_node_channel_tracker); @@ -608,7 +610,7 @@ void VNodeChannel::try_send_pending_block(RuntimeState* state) { _send_block_callback->clear_in_flight(); return; } - if (compressed_bytes >= double(config::brpc_max_body_size) * 0.95f) { + if (compressed_bytes >= double(config::brpc_max_body_size) * 0.95F) { LOG(WARNING) << "send block too large, this rpc may failed. send size: " << compressed_bytes << ", threshold: " << config::brpc_max_body_size << ", " << channel_info(); @@ -640,12 +642,10 @@ void VNodeChannel::try_send_pending_block(RuntimeState* state) { request->set_write_single_replica(false); if (_parent->_write_single_replica) { request->set_write_single_replica(true); - for (std::unordered_map>::iterator iter = - _slave_tablet_nodes.begin(); - iter != _slave_tablet_nodes.end(); iter++) { + for (auto& _slave_tablet_node : _slave_tablet_nodes) { PSlaveTabletNodes slave_tablet_nodes; - for (auto node_id : iter->second) { - auto node = _parent->_nodes_info->find_node(node_id); + for (auto node_id : _slave_tablet_node.second) { + const auto* node = _parent->_nodes_info->find_node(node_id); if (node == nullptr) { return; } @@ -655,7 +655,8 @@ void VNodeChannel::try_send_pending_block(RuntimeState* state) { pnode->set_host(node->host); pnode->set_async_internal_port(node->brpc_port); } - request->mutable_slave_tablet_nodes()->insert({iter->first, slave_tablet_nodes}); + request->mutable_slave_tablet_nodes()->insert( + {_slave_tablet_node.first, slave_tablet_nodes}); } } @@ -722,7 +723,7 @@ void VNodeChannel::_add_block_success_callback(const PTabletWriterAddBlockResult Status status(Status::create(result.status())); if (status.ok()) { // if has error tablet, handle them first - for (auto& error : result.tablet_errors()) { + for (const auto& error : result.tablet_errors()) { _index_channel->mark_as_failed(this, "tablet error: " + error.msg(), error.tablet_id()); } @@ -730,7 +731,7 @@ void VNodeChannel::_add_block_success_callback(const PTabletWriterAddBlockResult if (!st.ok()) { _cancel_with_msg(st.to_string()); } else if (is_last_rpc) { - for (auto& tablet : result.tablet_vec()) { + for (const auto& tablet : result.tablet_vec()) { TTabletCommitInfo commit_info; commit_info.tabletId = tablet.tablet_id(); commit_info.backendId = _node_id; @@ -748,7 +749,7 @@ void VNodeChannel::_add_block_success_callback(const PTabletWriterAddBlockResult << ", host: " << this->host() << ", txn_id=" << _parent->_txn_id; } if (_parent->_write_single_replica) { - for (auto& tablet_slave_node_ids : result.success_slave_tablet_node_ids()) { + for (const auto& tablet_slave_node_ids : result.success_slave_tablet_node_ids()) { for (auto slave_node_id : tablet_slave_node_ids.second.slave_node_ids()) { TTabletCommitInfo commit_info; commit_info.tabletId = tablet_slave_node_ids.first; @@ -776,7 +777,7 @@ void VNodeChannel::_add_block_success_callback(const PTabletWriterAddBlockResult } if (result.has_load_channel_profile()) { TRuntimeProfileTree tprofile; - const uint8_t* buf = (const uint8_t*)result.load_channel_profile().data(); + const auto* buf = (const uint8_t*)result.load_channel_profile().data(); uint32_t len = result.load_channel_profile().size(); auto st = deserialize_thrift_msg(buf, &len, false, &tprofile); if (st.ok()) { @@ -944,6 +945,11 @@ void VTabletWriter::_send_batch_process() { SCOPED_ATTACH_TASK(_state); SCOPED_CONSUME_MEM_TRACKER(_mem_tracker); + int sleep_time = config::olap_table_sink_send_interval_microseconds * + (_vpartition->is_auto_partition() + ? config::olap_table_sink_send_interval_auto_partition_factor + : 1); + while (true) { // incremental open will temporarily make channels into abnormal state. stop checking when this. std::unique_lock l(_stop_check_channel); @@ -986,7 +992,7 @@ void VTabletWriter::_send_batch_process() { return; } } - bthread_usleep(config::olap_table_sink_send_interval_ms * 1000); + bthread_usleep(sleep_time); } } @@ -1059,25 +1065,20 @@ static Status on_partitions_created(void* writer, TCreatePartitionResult* result } Status VTabletWriter::_init_row_distribution() { - VRowDistributionContext ctx; - - ctx.state = _state; - ctx.block_convertor = _block_convertor.get(); - ctx.tablet_finder = _tablet_finder.get(); - ctx.vpartition = _vpartition; - ctx.add_partition_request_timer = _add_partition_request_timer; - ctx.txn_id = _txn_id; - ctx.pool = _pool; - ctx.location = _location; - ctx.vec_output_expr_ctxs = &_vec_output_expr_ctxs; - ctx.on_partitions_created = &vectorized::on_partitions_created; - ctx.caller = (void*)this; - ctx.schema = _schema; - - _row_distribution.init(&ctx); - - RETURN_IF_ERROR(_row_distribution.open(_output_row_desc)); - return Status::OK(); + _row_distribution.init({.state = _state, + .block_convertor = _block_convertor.get(), + .tablet_finder = _tablet_finder.get(), + .vpartition = _vpartition, + .add_partition_request_timer = _add_partition_request_timer, + .txn_id = _txn_id, + .pool = _pool, + .location = _location, + .vec_output_expr_ctxs = &_vec_output_expr_ctxs, + .schema = _schema, + .caller = this, + .create_partition_callback = &vectorized::on_partitions_created}); + + return _row_distribution.open(_output_row_desc); } Status VTabletWriter::_init(RuntimeState* state, RuntimeProfile* profile) { @@ -1198,7 +1199,7 @@ Status VTabletWriter::_init(RuntimeState* state, RuntimeProfile* profile) { for (int i = 0; i < _schema->indexes().size(); ++i) { // collect all tablets belong to this rollup std::vector tablets; - auto index = _schema->indexes()[i]; + auto* index = _schema->indexes()[i]; for (const auto& part : partitions) { for (const auto& tablet : part->indexes[i].tablets) { TTabletWithPartition tablet_with_partition; @@ -1235,7 +1236,7 @@ Status VTabletWriter::_incremental_open_node_channel( for (int i = 0; i < _schema->indexes().size(); ++i) { const OlapTableIndexSchema* index = _schema->indexes()[i]; std::vector tablets; - for (auto& t_part : partitions) { + for (const auto& t_part : partitions) { VOlapTablePartition* part = nullptr; RETURN_IF_ERROR(_vpartition->generate_partition_from(t_part, part)); for (const auto& tablet : part->indexes[i].tablets) { @@ -1279,7 +1280,7 @@ Status VTabletWriter::_incremental_open_node_channel( return Status::OK(); } -Status VTabletWriter::_cancel_channel_and_check_intolerable_failure( +static Status cancel_channel_and_check_intolerable_failure( Status status, const std::string& err_msg, const std::shared_ptr ich, const std::shared_ptr nch) { LOG(WARNING) << nch->channel_info() << ", close channel failed, err: " << err_msg; @@ -1311,10 +1312,38 @@ void VTabletWriter::_cancel_all_channel(Status status) { print_id(_load_id), _txn_id, status); } +Status VTabletWriter::_send_new_partition_batch() { + if (_row_distribution.need_deal_batching()) { // maybe try_close more than 1 time + RETURN_IF_ERROR(_row_distribution.automatic_create_partition()); + + Block tmp_block = _row_distribution._batching_block->to_block(); // Borrow out, for lval ref + + // these order is only. + // 1. clear batching stats(and flag goes true) so that we won't make a new batching process in dealing batched block. + // 2. deal batched block + // 3. now reuse the column of lval block. cuz append_block doesn't real adjust it. it generate a new block from that. + _row_distribution.clear_batching_stats(); + RETURN_IF_ERROR(this->append_block(tmp_block)); + _row_distribution._batching_block->set_mutable_columns( + tmp_block.mutate_columns()); // Recovery back + _row_distribution._batching_block->clear_column_data(); + _row_distribution._deal_batched = false; + } + return Status::OK(); +} + Status VTabletWriter::try_close(RuntimeState* state, Status exec_status) { SCOPED_TIMER(_close_timer); Status status = exec_status; - _try_close = true; + + // must before set _try_close + if (status.ok()) { + SCOPED_TIMER(_profile->total_time_counter()); + _row_distribution._deal_batched = true; + status = _send_new_partition_batch(); + } + + _try_close = true; // will stop periodic thread if (status.ok()) { // only if status is ok can we call this _profile->total_time_counter(). // if status is not ok, this sink may not be prepared, so that _profile is null @@ -1325,14 +1354,14 @@ Status VTabletWriter::try_close(RuntimeState* state, Status exec_status) { break; } index_channel->for_each_node_channel( - [this, &index_channel, &status](const std::shared_ptr& ch) { + [&index_channel, &status](const std::shared_ptr& ch) { if (!status.ok() || ch->is_closed()) { return; } // only first try close, all node channels will mark_close() ch->mark_close(); if (ch->is_cancelled()) { - status = this->_cancel_channel_and_check_intolerable_failure( + status = cancel_channel_and_check_intolerable_failure( status, ch->get_cancel_msg(), index_channel, ch); } }); @@ -1413,7 +1442,7 @@ Status VTabletWriter::close(Status exec_status) { // no pipeline, close may block waiting. auto s = ch->close_wait(_state); if (!s.ok()) { - status = this->_cancel_channel_and_check_intolerable_failure( + status = cancel_channel_and_check_intolerable_failure( status, s.to_string(), index_channel, ch); } ch->time_report(&node_add_batch_counter_map, &serialize_batch_ns, @@ -1572,6 +1601,9 @@ Status VTabletWriter::append_block(doris::vectorized::Block& input_block) { return status; } + // check out of limit + RETURN_IF_ERROR(_send_new_partition_batch()); + auto rows = input_block.rows(); auto bytes = input_block.bytes(); if (UNLIKELY(rows == 0)) { @@ -1584,7 +1616,8 @@ Status VTabletWriter::append_block(doris::vectorized::Block& input_block) { int64_t filtered_rows = 0; RETURN_IF_ERROR(_row_distribution.generate_rows_distribution( - input_block, block, filtered_rows, has_filtered_rows, _row_part_tablet_ids)); + input_block, block, filtered_rows, has_filtered_rows, _row_part_tablet_ids, + _number_input_rows)); ChannelDistributionPayloadVec channel_to_payload; @@ -1624,11 +1657,7 @@ Status VTabletWriter::append_block(doris::vectorized::Block& input_block) { block.get(), _block_convertor.get(), _tablet_finder.get())); } - // TODO: Before load, we need to projection unuseful column - // auto slots = _schema->tuple_desc()->slots(); - // for (auto desc : slots) { - // desc->col_pos(); - // } + // Add block to node channel for (size_t i = 0; i < _channels.size(); i++) { for (const auto& entry : channel_to_payload[i]) { diff --git a/be/src/vec/sink/writer/vtablet_writer.h b/be/src/vec/sink/writer/vtablet_writer.h index e9f6ae13f437dd..c6190c2675b340 100644 --- a/be/src/vec/sink/writer/vtablet_writer.h +++ b/be/src/vec/sink/writer/vtablet_writer.h @@ -29,15 +29,13 @@ #include #include #include -#include -#include - -#include #include "olap/wal_writer.h" #include "vwal_writer.h" // IWYU pragma: no_include +#include #include // IWYU pragma: keep +#include #include #include #include @@ -60,6 +58,7 @@ #include "exec/data_sink.h" #include "exec/tablet_info.h" #include "gutil/ref_counted.h" +#include "olap/wal_writer.h" #include "runtime/decimalv2_value.h" #include "runtime/exec_env.h" #include "runtime/memory/mem_tracker.h" @@ -226,7 +225,7 @@ class VNodeChannel { void add_tablet(const TTabletWithPartition& tablet) { _all_tablets.emplace_back(tablet); } std::string debug_tablets() const { std::stringstream ss; - for (auto& tab : _all_tablets) { + for (const auto& tab : _all_tablets) { tab.printTo(ss); ss << '\n'; } @@ -272,7 +271,7 @@ class VNodeChannel { ss << "close wait failed coz rpc error"; { std::lock_guard l(_cancel_msg_lock); - if (_cancel_msg != "") { + if (!_cancel_msg.empty()) { ss << ". " << _cancel_msg; } } @@ -309,8 +308,6 @@ class VNodeChannel { std::string host() const { return _node_info.host; } std::string name() const { return _name; } - Status none_of(std::initializer_list vars); - std::string channel_info() const { return fmt::format("{}, {}, node={}:{}", _name, _load_info, _node_info.host, _node_info.brpc_port); @@ -418,9 +415,8 @@ class VNodeChannel { // an IndexChannel is related to specific table and its rollup and mv class IndexChannel { public: - IndexChannel(VTabletWriter* parent, int64_t index_id, - const vectorized::VExprContextSPtr& where_clause) - : _parent(parent), _index_id(index_id), _where_clause(where_clause) { + IndexChannel(VTabletWriter* parent, int64_t index_id, vectorized::VExprContextSPtr where_clause) + : _parent(parent), _index_id(index_id), _where_clause(std::move(where_clause)) { _index_channel_tracker = std::make_unique("IndexChannel:indexID=" + std::to_string(_index_id)); } @@ -447,7 +443,7 @@ class IndexChannel { size_t get_pending_bytes() const { size_t mem_consumption = 0; - for (auto& kv : _node_channels) { + for (const auto& kv : _node_channels) { mem_consumption += kv.second->get_pending_bytes(); } return mem_consumption; @@ -542,6 +538,8 @@ class VTabletWriter final : public AsyncResultWriter { Status on_partitions_created(TCreatePartitionResult* result); + Status _send_new_partition_batch(); + private: friend class VNodeChannel; friend class IndexChannel; @@ -560,18 +558,8 @@ class VTabletWriter final : public AsyncResultWriter { void _generate_index_channels_payloads(std::vector& row_part_tablet_ids, ChannelDistributionPayloadVec& payload); - Status _cancel_channel_and_check_intolerable_failure(Status status, const std::string& err_msg, - const std::shared_ptr ich, - const std::shared_ptr nch); - void _cancel_all_channel(Status status); - void _save_missing_values(vectorized::ColumnPtr col, vectorized::DataTypePtr value_type, - std::vector filter); - - // create partitions when need for auto-partition table using #_partitions_need_create. - Status _automatic_create_partition(); - Status _incremental_open_node_channel(const std::vector& partitions); TDataSink _t_sink; diff --git a/be/src/vec/sink/writer/vtablet_writer_v2.cpp b/be/src/vec/sink/writer/vtablet_writer_v2.cpp index 8bc65a4cba470a..fe8be28ec3b0a5 100644 --- a/be/src/vec/sink/writer/vtablet_writer_v2.cpp +++ b/be/src/vec/sink/writer/vtablet_writer_v2.cpp @@ -53,9 +53,7 @@ #include "vec/sink/vtablet_block_convertor.h" #include "vec/sink/vtablet_finder.h" -namespace doris { - -namespace vectorized { +namespace doris::vectorized { VTabletWriterV2::VTabletWriterV2(const TDataSink& t_sink, const VExprContextSPtrs& output_exprs) : AsyncResultWriter(output_exprs), _t_sink(t_sink) { @@ -121,26 +119,20 @@ Status VTabletWriterV2::_incremental_open_streams( } Status VTabletWriterV2::_init_row_distribution() { - VRowDistributionContext ctx; - - ctx.state = _state; - ctx.block_convertor = _block_convertor.get(); - ctx.tablet_finder = _tablet_finder.get(); - ctx.vpartition = _vpartition; - ctx.add_partition_request_timer = _add_partition_request_timer; - ctx.txn_id = _txn_id; - ctx.pool = _pool; - ctx.location = _location; - ctx.vec_output_expr_ctxs = &_vec_output_expr_ctxs; - ctx.on_partitions_created = &vectorized::on_partitions_created; - ctx.caller = (void*)this; - ctx.schema = _schema; - - _row_distribution.init(&ctx); - - RETURN_IF_ERROR(_row_distribution.open(_output_row_desc)); - - return Status::OK(); + _row_distribution.init({.state = _state, + .block_convertor = _block_convertor.get(), + .tablet_finder = _tablet_finder.get(), + .vpartition = _vpartition, + .add_partition_request_timer = _add_partition_request_timer, + .txn_id = _txn_id, + .pool = _pool, + .location = _location, + .vec_output_expr_ctxs = &_vec_output_expr_ctxs, + .schema = _schema, + .caller = (void*)this, + .create_partition_callback = &vectorized::on_partitions_created}); + + return _row_distribution.open(_output_row_desc); } Status VTabletWriterV2::init_properties(ObjectPool* pool, bool group_commit) { @@ -331,11 +323,11 @@ void VTabletWriterV2::_generate_rows_for_tablet(std::vector& r Status VTabletWriterV2::_select_streams(int64_t tablet_id, int64_t partition_id, int64_t index_id, Streams& streams) { - auto location = _location->find_tablet(tablet_id); + const auto* location = _location->find_tablet(tablet_id); if (location == nullptr) { return Status::InternalError("unknown tablet location, tablet id = {}", tablet_id); } - for (auto& node_id : location->node_ids) { + for (const auto& node_id : location->node_ids) { PTabletID tablet; tablet.set_partition_id(partition_id); tablet.set_index_id(index_id); @@ -356,6 +348,9 @@ Status VTabletWriterV2::append_block(Block& input_block) { return status; } + // check out of limit + RETURN_IF_ERROR(_send_new_partition_batch()); + auto input_rows = input_block.rows(); auto input_bytes = input_block.bytes(); if (UNLIKELY(input_rows == 0)) { @@ -379,7 +374,8 @@ Status VTabletWriterV2::append_block(Block& input_block) { std::shared_ptr block; RETURN_IF_ERROR(_row_distribution.generate_rows_distribution( - input_block, block, filtered_rows, has_filtered_rows, _row_part_tablet_ids)); + input_block, block, filtered_rows, has_filtered_rows, _row_part_tablet_ids, + _number_input_rows)); RowsForTablet rows_for_tablet; _generate_rows_for_tablet(_row_part_tablet_ids, rows_for_tablet); @@ -409,7 +405,7 @@ Status VTabletWriterV2::_write_memtable(std::shared_ptr block .is_high_priority = _is_high_priority, .write_file_cache = _write_file_cache, }; - for (auto& index : _schema->indexes()) { + for (const auto& index : _schema->indexes()) { if (index->index_id == rows.index_id) { req.slots = &index->slots; req.schema_hash = index->schema_hash; @@ -440,6 +436,26 @@ Status VTabletWriterV2::_cancel(Status status) { return Status::OK(); } +Status VTabletWriterV2::_send_new_partition_batch() { + if (_row_distribution.need_deal_batching()) { // maybe try_close more than 1 time + RETURN_IF_ERROR(_row_distribution.automatic_create_partition()); + + Block tmp_block = _row_distribution._batching_block->to_block(); // Borrow out, for lval ref + + // these order is only. + // 1. clear batching stats(and flag goes true) so that we won't make a new batching process in dealing batched block. + // 2. deal batched block + // 3. now reuse the column of lval block. cuz append_block doesn't real adjust it. it generate a new block from that. + _row_distribution.clear_batching_stats(); + RETURN_IF_ERROR(this->append_block(tmp_block)); + _row_distribution._batching_block->set_mutable_columns( + tmp_block.mutate_columns()); // Recovery back + _row_distribution._batching_block->clear_column_data(); + _row_distribution._deal_batched = false; + } + return Status::OK(); +} + Status VTabletWriterV2::close(Status exec_status) { std::lock_guard close_lock(_close_mutex); if (_is_closed) { @@ -447,6 +463,13 @@ Status VTabletWriterV2::close(Status exec_status) { } SCOPED_TIMER(_close_timer); Status status = exec_status; + + if (status.ok()) { + SCOPED_TIMER(_profile->total_time_counter()); + _row_distribution._deal_batched = true; + status = _send_new_partition_batch(); + } + if (status.ok()) { // only if status is ok can we call this _profile->total_time_counter(). // if status is not ok, this sink may not be prepared, so that _profile is null @@ -538,5 +561,4 @@ Status VTabletWriterV2::_close_load(const Streams& streams) { return Status::OK(); } -} // namespace vectorized -} // namespace doris +} // namespace doris::vectorized diff --git a/be/src/vec/sink/writer/vtablet_writer_v2.h b/be/src/vec/sink/writer/vtablet_writer_v2.h index d4ccf7b6523efb..3ce291eb9acb47 100644 --- a/be/src/vec/sink/writer/vtablet_writer_v2.h +++ b/be/src/vec/sink/writer/vtablet_writer_v2.h @@ -130,6 +130,8 @@ class VTabletWriterV2 final : public AsyncResultWriter { Status _incremental_open_streams(const std::vector& partitions); + Status _send_new_partition_batch(); + void _build_tablet_node_mapping(); void _generate_rows_for_tablet(std::vector& row_part_tablet_ids, diff --git a/docs/en/docs/admin-manual/config/be-config.md b/docs/en/docs/admin-manual/config/be-config.md index d3192d924521e8..2250c06115ec03 100644 --- a/docs/en/docs/admin-manual/config/be-config.md +++ b/docs/en/docs/admin-manual/config/be-config.md @@ -1500,3 +1500,13 @@ Indicates how many tablets failed to load in the data directory. At the same tim * Description: BE Whether to enable the use of java-jni. When enabled, mutual calls between c++ and java are allowed. Currently supports hudi, java-udf, jdbc, max-compute, paimon, preload, avro * Default value: true + +#### `olap_table_sink_send_interval_microseconds` + +* Description: While loading data, there's a polling thread keep sending data to corresponding BE from Coordinator's sink node. This thread will check whether there's data to send every `olap_table_sink_send_interval_microseconds` microseconds. +* Default value: 1000 + +#### `olap_table_sink_send_interval_auto_partition_factor` + +* Description: If we load data to a table which enabled auto partition. the interval of `olap_table_sink_send_interval_microseconds` is too slow. In that case the real interval will multiply this factor. +* Default value: 0.001 diff --git a/docs/en/docs/advanced/partition/auto-partition.md b/docs/en/docs/advanced/partition/auto-partition.md index 3e6fc6dc8e8f1d..f601445f874b83 100644 --- a/docs/en/docs/advanced/partition/auto-partition.md +++ b/docs/en/docs/advanced/partition/auto-partition.md @@ -38,19 +38,19 @@ When building a table, use the following syntax to populate [CREATE-TABLE](../.. 1. AUTO RANGE PARTITION: - ```SQL + ```sql AUTO PARTITION BY RANGE FUNC_CALL_EXPR ( ) ``` where - ```SQL + ```sql FUNC_CALL_EXPR ::= date_trunc ( , '' ) ``` 2. AUTO LIST PARTITION: - ```SQL + ```sql AUTO PARTITION BY LIST(`partition_col`) ( ) @@ -60,7 +60,7 @@ When building a table, use the following syntax to populate [CREATE-TABLE](../.. 1. AUTO RANGE PARTITION - ```SQL + ```sql CREATE TABLE `${tblDate}` ( `TIME_STAMP` datev2 NOT NULL COMMENT 'Date of collection' ) ENGINE=OLAP @@ -76,7 +76,7 @@ When building a table, use the following syntax to populate [CREATE-TABLE](../.. 2. AUTO LIST PARTITION - ```SQL + ```sql CREATE TABLE `${tblName1}` ( `str` varchar not null ) ENGINE=OLAP @@ -144,7 +144,7 @@ PROPERTIES ( The table stores a large amount of business history data, partitioned based on the date the transaction occurred. As you can see when building the table, we need to manually create the partitions in advance. If the data range of the partitioned columns changes, for example, 2022 is added to the above table, we need to create a partition by [ALTER-TABLE-PARTITION](../../sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-PARTITION.md) to make changes to the table partition. After using AUTO PARTITION, the table DDL can be changed to: -```SQL +```sql CREATE TABLE `DAILY_TRADE_VALUE` ( `TRADE_DATE` datev2 NULL, @@ -162,13 +162,13 @@ PROPERTIES ( ``` At this point the new table does not have a default partition: -```SQL +```sql mysql> show partitions from `DAILY_TRADE_VALUE`; Empty set (0.12 sec) ``` After inserting the data and then viewing it again, we could found that the table has been created with corresponding partitions: -```SQL +```sql mysql> insert into `DAILY_TRADE_VALUE` values ('2012-12-13', 1), ('2008-02-03', 2), ('2014-11-11', 3); Query OK, 3 rows affected (0.88 sec) {'label':'insert_754e2a3926a345ea_854793fb2638f0ec', 'status':'VISIBLE', 'txnId':'20014'} @@ -188,3 +188,4 @@ mysql> show partitions from `DAILY_TRADE_VALUE`; - If a partition is created during the insertion or importation of data and the process eventually fails, the created partition is not automatically deleted. - Tables that use AUTO PARTITION only have their partitions created automatically instead of manually. The original use of the table and the partitions it creates is the same as for non-AUTO PARTITION tables or partitions. +- When importing data to a table with AUTO PARTITION enabled, the polling interval for data sent by the Coordinator is different from that of a normal table. For details, see `olap_table_sink_send_interval_auto_partition_factor` in [BE Configuration](../../admin-manual/config/be-config.md). diff --git a/docs/zh-CN/docs/admin-manual/config/be-config.md b/docs/zh-CN/docs/admin-manual/config/be-config.md index 3a94883804da51..586958e3a6f737 100644 --- a/docs/zh-CN/docs/admin-manual/config/be-config.md +++ b/docs/zh-CN/docs/admin-manual/config/be-config.md @@ -1527,5 +1527,15 @@ load tablets from header failed, failed tablets size: xxx, path=xxx #### `enable_java_support` -* Description: BE 是否开启使用java-jni,开启后允许 c++ 与 java 之间的相互调用。目前已经支持hudi、java-udf、jdbc、max-compute、paimon、preload、avro -* Default value: true +* 描述: BE 是否开启使用java-jni,开启后允许 c++ 与 java 之间的相互调用。目前已经支持hudi、java-udf、jdbc、max-compute、paimon、preload、avro +* 默认值: true + +#### `olap_table_sink_send_interval_microseconds`. + +* 描述: 数据导入时,Coordinator 的 sink 节点有一个轮询线程持续向对应BE发送数据。该线程将每隔 `olap_table_sink_send_interval_microseconds` 微秒检查是否有数据要发送。 +* 默认值:1000 + +#### `olap_table_sink_send_interval_auto_partition_factor`. + +* 描述: 如果我们向一个启用了自动分区的表导入数据,那么 `olap_table_sink_send_interval_microseconds` 的时间间隔就会太慢。在这种情况下,实际间隔将乘以该系数。 +* 默认值:0.001 diff --git a/docs/zh-CN/docs/advanced/partition/auto-partition.md b/docs/zh-CN/docs/advanced/partition/auto-partition.md index 42c07581c2ef6f..ef0da5032dede8 100644 --- a/docs/zh-CN/docs/advanced/partition/auto-partition.md +++ b/docs/zh-CN/docs/advanced/partition/auto-partition.md @@ -38,19 +38,19 @@ under the License. 1. AUTO RANGE PARTITION: - ```SQL + ```sql AUTO PARTITION BY RANGE FUNC_CALL_EXPR ( ) ``` 其中 - ```SQL + ```sql FUNC_CALL_EXPR ::= date_trunc ( , '' ) ``` 2. AUTO LIST PARTITION: - ```SQL + ```sql AUTO PARTITION BY LIST(`partition_col`) ( ) @@ -60,7 +60,7 @@ under the License. 1. AUTO RANGE PARTITION - ```SQL + ```sql CREATE TABLE `${tblDate}` ( `TIME_STAMP` datev2 NOT NULL COMMENT '采集日期' ) ENGINE=OLAP @@ -76,7 +76,7 @@ under the License. 2. AUTO LIST PARTITION - ```SQL + ```sql CREATE TABLE `${tblName1}` ( `str` varchar not null ) ENGINE=OLAP @@ -144,7 +144,7 @@ PROPERTIES ( 该表内存储了大量业务历史数据,依据交易发生的日期进行分区。可以看到在建表时,我们需要预先手动创建分区。如果分区列的数据范围发生变化,例如上表中增加了2022年的数据,则我们需要通过[ALTER-TABLE-PARTITION](../../sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-PARTITION.md)对表的分区进行更改。在使用AUTO PARTITION后,该表DDL可以改为: -```SQL +```sql CREATE TABLE `DAILY_TRADE_VALUE` ( `TRADE_DATE` datev2 NULL COMMENT '交易日期', @@ -162,13 +162,13 @@ PROPERTIES ( ``` 此时新表没有默认分区: -```SQL +```sql mysql> show partitions from `DAILY_TRADE_VALUE`; Empty set (0.12 sec) ``` 经过插入数据后再查看,发现该表已经创建了对应的分区: -```SQL +```sql mysql> insert into `DAILY_TRADE_VALUE` values ('2012-12-13', 1), ('2008-02-03', 2), ('2014-11-11', 3); Query OK, 3 rows affected (0.88 sec) {'label':'insert_754e2a3926a345ea_854793fb2638f0ec', 'status':'VISIBLE', 'txnId':'20014'} @@ -188,3 +188,4 @@ mysql> show partitions from `DAILY_TRADE_VALUE`; - 在数据的插入或导入过程中如果创建了分区,而最终整个过程失败,被创建的分区不会被自动删除。 - 使用AUTO PARTITION的表,只是分区创建方式上由手动转为了自动。表及其所创建分区的原本使用方法都与非AUTO PARTITION的表或分区相同。 +- 向开启了AUTO PARTITION的表导入数据时,Coordinator发送数据的轮询间隔与普通表有所不同。具体请见[BE配置项](../../admin-manual/config/be-config.md)中的`olap_table_sink_send_interval_auto_partition_factor`。 diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java index e2cc67d992a9c5..351f7aa92f19d5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java @@ -368,23 +368,30 @@ private TOlapTablePartitionParam createPartition(long dbId, OlapTable table, Ana } } } - boolean enableAutomaticPartition = partitionInfo.enableAutomaticPartition(); + boolean enableAutomaticPartition = partitionInfo.enableAutomaticPartition(); // for auto create partition by function expr, there is no any partition firstly, // But this is required in thrift struct. if (enableAutomaticPartition && partitionIds.isEmpty()) { partitionParam.setDistributedColumns(getDistColumns(table.getDefaultDistributionInfo())); partitionParam.setPartitions(new ArrayList()); } - ArrayList exprs = partitionInfo.getPartitionExprs(); - if (enableAutomaticPartition && exprs != null && analyzer != null) { + + ArrayList exprSource = partitionInfo.getPartitionExprs(); + if (enableAutomaticPartition && exprSource != null && analyzer != null) { Analyzer funcAnalyzer = new Analyzer(analyzer.getEnv(), analyzer.getContext()); tupleDescriptor.setTable(table); funcAnalyzer.registerTupleDescriptor(tupleDescriptor); + // we must clone the exprs. otherwise analyze will influence the origin exprs. + ArrayList exprs = new ArrayList(); + for (Expr e : exprSource) { + exprs.add(e.clone()); + } for (Expr e : exprs) { e.analyze(funcAnalyzer); } partitionParam.setPartitionFunctionExprs(Expr.treesToThrift(exprs)); } + partitionParam.setEnableAutomaticPartition(enableAutomaticPartition); break; } diff --git a/regression-test/data/partition_p0/auto_partition/test_auto_partition_load.out b/regression-test/data/partition_p0/auto_partition/test_auto_partition_load.out index 7e1dd673f69927..2d85d850212474 100644 --- a/regression-test/data/partition_p0/auto_partition/test_auto_partition_load.out +++ b/regression-test/data/partition_p0/auto_partition/test_auto_partition_load.out @@ -10,6 +10,10 @@ 8 2006-12-12T12:12:12 2001-11-12T12:12:12.123456 9 2006-12-12T12:12:12 2001-11-13T12:12:12.123456 10 2007-12-12T12:12:12 2001-11-14T12:12:12.123456 +11 2007-12-12T12:12:12 2001-11-14T12:12:12.123456 +12 2008-12-12T12:12:12 2001-11-14T12:12:12.123456 +13 2003-12-12T12:12:12 2001-11-14T12:12:12.123456 +14 2002-12-12T12:12:12 2001-11-14T12:12:12.123456 -- !select2 -- 1 Beijing 2001-12-12T12:12:12.123456 @@ -22,4 +26,8 @@ 8 chengDU 2001-11-12T12:12:12.123456 9 xian 2001-11-13T12:12:12.123456 10 beiJing 2001-11-14T12:12:12.123456 +11 11 2123-11-14T12:12:12.123456 +12 Chengdu 2123-11-14T12:12:12.123456 +13 11 2123-11-14T12:12:12.123456 +14 12 2123-11-14T12:12:12.123456 diff --git a/regression-test/suites/partition_p0/auto_partition/test_auto_partition_load.groovy b/regression-test/suites/partition_p0/auto_partition/test_auto_partition_load.groovy index 0cf2eaf9c12dc2..351d7bb3200b06 100644 --- a/regression-test/suites/partition_p0/auto_partition/test_auto_partition_load.groovy +++ b/regression-test/suites/partition_p0/auto_partition/test_auto_partition_load.groovy @@ -40,11 +40,15 @@ suite("test_auto_partition_load") { file "auto_partition_stream_load1.csv" time 20000 } + sql """ insert into ${tblName1} values (11, '2007-12-12 12:12:12.123', '2001-11-14 12:12:12.123456') """ + sql """ insert into ${tblName1} values (12, '2008-12-12 12:12:12.123', '2001-11-14 12:12:12.123456') """ + sql """ insert into ${tblName1} values (13, '2003-12-12 12:12:12.123', '2001-11-14 12:12:12.123456') """ + sql """ insert into ${tblName1} values (14, '2002-12-12 12:12:12.123', '2001-11-14 12:12:12.123456') """ qt_select1 "select * from ${tblName1} order by k1" result1 = sql "show partitions from ${tblName1}" logger.info("${result1}") - assertEquals(result1.size(), 7) + assertEquals(result1.size(), 8) def tblName2 = "load_table2" @@ -71,9 +75,13 @@ suite("test_auto_partition_load") { file "auto_partition_stream_load2.csv" time 20000 } + sql """ insert into ${tblName2} values (11, '11', '2123-11-14 12:12:12.123456') """ + sql """ insert into ${tblName2} values (12, 'Chengdu', '2123-11-14 12:12:12.123456') """ + sql """ insert into ${tblName2} values (13, '11', '2123-11-14 12:12:12.123456') """ + sql """ insert into ${tblName2} values (14, '12', '2123-11-14 12:12:12.123456') """ qt_select2 "select * from ${tblName2} order by k1" result2 = sql "show partitions from ${tblName2}" logger.info("${result2}") - assertEquals(result2.size(), 9) + assertEquals(result2.size(), 11) } From dd65cc1d1450771578d0411ffd9c8ed4fa83e90d Mon Sep 17 00:00:00 2001 From: Ashin Gau Date: Thu, 23 Nov 2023 19:15:47 +0800 Subject: [PATCH 11/64] [opt](MergedIO) no need to merge large columns (#27315) 1. Fix a profile bug of `MergeRangeFileReader`, and add a profile `ApplyBytes` to show the total bytes of ranges. 2. There's no need to merge large columns, because `MergeRangeFileReader` will increase the copy time. --- be/src/io/fs/buffered_reader.cpp | 10 +++++----- be/src/io/fs/buffered_reader.h | 18 +++++++++++++----- be/src/vec/exec/format/orc/vorc_reader.cpp | 12 ++++++++++-- be/test/io/fs/buffered_reader_test.cpp | 6 +++--- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/be/src/io/fs/buffered_reader.cpp b/be/src/io/fs/buffered_reader.cpp index caa80616d35303..e7f2cc9533408d 100644 --- a/be/src/io/fs/buffered_reader.cpp +++ b/be/src/io/fs/buffered_reader.cpp @@ -54,7 +54,7 @@ Status MergeRangeFileReader::read_at_impl(size_t offset, Slice result, size_t* b Status st = _reader->read_at(offset, result, bytes_read, io_ctx); _statistics.merged_io++; _statistics.request_bytes += *bytes_read; - _statistics.read_bytes += *bytes_read; + _statistics.merged_bytes += *bytes_read; return st; } if (offset + result.size > _random_access_ranges[range_index].end_offset) { @@ -68,10 +68,10 @@ Status MergeRangeFileReader::read_at_impl(size_t offset, Slice result, size_t* b if (cached_data.contains(offset)) { // has cached data in box _read_in_box(cached_data, offset, result, &has_read); + _statistics.request_bytes += has_read; if (has_read == result.size) { // all data is read in cache *bytes_read = has_read; - _statistics.request_bytes += has_read; return Status::OK(); } } else if (!cached_data.empty()) { @@ -91,7 +91,7 @@ Status MergeRangeFileReader::read_at_impl(size_t offset, Slice result, size_t* b *bytes_read = has_read + read_size; _statistics.merged_io++; _statistics.request_bytes += read_size; - _statistics.read_bytes += read_size; + _statistics.merged_bytes += read_size; return Status::OK(); } @@ -186,7 +186,7 @@ Status MergeRangeFileReader::read_at_impl(size_t offset, Slice result, size_t* b *bytes_read = has_read + read_size; _statistics.merged_io++; _statistics.request_bytes += read_size; - _statistics.read_bytes += read_size; + _statistics.merged_bytes += read_size; return Status::OK(); } @@ -314,7 +314,7 @@ Status MergeRangeFileReader::_fill_box(int range_index, size_t start_offset, siz RETURN_IF_ERROR( _reader->read_at(start_offset, Slice(_read_slice, to_read), bytes_read, io_ctx)); _statistics.merged_io++; - _statistics.read_bytes += *bytes_read; + _statistics.merged_bytes += *bytes_read; } SCOPED_RAW_TIMER(&_statistics.copy_time); diff --git a/be/src/io/fs/buffered_reader.h b/be/src/io/fs/buffered_reader.h index 0bde47d79d9c82..8e5d87fcc2ba1b 100644 --- a/be/src/io/fs/buffered_reader.h +++ b/be/src/io/fs/buffered_reader.h @@ -80,7 +80,8 @@ class MergeRangeFileReader : public io::FileReader { int64_t request_io = 0; int64_t merged_io = 0; int64_t request_bytes = 0; - int64_t read_bytes = 0; + int64_t merged_bytes = 0; + int64_t apply_bytes = 0; }; struct RangeCachedData { @@ -147,6 +148,9 @@ class MergeRangeFileReader : public io::FileReader { // Equivalent min size of each IO that can reach the maximum storage speed limit: // 512KB for oss, 4KB for hdfs _equivalent_io_size = _is_oss ? OSS_MIN_IO_SIZE : HDFS_MIN_IO_SIZE; + for (const PrefetchRange& range : _random_access_ranges) { + _statistics.apply_bytes += range.end_offset - range.start_offset; + } if (_profile != nullptr) { const char* random_profile = "MergedSmallIO"; ADD_TIMER_WITH_LEVEL(_profile, random_profile, 1); @@ -158,8 +162,10 @@ class MergeRangeFileReader : public io::FileReader { random_profile, 1); _request_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(_profile, "RequestBytes", TUnit::BYTES, random_profile, 1); - _read_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(_profile, "MergedBytes", TUnit::BYTES, - random_profile, 1); + _merged_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(_profile, "MergedBytes", TUnit::BYTES, + random_profile, 1); + _apply_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(_profile, "ApplyBytes", TUnit::BYTES, + random_profile, 1); } } @@ -184,7 +190,8 @@ class MergeRangeFileReader : public io::FileReader { COUNTER_UPDATE(_request_io, _statistics.request_io); COUNTER_UPDATE(_merged_io, _statistics.merged_io); COUNTER_UPDATE(_request_bytes, _statistics.request_bytes); - COUNTER_UPDATE(_read_bytes, _statistics.read_bytes); + COUNTER_UPDATE(_merged_bytes, _statistics.merged_bytes); + COUNTER_UPDATE(_apply_bytes, _statistics.apply_bytes); } } return Status::OK(); @@ -220,7 +227,8 @@ class MergeRangeFileReader : public io::FileReader { RuntimeProfile::Counter* _request_io; RuntimeProfile::Counter* _merged_io; RuntimeProfile::Counter* _request_bytes; - RuntimeProfile::Counter* _read_bytes; + RuntimeProfile::Counter* _merged_bytes; + RuntimeProfile::Counter* _apply_bytes; int _search_read_range(size_t start_offset, size_t end_offset); void _clean_cached_data(RangeCachedData& cached_data); diff --git a/be/src/vec/exec/format/orc/vorc_reader.cpp b/be/src/vec/exec/format/orc/vorc_reader.cpp index f17dadfad71987..7dcff69824b93a 100644 --- a/be/src/vec/exec/format/orc/vorc_reader.cpp +++ b/be/src/vec/exec/format/orc/vorc_reader.cpp @@ -2188,6 +2188,7 @@ void ORCFileInputStream::beforeReadStripe( // Generate prefetch ranges, build stripe file reader. uint64_t offset = current_strip_information->getOffset(); std::vector prefetch_ranges; + size_t total_io_size = 0; for (uint64_t stream_id = 0; stream_id < current_strip_information->getNumberOfStreams(); ++stream_id) { std::unique_ptr stream = @@ -2195,13 +2196,20 @@ void ORCFileInputStream::beforeReadStripe( uint32_t columnId = stream->getColumnId(); uint64_t length = stream->getLength(); if (selected_columns[columnId]) { + total_io_size += length; doris::io::PrefetchRange prefetch_range = {offset, offset + length}; prefetch_ranges.emplace_back(std::move(prefetch_range)); } offset += length; } - // The underlying page reader will prefetch data in column. - _file_reader.reset(new io::MergeRangeFileReader(_profile, _inner_reader, prefetch_ranges)); + size_t num_columns = std::count_if(selected_columns.begin(), selected_columns.end(), + [](bool selected) { return selected; }); + if (total_io_size / num_columns < io::MergeRangeFileReader::SMALL_IO) { + // The underlying page reader will prefetch data in column. + _file_reader.reset(new io::MergeRangeFileReader(_profile, _inner_reader, prefetch_ranges)); + } else { + _file_reader = _inner_reader; + } } } // namespace doris::vectorized diff --git a/be/test/io/fs/buffered_reader_test.cpp b/be/test/io/fs/buffered_reader_test.cpp index 1f20e007f990d1..f805889471bfce 100644 --- a/be/test/io/fs/buffered_reader_test.cpp +++ b/be/test/io/fs/buffered_reader_test.cpp @@ -295,13 +295,13 @@ TEST_F(BufferedReaderTest, test_read_amplify) { static_cast(merge_reader.read_at(1024 * kb, result, &bytes_read, nullptr)); EXPECT_EQ(bytes_read, 1024 * kb); EXPECT_EQ(merge_reader.statistics().request_bytes, 1024 * kb); - EXPECT_EQ(merge_reader.statistics().read_bytes, 1024 * kb); + EXPECT_EQ(merge_reader.statistics().merged_bytes, 1024 * kb); // read column0 result.size = 1 * kb; // will merge column 0 ~ 3 static_cast(merge_reader.read_at(0, result, &bytes_read, nullptr)); EXPECT_EQ(bytes_read, 1 * kb); - EXPECT_EQ(merge_reader.statistics().read_bytes, 1024 * kb + 12 * kb); + EXPECT_EQ(merge_reader.statistics().merged_bytes, 1024 * kb + 12 * kb); // read column1 result.size = 1 * kb; static_cast(merge_reader.read_at(3 * kb, result, &bytes_read, nullptr)); @@ -312,7 +312,7 @@ TEST_F(BufferedReaderTest, test_read_amplify) { result.size = 5 * kb; static_cast(merge_reader.read_at(7 * kb, result, &bytes_read, nullptr)); EXPECT_EQ(merge_reader.statistics().request_bytes, 1024 * kb + 8 * kb); - EXPECT_EQ(merge_reader.statistics().read_bytes, 1024 * kb + 12 * kb); + EXPECT_EQ(merge_reader.statistics().merged_bytes, 1024 * kb + 12 * kb); } TEST_F(BufferedReaderTest, test_merged_io) { From 78203c8b7aa136ab1b12de7bb41434b00863afbe Mon Sep 17 00:00:00 2001 From: feifeifeimoon Date: Thu, 23 Nov 2023 19:36:43 +0800 Subject: [PATCH 12/64] [chore](docker cases): support for specifying output from the command line (#27340) --- docker/runtime/doris-compose/Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/runtime/doris-compose/Dockerfile b/docker/runtime/doris-compose/Dockerfile index 11a3c465709634..a524ce8c189fe6 100644 --- a/docker/runtime/doris-compose/Dockerfile +++ b/docker/runtime/doris-compose/Dockerfile @@ -19,16 +19,15 @@ # choose a base image FROM openjdk:8u342-jdk +ARG OUT_DIRECTORY=output + # set environment variables ENV JAVA_HOME="/usr/local/openjdk-8/" ENV jacoco_version 0.8.8 -ADD output /opt/apache-doris/ - RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list RUN apt-get clean -RUN mkdir /opt/apache-doris/coverage RUN apt-get update && \ apt-get install -y default-mysql-client python lsof tzdata curl unzip && \ @@ -40,5 +39,7 @@ RUN curl -f https://repo1.maven.org/maven2/org/jacoco/jacoco/$jacoco_version/jac mkdir /jacoco && \ unzip jacoco.zip -d /jacoco +ADD $OUT_DIRECTORY /opt/apache-doris/ +RUN mkdir -p /opt/apache-doris/coverage # in docker, run 'chmod 755 doris_be' first time cost 1min, remove it. RUN sed -i 's/\/echo/g' /opt/apache-doris/be/bin/start_be.sh From d04a2de3cc740b73a417300f253cab35bdefb096 Mon Sep 17 00:00:00 2001 From: Mingyu Chen Date: Thu, 23 Nov 2023 19:42:46 +0800 Subject: [PATCH 13/64] [fix](hms) fix compatibility issue of hive metastore client (#27327) For hive version lower than 2.3.7, there is no enum ClientCapability.INSERT_ONLY_TABLES. So if we send this enum to the server side, the server side will get a null, and this will cause some undefined behavior, eg, failed to get tables infos from hms. --- .../hadoop/hive/metastore/HiveMetaStoreClient.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index b39bec7c967ebe..ff85e31959769a 100644 --- a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -343,11 +343,17 @@ public HiveMetaStoreClient(Configuration conf, HiveMetaHookLoader hookLoader, Bo hiveVersion = HiveVersionUtil.getVersion(conf.get(HMSProperties.HIVE_VERSION)); - version = MetastoreConf.getBoolVar(conf, ConfVars.HIVE_IN_TEST) ? TEST_VERSION : VERSION; + // For hive 2.3.7, there is no ClientCapability.INSERT_ONLY_TABLES + if (hiveVersion == HiveVersion.V1_0 || hiveVersion == HiveVersion.V2_0 || hiveVersion == HiveVersion.V2_3) { + version = MetastoreConf.getBoolVar(conf, ConfVars.HIVE_IN_TEST) ? TEST_VERSION : null; + } else { + version = MetastoreConf.getBoolVar(conf, ConfVars.HIVE_IN_TEST) ? TEST_VERSION : VERSION; + } + filterHook = loadFilterHooks(); uriResolverHook = loadUriResolverHook(); fileMetadataBatchSize = MetastoreConf.getIntVar( - conf, ConfVars.BATCH_RETRIEVE_OBJECTS_MAX); + conf, ConfVars.BATCH_RETRIEVE_OBJECTS_MAX); String msUri = MetastoreConf.getVar(conf, ConfVars.THRIFT_URIS); localMetaStore = MetastoreConf.isEmbeddedMetaStore(msUri); From d73b945535f431966c46ee553e1e735876e81e65 Mon Sep 17 00:00:00 2001 From: jakevin Date: Thu, 23 Nov 2023 21:04:40 +0800 Subject: [PATCH 14/64] [chore](Nereids): rename pushdown to push_down (#27473) --- .../doris/nereids/jobs/executor/Rewriter.java | 51 +++++++++-------- .../processor/post/PlanPostProcessors.java | 2 +- ...java => PushDownFilterThroughProject.java} | 2 +- .../apache/doris/nereids/rules/RuleSet.java | 56 +++++++++---------- .../apache/doris/nereids/rules/RuleType.java | 50 ++++++++--------- .../rules/exploration/OrExpansion.java | 8 +-- ...PushDownProjectThroughInnerOuterJoin.java} | 8 +-- ...va => PushDownProjectThroughSemiJoin.java} | 8 +-- ...ll.java => PushDownAliasIntoUnionAll.java} | 4 +- ...oin.java => PushDownAliasThroughJoin.java} | 4 +- ...oin.java => PushDownCountThroughJoin.java} | 10 ++-- ....java => PushDownDistinctThroughJoin.java} | 4 +- ...> PushDownExpressionsInHashCondition.java} | 6 +- ... => PushDownFilterThroughAggregation.java} | 4 +- ...in.java => PushDownFilterThroughJoin.java} | 6 +- ...> PushDownFilterThroughPartitionTopN.java} | 4 +- ...java => PushDownFilterThroughProject.java} | 8 +-- ....java => PushDownFilterThroughRepeat.java} | 4 +- ...=> PushDownFilterThroughSetOperation.java} | 4 +- ...rt.java => PushDownFilterThroughSort.java} | 4 +- ....java => PushDownFilterThroughWindow.java} | 4 +- ...n.java => PushDownJoinOtherCondition.java} | 4 +- ...{PushdownLimit.java => PushDownLimit.java} | 2 +- ... => PushDownLimitDistinctThroughJoin.java} | 2 +- ...in.java => PushDownMinMaxThroughJoin.java} | 10 ++-- ....java => PushDownProjectThroughLimit.java} | 4 +- ...hJoin.java => PushDownSumThroughJoin.java} | 10 ++-- ...Join.java => PushDownTopNThroughJoin.java} | 2 +- ...ow.java => PushDownTopNThroughWindow.java} | 2 +- .../rules/rewrite/TransposeSemiJoinAgg.java | 2 +- ... => PushDownFilterThroughProjectTest.java} | 6 +- .../join/InnerJoinLAsscomProjectTest.java | 6 +- .../join/OuterJoinLAsscomProjectTest.java | 4 +- ...DownProjectThroughInnerOuterJoinTest.java} | 10 ++-- ...> PushDownProjectThroughSemiJoinTest.java} | 8 +-- ...AggScalarSubQueryToWindowFunctionTest.java | 2 +- ...a => PushDowFilterThroughProjectTest.java} | 10 ++-- ...java => PushDownAliasThroughJoinTest.java} | 10 ++-- ...java => PushDownCountThroughJoinTest.java} | 22 ++++---- ...a => PushDownDistinctThroughJoinTest.java} | 10 ++-- ...shDownExpressionsInHashConditionTest.java} | 10 ++-- ...PushDownFilterThroughAggregationTest.java} | 10 ++-- ...ava => PushDownFilterThroughJoinTest.java} | 14 ++--- ...ava => PushDownFilterThroughSortTest.java} | 10 ++-- ...a => PushDownFilterThroughWindowTest.java} | 4 +- ...va => PushDownJoinOtherConditionTest.java} | 8 +-- ...PushDownLimitDistinctThroughJoinTest.java} | 14 ++--- ...nLimitTest.java => PushDownLimitTest.java} | 4 +- ...ava => PushDownMinMaxThroughJoinTest.java} | 22 ++++---- ...a => PushDownProjectThroughLimitTest.java} | 4 +- ...t.java => PushDownSumThroughJoinTest.java} | 14 ++--- ....java => PushDownTopNThroughJoinTest.java} | 10 ++-- .../rewrite/mv/SelectRollupIndexTest.java | 4 +- 53 files changed, 255 insertions(+), 250 deletions(-) rename fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/{PushdownFilterThroughProject.java => PushDownFilterThroughProject.java} (97%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/{PushdownProjectThroughInnerOuterJoin.java => PushDownProjectThroughInnerOuterJoin.java} (95%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/{PushdownProjectThroughSemiJoin.java => PushDownProjectThroughSemiJoin.java} (92%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownAliasIntoUnionAll.java => PushDownAliasIntoUnionAll.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownAliasThroughJoin.java => PushDownAliasThroughJoin.java} (98%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownCountThroughJoin.java => PushDownCountThroughJoin.java} (97%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownDistinctThroughJoin.java => PushDownDistinctThroughJoin.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownExpressionsInHashCondition.java => PushDownExpressionsInHashCondition.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughAggregation.java => PushDownFilterThroughAggregation.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughJoin.java => PushDownFilterThroughJoin.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughPartitionTopN.java => PushDownFilterThroughPartitionTopN.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughProject.java => PushDownFilterThroughProject.java} (92%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughRepeat.java => PushDownFilterThroughRepeat.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughSetOperation.java => PushDownFilterThroughSetOperation.java} (95%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughSort.java => PushDownFilterThroughSort.java} (94%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughWindow.java => PushDownFilterThroughWindow.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownJoinOtherCondition.java => PushDownJoinOtherCondition.java} (97%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownLimit.java => PushDownLimit.java} (99%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownLimitDistinctThroughJoin.java => PushDownLimitDistinctThroughJoin.java} (98%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownMinMaxThroughJoin.java => PushDownMinMaxThroughJoin.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownProjectThroughLimit.java => PushDownProjectThroughLimit.java} (93%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownSumThroughJoin.java => PushDownSumThroughJoin.java} (96%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownTopNThroughJoin.java => PushDownTopNThroughJoin.java} (98%) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/{PushdownTopNThroughWindow.java => PushDownTopNThroughWindow.java} (98%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/{PushdownFilterThroughProjectTest.java => PushDownFilterThroughProjectTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/{PushdownProjectThroughInnerOuterJoinTest.java => PushDownProjectThroughInnerOuterJoinTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/{PushdownProjectThroughSemiJoinTest.java => PushDownProjectThroughSemiJoinTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdowFilterThroughProjectTest.java => PushDowFilterThroughProjectTest.java} (93%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownAliasThroughJoinTest.java => PushDownAliasThroughJoinTest.java} (95%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownCountThroughJoinTest.java => PushDownCountThroughJoinTest.java} (89%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownDistinctThroughJoinTest.java => PushDownDistinctThroughJoinTest.java} (91%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownExpressionsInHashConditionTest.java => PushDownExpressionsInHashConditionTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughAggregationTest.java => PushDownFilterThroughAggregationTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughJoinTest.java => PushDownFilterThroughJoinTest.java} (95%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughSortTest.java => PushDownFilterThroughSortTest.java} (93%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownFilterThroughWindowTest.java => PushDownFilterThroughWindowTest.java} (97%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownJoinOtherConditionTest.java => PushDownJoinOtherConditionTest.java} (96%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownLimitDistinctThroughJoinTest.java => PushDownLimitDistinctThroughJoinTest.java} (93%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownLimitTest.java => PushDownLimitTest.java} (99%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownMinMaxThroughJoinTest.java => PushDownMinMaxThroughJoinTest.java} (91%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownProjectThroughLimitTest.java => PushDownProjectThroughLimitTest.java} (93%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownSumThroughJoinTest.java => PushDownSumThroughJoinTest.java} (90%) rename fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/{PushdownTopNThroughJoinTest.java => PushDownTopNThroughJoinTest.java} (96%) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java index 1b8b0d86f09b3b..15e08d052e93f6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java @@ -91,14 +91,14 @@ import org.apache.doris.nereids.rules.rewrite.PullUpProjectUnderTopN; import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoEsScan; import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoJdbcScan; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughProject; +import org.apache.doris.nereids.rules.rewrite.PushDownLimit; +import org.apache.doris.nereids.rules.rewrite.PushDownLimitDistinctThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownTopNThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownTopNThroughWindow; import org.apache.doris.nereids.rules.rewrite.PushFilterInsideJoin; import org.apache.doris.nereids.rules.rewrite.PushProjectIntoOneRowRelation; import org.apache.doris.nereids.rules.rewrite.PushProjectThroughUnion; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughProject; -import org.apache.doris.nereids.rules.rewrite.PushdownLimit; -import org.apache.doris.nereids.rules.rewrite.PushdownLimitDistinctThroughJoin; -import org.apache.doris.nereids.rules.rewrite.PushdownTopNThroughJoin; -import org.apache.doris.nereids.rules.rewrite.PushdownTopNThroughWindow; import org.apache.doris.nereids.rules.rewrite.ReorderJoin; import org.apache.doris.nereids.rules.rewrite.RewriteCteChildren; import org.apache.doris.nereids.rules.rewrite.SemiJoinCommute; @@ -152,7 +152,7 @@ public class Rewriter extends AbstractBatchJobExecutor { // after doing NormalizeAggregate in analysis job // we need run the following 2 rules to make AGG_SCALAR_SUBQUERY_TO_WINDOW_FUNCTION work bottomUp(new PullUpProjectUnderApply()), - topDown(new PushdownFilterThroughProject()), + topDown(new PushDownFilterThroughProject()), custom(RuleType.AGG_SCALAR_SUBQUERY_TO_WINDOW_FUNCTION, AggScalarSubQueryToWindowFunction::new), bottomUp( @@ -236,13 +236,13 @@ public class Rewriter extends AbstractBatchJobExecutor { topDown(new ConvertInnerOrCrossJoin()) ), topic("LEADING JOIN", - bottomUp( - new CollectJoinConstraint() - ), - custom(RuleType.LEADING_JOIN, LeadingJoin::new), - bottomUp( - new ExpressionRewrite(CheckLegalityAfterRewrite.INSTANCE) - ) + bottomUp( + new CollectJoinConstraint() + ), + custom(RuleType.LEADING_JOIN, LeadingJoin::new), + bottomUp( + new ExpressionRewrite(CheckLegalityAfterRewrite.INSTANCE) + ) ), topic("Column pruning and infer predicate", custom(RuleType.COLUMN_PRUNING, ColumnPruning::new), @@ -272,8 +272,13 @@ public class Rewriter extends AbstractBatchJobExecutor { topDown(new BuildAggForUnion()) ), - // topic("Distinct", - // costBased(custom(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN, PushdownDistinctThroughJoin::new)) + // topic("Eager aggregation", + // topDown( + // new PushDownSumThroughJoin(), + // new PushDownMinMaxThroughJoin(), + // new PushDownCountThroughJoin() + // ), + // custom(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN, PushDownDistinctThroughJoin::new) // ), topic("Limit optimization", @@ -284,10 +289,10 @@ public class Rewriter extends AbstractBatchJobExecutor { topDown(new LimitSortToTopN()), topDown(new SplitLimit()), topDown( - new PushdownLimit(), - new PushdownTopNThroughJoin(), - new PushdownLimitDistinctThroughJoin(), - new PushdownTopNThroughWindow() + new PushDownLimit(), + new PushDownTopNThroughJoin(), + new PushDownLimitDistinctThroughJoin(), + new PushDownTopNThroughWindow() ), topDown(new CreatePartitionTopNFromWindow()), topDown( @@ -310,7 +315,7 @@ public class Rewriter extends AbstractBatchJobExecutor { new SelectMaterializedIndexWithAggregate(), new SelectMaterializedIndexWithoutAggregate(), new EliminateFilter(), - new PushdownFilterThroughProject(), + new PushDownFilterThroughProject(), new MergeProjects(), new PruneOlapScanTablet() ), @@ -330,7 +335,7 @@ public class Rewriter extends AbstractBatchJobExecutor { topic("Final rewrite and check", custom(RuleType.CHECK_DATA_TYPES, CheckDataTypes::new), custom(RuleType.ENSURE_PROJECT_ON_TOP_JOIN, EnsureProjectOnTopJoin::new), - topDown(new PushdownFilterThroughProject(), new MergeProjects()), + topDown(new PushDownFilterThroughProject(), new MergeProjects()), custom(RuleType.ADJUST_CONJUNCTS_RETURN_TYPE, AdjustConjunctsReturnType::new), bottomUp( new ExpressionRewrite(CheckLegalityAfterRewrite.INSTANCE), @@ -378,8 +383,8 @@ public static Rewriter getWholeTreeRewriterWithCustomJobs(CascadesContext cascad private static List getWholeTreeRewriteJobs(boolean withCostBased) { List withoutCostBased = Rewriter.CTE_CHILDREN_REWRITE_JOBS.stream() - .filter(j -> !(j instanceof CostBasedRewriteJob)) - .collect(Collectors.toList()); + .filter(j -> !(j instanceof CostBasedRewriteJob)) + .collect(Collectors.toList()); return getWholeTreeRewriteJobs(withCostBased ? CTE_CHILDREN_REWRITE_JOBS : withoutCostBased); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java index 9ae4c55608b765..7e69db047739ab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java @@ -58,7 +58,7 @@ public PhysicalPlan process(PhysicalPlan physicalPlan) { public List getProcessors() { // add processor if we need Builder builder = ImmutableList.builder(); - builder.add(new PushdownFilterThroughProject()); + builder.add(new PushDownFilterThroughProject()); builder.add(new MergeProjectPostProcessor()); builder.add(new RecomputeLogicalPropertiesProcessor()); builder.add(new TopNScanOpt()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushdownFilterThroughProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushDownFilterThroughProject.java similarity index 97% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushdownFilterThroughProject.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushDownFilterThroughProject.java index b5f269b069596e..643a4ee509f3eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushdownFilterThroughProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PushDownFilterThroughProject.java @@ -27,7 +27,7 @@ /** * merge consecutive projects */ -public class PushdownFilterThroughProject extends PlanPostProcessor { +public class PushDownFilterThroughProject extends PlanPostProcessor { @Override public Plan visitPhysicalFilter(PhysicalFilter filter, CascadesContext context) { Plan child = filter.child(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java index 80163663184227..736ad7f7a8735b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java @@ -36,8 +36,8 @@ import org.apache.doris.nereids.rules.exploration.join.OuterJoinAssocProject; import org.apache.doris.nereids.rules.exploration.join.OuterJoinLAsscom; import org.apache.doris.nereids.rules.exploration.join.OuterJoinLAsscomProject; -import org.apache.doris.nereids.rules.exploration.join.PushdownProjectThroughInnerOuterJoin; -import org.apache.doris.nereids.rules.exploration.join.PushdownProjectThroughSemiJoin; +import org.apache.doris.nereids.rules.exploration.join.PushDownProjectThroughInnerOuterJoin; +import org.apache.doris.nereids.rules.exploration.join.PushDownProjectThroughSemiJoin; import org.apache.doris.nereids.rules.exploration.join.SemiJoinSemiJoinTranspose; import org.apache.doris.nereids.rules.exploration.join.SemiJoinSemiJoinTransposeProject; import org.apache.doris.nereids.rules.implementation.AggregateStrategies; @@ -80,18 +80,18 @@ import org.apache.doris.nereids.rules.rewrite.MergeGenerates; import org.apache.doris.nereids.rules.rewrite.MergeLimits; import org.apache.doris.nereids.rules.rewrite.MergeProjects; -import org.apache.doris.nereids.rules.rewrite.PushdownAliasThroughJoin; -import org.apache.doris.nereids.rules.rewrite.PushdownExpressionsInHashCondition; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughAggregation; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughJoin; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughPartitionTopN; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughProject; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughRepeat; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughSetOperation; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughSort; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughWindow; -import org.apache.doris.nereids.rules.rewrite.PushdownJoinOtherCondition; -import org.apache.doris.nereids.rules.rewrite.PushdownProjectThroughLimit; +import org.apache.doris.nereids.rules.rewrite.PushDownAliasThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownExpressionsInHashCondition; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughAggregation; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughPartitionTopN; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughProject; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughRepeat; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughSetOperation; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughSort; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughWindow; +import org.apache.doris.nereids.rules.rewrite.PushDownJoinOtherCondition; +import org.apache.doris.nereids.rules.rewrite.PushDownProjectThroughLimit; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; @@ -115,8 +115,8 @@ public class RuleSet { .add(SemiJoinSemiJoinTransposeProject.INSTANCE) .add(LogicalJoinSemiJoinTranspose.INSTANCE) .add(LogicalJoinSemiJoinTransposeProject.INSTANCE) - .add(PushdownProjectThroughInnerOuterJoin.INSTANCE) - .add(PushdownProjectThroughSemiJoin.INSTANCE) + .add(PushDownProjectThroughInnerOuterJoin.INSTANCE) + .add(PushDownProjectThroughSemiJoin.INSTANCE) .add(TransposeAggSemiJoin.INSTANCE) .add(TransposeAggSemiJoinProject.INSTANCE) .add(OrExpansion.INSTANCE) @@ -124,24 +124,24 @@ public class RuleSet { public static final List PUSH_DOWN_FILTERS = ImmutableList.of( new CreatePartitionTopNFromWindow(), - new PushdownFilterThroughProject(), - new PushdownFilterThroughSort(), - new PushdownJoinOtherCondition(), - new PushdownFilterThroughJoin(), - new PushdownExpressionsInHashCondition(), - new PushdownFilterThroughAggregation(), - new PushdownFilterThroughRepeat(), - new PushdownFilterThroughSetOperation(), - new PushdownProjectThroughLimit(), + new PushDownFilterThroughProject(), + new PushDownFilterThroughSort(), + new PushDownJoinOtherCondition(), + new PushDownFilterThroughJoin(), + new PushDownExpressionsInHashCondition(), + new PushDownFilterThroughAggregation(), + new PushDownFilterThroughRepeat(), + new PushDownFilterThroughSetOperation(), + new PushDownProjectThroughLimit(), new EliminateOuterJoin(), new ConvertOuterJoinToAntiJoin(), new MergeProjects(), new MergeFilters(), new MergeGenerates(), new MergeLimits(), - new PushdownAliasThroughJoin(), - new PushdownFilterThroughWindow(), - new PushdownFilterThroughPartitionTopN() + new PushDownAliasThroughJoin(), + new PushDownFilterThroughWindow(), + new PushDownFilterThroughPartitionTopN() ); public static final List IMPLEMENTATION_RULES = planRuleFactories() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java index f8760ada9ec93c..40a63a056c0ccb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java @@ -142,35 +142,35 @@ public enum RuleType { IN_APPLY_TO_JOIN(RuleTypeClass.REWRITE), EXISTS_APPLY_TO_JOIN(RuleTypeClass.REWRITE), // predicate push down rules - PUSHDOWN_JOIN_OTHER_CONDITION(RuleTypeClass.REWRITE), - PUSHDOWN_PREDICATE_THROUGH_AGGREGATION(RuleTypeClass.REWRITE), - PUSHDOWN_PREDICATE_THROUGH_REPEAT(RuleTypeClass.REWRITE), - PUSHDOWN_EXPRESSIONS_IN_HASH_CONDITIONS(RuleTypeClass.REWRITE), + PUSH_DOWN_JOIN_OTHER_CONDITION(RuleTypeClass.REWRITE), + PUSH_DOWN_PREDICATE_THROUGH_AGGREGATION(RuleTypeClass.REWRITE), + PUSH_DOWN_PREDICATE_THROUGH_REPEAT(RuleTypeClass.REWRITE), + PUSH_DOWN_EXPRESSIONS_IN_HASH_CONDITIONS(RuleTypeClass.REWRITE), // Pushdown filter - PUSHDOWN_FILTER_THROUGH_JOIN(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_LEFT_SEMI_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_LEFT_SEMI_JOIN(RuleTypeClass.REWRITE), PUSH_FILTER_INSIDE_JOIN(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_PROJECT(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_PROJECT_UNDER_LIMIT(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_WINDOW(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_PARTITION_TOPN(RuleTypeClass.REWRITE), - PUSHDOWN_PROJECT_THROUGH_LIMIT(RuleTypeClass.REWRITE), - PUSHDOWN_ALIAS_THROUGH_JOIN(RuleTypeClass.REWRITE), - PUSHDOWN_ALIAS_INTO_UNION_ALL(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_SET_OPERATION(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_SORT(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_PROJECT(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_PROJECT_UNDER_LIMIT(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_WINDOW(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_PARTITION_TOPN(RuleTypeClass.REWRITE), + PUSH_DOWN_PROJECT_THROUGH_LIMIT(RuleTypeClass.REWRITE), + PUSH_DOWN_ALIAS_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_ALIAS_INTO_UNION_ALL(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_SET_OPERATION(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_SORT(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_CTE(RuleTypeClass.REWRITE), - PUSHDOWN_FILTER_THROUGH_CTE_ANCHOR(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_CTE(RuleTypeClass.REWRITE), + PUSH_DOWN_FILTER_THROUGH_CTE_ANCHOR(RuleTypeClass.REWRITE), - PUSHDOWN_DISTINCT_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_DISTINCT_THROUGH_JOIN(RuleTypeClass.REWRITE), COLUMN_PRUNING(RuleTypeClass.REWRITE), ELIMINATE_SORT(RuleTypeClass.REWRITE), - PUSHDOWN_MIN_MAX_THROUGH_JOIN(RuleTypeClass.REWRITE), - PUSHDOWN_SUM_THROUGH_JOIN(RuleTypeClass.REWRITE), - PUSHDOWN_COUNT_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_MIN_MAX_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_SUM_THROUGH_JOIN(RuleTypeClass.REWRITE), + PUSH_DOWN_COUNT_THROUGH_JOIN(RuleTypeClass.REWRITE), TRANSPOSE_LOGICAL_SEMI_JOIN_LOGICAL_JOIN(RuleTypeClass.REWRITE), TRANSPOSE_LOGICAL_SEMI_JOIN_LOGICAL_JOIN_PROJECT(RuleTypeClass.REWRITE), @@ -311,10 +311,10 @@ public enum RuleType { TRANSPOSE_LOGICAL_AGG_SEMI_JOIN(RuleTypeClass.EXPLORATION), TRANSPOSE_LOGICAL_AGG_SEMI_JOIN_PROJECT(RuleTypeClass.EXPLORATION), TRANSPOSE_LOGICAL_JOIN_UNION(RuleTypeClass.EXPLORATION), - PUSHDOWN_PROJECT_THROUGH_SEMI_JOIN_LEFT(RuleTypeClass.EXPLORATION), - PUSHDOWN_PROJECT_THROUGH_SEMI_JOIN_RIGHT(RuleTypeClass.EXPLORATION), - PUSHDOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_LEFT(RuleTypeClass.EXPLORATION), - PUSHDOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_RIGHT(RuleTypeClass.EXPLORATION), + PUSH_DOWN_PROJECT_THROUGH_SEMI_JOIN_LEFT(RuleTypeClass.EXPLORATION), + PUSH_DOWN_PROJECT_THROUGH_SEMI_JOIN_RIGHT(RuleTypeClass.EXPLORATION), + PUSH_DOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_LEFT(RuleTypeClass.EXPLORATION), + PUSH_DOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_RIGHT(RuleTypeClass.EXPLORATION), EAGER_COUNT(RuleTypeClass.EXPLORATION), EAGER_GROUP_BY(RuleTypeClass.EXPLORATION), EAGER_GROUP_BY_COUNT(RuleTypeClass.EXPLORATION), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java index 9019565142bfa3..73863ba1ae06d4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java @@ -21,7 +21,7 @@ import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; -import org.apache.doris.nereids.rules.rewrite.PushdownExpressionsInHashCondition; +import org.apache.doris.nereids.rules.rewrite.PushDownExpressionsInHashCondition; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.NamedExpression; @@ -178,7 +178,7 @@ private Plan expandLeftAntiJoin(CascadesContext ctx, otherConditions, originJoin.getHint(), originJoin.getMarkJoinSlotReference(), left, right); if (hashCond.children().stream().anyMatch(e -> !(e instanceof Slot))) { - Plan normalizedPlan = PushdownExpressionsInHashCondition.pushDownHashExpression( + Plan normalizedPlan = PushDownExpressionsInHashCondition.pushDownHashExpression( (LogicalJoin) newPlan); newPlan = new LogicalProject<>(new ArrayList<>(newPlan.getOutput()), normalizedPlan); } @@ -195,7 +195,7 @@ private Plan expandLeftAntiJoin(CascadesContext ctx, new ArrayList<>(), originJoin.getHint(), originJoin.getMarkJoinSlotReference(), newPlan, newRight); if (hashCond.children().stream().anyMatch(e -> !(e instanceof Slot))) { - newPlan = PushdownExpressionsInHashCondition.pushDownHashExpression( + newPlan = PushDownExpressionsInHashCondition.pushDownHashExpression( (LogicalJoin) newPlan); } } @@ -252,7 +252,7 @@ private List expandInnerJoin(CascadesContext ctx, Pair, join.getMarkJoinSlotReference(), left, right); if (newJoin.getHashJoinConjuncts().stream() .anyMatch(equalTo -> equalTo.children().stream().anyMatch(e -> !(e instanceof Slot)))) { - Plan plan = PushdownExpressionsInHashCondition.pushDownHashExpression(newJoin); + Plan plan = PushDownExpressionsInHashCondition.pushDownHashExpression(newJoin); plan = new LogicalProject<>(new ArrayList<>(newJoin.getOutput()), plan); joins.add(plan); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoin.java similarity index 95% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoin.java index 03fd3e8a8d8667..6a74e7c98d91cc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoin.java @@ -50,8 +50,8 @@ * A B A B * */ -public class PushdownProjectThroughInnerOuterJoin implements ExplorationRuleFactory { - public static final PushdownProjectThroughInnerOuterJoin INSTANCE = new PushdownProjectThroughInnerOuterJoin(); +public class PushDownProjectThroughInnerOuterJoin implements ExplorationRuleFactory { + public static final PushDownProjectThroughInnerOuterJoin INSTANCE = new PushDownProjectThroughInnerOuterJoin(); @Override public List buildRules() { @@ -69,7 +69,7 @@ public List buildRules() { return null; } return topJoin.withChildren(newLeft, topJoin.right()); - }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_LEFT), + }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_LEFT), logicalJoin(group(), logicalProject(logicalJoin().whenNot(LogicalJoin::isMarkJoin))) .when(j -> j.right().child().getJoinType().isOuterJoin() || j.right().child().getJoinType().isInnerJoin()) @@ -83,7 +83,7 @@ public List buildRules() { return null; } return topJoin.withChildren(topJoin.left(), newRight); - }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_RIGHT) + }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_INNER_OUTER_JOIN_RIGHT) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoin.java similarity index 92% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoin.java index 121994082363a5..f2a33b78a6c66b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoin.java @@ -48,8 +48,8 @@ * A B A * */ -public class PushdownProjectThroughSemiJoin implements ExplorationRuleFactory { - public static final PushdownProjectThroughSemiJoin INSTANCE = new PushdownProjectThroughSemiJoin(); +public class PushDownProjectThroughSemiJoin implements ExplorationRuleFactory { + public static final PushDownProjectThroughSemiJoin INSTANCE = new PushDownProjectThroughSemiJoin(); @Override public List buildRules() { @@ -63,7 +63,7 @@ public List buildRules() { LogicalProject> project = topJoin.left(); Plan newLeft = pushdownProject(project); return topJoin.withChildren(newLeft, topJoin.right()); - }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_SEMI_JOIN_LEFT), + }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_SEMI_JOIN_LEFT), logicalJoin(group(), logicalProject(logicalJoin().whenNot(LogicalJoin::isMarkJoin))) .when(j -> j.right().child().getJoinType().isLeftSemiOrAntiJoin()) @@ -74,7 +74,7 @@ public List buildRules() { LogicalProject> project = topJoin.right(); Plan newRight = pushdownProject(project); return topJoin.withChildren(topJoin.left(), newRight); - }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_SEMI_JOIN_RIGHT) + }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_SEMI_JOIN_RIGHT) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasIntoUnionAll.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasIntoUnionAll.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasIntoUnionAll.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasIntoUnionAll.java index 20f202a3b2b525..e3f9fb021bd50b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasIntoUnionAll.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasIntoUnionAll.java @@ -45,7 +45,7 @@ * UnionAll output(c1, c2 as c2t, c3) * */ -public class PushdownAliasIntoUnionAll extends OneRewriteRuleFactory { +public class PushDownAliasIntoUnionAll extends OneRewriteRuleFactory { @Override public Rule build() { return logicalProject(logicalUnion()) @@ -80,6 +80,6 @@ public Rule build() { List newProjects = project.getProjects().stream().map(NamedExpression::toSlot) .collect(Collectors.toList()); return PlanUtils.projectOrSelf(newProjects, union.withNewOutputs(newOutput)); - }).toRule(RuleType.PUSHDOWN_ALIAS_INTO_UNION_ALL); + }).toRule(RuleType.PUSH_DOWN_ALIAS_INTO_UNION_ALL); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoin.java similarity index 98% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoin.java index abe707b2608123..a544dfa361efc8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoin.java @@ -42,7 +42,7 @@ /** * Pushdown Alias (inside must be Slot) through Join. */ -public class PushdownAliasThroughJoin extends OneRewriteRuleFactory { +public class PushDownAliasThroughJoin extends OneRewriteRuleFactory { @Override public Rule build() { return logicalProject(logicalJoin()) @@ -99,7 +99,7 @@ public Rule build() { Plan newJoin = join.withConjunctsChildren(newHash, newOther, left, right); return project.withProjectsAndChild(newProjects, newJoin); - }).toRule(RuleType.PUSHDOWN_ALIAS_THROUGH_JOIN); + }).toRule(RuleType.PUSH_DOWN_ALIAS_THROUGH_JOIN); } private List replaceJoinConjuncts(List joinConjuncts, Map replaceMaps) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoin.java similarity index 97% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoin.java index 856a67d0482a68..462180ab7a610a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoin.java @@ -67,7 +67,7 @@ * * Notice: rule can't optimize condition that groupby is empty when Count(*) exists. */ -public class PushdownCountThroughJoin implements RewriteRuleFactory { +public class PushDownCountThroughJoin implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( @@ -84,13 +84,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type())) { return null; } LogicalAggregate> agg = ctx.root; return pushCount(agg, agg.child(), ImmutableList.of()); }) - .toRule(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN), + .toRule(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN), logicalAggregate(logicalProject(innerLogicalJoin())) .when(agg -> agg.child().isAllSlots()) .when(agg -> agg.child().child().getOtherJoinConjuncts().isEmpty()) @@ -105,13 +105,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type())) { return null; } LogicalAggregate>> agg = ctx.root; return pushCount(agg, agg.child().child(), agg.child().getProjects()); }) - .toRule(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN) + .toRule(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoin.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoin.java index ac239e8f95dc1f..fa705a08d8db8a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoin.java @@ -36,12 +36,12 @@ /** * PushdownDistinctThroughJoin */ -public class PushdownDistinctThroughJoin extends DefaultPlanRewriter implements CustomRewriter { +public class PushDownDistinctThroughJoin extends DefaultPlanRewriter implements CustomRewriter { @Override public Plan rewriteRoot(Plan plan, JobContext context) { Set enableNereidsRules = context.getCascadesContext().getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_DISTINCT_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type())) { return null; } return plan.accept(this, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashCondition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashCondition.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashCondition.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashCondition.java index df7acb4553c6ae..4aeb47a9d48f26 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashCondition.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashCondition.java @@ -43,7 +43,7 @@ /** * push down expression which is not slot reference */ -public class PushdownExpressionsInHashCondition extends OneRewriteRuleFactory { +public class PushDownExpressionsInHashCondition extends OneRewriteRuleFactory { /* * rewrite example: * join(t1.a + 1 = t2.b + 2) join(c = d) @@ -64,8 +64,8 @@ public Rule build() { return logicalJoin() .when(join -> join.getHashJoinConjuncts().stream().anyMatch(equalTo -> equalTo.children().stream().anyMatch(e -> !(e instanceof Slot)))) - .then(PushdownExpressionsInHashCondition::pushDownHashExpression) - .toRule(RuleType.PUSHDOWN_EXPRESSIONS_IN_HASH_CONDITIONS); + .then(PushDownExpressionsInHashCondition::pushDownHashExpression) + .toRule(RuleType.PUSH_DOWN_EXPRESSIONS_IN_HASH_CONDITIONS); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregation.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregation.java index 45fa1c645b2510..f3a54fd8eeaa8b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregation.java @@ -52,7 +52,7 @@ * but 'b>0' could not push down, because 'b' is not in group by keys. */ -public class PushdownFilterThroughAggregation extends OneRewriteRuleFactory { +public class PushDownFilterThroughAggregation extends OneRewriteRuleFactory { @Override public Rule build() { @@ -77,7 +77,7 @@ public Rule build() { Plan bottomFilter = new LogicalFilter<>(pushDownPredicates, aggregate.child(0)); aggregate = aggregate.withChildren(ImmutableList.of(bottomFilter)); return PlanUtils.filterOrSelf(filterPredicates, aggregate); - }).toRule(RuleType.PUSHDOWN_PREDICATE_THROUGH_AGGREGATION); + }).toRule(RuleType.PUSH_DOWN_PREDICATE_THROUGH_AGGREGATION); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoin.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoin.java index f6d1a3ce489d69..9165a95b6c67d6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoin.java @@ -38,8 +38,8 @@ /** * Push the predicate in the LogicalFilter to the join children. */ -public class PushdownFilterThroughJoin extends OneRewriteRuleFactory { - public static final PushdownFilterThroughJoin INSTANCE = new PushdownFilterThroughJoin(); +public class PushDownFilterThroughJoin extends OneRewriteRuleFactory { + public static final PushDownFilterThroughJoin INSTANCE = new PushDownFilterThroughJoin(); private static final ImmutableList COULD_PUSH_THROUGH_LEFT = ImmutableList.of( JoinType.INNER_JOIN, @@ -141,7 +141,7 @@ public Rule build() { join.getMarkJoinSlotReference(), PlanUtils.filterOrSelf(leftPredicates, join.left()), PlanUtils.filterOrSelf(rightPredicates, join.right()))); - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_JOIN); + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_JOIN); } private boolean convertJoinCondition(Expression predicate, Set leftOutputs, Set rightOutputs, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughPartitionTopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughPartitionTopN.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughPartitionTopN.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughPartitionTopN.java index da31fb2ae3de1f..4cb8076f7a44ee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughPartitionTopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughPartitionTopN.java @@ -51,7 +51,7 @@ * any_node */ -public class PushdownFilterThroughPartitionTopN extends OneRewriteRuleFactory { +public class PushDownFilterThroughPartitionTopN extends OneRewriteRuleFactory { @Override public Rule build() { @@ -91,7 +91,7 @@ public Rule build() { } else { return filter.withConjunctsAndChild(upperConjuncts, partitionTopN); } - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_PARTITION_TOPN); + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_PARTITION_TOPN); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughProject.java similarity index 92% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughProject.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughProject.java index a0d64b1a6090fa..65106ff8f81be5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughProject.java @@ -37,15 +37,15 @@ * output: * project(c+d as a, e as b) -> filter(c+d>2, e=0). */ -public class PushdownFilterThroughProject implements RewriteRuleFactory { +public class PushDownFilterThroughProject implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( logicalFilter(logicalProject()) .whenNot(filter -> filter.child().getProjects().stream().anyMatch( expr -> expr.anyMatch(WindowExpression.class::isInstance))) - .then(PushdownFilterThroughProject::pushdownFilterThroughProject) - .toRule(RuleType.PUSHDOWN_FILTER_THROUGH_PROJECT), + .then(PushDownFilterThroughProject::pushdownFilterThroughProject) + .toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_PROJECT), // filter(project(limit)) will change to filter(limit(project)) by PushdownProjectThroughLimit, // then we should change filter(limit(project)) to project(filter(limit)) logicalFilter(logicalLimit(logicalProject())) @@ -60,7 +60,7 @@ public List buildRules() { ExpressionUtils.replace(filter.getConjuncts(), project.getAliasToProducer()), limit.withChildren(project.child()))); - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_PROJECT_UNDER_LIMIT) + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_PROJECT_UNDER_LIMIT) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughRepeat.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughRepeat.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughRepeat.java index 804075c1dfe725..3fd743b375337b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughRepeat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughRepeat.java @@ -57,7 +57,7 @@ * but 'b>0' could not push down, because 'b' is not in group by keys. */ -public class PushdownFilterThroughRepeat extends OneRewriteRuleFactory { +public class PushDownFilterThroughRepeat extends OneRewriteRuleFactory { @Override public Rule build() { @@ -79,7 +79,7 @@ public Rule build() { } } return pushDownPredicate(filter, pushedPredicates, notPushedPredicates); - }).toRule(RuleType.PUSHDOWN_PREDICATE_THROUGH_REPEAT); + }).toRule(RuleType.PUSH_DOWN_PREDICATE_THROUGH_REPEAT); } private Plan pushDownPredicate(LogicalFilter> filter, Set pushedPredicates, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSetOperation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSetOperation.java similarity index 95% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSetOperation.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSetOperation.java index 6b78ab1f367aee..c8f83d62b4959a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSetOperation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSetOperation.java @@ -37,7 +37,7 @@ /** * Convert the expression in the filter into the output column corresponding to the child node and push it down. */ -public class PushdownFilterThroughSetOperation extends OneRewriteRuleFactory { +public class PushDownFilterThroughSetOperation extends OneRewriteRuleFactory { @Override public Rule build() { @@ -57,6 +57,6 @@ public Rule build() { } return setOperation.withChildren(newChildren); - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_SET_OPERATION); + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_SET_OPERATION); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSort.java similarity index 94% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSort.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSort.java index fc2216184c11c0..75b6806b78ec60 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSort.java @@ -36,7 +36,7 @@ * The filter can be directly push down to the sort. * Note when the sort key is equal to Literal, the sort can be eliminated */ -public class PushdownFilterThroughSort extends OneRewriteRuleFactory { +public class PushDownFilterThroughSort extends OneRewriteRuleFactory { @Override public Rule build() { return logicalFilter(logicalSort()).then(filter -> { @@ -45,7 +45,7 @@ public Rule build() { return new LogicalFilter<>(filter.getConjuncts(), sort.child()); } return sort.withChildren(new LogicalFilter<>(filter.getConjuncts(), sort.child())); - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_SORT); + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_SORT); } boolean checkSlotsConstant(Set slots, LogicalFilter filter) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindow.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindow.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindow.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindow.java index 1902ff50300d8c..0696bdd95c0392 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindow.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindow.java @@ -49,7 +49,7 @@ * any_node */ -public class PushdownFilterThroughWindow extends OneRewriteRuleFactory { +public class PushDownFilterThroughWindow extends OneRewriteRuleFactory { @Override public Rule build() { @@ -92,7 +92,7 @@ public Rule build() { .withConjuncts(upperConjuncts).withChildren(window); return upperFilter; } - }).toRule(RuleType.PUSHDOWN_FILTER_THROUGH_WINDOW); + }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_WINDOW); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherCondition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherCondition.java similarity index 97% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherCondition.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherCondition.java index 27285aa897db64..778a8729f2e99e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherCondition.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherCondition.java @@ -37,7 +37,7 @@ /** * Push the other join conditions in LogicalJoin to children. */ -public class PushdownJoinOtherCondition extends OneRewriteRuleFactory { +public class PushDownJoinOtherCondition extends OneRewriteRuleFactory { private static final ImmutableList PUSH_DOWN_LEFT_VALID_TYPE = ImmutableList.of( JoinType.INNER_JOIN, JoinType.LEFT_SEMI_JOIN, @@ -91,7 +91,7 @@ && allCoveredBy(otherConjunct, join.right().getOutputSet())) { return new LogicalJoin<>(join.getJoinType(), join.getHashJoinConjuncts(), remainingOther, join.getHint(), join.getMarkJoinSlotReference(), left, right); - }).toRule(RuleType.PUSHDOWN_JOIN_OTHER_CONDITION); + }).toRule(RuleType.PUSH_DOWN_JOIN_OTHER_CONDITION); } private boolean allCoveredBy(Expression predicate, Set inputSlotSet) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimit.java similarity index 99% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimit.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimit.java index 5964d741fc101f..69a7faa6aa7fa7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimit.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimit.java @@ -39,7 +39,7 @@ * Limit can't be push down if it has a valid offset info. * splitLimit run before this rule, so the limit match the patterns is local limit */ -public class PushdownLimit implements RewriteRuleFactory { +public class PushDownLimit implements RewriteRuleFactory { @Override public List buildRules() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoin.java similarity index 98% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoin.java index 24737b6362528e..9ba73c7ed8fc81 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoin.java @@ -34,7 +34,7 @@ /** * Same with PushdownLimit */ -public class PushdownLimitDistinctThroughJoin implements RewriteRuleFactory { +public class PushDownLimitDistinctThroughJoin implements RewriteRuleFactory { @Override public List buildRules() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownMinMaxThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoin.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownMinMaxThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoin.java index 07f0bbc81c7ef0..48ded00defe5ee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownMinMaxThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoin.java @@ -61,7 +61,7 @@ * aggregate: Min/Max(x) as min1 * */ -public class PushdownMinMaxThroughJoin implements RewriteRuleFactory { +public class PushDownMinMaxThroughJoin implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( @@ -77,13 +77,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type())) { return null; } LogicalAggregate> agg = ctx.root; return pushMinMax(agg, agg.child(), ImmutableList.of()); }) - .toRule(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN), + .toRule(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN), logicalAggregate(logicalProject(innerLogicalJoin())) .when(agg -> agg.child().isAllSlots()) .when(agg -> agg.child().child().getOtherJoinConjuncts().isEmpty()) @@ -98,13 +98,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type())) { return null; } LogicalAggregate>> agg = ctx.root; return pushMinMax(agg, agg.child().child(), agg.child().getProjects()); }) - .toRule(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN) + .toRule(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimit.java similarity index 93% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimit.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimit.java index 8c4d2a93c5697b..ca04043e84f2ac 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimit.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimit.java @@ -45,7 +45,7 @@ * plan node * */ -public class PushdownProjectThroughLimit extends OneRewriteRuleFactory { +public class PushDownProjectThroughLimit extends OneRewriteRuleFactory { @Override public Rule build() { @@ -53,6 +53,6 @@ public Rule build() { LogicalProject> logicalProject = ctx.root; LogicalLimit logicalLimit = logicalProject.child(); return logicalLimit.withChildren(logicalProject.withChildren(logicalLimit.child())); - }).toRule(RuleType.PUSHDOWN_PROJECT_THROUGH_LIMIT); + }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_LIMIT); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoin.java similarity index 96% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoin.java index 0ae16a070140d3..91cb2a6050b738 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoin.java @@ -61,7 +61,7 @@ * aggregate: Sum(x) as min1 * */ -public class PushdownSumThroughJoin implements RewriteRuleFactory { +public class PushDownSumThroughJoin implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( @@ -76,13 +76,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_SUM_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type())) { return null; } LogicalAggregate> agg = ctx.root; return pushSum(agg, agg.child(), ImmutableList.of()); }) - .toRule(RuleType.PUSHDOWN_SUM_THROUGH_JOIN), + .toRule(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN), logicalAggregate(logicalProject(innerLogicalJoin())) .when(agg -> agg.child().isAllSlots()) .when(agg -> agg.child().child().getOtherJoinConjuncts().isEmpty()) @@ -95,13 +95,13 @@ public List buildRules() { .thenApply(ctx -> { Set enableNereidsRules = ctx.cascadesContext.getConnectContext() .getSessionVariable().getEnableNereidsRules(); - if (!enableNereidsRules.contains(RuleType.PUSHDOWN_SUM_THROUGH_JOIN.type())) { + if (!enableNereidsRules.contains(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type())) { return null; } LogicalAggregate>> agg = ctx.root; return pushSum(agg, agg.child().child(), agg.child().getProjects()); }) - .toRule(RuleType.PUSHDOWN_SUM_THROUGH_JOIN) + .toRule(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoin.java similarity index 98% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoin.java index b025d40b6d761f..de4d5c9725c5ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoin.java @@ -35,7 +35,7 @@ /** * Push down TopN through Outer Join into left child ..... */ -public class PushdownTopNThroughJoin implements RewriteRuleFactory { +public class PushDownTopNThroughJoin implements RewriteRuleFactory { @Override public List buildRules() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughWindow.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughWindow.java similarity index 98% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughWindow.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughWindow.java index f1547d910898e4..11dd2b795974d9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughWindow.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughWindow.java @@ -38,7 +38,7 @@ /** * PushdownTopNThroughWindow push down the TopN through the Window and generate the PartitionTopN. */ -public class PushdownTopNThroughWindow implements RewriteRuleFactory { +public class PushDownTopNThroughWindow implements RewriteRuleFactory { @Override public List buildRules() { return ImmutableList.of( diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java index 1a8c4ca1e52b4e..864b5bb03a8c83 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java @@ -50,7 +50,7 @@ public Rule build() { */ public static boolean canTranspose(LogicalAggregate aggregate, LogicalJoin join) { - Set canPushDownSlots = PushdownFilterThroughAggregation.getCanPushDownSlots(aggregate); + Set canPushDownSlots = PushDownFilterThroughAggregation.getCanPushDownSlots(aggregate); Set leftConditionSlot = join.getLeftConditionSlot(); return canPushDownSlots.containsAll(leftConditionSlot); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushdownFilterThroughProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushDownFilterThroughProjectTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushdownFilterThroughProjectTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushDownFilterThroughProjectTest.java index 46130efbcbdd2a..b817f800008dcd 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushdownFilterThroughProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/postprocess/PushDownFilterThroughProjectTest.java @@ -20,7 +20,7 @@ import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.OlapTable; import org.apache.doris.nereids.CascadesContext; -import org.apache.doris.nereids.processor.post.PushdownFilterThroughProject; +import org.apache.doris.nereids.processor.post.PushDownFilterThroughProject; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -51,7 +51,7 @@ import java.util.Optional; import java.util.Set; -public class PushdownFilterThroughProjectTest { +public class PushDownFilterThroughProjectTest { /** * filter(y=0) * | @@ -101,7 +101,7 @@ public void testPushFilter(@Injectable LogicalProperties placeHolder, conjuncts.add(new EqualTo(y.toSlot(), Literal.of(0))); PhysicalFilter filter = new PhysicalFilter(conjuncts, proj2.getLogicalProperties(), proj2); - PushdownFilterThroughProject processor = new PushdownFilterThroughProject(); + PushDownFilterThroughProject processor = new PushDownFilterThroughProject(); PhysicalPlan newPlan = (PhysicalPlan) filter.accept(processor, ctx); Assertions.assertTrue(newPlan instanceof PhysicalProject); Assertions.assertTrue(newPlan.child(0) instanceof PhysicalProject); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java index e9ad622e8542f6..c6fbb8af38f41b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java @@ -18,7 +18,7 @@ package org.apache.doris.nereids.rules.exploration.join; import org.apache.doris.common.Pair; -import org.apache.doris.nereids.rules.rewrite.PushdownAliasThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownAliasThroughJoin; import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -102,7 +102,7 @@ void testAlias() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .applyExploration(InnerJoinLAsscomProject.INSTANCE.build()) .printlnExploration() .matchesExploration( @@ -148,7 +148,7 @@ public void testHashAndOther() { PlanChecker.from(MemoTestUtils.createConnectContext(), topJoin) .printlnTree() - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .applyExploration(InnerJoinLAsscomProject.INSTANCE.build()) .printlnExploration() .matchesExploration( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProjectTest.java index f00dac49609c40..b621af0e5d1830 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProjectTest.java @@ -18,7 +18,7 @@ package org.apache.doris.nereids.rules.exploration.join; import org.apache.doris.common.Pair; -import org.apache.doris.nereids.rules.rewrite.PushdownAliasThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownAliasThroughJoin; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.GreaterThan; @@ -79,7 +79,7 @@ void testAlias() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .printlnTree() .applyExploration(OuterJoinLAsscomProject.INSTANCE.build()) .printlnExploration() diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoinTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoinTest.java index 19be848332d4fa..ef4e2ee5134ac2 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughInnerOuterJoinTest.java @@ -37,7 +37,7 @@ import java.util.List; -class PushdownProjectThroughInnerOuterJoinTest implements MemoPatternMatchSupported { +class PushDownProjectThroughInnerOuterJoinTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); @@ -59,7 +59,7 @@ public void pushBothSide() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( @@ -90,7 +90,7 @@ public void pushdownProjectInCondition() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( @@ -121,7 +121,7 @@ void pushComplexProject() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( @@ -158,7 +158,7 @@ void rejectHyperEdgeProject() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughInnerOuterJoin.INSTANCE.buildRules()) .checkMemo(memo -> Assertions.assertEquals(1, memo.getRoot().getLogicalExpressions().size())); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoinTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoinTest.java index 862580208e6489..8c5a29f0d5556f 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughSemiJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushDownProjectThroughSemiJoinTest.java @@ -36,7 +36,7 @@ import java.util.List; -class PushdownProjectThroughSemiJoinTest implements MemoPatternMatchSupported { +class PushDownProjectThroughSemiJoinTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); @@ -56,7 +56,7 @@ public void pushdownProject() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughSemiJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughSemiJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( @@ -87,7 +87,7 @@ public void pushdownProjectInCondition() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughSemiJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughSemiJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( @@ -117,7 +117,7 @@ void pushComplexProject() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyExploration(PushdownProjectThroughSemiJoin.INSTANCE.buildRules()) + .applyExploration(PushDownProjectThroughSemiJoin.INSTANCE.buildRules()) .printlnOrigin() .printlnExploration() .matchesExploration( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/AggScalarSubQueryToWindowFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/AggScalarSubQueryToWindowFunctionTest.java index bc33c4c70e75e5..d7dad886ac3677 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/AggScalarSubQueryToWindowFunctionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/AggScalarSubQueryToWindowFunctionTest.java @@ -342,7 +342,7 @@ private void check(String sql) { Plan plan = PlanChecker.from(createCascadesContext(sql)) .analyze(sql) .applyBottomUp(new PullUpProjectUnderApply()) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .customRewrite(new EliminateUnnecessaryProject()) .customRewrite(new AggScalarSubQueryToWindowFunction()) .rewrite() diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdowFilterThroughProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDowFilterThroughProjectTest.java similarity index 93% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdowFilterThroughProjectTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDowFilterThroughProjectTest.java index 6118a98ebd911b..ad922a8f1c5702 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdowFilterThroughProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDowFilterThroughProjectTest.java @@ -38,7 +38,7 @@ import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Test; -class PushdowFilterThroughProjectTest implements MemoPatternMatchSupported { +class PushDowFilterThroughProjectTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student, ImmutableList.of("")); @@ -57,7 +57,7 @@ void pushDownFilterThroughProject() { .build(); PlanChecker.from(context, plan) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .matches(logicalFilter().when(f -> f.getPredicate().toSql().equals("id IS NULL") )); @@ -77,7 +77,7 @@ void notPushDownFilterThroughWindow() { .build(); PlanChecker.from(context, plan) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .matches(logicalFilter(logicalProject())); // filter -> limit -> project(windows) @@ -88,7 +88,7 @@ void notPushDownFilterThroughWindow() { .build(); PlanChecker.from(context, plan) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .matches(logicalFilter(logicalLimit(logicalProject()))); } @@ -104,7 +104,7 @@ void pushDownFilterThroughLimit() { .build(); PlanChecker.from(context, plan) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .matches(logicalProject(logicalFilter(logicalLimit()).when(f -> f.getPredicate().toSql().equals("id IS NULL")))); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoinTest.java similarity index 95% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoinTest.java index 543ff0933b5432..e0e05716f1d00d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownAliasThroughJoinTest.java @@ -36,7 +36,7 @@ import java.util.List; -class PushdownAliasThroughJoinTest implements MemoPatternMatchSupported { +class PushDownAliasThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -49,7 +49,7 @@ void testPushdown() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .matches( logicalProject( logicalJoin( @@ -69,7 +69,7 @@ void testCondition() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .matches( logicalProject( logicalJoin( @@ -94,7 +94,7 @@ void testJustRightSide() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .matches( logicalProject( logicalJoin( @@ -116,7 +116,7 @@ void testNoPushdownMarkJoin() { .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)).projectExprs(projects).build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownAliasThroughJoin()) + .applyTopDown(new PushDownAliasThroughJoin()) .matches(logicalProject(logicalJoin(logicalOlapScan(), logicalOlapScan())) .when(project -> project.getProjects().get(0).toSql().equals("markSlot1") && project.getProjects().get(1).toSql() diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java similarity index 89% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java index 69b9ae7751196d..21eebe1b375dc1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java @@ -39,7 +39,7 @@ import java.util.Set; -class PushdownCountThroughJoinTest implements MemoPatternMatchSupported { +class PushDownCountThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -48,7 +48,7 @@ void testSingleCount() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); } }; Alias count = new Count(scan1.getOutput().get(0)).alias("count"); @@ -58,7 +58,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownCountThroughJoin()) + .applyTopDown(new PushDownCountThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -74,7 +74,7 @@ void testMultiCount() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); } }; Alias leftCnt1 = new Count(scan1.getOutput().get(0)).alias("leftCnt1"); @@ -87,7 +87,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownCountThroughJoin()) + .applyTopDown(new PushDownCountThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -103,7 +103,7 @@ void testSingleCountStar() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); } }; Alias count = new Count().alias("countStar"); @@ -113,7 +113,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownCountThroughJoin()) + .applyTopDown(new PushDownCountThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -129,7 +129,7 @@ void testSingleCountStarEmptyGroupBy() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); } }; Alias count = new Count().alias("countStar"); @@ -140,7 +140,7 @@ public Set getEnableNereidsRules() { // shouldn't rewrite. PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownCountThroughJoin()) + .applyTopDown(new PushDownCountThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -156,7 +156,7 @@ void testBothSideCountAndCountStar() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_COUNT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); } }; Alias leftCnt = new Count(scan1.getOutput().get(0)).alias("leftCnt"); @@ -169,7 +169,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownCountThroughJoin()) + .applyTopDown(new PushDownCountThroughJoin()) .matches( logicalAggregate( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java similarity index 91% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java index feaeb5fa051c36..aac1bf2c7d4596 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java @@ -37,7 +37,7 @@ import java.util.Set; -class PushdownDistinctThroughJoinTest implements MemoPatternMatchSupported { +class PushDownDistinctThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private static final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); @@ -48,7 +48,7 @@ void testPushdownJoin() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_DISTINCT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type()); } }; LogicalPlan plan = new LogicalPlanBuilder(scan1) @@ -59,7 +59,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .customRewrite(new PushdownDistinctThroughJoin()) + .customRewrite(new PushDownDistinctThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -76,7 +76,7 @@ void testPushdownProjectJoin() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_DISTINCT_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type()); } }; LogicalPlan plan = new LogicalPlanBuilder(scan1) @@ -89,7 +89,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .customRewrite(new PushdownDistinctThroughJoin()) + .customRewrite(new PushDownDistinctThroughJoin()) .matches( logicalAggregate( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashConditionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashConditionTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashConditionTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashConditionTest.java index dfad75d5d8042a..ca1e48fc7eb304 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownExpressionsInHashConditionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownExpressionsInHashConditionTest.java @@ -30,7 +30,7 @@ import java.util.List; -public class PushdownExpressionsInHashConditionTest extends TestWithFeService implements MemoPatternMatchSupported { +public class PushDownExpressionsInHashConditionTest extends TestWithFeService implements MemoPatternMatchSupported { @Override protected void runBeforeAll() throws Exception { createDatabase("test"); @@ -83,7 +83,7 @@ public void testSimpleCase() { PlanChecker.from(connectContext) .analyze("SELECT * FROM T1 JOIN T2 ON T1.ID + 1 = T2.ID + 2 AND T1.ID + 1 > 2") .applyTopDown(new FindHashConditionForJoin()) - .applyTopDown(new PushdownExpressionsInHashCondition()) + .applyTopDown(new PushDownExpressionsInHashCondition()) .matches( logicalProject( logicalJoin( @@ -104,7 +104,7 @@ public void testSubQueryCase() { .analyze( "SELECT * FROM (SELECT * FROM T1) X JOIN (SELECT * FROM T2) Y ON X.ID + 1 = Y.ID + 2 AND X.ID + 1 > 2") .applyTopDown(new FindHashConditionForJoin()) - .applyTopDown(new PushdownExpressionsInHashCondition()) + .applyTopDown(new PushDownExpressionsInHashCondition()) .matches( logicalProject( logicalJoin( @@ -133,7 +133,7 @@ public void testAggNodeCase() { .analyze( "SELECT * FROM T1 JOIN (SELECT ID, SUM(SCORE) SCORE FROM T2 GROUP BY ID) T ON T1.ID + 1 = T.ID AND T.SCORE = T1.SCORE + 10") .applyTopDown(new FindHashConditionForJoin()) - .applyTopDown(new PushdownExpressionsInHashCondition()) + .applyTopDown(new PushDownExpressionsInHashCondition()) .matches( logicalProject( logicalJoin( @@ -160,7 +160,7 @@ public void testSortNodeCase() { .analyze( "SELECT * FROM T1 JOIN (SELECT ID, SUM(SCORE) SCORE FROM T2 GROUP BY ID ORDER BY ID) T ON T1.ID + 1 = T.ID AND T.SCORE = T1.SCORE + 10") .applyTopDown(new FindHashConditionForJoin()) - .applyTopDown(new PushdownExpressionsInHashCondition()) + .applyTopDown(new PushDownExpressionsInHashCondition()) .matches( logicalProject( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregationTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregationTest.java index 80f70f280d97a7..830921b9a2b7b2 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughAggregationTest.java @@ -44,7 +44,7 @@ import java.util.Optional; -public class PushdownFilterThroughAggregationTest implements MemoPatternMatchSupported { +public class PushDownFilterThroughAggregationTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student, ImmutableList.of("")); @@ -79,7 +79,7 @@ public void pushDownPredicateOneFilterTest() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughAggregation()) + .applyTopDown(new PushDownFilterThroughAggregation()) .matches( logicalProject( logicalAggregate( @@ -132,7 +132,7 @@ public void pushDownPredicateTwoFilterTest() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughAggregation()) + .applyTopDown(new PushDownFilterThroughAggregation()) .printlnTree() .matches( logicalProject( @@ -167,7 +167,7 @@ public void pushDownPredicateGroupWithRepeatTest() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughAggregation()) + .applyTopDown(new PushDownFilterThroughAggregation()) .printlnTree() .matches( logicalProject( @@ -190,7 +190,7 @@ public void pushDownPredicateGroupWithRepeatTest() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughAggregation()) + .applyTopDown(new PushDownFilterThroughAggregation()) .printlnTree() .matches( logicalProject( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoinTest.java similarity index 95% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoinTest.java index 559f9d92ce1365..343619cbd8b08a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughJoinTest.java @@ -44,7 +44,7 @@ * PushdownFilterThroughJoinTest UT. */ @TestInstance(TestInstance.Lifecycle.PER_CLASS) -public class PushdownFilterThroughJoinTest implements MemoPatternMatchSupported { +public class PushDownFilterThroughJoinTest implements MemoPatternMatchSupported { private LogicalPlan rStudent; private LogicalPlan rScore; @@ -82,7 +82,7 @@ private void testLeft(JoinType joinType) { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .matchesFromRoot( logicalJoin( logicalFilter(logicalOlapScan()) @@ -103,7 +103,7 @@ private void testRight(JoinType joinType) { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .matchesFromRoot( logicalJoin( logicalOlapScan(), @@ -134,7 +134,7 @@ private void bothSideToBothSide(JoinType joinType) { if (joinType.isInnerJoin()) { PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .printlnTree() .matchesFromRoot( logicalJoin( @@ -147,7 +147,7 @@ private void bothSideToBothSide(JoinType joinType) { } if (joinType.isCrossJoin()) { PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .printlnTree() .matchesFromRoot( logicalFilter( @@ -183,7 +183,7 @@ private void bothSideToLeft(JoinType joinType) { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .matchesFromRoot( logicalFilter( logicalJoin( @@ -206,7 +206,7 @@ private void bothSideToRight(JoinType joinType) { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(PushdownFilterThroughJoin.INSTANCE) + .applyTopDown(PushDownFilterThroughJoin.INSTANCE) .matchesFromRoot( logicalFilter( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSortTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSortTest.java similarity index 93% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSortTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSortTest.java index 4677514c9213fb..9f898d1cca287b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughSortTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughSortTest.java @@ -40,7 +40,7 @@ import java.util.List; import java.util.stream.Collectors; -public class PushdownFilterThroughSortTest implements MemoPatternMatchSupported { +public class PushDownFilterThroughSortTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student, ImmutableList.of("")); @@ -56,7 +56,7 @@ void testPushdownFilterThroughSortTest() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughSort()) + .applyTopDown(new PushDownFilterThroughSort()) .matchesFromRoot( logicalSort( logicalFilter( @@ -77,7 +77,7 @@ void testFilterOneConstant() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughSort()) + .applyTopDown(new PushDownFilterThroughSort()) .matchesFromRoot(logicalFilter(logicalOlapScan())); } @@ -95,7 +95,7 @@ void testFilterTwoConstant() { .filter(filterPredicate) .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughSort()) + .applyTopDown(new PushDownFilterThroughSort()) .matchesFromRoot(logicalSort(logicalFilter(logicalOlapScan()))); Expression filterPredicate2 = new EqualTo(id, Literal.of(1)); @@ -104,7 +104,7 @@ void testFilterTwoConstant() { .filter(Sets.newHashSet(filterPredicate2, filterPredicate)) .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownFilterThroughSort()) + .applyTopDown(new PushDownFilterThroughSort()) .matchesFromRoot(logicalFilter(logicalOlapScan())); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindowTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindowTest.java similarity index 97% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindowTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindowTest.java index 8d09426ce356f4..e62de6cdf9e435 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughWindowTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughWindowTest.java @@ -42,7 +42,7 @@ import java.util.List; -class PushdownFilterThroughWindowTest implements MemoPatternMatchSupported { +class PushDownFilterThroughWindowTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student, ImmutableList.of("")); @@ -67,7 +67,7 @@ void pushDownFilterThroughWindowTest() { .project(ImmutableList.of(0)) .build(); PlanChecker.from(context, plan) - .applyTopDown(new PushdownFilterThroughWindow()) + .applyTopDown(new PushDownFilterThroughWindow()) .matches( logicalProject( logicalWindow( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherConditionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherConditionTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherConditionTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherConditionTest.java index 98c0f283946d8d..05642f084d5b58 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownJoinOtherConditionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOtherConditionTest.java @@ -41,7 +41,7 @@ import java.util.List; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -class PushdownJoinOtherConditionTest implements MemoPatternMatchSupported { +class PushDownJoinOtherConditionTest implements MemoPatternMatchSupported { private LogicalOlapScan rStudent; private LogicalOlapScan rScore; @@ -92,7 +92,7 @@ private void oneSide(JoinType joinType, boolean testRight) { .build(); PlanChecker planChecker = PlanChecker.from(MemoTestUtils.createConnectContext(), root) - .applyTopDown(new PushdownJoinOtherCondition()); + .applyTopDown(new PushDownJoinOtherCondition()); if (testRight) { planChecker.matches( @@ -130,7 +130,7 @@ private void bothSideToBothSide(JoinType joinType) { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), root) - .applyTopDown(new PushdownJoinOtherCondition()) + .applyTopDown(new PushDownJoinOtherCondition()) .matches( logicalJoin( logicalFilter().when(left -> left.getConjuncts().equals(ImmutableSet.of(leftSide))), @@ -164,7 +164,7 @@ private void bothSideToOneSide(JoinType joinType, boolean testRight) { .build(); PlanChecker planChecker = PlanChecker.from(MemoTestUtils.createConnectContext(), root) - .applyTopDown(new PushdownJoinOtherCondition()); + .applyTopDown(new PushDownJoinOtherCondition()); if (testRight) { planChecker.matches( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoinTest.java similarity index 93% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoinTest.java index 73a9baac8e4d0f..e3c972e0556d5c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitDistinctThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitDistinctThroughJoinTest.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Test; -class PushdownLimitDistinctThroughJoinTest extends TestWithFeService implements MemoPatternMatchSupported { +class PushDownLimitDistinctThroughJoinTest extends TestWithFeService implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -75,7 +75,7 @@ void testJoin() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches( logicalJoin( logicalLimit(logicalAggregate(logicalOlapScan())).when(l -> l.getLimit() == 10), @@ -89,7 +89,7 @@ void testJoin() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches( logicalJoin( logicalOlapScan(), @@ -103,7 +103,7 @@ void testJoin() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches( logicalJoin( logicalLimit(logicalAggregate(logicalOlapScan())).when(l -> l.getLimit() == 10), @@ -117,7 +117,7 @@ void testJoin() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches( logicalJoin( logicalOlapScan(), @@ -148,7 +148,7 @@ void badCaseJoinType() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches(logicalJoin(logicalOlapScan(), logicalOlapScan())); } @@ -161,7 +161,7 @@ void badCaseOutput() { .limit(10) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownLimitDistinctThroughJoin()) + .applyTopDown(new PushDownLimitDistinctThroughJoin()) .matches(logicalJoin(logicalOlapScan(), logicalOlapScan())); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java similarity index 99% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java index 28e1a7fa468619..9ac6078a077374 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownLimitTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownLimitTest.java @@ -63,7 +63,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -class PushdownLimitTest extends TestWithFeService implements MemoPatternMatchSupported { +class PushDownLimitTest extends TestWithFeService implements MemoPatternMatchSupported { private final LogicalOlapScan scanScore = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.score); private final LogicalOlapScan scanStudent = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student); @@ -351,7 +351,7 @@ private void test(JoinType joinType, boolean hasProject, PatternDescriptor() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); } }; Alias min = new Min(scan1.getOutput().get(0)).alias("min"); @@ -61,7 +61,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownMinMaxThroughJoin()) + .applyTopDown(new PushDownMinMaxThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -77,7 +77,7 @@ void testMultiJoin() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); } }; Alias min = new Min(scan1.getOutput().get(0)).alias("min"); @@ -89,7 +89,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownMinMaxThroughJoin()) + .applyTopDown(new PushDownMinMaxThroughJoin()) .printlnTree() .matches( logicalAggregate( @@ -116,7 +116,7 @@ void testAggNotOutputGroupBy() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); } }; // agg don't output group by @@ -128,7 +128,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownMinMaxThroughJoin()) + .applyTopDown(new PushDownMinMaxThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -149,7 +149,7 @@ void testBothSideSingleJoin() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); } }; Alias min = new Min(scan1.getOutput().get(1)).alias("min"); @@ -161,7 +161,7 @@ public Set getEnableNereidsRules() { PlanChecker.from(MemoTestUtils.createConnectContext(), plan) .printlnTree() - .applyTopDown(new PushdownMinMaxThroughJoin()) + .applyTopDown(new PushDownMinMaxThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -177,7 +177,7 @@ void testBothSide() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_MIN_MAX_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); } }; Alias min = new Min(scan1.getOutput().get(1)).alias("min"); @@ -189,7 +189,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownMinMaxThroughJoin()) + .applyTopDown(new PushDownMinMaxThroughJoin()) .matches( logicalAggregate( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimitTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimitTest.java similarity index 93% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimitTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimitTest.java index d3adbe98329c79..72b21e5e309e71 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownProjectThroughLimitTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownProjectThroughLimitTest.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Test; -class PushdownProjectThroughLimitTest implements MemoPatternMatchSupported { +class PushDownProjectThroughLimitTest implements MemoPatternMatchSupported { @Test void testPushdownProjectThroughLimit() { @@ -37,7 +37,7 @@ void testPushdownProjectThroughLimit() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), project) - .applyTopDown(new PushdownProjectThroughLimit()) + .applyTopDown(new PushDownProjectThroughLimit()) .matches( logicalLimit(logicalProject()) ); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java similarity index 90% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java index f97c8244653b8b..5828d2319f283b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownSumThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java @@ -39,7 +39,7 @@ import java.util.Set; -class PushdownSumThroughJoinTest implements MemoPatternMatchSupported { +class PushDownSumThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -48,7 +48,7 @@ void testSingleJoinLeftSum() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_SUM_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); } }; Alias sum = new Sum(scan1.getOutput().get(1)).alias("sum"); @@ -58,7 +58,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownSumThroughJoin()) + .applyTopDown(new PushDownSumThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -74,7 +74,7 @@ void testSingleJoinRightSum() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_SUM_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); } }; Alias sum = new Sum(scan2.getOutput().get(1)).alias("sum"); @@ -84,7 +84,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownSumThroughJoin()) + .applyTopDown(new PushDownSumThroughJoin()) .matches( logicalAggregate( logicalJoin( @@ -100,7 +100,7 @@ void testAggNotOutputGroupBy() { new MockUp() { @Mock public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSHDOWN_SUM_THROUGH_JOIN.type()); + return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); } }; // agg don't output group by @@ -111,7 +111,7 @@ public Set getEnableNereidsRules() { .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), plan) - .applyTopDown(new PushdownSumThroughJoin()) + .applyTopDown(new PushDownSumThroughJoin()) .matches( logicalAggregate( logicalJoin( diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoinTest.java similarity index 96% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoinTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoinTest.java index 8532f11929801b..7e8a82c31e4a0d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownTopNThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownTopNThroughJoinTest.java @@ -36,7 +36,7 @@ import java.util.List; -class PushdownTopNThroughJoinTest extends TestWithFeService implements MemoPatternMatchSupported { +class PushDownTopNThroughJoinTest extends TestWithFeService implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -80,7 +80,7 @@ void testJoin() { .topN(10, 0, ImmutableList.of(0)) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownTopNThroughJoin()) + .applyTopDown(new PushDownTopNThroughJoin()) .matches( logicalTopN( logicalJoin( @@ -101,7 +101,7 @@ void testProject1() { .topN(10, 0, ImmutableList.of(0)) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownTopNThroughJoin()) + .applyTopDown(new PushDownTopNThroughJoin()) .matches( logicalTopN( logicalProject( @@ -186,7 +186,7 @@ void rejectTopNUseProjectComplexExpr() { .topN(10, 0, ImmutableList.of(0)) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownTopNThroughJoin()) + .applyTopDown(new PushDownTopNThroughJoin()) .matches( logicalJoin( logicalOlapScan(), @@ -202,7 +202,7 @@ void rejectWrongJoinType() { .topN(10, 0, ImmutableList.of(0)) .build(); PlanChecker.from(connectContext, plan) - .applyTopDown(new PushdownTopNThroughJoin()) + .applyTopDown(new PushDownTopNThroughJoin()) .matches( logicalJoin( logicalOlapScan(), diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectRollupIndexTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectRollupIndexTest.java index ed5a96933db105..4661fcf69432fc 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectRollupIndexTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectRollupIndexTest.java @@ -20,7 +20,7 @@ import org.apache.doris.common.FeConstants; import org.apache.doris.nereids.rules.analysis.LogicalSubQueryAliasToLogicalProject; import org.apache.doris.nereids.rules.rewrite.MergeProjects; -import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughProject; +import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughProject; import org.apache.doris.nereids.trees.plans.PreAggStatus; import org.apache.doris.nereids.util.MemoPatternMatchSupported; import org.apache.doris.nereids.util.PlanChecker; @@ -189,7 +189,7 @@ public void testWithFilterAndProject() { PlanChecker.from(connectContext) .analyze(sql) .applyBottomUp(new LogicalSubQueryAliasToLogicalProject()) - .applyTopDown(new PushdownFilterThroughProject()) + .applyTopDown(new PushDownFilterThroughProject()) .applyBottomUp(new MergeProjects()) .applyTopDown(new SelectMaterializedIndexWithAggregate()) .applyTopDown(new SelectMaterializedIndexWithoutAggregate()) From aa766a7b4ac5e1d647fdb73a8316b4d6014c26ae Mon Sep 17 00:00:00 2001 From: yiguolei <676222867@qq.com> Date: Thu, 23 Nov 2023 21:43:39 +0800 Subject: [PATCH 15/64] [bugfix](pipeline core) lock fragment context during task close to avoid concurrent delete (#27484) --- be/src/pipeline/task_scheduler.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/be/src/pipeline/task_scheduler.cpp b/be/src/pipeline/task_scheduler.cpp index cc6e502fb5ee11..0fffdb72a6cf9d 100644 --- a/be/src/pipeline/task_scheduler.cpp +++ b/be/src/pipeline/task_scheduler.cpp @@ -352,6 +352,10 @@ void TaskScheduler::_do_work(size_t index) { void TaskScheduler::_try_close_task(PipelineTask* task, PipelineTaskState state, Status exec_status) { + // close_a_pipeline may delete fragment context and will core in some defer + // code, because the defer code will access fragment context it self. + std::shared_ptr lock_for_context = + task->fragment_context()->shared_from_this(); auto status = task->try_close(exec_status); auto cancel = [&]() { task->query_context()->cancel(true, status.to_string(), @@ -365,6 +369,9 @@ void TaskScheduler::_try_close_task(PipelineTask* task, PipelineTaskState state, } if (!task->is_pipelineX() && task->is_pending_finish()) { task->set_state(PipelineTaskState::PENDING_FINISH); + // After the task is added to the block queue, it maybe run by another thread + // and the task maybe released in the other thread. And will core at + // task set running. static_cast(_blocked_task_scheduler->add_blocked_task(task)); task->set_running(false); return; @@ -382,10 +389,6 @@ void TaskScheduler::_try_close_task(PipelineTask* task, PipelineTaskState state, task->set_close_pipeline_time(); task->finalize(); task->set_running(false); - // close_a_pipeline may delete fragment context and will core in some defer - // code, because the defer code will access fragment context it self. - std::shared_ptr lock_for_context = - task->fragment_context()->shared_from_this(); task->fragment_context()->close_a_pipeline(); } From 540bce4d1b32263e78f18e77dbaa071374c778f2 Mon Sep 17 00:00:00 2001 From: Lei Zhang <27994433+SWJTU-ZhangLei@users.noreply.github.com> Date: Thu, 23 Nov 2023 23:03:06 +0800 Subject: [PATCH 16/64] [typo](log) Let env lock msg more distinct (#27493) --- .../main/java/org/apache/doris/catalog/Env.java | 10 +++++----- .../apache/doris/datasource/InternalCatalog.java | 14 ++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) 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 941e24599b7e67..78f83bb7c5d15c 100755 --- 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 @@ -855,7 +855,7 @@ private boolean tryLock(boolean mustLock) { // to see which thread held this lock for long time. Thread owner = lock.getOwner(); if (owner != null) { - LOG.info("catalog lock is held by: {}", Util.dumpThread(owner, 10)); + LOG.info("env lock is held by: {}", Util.dumpThread(owner, 10)); } if (mustLock) { @@ -866,7 +866,7 @@ private boolean tryLock(boolean mustLock) { } return true; } catch (InterruptedException e) { - LOG.warn("got exception while getting catalog lock", e); + LOG.warn("got exception while getting env lock", e); if (mustLock) { continue; } else { @@ -2634,7 +2634,7 @@ protected void runAfterCatalogReady() { public void addFrontend(FrontendNodeType role, String host, int editLogPort) throws DdlException { if (!tryLock(false)) { - throw new DdlException("Failed to acquire catalog lock. Try again"); + throw new DdlException("Failed to acquire env lock. Try again"); } try { Frontend fe = checkFeExist(host, editLogPort); @@ -2680,7 +2680,7 @@ public void modifyFrontendHostName(String srcHost, int srcPort, String destHost) public void modifyFrontendHost(String nodeName, String destHost) throws DdlException { if (!tryLock(false)) { - throw new DdlException("Failed to acquire catalog lock. Try again"); + throw new DdlException("Failed to acquire env lock. Try again"); } try { Frontend fe = getFeByName(nodeName); @@ -2711,7 +2711,7 @@ public void dropFrontend(FrontendNodeType role, String host, int port) throws Dd throw new DdlException("can not drop current master node."); } if (!tryLock(false)) { - throw new DdlException("Failed to acquire catalog lock. Try again"); + throw new DdlException("Failed to acquire env lock. Try again"); } try { Frontend fe = checkFeExist(host, port); 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 aa8d40afc23164..a8f548185c979e 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 @@ -330,14 +330,12 @@ private boolean tryLock(boolean mustLock) { while (true) { try { if (!lock.tryLock(Config.catalog_try_lock_timeout_ms, TimeUnit.MILLISECONDS)) { - if (LOG.isDebugEnabled()) { - // to see which thread held this lock for long time. - Thread owner = lock.getOwner(); - if (owner != null) { - // There are many catalog timeout during regression test - // And this timeout should not happen very often, so it could be info log - LOG.info("catalog lock is held by: {}", Util.dumpThread(owner, 10)); - } + // to see which thread held this lock for long time. + Thread owner = lock.getOwner(); + if (owner != null) { + // There are many catalog timeout during regression test + // And this timeout should not happen very often, so it could be info log + LOG.info("catalog lock is held by: {}", Util.dumpThread(owner, 10)); } if (mustLock) { From 5d31bc99b8689fd12cfa275cf8b885b69a0a1afc Mon Sep 17 00:00:00 2001 From: abmdocrt Date: Thu, 23 Nov 2023 23:03:38 +0800 Subject: [PATCH 17/64] [Fix](Group_commit) Fix group commit regression test failure (#27475) --- ...test_group_commit_interval_ms_property.out | 8 +++---- ...t_group_commit_interval_ms_property.groovy | 23 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/regression-test/data/insert_p0/test_group_commit_interval_ms_property.out b/regression-test/data/insert_p0/test_group_commit_interval_ms_property.out index 54013be8c16dc9..2537f0a4a54f2d 100644 --- a/regression-test/data/insert_p0/test_group_commit_interval_ms_property.out +++ b/regression-test/data/insert_p0/test_group_commit_interval_ms_property.out @@ -1,13 +1,13 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !1 -- -test_group_commit_interval_ms_property_tbl CREATE TABLE `test_group_commit_interval_ms_property_tbl` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "10000"\n); +test_group_commit_interval_ms_property_tbl_legacy CREATE TABLE `test_group_commit_interval_ms_property_tbl_legacy` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "10000"\n); -- !2 -- -test_group_commit_interval_ms_property_tbl CREATE TABLE `test_group_commit_interval_ms_property_tbl` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "1000"\n); +test_group_commit_interval_ms_property_tbl_legacy CREATE TABLE `test_group_commit_interval_ms_property_tbl_legacy` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "1000"\n); -- !1 -- -test_group_commit_interval_ms_property_tbl CREATE TABLE `test_group_commit_interval_ms_property_tbl` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "10000"\n); +test_group_commit_interval_ms_property_tbl_nereids CREATE TABLE `test_group_commit_interval_ms_property_tbl_nereids` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "10000"\n); -- !2 -- -test_group_commit_interval_ms_property_tbl CREATE TABLE `test_group_commit_interval_ms_property_tbl` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "1000"\n); +test_group_commit_interval_ms_property_tbl_nereids CREATE TABLE `test_group_commit_interval_ms_property_tbl_nereids` (\n `k` BIGINT NULL,\n `v` BIGINT NULL\n) ENGINE=OLAP\nUNIQUE KEY(`k`)\nCOMMENT 'OLAP'\nDISTRIBUTED BY HASH(`v`) BUCKETS 8\nPROPERTIES (\n"replication_allocation" = "tag.location.default: 1",\n"min_load_replica_num" = "-1",\n"is_being_synced" = "false",\n"storage_format" = "V2",\n"light_schema_change" = "true",\n"disable_auto_compaction" = "false",\n"binlog.enable" = "false",\n"binlog.ttl_seconds" = "9223372036854775807",\n"binlog.max_bytes" = "9223372036854775807",\n"binlog.max_history_nums" = "9223372036854775807",\n"enable_single_replica_compaction" = "false",\n"group_commit_interval_ms" = "1000"\n); diff --git a/regression-test/suites/insert_p0/test_group_commit_interval_ms_property.groovy b/regression-test/suites/insert_p0/test_group_commit_interval_ms_property.groovy index 0a1313b15de54d..fd5dafcdc7dd95 100644 --- a/regression-test/suites/insert_p0/test_group_commit_interval_ms_property.groovy +++ b/regression-test/suites/insert_p0/test_group_commit_interval_ms_property.groovy @@ -39,13 +39,14 @@ suite("test_group_commit_interval_ms_property") { return serverInfo } + + for (item in ["legacy", "nereids"]) { try { - // create table - sql """ drop table if exists ${table}; """ - + test_table = table + "_" + item; + sql """ drop table if exists ${test_table} force; """ sql """ - CREATE TABLE ${table} ( + CREATE table ${test_table} ( k bigint, v bigint ) @@ -69,25 +70,25 @@ suite("test_group_commit_interval_ms_property") { sql """ set enable_nereids_dml = false; """ } - qt_1 "show create table ${table}" + qt_1 "show create table ${test_table}" - def msg1 = group_commit_insert """insert into ${table} values(1,1); """, 1 + def msg1 = group_commit_insert """insert into ${test_table} values(1,1); """, 1 Thread.sleep(8000); - def msg2 = group_commit_insert """insert into ${table} values(2,2) """, 1 + def msg2 = group_commit_insert """insert into ${test_table} values(2,2) """, 1 assertEquals(msg1.substring(msg1.indexOf("group_commit")+11, msg1.indexOf("group_commit")+43), msg2.substring(msg2.indexOf("group_commit")+11, msg2.indexOf("group_commit")+43)); - sql "ALTER TABLE ${table} SET (\"group_commit_interval_ms\"=\"1000\"); " + sql "ALTER table ${test_table} SET (\"group_commit_interval_ms\"=\"1000\"); " - qt_2 "show create table ${table}" + qt_2 "show create table ${test_table}" - def msg3 = group_commit_insert """insert into ${table} values(3,3); """, 1 + def msg3 = group_commit_insert """insert into ${test_table} values(3,3); """, 1 Thread.sleep(2000); - def msg4 = group_commit_insert """insert into ${table} values(4,4); """, 1 + def msg4 = group_commit_insert """insert into ${test_table} values(4,4); """, 1 assertNotEquals(msg3.substring(msg3.indexOf("group_commit")+11, msg3.indexOf("group_commit")+43), msg4.substring(msg4.indexOf("group_commit")+11, msg4.indexOf("group_commit")+43)); From 5adbe47d3af7245f3bdf10baec2e5947dad0bac1 Mon Sep 17 00:00:00 2001 From: HHoflittlefish777 <77738092+HHoflittlefish777@users.noreply.github.com> Date: Thu, 23 Nov 2023 23:04:10 +0800 Subject: [PATCH 18/64] [test](regression) add stream load tvf properties regression test (#27467) --- .../load_p0/http_stream/test_http_stream.out | 4 + .../http_stream/test_http_stream_json.out | 5 + .../test_http_stream_properties.out | 644 ++++++++++++++++++ .../http_stream/test_http_stream.groovy | 36 + .../http_stream/test_http_stream_json.groovy | 44 ++ .../test_http_stream_properties.groovy | 258 ++++++- 6 files changed, 989 insertions(+), 2 deletions(-) diff --git a/regression-test/data/load_p0/http_stream/test_http_stream.out b/regression-test/data/load_p0/http_stream/test_http_stream.out index fd047d50bfc638..68fbf64f4bfc99 100644 --- a/regression-test/data/load_p0/http_stream/test_http_stream.out +++ b/regression-test/data/load_p0/http_stream/test_http_stream.out @@ -612,3 +612,7 @@ -- !sql16_1 -- +-- !sql_trim_double_quotes -- +1 test +2 test + diff --git a/regression-test/data/load_p0/http_stream/test_http_stream_json.out b/regression-test/data/load_p0/http_stream/test_http_stream_json.out index 0f42c5214c94a7..6c55a54f0d1487 100644 --- a/regression-test/data/load_p0/http_stream/test_http_stream_json.out +++ b/regression-test/data/load_p0/http_stream/test_http_stream_json.out @@ -46,3 +46,8 @@ 10 23456711 10 23456710 +-- !sql_num_as_string -- +10 1.23 3.14159 +20 4.56 2.71828 +30 7.89 1.61803 + diff --git a/regression-test/data/load_p0/http_stream/test_http_stream_properties.out b/regression-test/data/load_p0/http_stream/test_http_stream_properties.out index 702c0da8244ffa..b04fa4467d705a 100644 --- a/regression-test/data/load_p0/http_stream/test_http_stream_properties.out +++ b/regression-test/data/load_p0/http_stream/test_http_stream_properties.out @@ -21,6 +21,200 @@ 90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N 91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +-- !sql_merge_type_append -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_merge_type_append -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_merge_type_append -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_merge_type_append -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N + +-- !sql_merge_type_append -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [63, 63, 63, 63, 63, 63] [11399, 11399, 11399, 11399, 11399, 11399] [-583523026, -583523026, -583523026, -583523026, -583523026, -583523026] [8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293] [-8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906] [23243.16, 23243.16, 23243.16, 23243.16, 23243.16] [716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115] [-40335903, -40335903, -40335903, -40335903, -40335903, -40335903] [74087997, 74087997, 74087997, 74087997, 74087997, 74087997] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27"] ["2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28"] ["2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47"] ["z", "z", "z", "z", "z", "z"] ["1", "1", "1", "1", "1", "1"] ["xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [1, 1, 1, 1, 1, 1] [-7, -7, -7, -7, -7, -7] [18655, 18655, 18655, 18655, 18655, 18655] [6240356, 6240356, 6240356, 6240356, 6240356, 6240356] [4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393] [323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978] [2972.2478, 2972.2478, 2972.2478, 2972.2478, 2972.2478] [-1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008] [-84949097, -84949097, -84949097, -84949097, -84949097, -84949097] [29815991, 29815991, 29815991, 29815991, 29815991, 29815991] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11"] ["2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10"] ["2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07"] ["9", "9", "9", "9", "9", "9"] ["n", "n", "n", "n", "n", "n"] ["s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_merge_type_append -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_merge_type_append -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_merge_type_delete -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_merge_type_merge -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + -- !sql_skip_lines -- 8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N 20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N @@ -157,3 +351,453 @@ 76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] 88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [63, 63, 63, 63, 63, 63] [11399, 11399, 11399, 11399, 11399, 11399] [-583523026, -583523026, -583523026, -583523026, -583523026, -583523026] [8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293] [-8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906] [23243.16, 23243.16, 23243.16, 23243.16, 23243.16] [716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115] [-40335903, -40335903, -40335903, -40335903, -40335903, -40335903] [74087997, 74087997, 74087997, 74087997, 74087997, 74087997] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27"] ["2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28"] ["2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47"] ["z", "z", "z", "z", "z", "z"] ["1", "1", "1", "1", "1", "1"] ["xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [1, 1, 1, 1, 1, 1] [-7, -7, -7, -7, -7, -7] [18655, 18655, 18655, 18655, 18655, 18655] [6240356, 6240356, 6240356, 6240356, 6240356, 6240356] [4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393] [323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978] [2972.2478, 2972.2478, 2972.2478, 2972.2478, 2972.2478] [-1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008] [-84949097, -84949097, -84949097, -84949097, -84949097, -84949097] [29815991, 29815991, 29815991, 29815991, 29815991, 29815991] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11"] ["2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10"] ["2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07"] ["9", "9", "9", "9", "9", "9"] ["n", "n", "n", "n", "n", "n"] ["s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_load_to_single_tablet -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [63, 63, 63, 63, 63, 63] [11399, 11399, 11399, 11399, 11399, 11399] [-583523026, -583523026, -583523026, -583523026, -583523026, -583523026] [8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293] [-8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906] [23243.16, 23243.16, 23243.16, 23243.16, 23243.16] [716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115] [-40335903, -40335903, -40335903, -40335903, -40335903, -40335903] [74087997, 74087997, 74087997, 74087997, 74087997, 74087997] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27"] ["2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28"] ["2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47"] ["z", "z", "z", "z", "z", "z"] ["1", "1", "1", "1", "1", "1"] ["xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [1, 1, 1, 1, 1, 1] [-7, -7, -7, -7, -7, -7] [18655, 18655, 18655, 18655, 18655, 18655] [6240356, 6240356, 6240356, 6240356, 6240356, 6240356] [4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393] [323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978] [2972.2478, 2972.2478, 2972.2478, 2972.2478, 2972.2478] [-1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008] [-84949097, -84949097, -84949097, -84949097, -84949097, -84949097] [29815991, 29815991, 29815991, 29815991, 29815991, 29815991] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11"] ["2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10"] ["2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07"] ["9", "9", "9", "9", "9", "9"] ["n", "n", "n", "n", "n", "n"] ["s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_load_to_single_tablet -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_enable_profile -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_enable_profile -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_enable_profile -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N + +-- !sql_enable_profile -- +8 2023-08-14 true 109 -31573 -1362465190 3990845741226497177 2732763251146840270 -25698.553 1.312831962567818E9 99999999.9 99999999.9 2023-03-07T14:13:19 2022-10-18 2023-07-16T05:03:13 D PBn1wa6X8WneZYLMac11zzyhGl7tPXB5XgjmOV8L6uav9ja5oY433ktb2yhyQQIqBveZPkme {"animal":"lion","weight":200,"habitat":["savannah","grassland"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +20 2023-08-17 false -5 18158 784479801 1485484354598941738 -6632681928222776815 9708.431 -3.30432620706069E8 -99999999.9 99999999.9 2022-09-15T21:40:55 2023-02-23 2023-08-13T21:31:54 O X 2pYmX2vAhfEEHZZYPsgAmda1G7otnwx5TmUC879FPhDeIjvWI79ksBZpfFG2gp7jhCSbpZiecKGklB5SvG8tm31i5SUqe1xrWgLt4HSq7lMJWp75tx2kxD7pRIOpn {"name":"Sarah","age":30,"city":"London","isMarried":false} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +21 2023-08-18 false 63 -27847 -35409596 8638201997392767650 4919963231735304178 -23382.541 -1.803403621426313E9 -22009767.0 99999999.9 2023-03-31T10:56:14 2023-01-20 2023-02-18T13:37:52 N T PSiFwUEx3eVFNtjlnQ70YkgZNvKrGmQ2DN5K9yYHiSdFWeEDB1UpL3Frt8z1kEAIWRDWqXZuyi {"city":"Sydney","population":5312000,"area":2058.7} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +31 2023-08-27 false 17 -18849 1728109133 3266501886640700374 527195452623418935 -24062.328 -1.514348021262435E9 -99999999.9 -99999999.9 2022-10-07T03:24:23 2022-09-25 \N 0 8 yKMiAntORoRa8svnMfcxlOPwwND1m5s2fdS26Xu6cfs6HK5SAibqIp9h8sZcpjHy4 {"team":"Manchester United","players":["Ronaldo","Rooney","Giggs"],"coach":"Ole Gunnar Solskjaer"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +41 2023-08-27 true -104 22750 \N 8527773271030840740 5554497317268279215 -5296.828 -1.71564688801304E9 -99999999.9 99999999.9 2022-12-02T17:56:44 2022-10-12 2023-02-19T07:02:54 V \N E9GzQdTwX1ITUQz27IVznAs6Ca4WwprKk6Odjs6SH75D2F1089QiY3HQ52LXRD1V6xAWjhLE2hWgW3EdHuAOnUDVrb5V {"food":"Sushi","price":10,"restaurant":"Sushi King"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +49 2023-08-08 false \N 16275 -2144851675 -2303421957908954634 -46526938720058765 -13141.143 -6.866322332302E8 99999999.9 -99999999.9 2022-09-01T00:16:01 2023-03-25 2022-09-07T14:59:03 s yvuILR2iNxfe8RRml {"student":true,"name":"Alice","grade":9,"subjects":["math","science","history"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-06 true 109 -6330 1479023892 -8630800697573159428 -1645095773540208759 17880.96 -1.453844792013949E9 -99999999.9 -99999999.9 2022-09-22T02:03:21 2023-05-14 2023-03-25T02:18:34 m JKnIgXvGVidGiWl9YRSi3mFI7wHKt1sBpWSadKF8VX3LAuElm4sdc9gtxREaUr57oikSYlU8We8h1MWqQlYNiJObl {"city":"Tokyo","temperature":20.5,"humidity":75} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +50 2023-08-24 true 15 14403 \N -6418906115745394180 9205303779366462513 -4331.549 -6.15112179557648E8 99999999.9 -99999999.9 2022-12-29T02:27:20 2023-06-01 2023-08-12T04:50:04 a eCl38sztIvBQvGvGKyYZmyMXy9vIJx197iu3JwP9doJGcrYUl9Uova0rz4iCCgrjlAiZU18Fs9YtCq830nhM {"band":"The Beatles","members":["John Lennon","Paul McCartney","George Harrison","Ringo Starr"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +57 2023-08-19 true 2 -25462 -74112029 6458082754318544493 -7910671781690629051 -15205.859 -3.06870797484914E8 99999999.9 -99999999.9 2023-07-10T18:39:10 2023-02-12 2023-01-27T07:26:06 y Xi9nDVrLv8m6AwEpUxmtzFAuK48sQ {"name":"John","age":25,"city":"New York"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +58 2023-08-22 \N 0 -18231 1832867360 6997858407575297145 2480714305422728023 -5450.489 1.475901032138386E9 -99999999.9 -99999999.9 2023-02-02T05:13:24 2022-09-18 2023-04-23T10:51:15 k LdFXF7Kmfzgmnn2R6zLsXdmi3A2cLBLq4G4WDVNDhxvH7dYH8Kga2WA47uSIxp6NSrwPSdw0ssB1TS8RFJTDJAB0Uba3e05NL2Aiw0ja {"restaurant":"Pizza Hut","menu":["pizza","pasta","salad"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +60 2023-08-27 false -52 -2338 -757056972 1047567408607120856 6541476642780646552 6614.0894 -1.204448798517855E9 99999999.9 99999999.9 2022-12-29T14:47:30 2022-09-24 2023-08-01T12:41:59 O F RM4F1Ke7lkcnuxF2nK0j9VBW3MDcgyHR4pseBjtFnqS6GUkVFuzF6u3Cp9Nv7ab0O6UYrpP4DhU {"game":"Chess","players":2,"time":"1 hour"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +62 2023-08-21 false 81 20302 -200761532 6365479976421007608 \N -29916.533 1.709141750828478E9 99999999.9 -99999999.9 2023-05-04T01:14:51 2022-09-17 2022-12-04T19:30:09 d v BKWy9dTNg1aZW7ancEJAmEDOPK5TwFsNSHbI78emu9gymeIlx5NoLmyii0QAqdzRvSQPZKiqKkwInGCTIBnK1yYkK7zD {"username":"user123","password":"pass123","email":"user123@example.com"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +65 2023-08-09 false 94 31514 814994517 -297697460695940343 734910652450318597 -13061.892 6.2750847041706E7 -9808654.0 \N 2023-08-14T22:01:27 2023-05-19 2022-11-13T13:44:28 V aGeMsI24O12chGlP5ak0AHghAz7bu5MargJBStHnt0yMnChH0JnfYhsfH1u59XIHkJKMsHYktBqORkGlovu8V47E74KeFpaqxn5yLyXfDbhhzUKf {"language":"Python","version":3.9,"frameworks":["Django","Flask"]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +66 2023-08-15 true -91 28378 609923317 4872185586197131212 1207709464099378591 \N -1.863683325985123E9 -99999999.9 -99999999.9 2022-09-24T10:39:23 2022-09-24 2022-10-16T18:36:43 Y z AI1BSPQdKiHJiQH1kguyLSWsDXkC7zwy7PwgWnyGSaa9tBKRex8vHBdxg2QSKZKL2mV2lHz7iI1PnsTd4MXDcIKhqiHyPuQPt2tEtgt0UgF6 {"book":{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},"year":1925} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +68 2023-08-23 true -73 20117 1737338128 795638676048937749 -5551546237562433901 -30627.04 6.8589475684545E7 99999999.9 99999999.9 2022-12-28T20:26:51 2022-10-04 2023-07-30T00:20:06 y keZ3JlWWpdnPBejf0cuiCQCVBBTd5gjvO08NVdcAFewqL7nRT4N9lnvSU6pWmletA5VbPQCeQapJdcnQCHfZUDCf4ulCnczyqr7SGrbGRT0XYcd7iktKM {"country":"Brazil","continent":"South America","population":211049527} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +80 2023-08-18 false -18 -8971 679027874 6535956962935330265 3960889045799757165 -13219.76 1.187161924505394E9 -99999999.9 -99999999.9 2023-03-11T07:40 2022-11-29 2023-01-14T07:24:07 \N D 3Nhx6xX1qdwaq7lxwLRSKMtJFbC03swWv12mpySSVysH3igGZTiGPuKMsYW7HAkf6CWc7c0nzqDsjuH3FYVMNCWRmfxMrmY8rykQCC4Ve {"car":"BMW","model":"X5","year":2020,"color":"black"} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +81 2023-08-23 false 106 11492 -667795397 4480250461471356146 -5346660566234294101 9082.75 3.85167225902608E8 -99999999.9 99999999.9 2023-03-20T03:33:16 2022-11-24 2023-02-16T18:29:41 G 9 Lk3eNVQNjucbekD1rZmUlGPiXS5JvcWr2LQzRU8GSGIbSag {"flower":"rose","color":"red","fragrance":true} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +85 2023-08-11 true -7 24304 -2043877415 -2024144417867729183 \N 5363.0244 -5.78615669042831E8 -99999999.9 -99999999.9 2023-07-15T01:07:41 2023-08-13 2023-01-20T11:57:48 i WQ9dh9ajPu0y {"country":"France","capital":"Paris","population":67081000} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +90 2023-08-27 true 22 16456 -1476824962 -3279894870153540825 8990195191470116763 26651.906 2.06860148942546E8 -99999999.9 -99999999.9 2022-10-07T03:11:03 2023-03-18 2023-04-15T00:38:33 T L QW0GQ3GoMtHgxPQOWGfVaveynahNpsNs09siMFA1OtO6QEDBQTdivmGyq7bFzejAqwbbVQQpREAmeLjcFSXLnQuou2KbwYD {"company":"Apple","products":[{"name":"iPhone","price":1000},{"name":"MacBook","price":1500}]} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N +91 2023-08-27 true 90 2465 702240964 6373830997821598984 305860046137409400 15991.356 1.599972327386147E9 -99999999.9 \N 2023-04-26T19:31:10 2023-07-21 \N 2 B7YKYBYT8w0YC926bZ8Yz1VzyiWw2NWDAiTlEoPVyz9AXGti2Npg1FxWqWk4hEaALw0ZBSuiAIPj41lq36g5QRpPmAjNPK {"fruit":"apple","color":"red","qty":5,"price":2.5} \N \N \N true 1 2 3 4 5 6.0 7.0 888888888 999999999 2023-08-24 2023-08-24T12:00 2023-08-24 2023-08-24T12:00 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 我能吞下玻璃而不伤身体 \N \N \N \N + +-- !sql_enable_profile -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [63, 63, 63, 63, 63, 63] [11399, 11399, 11399, 11399, 11399, 11399] [-583523026, -583523026, -583523026, -583523026, -583523026, -583523026] [8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293, 8801164674137231293] [-8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906, -8287675635310193906] [23243.16, 23243.16, 23243.16, 23243.16, 23243.16] [716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115, 716719993.249115] [-40335903, -40335903, -40335903, -40335903, -40335903, -40335903] [74087997, 74087997, 74087997, 74087997, 74087997, 74087997] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27", "2023-08-06 19:03:27"] ["2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28", "2023-03-28"] ["2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47", "2022-09-27 09:19:47"] ["z", "z", "z", "z", "z", "z"] ["1", "1", "1", "1", "1", "1"] ["xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz", "xdc5RcpnOAqeK6Hmz"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [1, 1, 1, 1, 1, 1] [-7, -7, -7, -7, -7, -7] [18655, 18655, 18655, 18655, 18655, 18655] [6240356, 6240356, 6240356, 6240356, 6240356, 6240356] [4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393, 4552179257266841393] [323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978, 323868824766329978] [2972.2478, 2972.2478, 2972.2478, 2972.2478, 2972.2478] [-1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008, -1177167334.995008] [-84949097, -84949097, -84949097, -84949097, -84949097, -84949097] [29815991, 29815991, 29815991, 29815991, 29815991, 29815991] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11", "2022-09-10 01:11:11"] ["2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10", "2022-09-10"] ["2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07", "2023-06-06 20:38:07"] ["9", "9", "9", "9", "9", "9"] ["n", "n", "n", "n", "n", "n"] ["s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX", "s093vhFomjJOSwwn3Dii8iK9wevxUFwRUVJE6GAGOZEErIMLY68bUYV1h5d57QWfp7AxBkTbxPqbEh4ZR2Z3wROrAFQjpUtN4Y9Y8H4nC5xj14n5hXqCdJYpzkX"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_enable_profile -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + +-- !sql_enable_profile -- +2 [0, 0, 0, 0, 0, 0] [117, 117, 117, 117, 117, 117] [-4744, -4744, -4744, -4744, -4744, -4744] [-1593211961, -1593211961, -1593211961, -1593211961, -1593211961, -1593211961] [-3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780, -3869640069299678780] [8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567, 8491817458398170567] [-30948.857, -30948.857, -30948.857, -30948.857, -30948.857] [804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905, 804341131.229905] [-74019648, -74019648, -74019648, -74019648, -74019648, -74019648] [13024168, 13024168, 13024168, 13024168, 13024168, 13024168] ["2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22", "2023-08-22"] ["2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12", "2022-09-30 07:47:12"] ["2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21", "2023-04-21"] ["2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56", "2022-11-24 15:07:56"] ["g", "g", "g", "g", "g", "g"] ["a", "a", "a", "a", "a", "a"] ["S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl", "S9JEYFrLN4zr1vX1yPUE6ovSX431nJdCuttpBUOVMrp844vBfHStO7laHNc5sI9MehAi8GbGDGV3t322DPMy7SBlquU5D7jsGISMNpX4IWbn3Yrsl"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +3 [0, 0, 0, 0, 0, 0] [65, 65, 65, 65, 65, 65] [-4963, -4963, -4963, -4963, -4963, -4963] [-1415431954, -1415431954, -1415431954, -1415431954, -1415431954, -1415431954] [-3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000, -3804309860450207000] [8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376, 8209240008557215376] [-5058.13, -5058.13, -5058.13, -5058.13, -5058.13] [1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352, 1034763010.616352] [3858273, 3858273, 3858273, 3858273, 3858273, 3858273] [-3634150, -3634150, -3634150, -3634150, -3634150, -3634150] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44", "2023-03-06 07:47:44"] ["2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27", "2023-04-27"] ["2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11", "2022-12-20 15:40:11"] ["i", "i", "i", "i", "i", "i"] ["G", "G", "G", "G", "G", "G"] ["XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ", "XuyX5eljhfMNqMmuOGkFNvyoKFyFMzGWPuGQPxAi6NYV6JA2aooYGJ0CgQ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +4 [0, 0, 0, 0, 0, 0] [-67, -67, -67, -67, -67, -67] [-30372, -30372, -30372, -30372, -30372, -30372] [181502941, 181502941, 181502941, 181502941, 181502941, 181502941] [-2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800, -2062236823576972800] [6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842, 6357002962400127842] [21235.783, 21235.783, 21235.783, 21235.783, 21235.783] [-1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891, -1101694755.713891] [58088067, 58088067, 58088067, 58088067, 58088067, 58088067] [-66079723, -66079723, -66079723, -66079723, -66079723, -66079723] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12", "2023-06-16 18:07:12"] ["2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19", "2022-11-19"] ["2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12", "2023-08-23 08:19:12"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W", "tX4eqSuxvREnF4UIk8OnDyDZM1yT2G2IVzcNB4Lejgxr1W"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +8 [1, 1, 1, 1, 1, 1] [-11, -11, -11, -11, -11, -11] [-9648, -9648, -9648, -9648, -9648, -9648] [-505356927, -505356927, -505356927, -505356927, -505356927, -505356927] [7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037, 7604760670442035037] [1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798, 1634770507625165798] [10822.962, 10822.962, 10822.962, 10822.962, 10822.962] [1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071, 1987551048.863071] [64879544, 64879544, 64879544, 64879544, 64879544, 64879544] [-55896622, -55896622, -55896622, -55896622, -55896622, -55896622] ["2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08", "2023-08-08"] ["2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23", "2023-01-05 00:55:23"] ["2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16", "2023-06-16"] ["2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26", "2023-04-06 03:40:26"] ["U", "U", "U", "U", "U", "U"] ["G", "G", "G", "G", "G", "G"] ["iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ", "iyAI9214vOaKrPo1EmVesccN0PdeCC0rKXzRJv33KpnnJbG0o0FXubzuBfrYTQZ"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +16 [0, 0, 0, 0, 0, 0] [-43, -43, -43, -43, -43, -43] [13560, 13560, 13560, 13560, 13560, 13560] [-1743686513, -1743686513, -1743686513, -1743686513, -1743686513, -1743686513] [7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769, 7234719406392208769] [-3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413, -3871745630024229413] [12225.427, 12225.427, 12225.427, 12225.427, 12225.427] [-1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191, -1352141342.04191] [-35959452, -35959452, -35959452, -35959452, -35959452, -35959452] [-4256846, -4256846, -4256846, -4256846, -4256846, -4256846] ["2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24", "2023-08-24"] ["2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43", "2022-12-25 20:40:43"] ["2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05", "2023-01-05"] ["2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04", "2023-01-27 19:34:04"] ["V", "V", "V", "V", "V", "V"] ["a", "a", "a", "a", "a", "a"] ["8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj", "8PRRNG2OCMIFR5k9nuC0O4TDT6hxwj"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +17 [1, 1, 1, 1, 1, 1] [126, 126, 126, 126, 126, 126] [28165, 28165, 28165, 28165, 28165, 28165] [2032059721, 2032059721, 2032059721, 2032059721, 2032059721, 2032059721] [-2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879, -2686776977990574879] [-8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876, -8498149444423102876] [-21681.223, -21681.223, -21681.223, -21681.223, -21681.223] [95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678, 95345732.447678] [89062729, 89062729, 89062729, 89062729, 89062729, 89062729] [-2464406, -2464406, -2464406, -2464406, -2464406, -2464406] ["2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16", "2023-08-16"] ["2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36", "2023-03-05 10:43:36"] ["2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20", "2023-08-20"] ["2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44", "2023-04-11 00:33:44"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb", "XJ3RV27MQpsPD30k1xV0RGSuomCT1z5oEfOiF2gNisoMyFhoClXJJ8eIZSeasLKeJwflG4In7xn54n9oI16rpRQJkeb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +27 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [18307, 18307, 18307, 18307, 18307, 18307] [76399879, 76399879, 76399879, 76399879, 76399879, 76399879] [8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699, 8050764818738996699] [2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999, 2402219865213589999] [-16678.924, -16678.924, -16678.924, -16678.924, -16678.924] [-2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261, -2053879544.8447261] [12639967, 12639967, 12639967, 12639967, 12639967, 12639967] [24677022, 24677022, 24677022, 24677022, 24677022, 24677022] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55", "2023-01-09 07:35:55"] ["2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31", "2023-07-31"] ["2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44", "2023-03-15 06:40:44"] ["d", "d", "d", "d", "d", "d"] ["a", "a", "a", "a", "a", "a"] ["dGkS", "dGkS", "dGkS", "dGkS", "dGkS", "dGkS"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +41 [0, 0, 0, 0, 0, 0] [-25, -25, -25, -25, -25, -25] [28704, 28704, 28704, 28704, 28704, 28704] [-437867812, -437867812, -437867812, -437867812, -437867812, -437867812] [5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079, 5508042206505207079] [462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597, 462527544684407597] [13629.614, 13629.614, 13629.614, 13629.614, 13629.614] [213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962, 213722401.337962] [86704879, 86704879, 86704879, 86704879, 86704879, 86704879] [-2662959, -2662959, -2662959, -2662959, -2662959, -2662959] ["2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04", "2023-08-04"] ["2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08", "2022-12-28 16:55:08"] ["2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13", "2023-05-13"] ["2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07", "2023-03-10 18:15:07"] ["4", "4", "4", "4", "4", "4"] ["a", "a", "a", "a", "a", "a"] ["2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI", "2dxEKrIfvZTmYHO6jXR7HMuJAJrj1dJD2WRroeHL20dGolyHdcI"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +44 [0, 0, 0, 0, 0, 0] [61, 61, 61, 61, 61, 61] [-23419, -23419, -23419, -23419, -23419, -23419] [378600280, 378600280, 378600280, 378600280, 378600280, 378600280] [6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679, 6788166268039991679] [-2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852, -2814786606977504852] [-20151.432, -20151.432, -20151.432, -20151.432, -20151.432] [-1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291, -1248229001.2182291] [-45191385, -45191385, -45191385, -45191385, -45191385, -45191385] [-27910227, -27910227, -27910227, -27910227, -27910227, -27910227] ["2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13", "2023-08-13"] ["2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32", "2023-05-18 04:25:32"] ["2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20", "2023-03-20"] ["2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00", "2022-12-21 11:34:00"] ["4", "4", "4", "4", "4", "4"] ["I", "I", "I", "I", "I", "I"] ["NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1", "NZXyjFFg0Yunu6fDXpyr9OlUtMNbaJbSENshFUaeCdMR64vgELMWSxvUxwLfmhzoDY1z6bLCyjuGmMUk9hhnF9hKsFkgpbcPo2nz1"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +48 [0, 0, 0, 0, 0, 0] [88, 88, 88, 88, 88, 88] [-18899, -18899, -18899, -18899, -18899, -18899] [1953750640, 1953750640, 1953750640, 1953750640, 1953750640, 1953750640] [-6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312, -6083034186246180312] [7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662, 7861718260607212662] [20562.791, 20562.791, 20562.791, 20562.791, 20562.791] [-1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959, -1597994654.9033959] [91765768, 91765768, 91765768, 91765768, 91765768, 91765768] [-47488138, -47488138, -47488138, -47488138, -47488138, -47488138] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24", "2022-11-04 07:47:24"] ["2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16", "2023-07-16"] ["2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07", "2022-08-29 04:51:07"] ["u", "u", "u", "u", "u", "u"] ["P", "P", "P", "P", "P", "P"] ["wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv", "wodMoILg2POwMnYHhY33utnoZ325ocWKXPLvo1Cxx8C2Wj8maoUhfwozaHgjzoOqeW9lMj2nNinNDJV2dnXsNfa0hVeNzonA7s84gYHSyHXDzvjv"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +49 [0, 0, 0, 0, 0, 0] [126, 126, 126, 126, 126, 126] [31661, 31661, 31661, 31661, 31661, 31661] [359703581, 359703581, 359703581, 359703581, 359703581, 359703581] [-2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939, -2399575246807057939] [7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391, 7684667782059034391] [-504.68152, -504.68152, -504.68152, -504.68152, -504.68152] [2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791, 2121528178.4887791] [-99977803, -99977803, -99977803, -99977803, -99977803, -99977803] [25652192, 25652192, 25652192, 25652192, 25652192, 25652192] ["2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25", "2023-08-25"] ["2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11", "2023-07-14 17:16:11"] ["2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28", "2022-12-28"] ["2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11", "2023-04-10 04:24:11"] ["i", "i", "i", "i", "i", "i"] ["0", "0", "0", "0", "0", "0"] ["X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7", "X53UUdHkzSVyWMmGyI5i6M4ohehRhx1NR02IjJsuKy64Tp0KJvsHgjJ64F2qHOpNQ17EUnIPJlmpCV32vDZkJwXjhhY1eObFH2Ru7gHqsmFCQ2zy7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +52 [0, 0, 0, 0, 0, 0] [-7, -7, -7, -7, -7, -7] [-6985, -6985, -6985, -6985, -6985, -6985] [826683531, 826683531, 826683531, 826683531, 826683531, 826683531] [-8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361, -8966681855246736361] [4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446, 4814686163176635446] [-6490.2471, -6490.2471, -6490.2471, -6490.2471, -6490.2471] [1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261, 1076976372.0338261] [-25002204, -25002204, -25002204, -25002204, -25002204, -25002204] [-97805693, -97805693, -97805693, -97805693, -97805693, -97805693] ["2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02", "2023-08-02"] ["2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22", "2022-11-21 04:05:22"] ["2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19", "2023-05-19"] ["2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09", "2023-03-12 05:07:09"] ["p", "p", "p", "p", "p", "p"] ["a", "a", "a", "a", "a", "a"] ["WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p", "WG0vFztUWdoC7f8D14NbhHAK302bHf6s1JKNU2hiIjZ5ABhHwikfSzCAKdr04s6bhGkkssdVzRuSSheQ0rFUGkueuLch5p"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +55 [1, 1, 1, 1, 1, 1] [65, 65, 65, 65, 65, 65] [18805, 18805, 18805, 18805, 18805, 18805] [229725878, 229725878, 229725878, 229725878, 229725878, 229725878] [2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325, 2742856458318615325] [5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371, 5907702768956232371] [12354.624, 12354.624, 12354.624, 12354.624, 12354.624] [1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771, 1697579881.9474771] [20409908, 20409908, 20409908, 20409908, 20409908, 20409908] [-69625379, -69625379, -69625379, -69625379, -69625379, -69625379] ["2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09", "2023-08-09"] ["2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54", "2022-12-17 11:47:54"] ["2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19", "2023-03-19"] ["2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52", "2023-03-13 10:31:52"] ["G", "G", "G", "G", "G", "G"] ["a", "a", "a", "a", "a", "a"] ["BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7", "BU2JJTmOKfXr9q8SjWLRUhxn2Me7HFpkMAJxCJCRvnnUJg2l3zXXOnLavxUNt7"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +61 [1, 1, 1, 1, 1, 1] [121, 121, 121, 121, 121, 121] [31806, 31806, 31806, 31806, 31806, 31806] [-1410915562, -1410915562, -1410915562, -1410915562, -1410915562, -1410915562] [-250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717, -250403393155768717] [4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431, 4301573778529723431] [10719.892, 10719.892, 10719.892, 10719.892, 10719.892] [1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421, 1073780599.1272421] [78876206, 78876206, 78876206, 78876206, 78876206, 78876206] [-77837482, -77837482, -77837482, -77837482, -77837482, -77837482] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07", "2023-01-31 15:44:07"] ["2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15", "2023-03-15"] ["2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16", "2023-02-06 12:53:16"] ["U", "U", "U", "U", "U", "U"] ["a", "a", "a", "a", "a", "a"] ["y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb", "y25ujOZPm64KwGfKXGPMgqaUAdIhi8GtBb"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +62 [0, 0, 0, 0, 0, 0] [-126, -126, -126, -126, -126, -126] [-3813, -3813, -3813, -3813, -3813, -3813] [1950651540, 1950651540, 1950651540, 1950651540, 1950651540, 1950651540] [-7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217, -7509418841468966217] [5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397, 5935288575051629397] [-17121.195, -17121.195, -17121.195, -17121.195, -17121.195] [-987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562, -987496114.899562] [9626406, 9626406, 9626406, 9626406, 9626406, 9626406] [-8723076, -8723076, -8723076, -8723076, -8723076, -8723076] ["2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01"] ["2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20", "2023-04-24 18:15:20"] ["2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06", "2022-10-06"] ["2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10", "2022-10-14 01:34:10"] ["B", "B", "B", "B", "B", "B"] ["a", "a", "a", "a", "a", "a"] ["8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC", "8aRmFSUBC"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +76 [1, 1, 1, 1, 1, 1] [-63, -63, -63, -63, -63, -63] [25799, 25799, 25799, 25799, 25799, 25799] [-1387912656, -1387912656, -1387912656, -1387912656, -1387912656, -1387912656] [8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181, 8967926767558546181] [-3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476, -3537865898119184476] [5311.188, 5311.188, 5311.188, 5311.188, 5311.188] [173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049, 173628749.847049] [-28850258, -28850258, -28850258, -28850258, -28850258, -28850258] [-99202733, -99202733, -99202733, -99202733, -99202733, -99202733] ["2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12", "2023-08-12"] ["2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22", "2023-05-28 15:56:22"] ["2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11", "2023-06-11"] ["2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10", "2022-11-29 16:23:10"] ["7", "7", "7", "7", "7", "7"] ["j", "j", "j", "j", "j", "j"] ["fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0", "fjbvP5vNgAwYBIAEnONGcVbrBpGM3mqVeBjDQs4KQlLEgNbnHVIIscgaRuPdDjU0"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +84 [0, 0, 0, 0, 0, 0] [-10, -10, -10, -10, -10, -10] [9493, 9493, 9493, 9493, 9493, 9493] [-547874696, -547874696, -547874696, -547874696, -547874696, -547874696] [-115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756, -115057683458952756] [4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085, 4473017779279230085] [13718.372, 13718.372, 13718.372, 13718.372, 13718.372] [-978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697, -978213266.02697] [-88516589, -88516589, -88516589, -88516589, -88516589, -88516589] [-62683124, -62683124, -62683124, -62683124, -62683124, -62683124] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43", "2022-12-13 00:33:43"] ["2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25", "2023-03-25"] ["2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14", "2022-09-15 10:53:14"] ["J", "J", "J", "J", "J", "J"] ["a", "a", "a", "a", "a", "a"] ["yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq", "yQtIngWQxQTtvo1z2xxWMOT6JdaZT599ZTsOKOxwERkicW5YhScbCNrQAz8BHaarqK8AHPwvT2uXRlFKu6uZLIONVqdMR0Irap9OzNVIJCJmkCq"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] +88 [1, 1, 1, 1, 1, 1] [23, 23, 23, 23, 23, 23] [14833, 14833, 14833, 14833, 14833, 14833] [2017339015, 2017339015, 2017339015, 2017339015, 2017339015, 2017339015] [7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930, 7437673973249797930] [-5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347, -5508026584283164347] [-29817.77, -29817.77, -29817.77, -29817.77, -29817.77] [-1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042, -1646754251.102042] [44414137, 44414137, 44414137, 44414137, 44414137, 44414137] [75659236, 75659236, 75659236, 75659236, 75659236, 75659236] ["2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26", "2023-08-26"] ["2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19", "2022-12-15 12:25:19"] ["2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27", "2022-11-27"] ["2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51", "2023-02-22 00:46:51"] ["a", "a", "a", "a", "a", "a"] ["a", "a", "a", "a", "a", "a"] ["gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh", "gfynMkzlxqeETupAZg6mdTlgEMju0lBsyTaX2BLXSWadWS5XfjiLGh"] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] + 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 b084c622abc8ed..d65344320702d5 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 @@ -779,5 +779,41 @@ suite("test_http_stream", "p0") { try_sql "DROP TABLE IF EXISTS ${tableName16}" } + def tableName17 = "test_http_stream_trim_double_quotes" + + try { + sql """ + CREATE TABLE IF NOT EXISTS ${tableName17} ( + `k1` int(11) NULL, + `k2` VARCHAR(20) NULL + ) ENGINE=OLAP + DUPLICATE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 3 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableName17} select c1, c2 from http_stream("format"="csv", "column_separator"="|", "trim_double_quotes"="true") + """ + time 10000 + file '../stream_load/trim_double_quotes.csv' + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("http_stream result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + } + } + + qt_sql_trim_double_quotes "select * from ${tableName17} order by k1" + } finally { + try_sql "DROP TABLE IF EXISTS ${tableName17}" + } } diff --git a/regression-test/suites/load_p0/http_stream/test_http_stream_json.groovy b/regression-test/suites/load_p0/http_stream/test_http_stream_json.groovy index f44fcd7bbc24c1..8a4710d0aa6224 100644 --- a/regression-test/suites/load_p0/http_stream/test_http_stream_json.groovy +++ b/regression-test/suites/load_p0/http_stream/test_http_stream_json.groovy @@ -193,5 +193,49 @@ suite("test_http_stream_json", "p0") { } finally { try_sql "DROP TABLE IF EXISTS ${tableName4}" } + + // 5.test num as string + def tableName5 = "test_http_stream_num_as_string" + try { + sql """ + CREATE TABLE IF NOT EXISTS ${tableName5} ( + `k1` int(11) NULL, + `k2` float NULL, + `k3` double NULL + ) ENGINE=OLAP + DUPLICATE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 3 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableName5} (k1,k2,k3) select k1,k2,k3 from http_stream( + "format"="json", + "strip_outer_array" = "true", + "num_as_string" = "true" + ) + """ + time 10000 + file '../stream_load/num_as_string.json' + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("http_stream result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + assertEquals(3, json.NumberTotalRows) + assertEquals(0, json.NumberFilteredRows) + } + } + + qt_sql_num_as_string "select * from ${tableName5} order by k1" + } finally { + try_sql "DROP TABLE IF EXISTS ${tableName5}" + } } diff --git a/regression-test/suites/load_p0/http_stream/test_http_stream_properties.groovy b/regression-test/suites/load_p0/http_stream/test_http_stream_properties.groovy index 1ea7d4b89a80e3..ab7d52d38f2e7f 100644 --- a/regression-test/suites/load_p0/http_stream/test_http_stream_properties.groovy +++ b/regression-test/suites/load_p0/http_stream/test_http_stream_properties.groovy @@ -224,9 +224,138 @@ suite("test_http_stream_properties", "p0") { sql new File("""${context.file.parent}/../stream_load/ddl/uniq_tbl_basic_drop_sequence.sql""").text } - // TODO merge type + // merge type + // append + i = 0 + try { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName - // TODO two_phase_commit + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[i]}) select ${columns[i]} from http_stream("format"="csv", "column_separator"="|", "merge_type"="APPEND") + """ + file files[i] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + if (i <= 3) { + qt_sql_merge_type_append "select * from ${tableNm} order by k00,k01" + } else { + qt_sql_merge_type_append "select * from ${tableNm} order by k00" + } + i++ + } + } finally { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + } + } + + // delete + try { + def tableName = "mow_tbl_basic" + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[2]}) select ${columns[2]} from http_stream("format"="csv", "column_separator"="|", "merge_type"="APPEND") + """ + file files[2] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[2]}) select ${columns[2]} from http_stream("format"="csv", "column_separator"="|", "merge_type"="DELETE") + """ + file files[2] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + qt_sql_merge_type_delete "select * from ${tableNm} order by k00,k01" + } finally { + sql new File("""${context.file.parent}/../stream_load/ddl/mow_tbl_basic_drop.sql""").text + } + + // merge + try { + def tableName = "mow_tbl_basic" + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[2]}) select ${columns[2]} from http_stream("format"="csv", "column_separator"="|", "merge_type"="merge", "delete"="k00=8") + """ + file files[2] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + qt_sql_merge_type_merge "select * from ${tableNm} order by k00,k01" + } finally { + sql new File("""${context.file.parent}/../stream_load/ddl/mow_tbl_basic_drop.sql""").text + } // compress_type // gz/bz2 @@ -416,5 +545,130 @@ suite("test_http_stream_properties", "p0") { sql new File("""${context.file.parent}/../stream_load/ddl/${table}_drop.sql""").text } } + + // load_to_single_tablet + i = 0 + try { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[i]}) select ${columns[i]} from http_stream("format"="csv", "column_separator"="|", "load_to_single_tablet"="false") + """ + file files[i] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + if (i <= 3) { + qt_sql_load_to_single_tablet "select * from ${tableNm} order by k00,k01" + } else { + qt_sql_load_to_single_tablet "select * from ${tableNm} order by k00" + } + i++ + } + } finally { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + } + } + + i = 0 + try { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[i]}) select ${columns[i]} from http_stream("format"="csv", "column_separator"="|", "load_to_single_tablet"="test_invalid") + """ + file files[i] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + if (i <= 3) { + qt_sql_load_to_single_tablet "select * from ${tableNm} order by k00,k01" + } else { + qt_sql_load_to_single_tablet "select * from ${tableNm} order by k00" + } + i++ + } + } finally { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + } + } + + // enable profile + i = 0 + try { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_create.sql""").text + + def tableNm = "stream_load_" + tableName + + streamLoad { + set 'version', '1' + set 'sql', """ + insert into ${db}.${tableNm}(${target_columns[i]}) select ${columns[i]} from http_stream("format"="csv", "column_separator"="|", "enable_profile"="true") + """ + file files[i] + 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(20, json.NumberTotalRows) + assertEquals(20, json.NumberLoadedRows) + assertEquals(0, json.NumberFilteredRows) + assertEquals(0, json.NumberUnselectedRows) + } + } + if (i <= 3) { + qt_sql_enable_profile "select * from ${tableNm} order by k00,k01" + } else { + qt_sql_enable_profile "select * from ${tableNm} order by k00" + } + i++ + } + } finally { + for (String tableName in tables) { + sql new File("""${context.file.parent}/../stream_load/ddl/${tableName}_drop.sql""").text + } + } } From eb878ad0d2a10f2722c959a6af125271908ad2d4 Mon Sep 17 00:00:00 2001 From: Tiewei Fang <43782773+BePPPower@users.noreply.github.com> Date: Thu, 23 Nov 2023 23:18:30 +0800 Subject: [PATCH 19/64] [fix](Export) add feut for `Cancel Export` (#27178) --- .../java/org/apache/doris/load/ExportJob.java | 4 + .../doris/analysis/CancelExportStmtTest.java | 151 ++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java index 5d31053017d162..22adf3e4d03a18 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java @@ -45,6 +45,7 @@ import org.apache.doris.catalog.TableIf; import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.Config; +import org.apache.doris.common.FeConstants; import org.apache.doris.common.FeMetaVersion; import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; @@ -615,6 +616,9 @@ private void cancelExportJobUnprotected(ExportFailMsg.CancelType type, String ms setExportJobState(ExportJobState.CANCELLED); finishTimeMs = System.currentTimeMillis(); failMsg = new ExportFailMsg(type, msg); + if (FeConstants.runningUnitTest) { + return; + } Env.getCurrentEnv().getEditLog().logExportUpdateState(id, ExportJobState.CANCELLED); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CancelExportStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CancelExportStmtTest.java index 71cb62120c8074..55fe2a283b9ee5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CancelExportStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CancelExportStmtTest.java @@ -200,4 +200,155 @@ public void testCancelJobFilter() throws UserException { } + @Test + public void testExportMgrCancelJob() throws UserException { + FeConstants.runningUnitTest = true; + ExportJob job1 = new ExportJob(); + job1.setId(1); + job1.setLabel("label_job1"); + ExportJob job2 = new ExportJob(); + job2.setId(2); + job2.setLabel("label_job2"); + ExportJob job3 = new ExportJob(); + job3.setId(3); + job3.setLabel("label_job3"); + ExportJob job4 = new ExportJob(); + job4.setId(4); + job4.setLabel("label_job4"); + + try { + Method setExportJobState = job1.getClass().getDeclaredMethod("setExportJobState", + ExportJobState.class); + setExportJobState.setAccessible(true); + // job1 is PENDING + setExportJobState.invoke(job2, ExportJobState.EXPORTING); + setExportJobState.invoke(job3, ExportJobState.FINISHED); + setExportJobState.invoke(job4, ExportJobState.CANCELLED); + } catch (Exception e) { + throw new UserException(e); + } + + ExportMgr exportMgr = new ExportMgr(); + exportMgr.unprotectAddJob(job1); + exportMgr.unprotectAddJob(job2); + exportMgr.unprotectAddJob(job3); + exportMgr.unprotectAddJob(job4); + + + // cancel export job where state = "PENDING" + Assert.assertTrue(job1.getState() == ExportJobState.PENDING); + SlotRef stateSlotRef = new SlotRef(null, "state"); + StringLiteral stateStringLiteral = new StringLiteral("PENDING"); + BinaryPredicate stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + CancelExportStmt stmt = new CancelExportStmt(null, stateEqPredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job1.getState() == ExportJobState.CANCELLED); + + // cancel export job where state = "EXPORTING" + Assert.assertTrue(job2.getState() == ExportJobState.EXPORTING); + stateStringLiteral = new StringLiteral("EXPORTING"); + stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + stmt = new CancelExportStmt(null, stateEqPredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job2.getState() == ExportJobState.CANCELLED); + + // cancel export job where state = "FINISHED" + Assert.assertTrue(job3.getState() == ExportJobState.FINISHED); + stateStringLiteral = new StringLiteral("FINISHED"); + stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + stmt = new CancelExportStmt(null, stateEqPredicate); + try { + stmt.analyze(analyzer); + } catch (AnalysisException e) { + Assert.assertTrue(e.getMessage().contains("Only support PENDING/EXPORTING")); + } + + // cancel export job where state = "CANCELLED" + Assert.assertTrue(job4.getState() == ExportJobState.CANCELLED); + stateStringLiteral = new StringLiteral("CANCELLED"); + stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + stmt = new CancelExportStmt(null, stateEqPredicate); + try { + stmt.analyze(analyzer); + } catch (AnalysisException e) { + Assert.assertTrue(e.getMessage().contains("Only support PENDING/EXPORTING")); + } + + ExportJob job5 = new ExportJob(); + job5.setId(5); + job5.setLabel("label_job5"); + exportMgr.unprotectAddJob(job5); + + ExportJob job6 = new ExportJob(); + job6.setId(6); + job6.setLabel("label_job6"); + exportMgr.unprotectAddJob(job6); + + ExportJob job7 = new ExportJob(); + job7.setId(7); + job7.setLabel("label_job7"); + exportMgr.unprotectAddJob(job7); + + ExportJob job8 = new ExportJob(); + job8.setId(8); + job8.setLabel("label_job8"); + exportMgr.unprotectAddJob(job8); + + // cancel export job where label = "label_job5" + Assert.assertTrue(job5.getState() == ExportJobState.PENDING); + SlotRef labelSlotRef = new SlotRef(null, "label"); + StringLiteral labelStringLiteral = new StringLiteral("label_job5"); + BinaryPredicate labelEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, labelSlotRef, labelStringLiteral); + stmt = new CancelExportStmt(null, labelEqPredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job5.getState() == ExportJobState.CANCELLED); + + // cancel export job where label like "job6" + Assert.assertTrue(job6.getState() == ExportJobState.PENDING); + labelSlotRef = new SlotRef(null, "label"); + labelStringLiteral = new StringLiteral("%job6"); + LikePredicate likePredicate = new LikePredicate(LikePredicate.Operator.LIKE, labelSlotRef, labelStringLiteral); + stmt = new CancelExportStmt(null, likePredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job6.getState() == ExportJobState.CANCELLED); + + // cancel export job where label = "label_job7" AND STATE = "PENDING" + Assert.assertTrue(job7.getState() == ExportJobState.PENDING); + labelSlotRef = new SlotRef(null, "label"); + labelStringLiteral = new StringLiteral("label_job7"); + labelEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, labelSlotRef, labelStringLiteral); + stateStringLiteral = new StringLiteral("PENDING"); + stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + CompoundPredicate andCompoundPredicate = new CompoundPredicate(Operator.AND, labelEqPredicate, stateEqPredicate); + stmt = new CancelExportStmt(null, andCompoundPredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job7.getState() == ExportJobState.CANCELLED); + + // cancel export job where label like "%job8" OR STATE = "PENDING" + Assert.assertTrue(job8.getState() == ExportJobState.PENDING); + labelSlotRef = new SlotRef(null, "label"); + labelStringLiteral = new StringLiteral("%job8"); + likePredicate = new LikePredicate(LikePredicate.Operator.LIKE, labelSlotRef, labelStringLiteral); + stateStringLiteral = new StringLiteral("PENDING"); + stateEqPredicate = + new BinaryPredicate(BinaryPredicate.Operator.EQ, stateSlotRef, stateStringLiteral); + CompoundPredicate orCompoundPredicate = new CompoundPredicate(Operator.OR, likePredicate, stateEqPredicate); + stmt = new CancelExportStmt(null, orCompoundPredicate); + stmt.analyze(analyzer); + exportMgr.cancelExportJob(stmt); + Assert.assertTrue(job8.getState() == ExportJobState.CANCELLED); + } } + From 8e74470db9839e23de81b8317d3e46773404675c Mon Sep 17 00:00:00 2001 From: Jibing-Li <64681310+Jibing-Li@users.noreply.github.com> Date: Thu, 23 Nov 2023 23:22:02 +0800 Subject: [PATCH 20/64] [fix](statistics)Fix auto analyze remove finished job bug (#27486) Finished job must be removed from the job list, otherwise the next batch of jobs will not be scheduled. --- .../main/java/org/apache/doris/statistics/AnalysisManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java index 73df00374e0ee9..75ad9f7ec15361 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java @@ -237,6 +237,7 @@ public class AnalysisManager implements Writable { } autoJobs.offer(job); systemJobInfoMap.remove(info.jobId); + analysisJobIdToTaskMap.remove(info.jobId); } return null; }; From b580ee91ce92744ab8c6ebbac27ac5ad6c11561a Mon Sep 17 00:00:00 2001 From: zclllyybb Date: Thu, 23 Nov 2023 23:24:10 +0800 Subject: [PATCH 21/64] [fix](compile) fix macOS compile and format code (#27494) --- be/src/vec/core/block.cpp | 66 +++++++++++++++++++++------------------ be/src/vec/core/block.h | 2 +- build.sh | 1 - 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp index 0aef622870ca3a..40222ad1f93fff 100644 --- a/be/src/vec/core/block.cpp +++ b/be/src/vec/core/block.cpp @@ -20,17 +20,17 @@ #include "vec/core/block.h" -#include -#include #include #include #include #include #include +#include #include #include #include +#include #include "agent/be_exec_version_manager.h" #include "common/compiler_util.h" // IWYU pragma: keep @@ -55,11 +55,9 @@ class SipHash; -namespace doris { -namespace segment_v2 { +namespace doris::segment_v2 { enum CompressionTypePB : int; -} // namespace segment_v2 -} // namespace doris +} // namespace doris::segment_v2 namespace doris::vectorized { @@ -67,13 +65,13 @@ Block::Block(std::initializer_list il) : data {il} { initialize_index_by_name(); } -Block::Block(const ColumnsWithTypeAndName& data_) : data {data_} { +Block::Block(ColumnsWithTypeAndName data_) : data {std::move(data_)} { initialize_index_by_name(); } Block::Block(const std::vector& slots, size_t block_size, bool ignore_trivial_slot) { - for (const auto slot_desc : slots) { + for (auto* const slot_desc : slots) { if (ignore_trivial_slot && !slot_desc->need_materialize()) { continue; } @@ -207,8 +205,8 @@ void Block::insert_unique(ColumnWithTypeAndName&& elem) { } void Block::erase(const std::set& positions) { - for (auto it = positions.rbegin(); it != positions.rend(); ++it) { - erase(*it); + for (unsigned long position : std::ranges::reverse_view(positions)) { + erase(position); } } @@ -240,10 +238,12 @@ void Block::erase_impl(size_t position) { data.erase(data.begin() + position); for (auto it = index_by_name.begin(); it != index_by_name.end();) { - if (it->second == position) + if (it->second == position) { index_by_name.erase(it++); - else { - if (it->second > position) --it->second; + } else { + if (it->second > position) { + --it->second; + } ++it; } } @@ -333,7 +333,9 @@ size_t Block::get_position_by_name(const std::string& name) const { void Block::check_number_of_rows(bool allow_null_columns) const { ssize_t rows = -1; for (const auto& elem : data) { - if (!elem.column && allow_null_columns) continue; + if (!elem.column && allow_null_columns) { + continue; + } if (!elem.column) { LOG(FATAL) << fmt::format( @@ -725,11 +727,11 @@ void Block::filter_block_internal(Block* block, const std::vector& col const IColumn::Filter& filter) { size_t count = filter.size() - simd::count_zero_num((int8_t*)filter.data(), filter.size()); if (count == 0) { - for (auto& col : columns_to_filter) { + for (const auto& col : columns_to_filter) { std::move(*block->get_by_position(col).column).assume_mutable()->clear(); } } else { - for (auto& col : columns_to_filter) { + for (const auto& col : columns_to_filter) { auto& column = block->get_by_position(col).column; if (column->size() != count) { if (column->is_exclusive()) { @@ -782,7 +784,7 @@ void Block::append_to_block_by_selector(MutableBlock* dst, Status Block::filter_block(Block* block, const std::vector& columns_to_filter, int filter_column_id, int column_to_keep) { const auto& filter_column = block->get_by_position(filter_column_id).column; - if (auto* nullable_column = check_and_get_column(*filter_column)) { + if (const auto* nullable_column = check_and_get_column(*filter_column)) { const auto& nested_column = nullable_column->get_nested_column_ptr(); MutableColumnPtr mutable_holder = @@ -790,8 +792,8 @@ Status Block::filter_block(Block* block, const std::vector& columns_to ? nested_column->assume_mutable() : nested_column->clone_resized(nested_column->size()); - ColumnUInt8* concrete_column = assert_cast(mutable_holder.get()); - auto* __restrict null_map = nullable_column->get_null_map_data().data(); + auto* concrete_column = assert_cast(mutable_holder.get()); + const auto* __restrict null_map = nullable_column->get_null_map_data().data(); IColumn::Filter& filter = concrete_column->get_data(); auto* __restrict filter_data = filter.data(); @@ -800,10 +802,10 @@ Status Block::filter_block(Block* block, const std::vector& columns_to filter_data[i] &= !null_map[i]; } RETURN_IF_CATCH_EXCEPTION(filter_block_internal(block, columns_to_filter, filter)); - } else if (auto* const_column = check_and_get_column(*filter_column)) { + } else if (const auto* const_column = check_and_get_column(*filter_column)) { bool ret = const_column->get_bool(0); if (!ret) { - for (auto& col : columns_to_filter) { + for (const auto& col : columns_to_filter) { std::move(*block->get_by_position(col).column).assume_mutable()->clear(); } } @@ -899,8 +901,8 @@ Status Block::serialize(int be_exec_version, PBlock* pblock, MutableBlock::MutableBlock(const std::vector& tuple_descs, int reserve_size, bool ignore_trivial_slot) { - for (auto tuple_desc : tuple_descs) { - for (auto slot_desc : tuple_desc->slots()) { + for (auto* const tuple_desc : tuple_descs) { + for (auto* const slot_desc : tuple_desc->slots()) { if (ignore_trivial_slot && !slot_desc->need_materialize()) { continue; } @@ -941,7 +943,7 @@ void MutableBlock::swap(MutableBlock&& another) noexcept { } void MutableBlock::add_row(const Block* block, int row) { - auto& block_data = block->get_columns_with_type_and_name(); + const auto& block_data = block->get_columns_with_type_and_name(); for (size_t i = 0; i < _columns.size(); ++i) { _columns[i]->insert_from(*block_data[i].column.get(), row); } @@ -949,22 +951,22 @@ void MutableBlock::add_row(const Block* block, int row) { void MutableBlock::add_rows(const Block* block, const int* row_begin, const int* row_end) { DCHECK_LE(columns(), block->columns()); - auto& block_data = block->get_columns_with_type_and_name(); + const auto& block_data = block->get_columns_with_type_and_name(); for (size_t i = 0; i < _columns.size(); ++i) { DCHECK_EQ(_data_types[i]->get_name(), block_data[i].type->get_name()); auto& dst = _columns[i]; - auto& src = *block_data[i].column.get(); + const auto& src = *block_data[i].column.get(); dst->insert_indices_from(src, row_begin, row_end); } } void MutableBlock::add_rows(const Block* block, size_t row_begin, size_t length) { DCHECK_LE(columns(), block->columns()); - auto& block_data = block->get_columns_with_type_and_name(); + const auto& block_data = block->get_columns_with_type_and_name(); for (size_t i = 0; i < _columns.size(); ++i) { DCHECK_EQ(_data_types[i]->get_name(), block_data[i].type->get_name()); auto& dst = _columns[i]; - auto& src = *block_data[i].column.get(); + const auto& src = *block_data[i].column.get(); dst->insert_range_from(src, row_begin, length); } } @@ -999,10 +1001,12 @@ void MutableBlock::erase(const String& name) { _names.erase(_names.begin() + position); for (auto it = index_by_name.begin(); it != index_by_name.end();) { - if (it->second == position) + if (it->second == position) { index_by_name.erase(it++); - else { - if (it->second > position) --it->second; + } else { + if (it->second > position) { + --it->second; + } ++it; } } diff --git a/be/src/vec/core/block.h b/be/src/vec/core/block.h index b03d9fa4e217e8..e125706cbe6d7e 100644 --- a/be/src/vec/core/block.h +++ b/be/src/vec/core/block.h @@ -85,7 +85,7 @@ class Block { public: Block() = default; Block(std::initializer_list il); - Block(const ColumnsWithTypeAndName& data_); + Block(ColumnsWithTypeAndName data_); Block(const std::vector& slots, size_t block_size, bool ignore_trivial_slot = false); diff --git a/build.sh b/build.sh index 1ff1a3284c9f0d..d06e3c78ed72cf 100755 --- a/build.sh +++ b/build.sh @@ -525,7 +525,6 @@ if [[ "${BUILD_BE}" -eq 1 ]]; then -DENABLE_PCH="${ENABLE_PCH}" \ -DUSE_MEM_TRACKER="${USE_MEM_TRACKER}" \ -DUSE_JEMALLOC="${USE_JEMALLOC}" \ - -DUSE_BTHREAD_SCANNER="${USE_BTHREAD_SCANNER}" \ -DENABLE_STACKTRACE="${ENABLE_STACKTRACE}" \ -DUSE_AVX2="${USE_AVX2}" \ -DGLIBC_COMPATIBILITY="${GLIBC_COMPATIBILITY}" \ From 39a5229027d557194e0afdea49369d62e9124898 Mon Sep 17 00:00:00 2001 From: Jibing-Li <64681310+Jibing-Li@users.noreply.github.com> Date: Thu, 23 Nov 2023 23:32:21 +0800 Subject: [PATCH 22/64] [fix](regression)Fix hive p2 case (#27466) --- .../hive/test_hive_statistic_auto.groovy | 54 +++--- .../hive/test_hive_statistic_sample.groovy | 182 +++++++++--------- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy index f766069346e1e8..08c4d0aed95094 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy @@ -41,43 +41,43 @@ suite("test_hive_statistic_auto", "p2,external,hive,external_remote,external_rem if (result.size <= 0) { continue; } - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "lo_quantity") - assertTrue(result[0][1] == "100.0") - assertTrue(result[0][2] == "46.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "404.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "50") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "lo_quantity") + assertEquals(result[0][1], "100.0") + assertEquals(result[0][2], "46.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "400.0") + assertEquals(result[0][5], "4.0") + assertEquals(result[0][6], "1") + assertEquals(result[0][7], "50") result = sql """show column stats `statistics` (lo_orderkey)""" if (result.size <= 0) { continue; } - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "lo_orderkey") - assertTrue(result[0][1] == "100.0") - assertTrue(result[0][2] == "26.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "404.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "98") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "lo_orderkey") + assertEquals(result[0][1], "100.0") + assertEquals(result[0][2], "26.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "400.0") + assertEquals(result[0][5], "4.0") + assertEquals(result[0][6], "1") + assertEquals(result[0][7], "98") result = sql """show column stats `statistics` (lo_linenumber)""" if (result.size <= 0) { continue; } - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "lo_linenumber") - assertTrue(result[0][1] == "100.0") - assertTrue(result[0][2] == "7.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "404.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "7") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "lo_linenumber") + assertEquals(result[0][1], "100.0") + assertEquals(result[0][2], "7.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "400.0") + assertEquals(result[0][5], "4.0") + assertEquals(result[0][6], "1") + assertEquals(result[0][7], "7") } sql """drop catalog ${catalog_name}""" diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy index 212ea2a3f9f72e..675a9409b33ce7 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy @@ -31,118 +31,118 @@ suite("test_hive_statistic_sample", "p2,external,hive,external_remote,external_r """ logger.info("catalog " + catalog_name + " created") - sql """analyze table ${catalog_name}.tpch_1000_parquet.region with sample percent 10 with sync""" + sql """analyze table ${catalog_name}.tpch_1000_parquet.region with sample rows 10 with sync""" sql """analyze table ${catalog_name}.tpch_1000_parquet.supplier with sample percent 10 with sync""" sql """use ${catalog_name}.tpch_1000_parquet""" def result = sql """show column stats region (r_regionkey)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "r_regionkey") - assertTrue(result[0][1] == "5.0") - assertTrue(result[0][2] == "5.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "20.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "r_regionkey") + assertEquals(result[0][1], "5.0") + assertEquals(result[0][2], "5.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "20.0") + assertEquals(result[0][5], "4.0") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats region (r_name)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "r_name") - assertTrue(result[0][1] == "5.0") - assertTrue(result[0][2] == "5.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "34.0") - assertTrue(result[0][5] == "6.8") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "r_name") + assertEquals(result[0][1], "5.0") + assertEquals(result[0][2], "5.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "34.0") + assertEquals(result[0][5], "6.8") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats region (r_comment)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "r_comment") - assertTrue(result[0][1] == "5.0") - assertTrue(result[0][2] == "5.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "330.0") - assertTrue(result[0][5] == "66.0") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "r_comment") + assertEquals(result[0][1], "5.0") + assertEquals(result[0][2], "5.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "330.0") + assertEquals(result[0][5], "66.0") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_suppkey)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_suppkey") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "9970222.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "3.9995194E7") - assertTrue(result[0][5] == "3.9999997999759773") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_suppkey") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "3.9995194E7") + assertEquals(result[0][5], "3.9999997999759773") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_name)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_name") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "1.004004E7") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "1.79978374E8") - assertTrue(result[0][5] == "17.999999199903908") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_name") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "1.79978374E8") + assertEquals(result[0][5], "17.999999199903908") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_address)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_address") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "9998862.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.50070604E8") - assertTrue(result[0][5] == "25.010064108699456") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_address") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "2.50070604E8") + assertEquals(result[0][5], "25.010064108699456") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_nationkey)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_nationkey") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "25.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "3.9995194E7") - assertTrue(result[0][5] == "3.9999997999759773") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_nationkey") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "25.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "3.9995194E7") + assertEquals(result[0][5], "3.9999997999759773") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_phone)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_phone") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "9928006.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "1.49981978E8") - assertTrue(result[0][5] == "14.99999929991592") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_phone") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "9996537.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "1.49981978E8") + assertEquals(result[0][5], "14.99999929991592") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_acctbal)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_acctbal") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "4766937.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "7.9990388E7") - assertTrue(result[0][5] == "7.999999599951955") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_acctbal") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "1054512.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "7.9990388E7") + assertEquals(result[0][5], "7.999999599951955") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") result = sql """show column stats supplier (s_comment)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "s_comment") - assertTrue(result[0][1] == "9998799.0") - assertTrue(result[0][2] == "9931298.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "6.24883849E8") - assertTrue(result[0][5] == "62.49589065646784") - assertTrue(result[0][6] == "N/A") - assertTrue(result[0][7] == "N/A") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "s_comment") + assertEquals(result[0][1], "9998799.0") + assertEquals(result[0][2], "9630165.0") + assertEquals(result[0][3], "0.0") + assertEquals(result[0][4], "6.24883849E8") + assertEquals(result[0][5], "62.49589065646784") + assertEquals(result[0][6], "N/A") + assertEquals(result[0][7], "N/A") sql """drop catalog ${catalog_name}""" } From df628e153804ec8102c20bfda02639ee80941601 Mon Sep 17 00:00:00 2001 From: Xin Liao Date: Thu, 23 Nov 2023 23:39:01 +0800 Subject: [PATCH 23/64] [chore](merge-on-write) disable rowid conversion check for mow table by default (#27482) --- be/src/common/config.cpp | 2 ++ be/src/common/config.h | 2 ++ be/src/olap/compaction.cpp | 8 ++++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index adbc61fe569d0a..b8ad3523b3caa8 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1068,6 +1068,8 @@ DEFINE_mInt64(lookup_connection_cache_bytes_limit, "4294967296"); DEFINE_mInt64(LZ4_HC_compression_level, "9"); DEFINE_mBool(enable_merge_on_write_correctness_check, "true"); +// rowid conversion correctness check when compaction for mow table +DEFINE_mBool(enable_rowid_conversion_correctness_check, "false"); // The secure path with user files, used in the `local` table function. DEFINE_mString(user_files_secure_path, "${DORIS_HOME}"); diff --git a/be/src/common/config.h b/be/src/common/config.h index f616cfb6081baa..f080063265c21e 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1130,6 +1130,8 @@ DECLARE_mBool(enable_flatten_nested_for_variant); DECLARE_mDouble(ratio_of_defaults_as_sparse_column); DECLARE_mBool(enable_merge_on_write_correctness_check); +// rowid conversion correctness check when compaction for mow table +DECLARE_mBool(enable_rowid_conversion_correctness_check); // The secure path with user files, used in the `local` table function. DECLARE_mString(user_files_secure_path); diff --git a/be/src/olap/compaction.cpp b/be/src/olap/compaction.cpp index c8d0b2a29fa986..b57e6dcdc58c30 100644 --- a/be/src/olap/compaction.cpp +++ b/be/src/olap/compaction.cpp @@ -689,7 +689,9 @@ Status Compaction::modify_rowsets(const Merger::Statistics* stats) { } } - RETURN_IF_ERROR(_tablet->check_rowid_conversion(_output_rowset, location_map)); + if (config::enable_rowid_conversion_correctness_check) { + RETURN_IF_ERROR(_tablet->check_rowid_conversion(_output_rowset, location_map)); + } location_map.clear(); { @@ -750,7 +752,9 @@ Status Compaction::modify_rowsets(const Merger::Statistics* stats) { } } - RETURN_IF_ERROR(_tablet->check_rowid_conversion(_output_rowset, location_map)); + if (config::enable_rowid_conversion_correctness_check) { + RETURN_IF_ERROR(_tablet->check_rowid_conversion(_output_rowset, location_map)); + } _tablet->merge_delete_bitmap(output_rowset_delete_bitmap); RETURN_IF_ERROR(_tablet->modify_rowsets(output_rowsets, _input_rowsets, true)); From 5a82a5746eb6dfe92d3a637d3c4648abc95c31cd Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 24 Nov 2023 09:21:17 +0800 Subject: [PATCH 24/64] [pipelineX](bug) Fix core dump if cancelled (#27449) --- .../exec/aggregation_source_operator.cpp | 44 +---------- .../exec/aggregation_source_operator.h | 10 --- be/src/pipeline/pipeline_x/dependency.h | 77 +++++++++++++++---- be/src/pipeline/pipeline_x/operator.cpp | 8 ++ be/src/pipeline/pipeline_x/operator.h | 2 +- .../pipeline_x_fragment_context.cpp | 3 + 6 files changed, 77 insertions(+), 67 deletions(-) diff --git a/be/src/pipeline/exec/aggregation_source_operator.cpp b/be/src/pipeline/exec/aggregation_source_operator.cpp index 6f0c071d3911e8..a417c1fa997c7e 100644 --- a/be/src/pipeline/exec/aggregation_source_operator.cpp +++ b/be/src/pipeline/exec/aggregation_source_operator.cpp @@ -63,8 +63,6 @@ Status AggLocalState::init(RuntimeState* state, LocalStateInfo& info) { std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); } - - _executor.close = std::bind(&AggLocalState::_close_without_key, this); } else { if (p._needs_finalize) { _executor.get_result = std::bind( @@ -75,10 +73,9 @@ Status AggLocalState::init(RuntimeState* state, LocalStateInfo& info) { &AggLocalState::_serialize_with_serialized_key_result, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); } - _executor.close = std::bind(&AggLocalState::_close_with_serialized_key, this); } - _agg_data_created_without_key = p._without_key; + _shared_state->agg_data_created_without_key = p._without_key; return Status::OK(); } @@ -91,39 +88,6 @@ Status AggLocalState::_destroy_agg_status(vectorized::AggregateDataPtr data) { return Status::OK(); } -void AggLocalState::_close_with_serialized_key() { - std::visit( - [&](auto&& agg_method) -> void { - auto& data = *agg_method.hash_table; - data.for_each_mapped([&](auto& mapped) { - if (mapped) { - static_cast(_destroy_agg_status(mapped)); - mapped = nullptr; - } - }); - if (data.has_null_key_data()) { - auto st = _destroy_agg_status( - data.template get_null_key_data()); - if (!st) { - throw Exception(st.code(), st.to_string()); - } - } - }, - _agg_data->method_variant); - _release_tracker(); -} - -void AggLocalState::_close_without_key() { - //because prepare maybe failed, and couldn't create agg data. - //but finally call close to destory agg data, if agg data has bitmapValue - //will be core dump, it's not initialized - if (_agg_data_created_without_key) { - static_cast(_destroy_agg_status(_agg_data->without_key)); - _agg_data_created_without_key = false; - } - _release_tracker(); -} - Status AggLocalState::_serialize_with_serialized_key_result(RuntimeState* state, vectorized::Block* block, SourceState& source_state) { @@ -597,12 +561,6 @@ Status AggLocalState::close(RuntimeState* state) { if (_closed) { return Status::OK(); } - for (auto* aggregate_evaluator : _shared_state->aggregate_evaluators) { - aggregate_evaluator->close(state); - } - if (_executor.close) { - _executor.close(); - } /// _hash_table_size_counter may be null if prepare failed. if (_hash_table_size_counter) { diff --git a/be/src/pipeline/exec/aggregation_source_operator.h b/be/src/pipeline/exec/aggregation_source_operator.h index 9c6d3e0fd0dde2..9418301f150cfc 100644 --- a/be/src/pipeline/exec/aggregation_source_operator.h +++ b/be/src/pipeline/exec/aggregation_source_operator.h @@ -88,8 +88,6 @@ class AggLocalState final : public PipelineXLocalState { friend class DistinctStreamingAggSourceOperatorX; friend class DistinctStreamingAggSinkOperatorX; - void _close_without_key(); - void _close_with_serialized_key(); Status _get_without_key_result(RuntimeState* state, vectorized::Block* block, SourceState& source_state); Status _serialize_without_key(RuntimeState* state, vectorized::Block* block, @@ -122,11 +120,6 @@ class AggLocalState final : public PipelineXLocalState { } } } - void _release_tracker() { - Base::_shared_state->mem_tracker->release( - Base::_shared_state->mem_usage_record.used_in_state + - Base::_shared_state->mem_usage_record.used_in_arena); - } RuntimeProfile::Counter* _get_results_timer; RuntimeProfile::Counter* _serialize_result_timer; @@ -137,17 +130,14 @@ class AggLocalState final : public PipelineXLocalState { using vectorized_get_result = std::function; - using vectorized_closer = std::function; struct executor { vectorized_get_result get_result; - vectorized_closer close; }; executor _executor; vectorized::AggregatedDataVariants* _agg_data; - bool _agg_data_created_without_key = false; }; class AggSourceOperatorX : public OperatorX { diff --git a/be/src/pipeline/pipeline_x/dependency.h b/be/src/pipeline/pipeline_x/dependency.h index 13ae1cd9d7d58d..cd5fef95c5c729 100644 --- a/be/src/pipeline/pipeline_x/dependency.h +++ b/be/src/pipeline/pipeline_x/dependency.h @@ -57,6 +57,12 @@ static_assert(TIME_UNIT_DEPENDENCY_LOG < SLOW_DEPENDENCY_THRESHOLD); struct BasicSharedState { Dependency* source_dep; Dependency* sink_dep; + + std::atomic ref_count = 0; + + void ref() { ref_count++; } + virtual Status close(RuntimeState* state) { return Status::OK(); } + virtual ~BasicSharedState() = default; }; class Dependency : public std::enable_shared_from_this { @@ -110,16 +116,6 @@ class Dependency : public std::enable_shared_from_this { virtual void block() { _ready = false; } protected: - bool _should_log(uint64_t cur_time) { - if (cur_time < SLOW_DEPENDENCY_THRESHOLD) { - return false; - } - if ((cur_time - _last_log_time) < TIME_UNIT_DEPENDENCY_LOG) { - return false; - } - _last_log_time = cur_time; - return true; - } void _add_block_task(PipelineXTask* task); bool _is_cancelled() const { return push_to_blocking_queue() ? false : _query_ctx->is_cancelled(); @@ -134,10 +130,8 @@ class Dependency : public std::enable_shared_from_this { std::shared_ptr _shared_state {nullptr}; MonotonicStopWatch _watcher; - std::weak_ptr _parent; std::list> _children; - uint64_t _last_log_time = 0; std::mutex _task_lock; std::vector _blocked_task; }; @@ -249,11 +243,25 @@ struct AggSharedState : public BasicSharedState { agg_data = std::make_unique(); agg_arena_pool = std::make_unique(); } - virtual ~AggSharedState() = default; + ~AggSharedState() override = default; void init_spill_partition_helper(size_t spill_partition_count_bits) { spill_partition_helper = std::make_unique(spill_partition_count_bits); } + Status close(RuntimeState* state) override { + if (ref_count.fetch_sub(1) == 1) { + for (auto* aggregate_evaluator : aggregate_evaluators) { + aggregate_evaluator->close(state); + } + if (probe_expr_ctxs.empty()) { + _close_without_key(); + } else { + _close_with_serialized_key(); + } + } + return Status::OK(); + } + vectorized::AggregatedDataVariantsUPtr agg_data; std::unique_ptr aggregate_data_container; vectorized::AggSpillContext spill_context; @@ -280,6 +288,49 @@ struct AggSharedState : public BasicSharedState { }; MemoryRecord mem_usage_record; std::unique_ptr mem_tracker = std::make_unique("AggregateOperator"); + bool agg_data_created_without_key = false; + +private: + void _release_tracker() { + mem_tracker->release(mem_usage_record.used_in_state + mem_usage_record.used_in_arena); + } + void _close_with_serialized_key() { + std::visit( + [&](auto&& agg_method) -> void { + auto& data = *agg_method.hash_table; + data.for_each_mapped([&](auto& mapped) { + if (mapped) { + static_cast(_destroy_agg_status(mapped)); + mapped = nullptr; + } + }); + if (data.has_null_key_data()) { + auto st = _destroy_agg_status( + data.template get_null_key_data()); + if (!st) { + throw Exception(st.code(), st.to_string()); + } + } + }, + agg_data->method_variant); + _release_tracker(); + } + void _close_without_key() { + //because prepare maybe failed, and couldn't create agg data. + //but finally call close to destory agg data, if agg data has bitmapValue + //will be core dump, it's not initialized + if (agg_data_created_without_key) { + static_cast(_destroy_agg_status(agg_data->without_key)); + agg_data_created_without_key = false; + } + _release_tracker(); + } + Status _destroy_agg_status(vectorized::AggregateDataPtr data) { + for (int i = 0; i < aggregate_evaluators.size(); ++i) { + aggregate_evaluators[i]->function()->destroy(data + offsets_of_aggregate_states[i]); + } + return Status::OK(); + } }; struct SortSharedState : public BasicSharedState { diff --git a/be/src/pipeline/pipeline_x/operator.cpp b/be/src/pipeline/pipeline_x/operator.cpp index 050b198a22e22f..0eafada38a98e5 100644 --- a/be/src/pipeline/pipeline_x/operator.cpp +++ b/be/src/pipeline/pipeline_x/operator.cpp @@ -348,6 +348,7 @@ Status PipelineXLocalState::init(RuntimeState* state, LocalState auto& deps = info.upstream_dependencies; _dependency->set_shared_state(deps.front()->shared_state()); _shared_state = (typename DependencyType::SharedState*)_dependency->shared_state().get(); + _shared_state->ref(); _wait_for_dependency_timer = ADD_TIMER(_runtime_profile, "WaitForDependency[" + _dependency->name() + "]Time"); _shared_state->source_dep = _dependency; @@ -382,6 +383,9 @@ Status PipelineXLocalState::close(RuntimeState* state) { if (_closed) { return Status::OK(); } + if (_shared_state) { + RETURN_IF_ERROR(_shared_state->close(state)); + } if constexpr (!std::is_same_v) { COUNTER_SET(_wait_for_dependency_timer, _dependency->watcher_elapse_time()); } @@ -410,6 +414,7 @@ Status PipelineXSinkLocalState::init(RuntimeState* state, _wait_for_dependency_timer = ADD_TIMER(_profile, "WaitForDependency[" + _dependency->name() + "]Time"); } + _shared_state->ref(); } else { auto& deps = info.dependencys; deps.front() = std::make_shared(0, 0, state->get_query_ctx()); @@ -429,6 +434,9 @@ Status PipelineXSinkLocalState::close(RuntimeState* state, Statu if (_closed) { return Status::OK(); } + if (_shared_state) { + RETURN_IF_ERROR(_shared_state->close(state)); + } if constexpr (!std::is_same_v) { COUNTER_SET(_wait_for_dependency_timer, _dependency->watcher_elapse_time()); } diff --git a/be/src/pipeline/pipeline_x/operator.h b/be/src/pipeline/pipeline_x/operator.h index 3f9548099a2ffb..7d534c048b8e6e 100644 --- a/be/src/pipeline/pipeline_x/operator.h +++ b/be/src/pipeline/pipeline_x/operator.h @@ -326,7 +326,7 @@ class PipelineXLocalState : public PipelineXLocalStateBase { protected: DependencyType* _dependency; - typename DependencyType::SharedState* _shared_state; + typename DependencyType::SharedState* _shared_state = nullptr; }; class DataSinkOperatorXBase; diff --git a/be/src/pipeline/pipeline_x/pipeline_x_fragment_context.cpp b/be/src/pipeline/pipeline_x/pipeline_x_fragment_context.cpp index e832124bf8899b..b26e9ead695a1b 100644 --- a/be/src/pipeline/pipeline_x/pipeline_x_fragment_context.cpp +++ b/be/src/pipeline/pipeline_x/pipeline_x_fragment_context.cpp @@ -149,6 +149,9 @@ void PipelineXFragmentContext::cancel(const PPlanFragmentCancelReason& reason, // TODO pipeline incomp // _exec_env->result_queue_mgr()->update_queue_status(id, Status::Aborted(msg)); } + if (reason == PPlanFragmentCancelReason::TIMEOUT) { + LOG(WARNING) << "PipelineXFragmentContext is cancelled due to timeout : " << debug_string(); + } for (auto& tasks : _tasks) { for (auto& task : tasks) { task->clear_blocking_state(); From 17ca75f83400fdf66153de7946b39946de1cacc3 Mon Sep 17 00:00:00 2001 From: jakevin Date: Fri, 24 Nov 2023 10:06:04 +0800 Subject: [PATCH 25/64] [chore](Nereids): add eager aggregate into rules (#27505) Add `Eager Aggregate` rules into Rewrite rules. --- .../doris/nereids/jobs/executor/Rewriter.java | 18 +++++----- .../rewrite/PushDownCountThroughJoinTest.java | 36 ++++--------------- .../PushDownDistinctThroughJoinTest.java | 18 ++++------ .../PushDownMinMaxThroughJoinTest.java | 36 ++++--------------- .../rewrite/PushDownSumThroughJoinTest.java | 24 ++++--------- .../doris/utframe/TestWithFeService.java | 11 ++++++ 6 files changed, 45 insertions(+), 98 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java index 15e08d052e93f6..183bfc3c91ab47 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java @@ -91,9 +91,12 @@ import org.apache.doris.nereids.rules.rewrite.PullUpProjectUnderTopN; import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoEsScan; import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoJdbcScan; +import org.apache.doris.nereids.rules.rewrite.PushDownCountThroughJoin; import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughProject; import org.apache.doris.nereids.rules.rewrite.PushDownLimit; import org.apache.doris.nereids.rules.rewrite.PushDownLimitDistinctThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownMinMaxThroughJoin; +import org.apache.doris.nereids.rules.rewrite.PushDownSumThroughJoin; import org.apache.doris.nereids.rules.rewrite.PushDownTopNThroughJoin; import org.apache.doris.nereids.rules.rewrite.PushDownTopNThroughWindow; import org.apache.doris.nereids.rules.rewrite.PushFilterInsideJoin; @@ -272,14 +275,13 @@ public class Rewriter extends AbstractBatchJobExecutor { topDown(new BuildAggForUnion()) ), - // topic("Eager aggregation", - // topDown( - // new PushDownSumThroughJoin(), - // new PushDownMinMaxThroughJoin(), - // new PushDownCountThroughJoin() - // ), - // custom(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN, PushDownDistinctThroughJoin::new) - // ), + topic("Eager aggregation", + topDown( + new PushDownSumThroughJoin(), + new PushDownMinMaxThroughJoin(), + new PushDownCountThroughJoin() + ) + ), topic("Limit optimization", // TODO: the logical plan should not contains any phase information, diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java index 21eebe1b375dc1..34ccfe70f70205 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownCountThroughJoinTest.java @@ -42,15 +42,15 @@ class PushDownCountThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); + private MockUp mockUp = new MockUp() { + @Mock + public Set getEnableNereidsRules() { + return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); + } + }; @Test void testSingleCount() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); - } - }; Alias count = new Count(scan1.getOutput().get(0)).alias("count"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -71,12 +71,6 @@ public Set getEnableNereidsRules() { @Test void testMultiCount() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); - } - }; Alias leftCnt1 = new Count(scan1.getOutput().get(0)).alias("leftCnt1"); Alias leftCnt2 = new Count(scan1.getOutput().get(1)).alias("leftCnt2"); Alias rightCnt1 = new Count(scan2.getOutput().get(1)).alias("rightCnt1"); @@ -100,12 +94,6 @@ public Set getEnableNereidsRules() { @Test void testSingleCountStar() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); - } - }; Alias count = new Count().alias("countStar"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -126,12 +114,6 @@ public Set getEnableNereidsRules() { @Test void testSingleCountStarEmptyGroupBy() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); - } - }; Alias count = new Count().alias("countStar"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -153,12 +135,6 @@ public Set getEnableNereidsRules() { @Test void testBothSideCountAndCountStar() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_COUNT_THROUGH_JOIN.type()); - } - }; Alias leftCnt = new Count(scan1.getOutput().get(0)).alias("leftCnt"); Alias rightCnt = new Count(scan2.getOutput().get(0)).alias("rightCnt"); Alias countStar = new Count().alias("countStar"); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java index aac1bf2c7d4596..1ce91d1c7c3d36 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownDistinctThroughJoinTest.java @@ -42,15 +42,15 @@ class PushDownDistinctThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private static final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); private static final LogicalOlapScan scan4 = PlanConstructor.newLogicalOlapScan(3, "t4", 0); + private MockUp mockUp = new MockUp() { + @Mock + public Set getEnableNereidsRules() { + return ImmutableSet.of(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type()); + } + }; @Test void testPushdownJoin() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type()); - } - }; LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) .join(scan3, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -73,12 +73,6 @@ public Set getEnableNereidsRules() { @Test void testPushdownProjectJoin() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN.type()); - } - }; LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) .project(ImmutableList.of(0, 2)) diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoinTest.java index dafef59100a816..cf28954a47c4c9 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownMinMaxThroughJoinTest.java @@ -45,15 +45,15 @@ class PushDownMinMaxThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); private static final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0); private static final LogicalOlapScan scan4 = PlanConstructor.newLogicalOlapScan(3, "t4", 0); + private MockUp mockUp = new MockUp() { + @Mock + public Set getEnableNereidsRules() { + return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); + } + }; @Test void testSingleJoin() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); - } - }; Alias min = new Min(scan1.getOutput().get(0)).alias("min"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -74,12 +74,6 @@ public Set getEnableNereidsRules() { @Test void testMultiJoin() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); - } - }; Alias min = new Min(scan1.getOutput().get(0)).alias("min"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -113,12 +107,6 @@ public Set getEnableNereidsRules() { @Test void testAggNotOutputGroupBy() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); - } - }; // agg don't output group by Alias min = new Min(scan1.getOutput().get(0)).alias("min"); LogicalPlan plan = new LogicalPlanBuilder(scan1) @@ -146,12 +134,6 @@ public Set getEnableNereidsRules() { @Test void testBothSideSingleJoin() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); - } - }; Alias min = new Min(scan1.getOutput().get(1)).alias("min"); Alias max = new Max(scan2.getOutput().get(1)).alias("max"); LogicalPlan plan = new LogicalPlanBuilder(scan1) @@ -174,12 +156,6 @@ public Set getEnableNereidsRules() { @Test void testBothSide() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_MIN_MAX_THROUGH_JOIN.type()); - } - }; Alias min = new Min(scan1.getOutput().get(1)).alias("min"); Alias max = new Max(scan3.getOutput().get(1)).alias("max"); LogicalPlan plan = new LogicalPlanBuilder(scan1) diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java index 5828d2319f283b..088372b0d76851 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownSumThroughJoinTest.java @@ -42,15 +42,15 @@ class PushDownSumThroughJoinTest implements MemoPatternMatchSupported { private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); + private MockUp mockUp = new MockUp() { + @Mock + public Set getEnableNereidsRules() { + return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); + } + }; @Test void testSingleJoinLeftSum() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); - } - }; Alias sum = new Sum(scan1.getOutput().get(1)).alias("sum"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -71,12 +71,6 @@ public Set getEnableNereidsRules() { @Test void testSingleJoinRightSum() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); - } - }; Alias sum = new Sum(scan2.getOutput().get(1)).alias("sum"); LogicalPlan plan = new LogicalPlanBuilder(scan1) .join(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) @@ -97,12 +91,6 @@ public Set getEnableNereidsRules() { @Test void testAggNotOutputGroupBy() { - new MockUp() { - @Mock - public Set getEnableNereidsRules() { - return ImmutableSet.of(RuleType.PUSH_DOWN_SUM_THROUGH_JOIN.type()); - } - }; // agg don't output group by Alias sum = new Sum(scan1.getOutput().get(1)).alias("sum"); LogicalPlan plan = new LogicalPlanBuilder(scan1) diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java index 911155df7a2885..946e159529d22a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java @@ -69,6 +69,7 @@ import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.OriginStatement; import org.apache.doris.qe.QueryState; +import org.apache.doris.qe.SessionVariable; import org.apache.doris.qe.ShowExecutor; import org.apache.doris.qe.ShowResultSet; import org.apache.doris.qe.StmtExecutor; @@ -84,9 +85,12 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import mockit.Mock; +import mockit.MockUp; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -129,6 +133,13 @@ public abstract class TestWithFeService { protected static final String DEFAULT_CLUSTER_PREFIX = "default_cluster:"; + private static final MockUp mockUp = new MockUp() { + @Mock + public Set getEnableNereidsRules() { + return ImmutableSet.of(); + } + }; + @BeforeAll public final void beforeAll() throws Exception { FeConstants.enableInternalSchemaDb = false; From 75c9f001373e946a8f30920566a55f5e7665754b Mon Sep 17 00:00:00 2001 From: xy720 <22125576+xy720@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:09:31 +0800 Subject: [PATCH 26/64] [Bug](bitmap) Fix heap-use-after-free in the bitmap functions (#27411) --- be/src/util/bitmap_value.h | 3 +- be/src/vec/data_types/data_type_bitmap.cpp | 3 +- .../bitmap_functions/test_issue_27409.groovy | 643 ++++++++++++++++++ 3 files changed, 647 insertions(+), 2 deletions(-) create mode 100644 regression-test/suites/query_p0/sql_functions/bitmap_functions/test_issue_27409.groovy diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h index 07895ed5591ef9..6bc88d4f0a1b69 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -2167,7 +2167,7 @@ class BitmapValue { // Return how many bytes are required to serialize this bitmap. // See BitmapTypeCode for the serialized format. - size_t getSizeInBytes() const { + size_t getSizeInBytes() { size_t res = 0; switch (_type) { case EMPTY: @@ -2181,6 +2181,7 @@ class BitmapValue { } break; case BITMAP: + _prepare_bitmap_for_write(); _bitmap->runOptimize(); _bitmap->shrinkToFit(); res = _bitmap->getSizeInBytes(config::bitmap_serialize_version); diff --git a/be/src/vec/data_types/data_type_bitmap.cpp b/be/src/vec/data_types/data_type_bitmap.cpp index 79800029eb83ca..6cccf914f1438e 100644 --- a/be/src/vec/data_types/data_type_bitmap.cpp +++ b/be/src/vec/data_types/data_type_bitmap.cpp @@ -114,7 +114,8 @@ void DataTypeBitMap::to_string(const IColumn& column, size_t row_num, BufferWrit ColumnPtr ptr = result.first; row_num = result.second; - const auto& data = assert_cast(*ptr).get_element(row_num); + auto& data = + const_cast(assert_cast(*ptr).get_element(row_num)); std::string buffer(data.getSizeInBytes(), '0'); data.write_to(const_cast(buffer.data())); ostr.write(buffer.c_str(), buffer.size()); diff --git a/regression-test/suites/query_p0/sql_functions/bitmap_functions/test_issue_27409.groovy b/regression-test/suites/query_p0/sql_functions/bitmap_functions/test_issue_27409.groovy new file mode 100644 index 00000000000000..3089e429565b90 --- /dev/null +++ b/regression-test/suites/query_p0/sql_functions/bitmap_functions/test_issue_27409.groovy @@ -0,0 +1,643 @@ +// 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_issue_27409") { + sql """ DROP TABLE IF EXISTS behavior_bitmap_base; """ + sql """ + CREATE TABLE `behavior_bitmap_base` ( + `identity_type_desc` varchar(25) NULL, + `system_type` varchar(25) NULL, + `statistic_data` int(11) NULL, + `one_id` bitmap BITMAP_UNION NULL, + INDEX index_identity_type_desc (`identity_type_desc`) USING BITMAP COMMENT 'identity_type_desc', + INDEX index_system_type (`system_type`) USING BITMAP COMMENT 'system_type', + INDEX index_statistic_data (`statistic_data`) USING BITMAP COMMENT 'statistic_data' + ) ENGINE=OLAP + AGGREGATE KEY(`identity_type_desc`, `system_type`, `statistic_data`) + DISTRIBUTED BY HASH(`identity_type_desc`, `system_type`, `statistic_data`) BUCKETS 5 + PROPERTIES ( + "replication_num" = "1" + ); + """ + sql """ + INSERT INTO `behavior_bitmap_base` VALUES + ('GuestId','renew',1684598400,to_bitmap(0)), + ('GuestId','renew',1684598400,to_bitmap(0)), + ('GuestId','renew',1685116800,to_bitmap(0)), + ('GuestId','renew',1685376000,to_bitmap(0)), + ('GuestId','renew',1686499200,to_bitmap(0)), + ('GuestId','renew',1687276800,to_bitmap(0)), + ('GuestId','renew',1687363200,to_bitmap(0)), + ('GuestId','renew',1687881600,to_bitmap(0)), + ('GuestId','renew',1689436800,to_bitmap(0)), + ('GuestId','renew',1689782400,to_bitmap(0)), + ('GuestId','renew',1690646400,to_bitmap(0)), + ('GuestId','renew',1690819200,to_bitmap(0)), + ('GuestId','renew',1691769600,to_bitmap(0)), + ('GuestId','renew',1692028800,to_bitmap(0)), + ('GuestId','renew',1692460800,to_bitmap(0)), + ('GuestId','renew',1692806400,to_bitmap(0)), + ('GuestId','renew',1693324800,to_bitmap(0)), + ('GuestId','renew',1694361600,to_bitmap(0)), + ('GuestId','renew',1694448000,to_bitmap(0)), + ('GuestId','renew',1694534400,to_bitmap(0)), + ('GuestId','renew',1695139200,to_bitmap(0)), + ('GuestId','renew',1695312000,to_bitmap(0)), + ('GuestId','renew',1695830400,to_bitmap(0)), + ('GuestId','renew',1696262400,to_bitmap(0)), + ('GuestId','renew',1696521600,to_bitmap(0)), + ('GuestId','renew',1696608000,to_bitmap(0)), + ('GuestId','renew',1696953600,to_bitmap(0)), + ('GuestId','renew',1697040000,to_bitmap(0)), + ('GuestId','renew',1697212800,to_bitmap(0)), + ('GuestId','renew',1697385600,to_bitmap(0)), + ('GuestId','renew',1697644800,to_bitmap(0)), + ('GuestId','renew',1697904000,to_bitmap(0)), + ('GuestId','renew',1697990400,to_bitmap(0)), + ('GuestId','renew',1698163200,to_bitmap(0)), + ('GuestId','renew',1699200000,to_bitmap(0)), + ('MateId','renew',1684857600,to_bitmap(0)), + ('MateId','renew',1686844800,to_bitmap(0)), + ('MateId','renew',1686931200,to_bitmap(0)), + ('MateId','renew',1687017600,to_bitmap(0)), + ('MateId','renew',1687449600,to_bitmap(0)), + ('MateId','renew',1687622400,to_bitmap(0)), + ('MateId','renew',1688313600,to_bitmap(0)), + ('MateId','renew',1688572800,to_bitmap(0)), + ('MateId','renew',1688659200,to_bitmap(0)), + ('MateId','renew',1689523200,to_bitmap(0)), + ('MateId','renew',1690041600,to_bitmap(0)), + ('MateId','renew',1690128000,to_bitmap(0)), + ('MateId','renew',1690214400,to_bitmap(0)), + ('MateId','renew',1690387200,to_bitmap(0)), + ('MateId','renew',1692374400,to_bitmap(0)), + ('MateId','renew',1692979200,to_bitmap(0)), + ('MateId','renew',1693238400,to_bitmap(0)), + ('MateId','renew',1693324800,to_bitmap(0)), + ('MateId','renew',1693497600,to_bitmap(0)), + ('MateId','renew',1693670400,to_bitmap(0)), + ('MateId','renew',1693756800,to_bitmap(0)), + ('MateId','renew',1693843200,to_bitmap(0)), + ('MateId','renew',1693929600,to_bitmap(0)), + ('MateId','renew',1694016000,to_bitmap(0)), + ('MateId','renew',1694620800,to_bitmap(0)), + ('MateId','renew',1694707200,to_bitmap(0)), + ('MateId','renew',1695398400,to_bitmap(0)), + ('MateId','renew',1696262400,to_bitmap(0)), + ('MateId','renew',1696435200,to_bitmap(0)), + ('MateId','renew',1696694400,to_bitmap(0)), + ('MateId','renew',1696780800,to_bitmap(0)), + ('MateId','renew',1696867200,to_bitmap(0)), + ('MateId','renew',1696953600,to_bitmap(0)), + ('MateId','renew',1697040000,to_bitmap(0)), + ('MateId','renew',1697644800,to_bitmap(0)), + ('MateId','renew',1697731200,to_bitmap(0)), + ('MateId','renew',1698508800,to_bitmap(0)), + ('MateId','renew',1698681600,to_bitmap(0)), + ('MateId','renew',1698854400,to_bitmap(0)), + ('MateId','renew',1699113600,to_bitmap(0)), + ('MateId','renew',1699632000,to_bitmap(0)), + ('MateId','scrm',1684771200,to_bitmap(0)), + ('MateId','scrm',1686153600,to_bitmap(0)), + ('MateId','scrm',1686326400,to_bitmap(0)), + ('MateId','scrm',1686412800,to_bitmap(0)), + ('MateId','scrm',1687276800,to_bitmap(0)), + ('MateId','scrm',1687795200,to_bitmap(0)), + ('MateId','scrm',1689523200,to_bitmap(0)), + ('MateId','scrm',1689782400,to_bitmap(0)), + ('MateId','scrm',1689955200,to_bitmap(0)), + ('MateId','scrm',1690560000,to_bitmap(0)), + ('MateId','scrm',1691078400,to_bitmap(0)), + ('MateId','scrm',1692460800,to_bitmap(0)), + ('MateId','scrm',1692892800,to_bitmap(0)), + ('MateId','scrm',1693065600,to_bitmap(0)), + ('MateId','scrm',1693324800,to_bitmap(0)), + ('MateId','scrm',1693584000,to_bitmap(0)), + ('MateId','scrm',1693670400,to_bitmap(0)), + ('MateId','scrm',1694102400,to_bitmap(0)), + ('MateId','scrm',1695139200,to_bitmap(0)), + ('MateId','scrm',1695916800,to_bitmap(0)), + ('MateId','scrm',1696521600,to_bitmap(0)), + ('MateId','scrm',1697558400,to_bitmap(0)), + ('MateId','scrm',1697904000,to_bitmap(0)), + ('MateId','scrm',1697990400,to_bitmap(0)), + ('MateId','scrm',1698163200,to_bitmap(0)), + ('MateId','scrm',1698422400,to_bitmap(0)), + ('MateId','scrm',1698508800,to_bitmap(0)), + ('MateId','scrm',1698681600,to_bitmap(0)), + ('GuestId','renew',1685808000,to_bitmap(0)), + ('GuestId','renew',1686067200,to_bitmap(0)), + ('GuestId','renew',1686153600,to_bitmap(0)), + ('GuestId','renew',1686240000,to_bitmap(0)), + ('GuestId','renew',1686326400,to_bitmap(0)), + ('GuestId','renew',1686758400,to_bitmap(0)), + ('GuestId','renew',1687017600,to_bitmap(0)), + ('GuestId','renew',1687708800,to_bitmap(0)), + ('GuestId','renew',1687795200,to_bitmap(0)), + ('GuestId','renew',1687968000,to_bitmap(0)), + ('GuestId','renew',1688227200,to_bitmap(0)), + ('GuestId','renew',1688400000,to_bitmap(0)), + ('GuestId','renew',1688832000,to_bitmap(0)), + ('GuestId','renew',1689177600,to_bitmap(0)), + ('GuestId','renew',1690214400,to_bitmap(0)), + ('GuestId','renew',1690473600,to_bitmap(0)), + ('GuestId','renew',1690560000,to_bitmap(0)), + ('GuestId','renew',1691078400,to_bitmap(0)), + ('GuestId','renew',1691510400,to_bitmap(0)), + ('GuestId','renew',1691683200,to_bitmap(0)), + ('GuestId','renew',1691856000,to_bitmap(0)), + ('GuestId','renew',1692115200,to_bitmap(0)), + ('GuestId','renew',1692374400,to_bitmap(0)), + ('GuestId','renew',1693065600,to_bitmap(0)), + ('GuestId','renew',1693756800,to_bitmap(0)), + ('GuestId','renew',1693843200,to_bitmap(0)), + ('GuestId','renew',1694275200,to_bitmap(0)), + ('GuestId','renew',1695225600,to_bitmap(0)), + ('GuestId','renew',1695916800,to_bitmap(0)), + ('GuestId','renew',1696435200,to_bitmap(0)), + ('GuestId','renew',1697299200,to_bitmap(0)), + ('GuestId','renew',1697472000,to_bitmap(0)), + ('GuestId','renew',1697817600,to_bitmap(0)), + ('GuestId','renew',1698681600,to_bitmap(0)), + ('GuestId','renew',1698854400,to_bitmap(0)), + ('GuestId','renew',1699113600,to_bitmap(0)), + ('GuestId','renew',1699545600,to_bitmap(0)), + ('GuestId','renew',1699804800,to_bitmap(0)), + ('MateId','renew',1684944000,to_bitmap(0)), + ('MateId','renew',1685721600,to_bitmap(0)), + ('MateId','renew',1685980800,to_bitmap(0)), + ('MateId','renew',1686067200,to_bitmap(0)), + ('MateId','renew',1687795200,to_bitmap(0)), + ('MateId','renew',1687881600,to_bitmap(0)), + ('MateId','renew',1687968000,to_bitmap(0)), + ('MateId','renew',1688400000,to_bitmap(0)), + ('MateId','renew',1689091200,to_bitmap(0)), + ('MateId','renew',1689782400,to_bitmap(0)), + ('MateId','renew',1689955200,to_bitmap(0)), + ('MateId','renew',1690646400,to_bitmap(0)), + ('MateId','renew',1690905600,to_bitmap(0)), + ('MateId','renew',1691164800,to_bitmap(0)), + ('MateId','renew',1691683200,to_bitmap(0)), + ('MateId','renew',1692288000,to_bitmap(0)), + ('MateId','renew',1693411200,to_bitmap(0)), + ('MateId','renew',1693584000,to_bitmap(0)), + ('MateId','renew',1694188800,to_bitmap(0)), + ('MateId','renew',1694361600,to_bitmap(0)), + ('MateId','renew',1697212800,to_bitmap(0)), + ('MateId','renew',1699804800,to_bitmap(0)), + ('MateId','scrm',1684857600,to_bitmap(0)), + ('MateId','scrm',1685894400,to_bitmap(0)), + ('MateId','scrm',1686499200,to_bitmap(0)), + ('MateId','scrm',1686672000,to_bitmap(0)), + ('MateId','scrm',1688140800,to_bitmap(0)), + ('MateId','scrm',1688400000,to_bitmap(0)), + ('MateId','scrm',1688486400,to_bitmap(0)), + ('MateId','scrm',1688659200,to_bitmap(0)), + ('MateId','scrm',1688832000,to_bitmap(0)), + ('MateId','scrm',1690214400,to_bitmap(0)), + ('MateId','scrm',1690905600,to_bitmap(0)), + ('MateId','scrm',1691164800,to_bitmap(0)), + ('MateId','scrm',1691596800,to_bitmap(0)), + ('MateId','scrm',1691769600,to_bitmap(0)), + ('MateId','scrm',1691942400,to_bitmap(0)), + ('MateId','scrm',1692028800,to_bitmap(0)), + ('MateId','scrm',1692374400,to_bitmap(0)), + ('MateId','scrm',1692633600,to_bitmap(0)), + ('MateId','scrm',1692979200,to_bitmap(0)), + ('MateId','scrm',1693238400,to_bitmap(0)), + ('MateId','scrm',1693929600,to_bitmap(0)), + ('MateId','scrm',1695312000,to_bitmap(0)), + ('MateId','scrm',1695398400,to_bitmap(0)), + ('MateId','scrm',1695830400,to_bitmap(0)), + ('MateId','scrm',1696435200,to_bitmap(0)), + ('MateId','scrm',1696694400,to_bitmap(0)), + ('MateId','scrm',1697212800,to_bitmap(0)), + ('MateId','scrm',1697472000,to_bitmap(0)), + ('MateId','scrm',1698595200,to_bitmap(0)), + ('MateId','scrm',1698940800,to_bitmap(0)), + ('MateId','scrm',1699286400,to_bitmap(0)), + ('MateId','scrm',1699372800,to_bitmap(0)), + ('MateId','scrm',1699545600,to_bitmap(0)), + ('MateId','scrm',1699718400,to_bitmap(0)), + ('GuestId','renew',1684512000,to_bitmap(0)), + ('GuestId','renew',1684684800,to_bitmap(0)), + ('GuestId','renew',1684771200,to_bitmap(0)), + ('GuestId','renew',1684944000,to_bitmap(0)), + ('GuestId','renew',1685030400,to_bitmap(0)), + ('GuestId','renew',1685289600,to_bitmap(0)), + ('GuestId','renew',1685635200,to_bitmap(0)), + ('GuestId','renew',1685721600,to_bitmap(0)), + ('GuestId','renew',1686585600,to_bitmap(0)), + ('GuestId','renew',1687104000,to_bitmap(0)), + ('GuestId','renew',1687190400,to_bitmap(0)), + ('GuestId','renew',1687536000,to_bitmap(0)), + ('GuestId','renew',1687622400,to_bitmap(0)), + ('GuestId','renew',1688140800,to_bitmap(0)), + ('GuestId','renew',1688313600,to_bitmap(0)), + ('GuestId','renew',1688486400,to_bitmap(0)), + ('GuestId','renew',1688659200,to_bitmap(0)), + ('GuestId','renew',1688745600,to_bitmap(0)), + ('GuestId','renew',1689609600,to_bitmap(0)), + ('GuestId','renew',1690732800,to_bitmap(0)), + ('GuestId','renew',1691164800,to_bitmap(0)), + ('GuestId','renew',1692633600,to_bitmap(0)), + ('GuestId','renew',1692979200,to_bitmap(0)), + ('GuestId','renew',1693411200,to_bitmap(0)), + ('GuestId','renew',1693584000,to_bitmap(0)), + ('GuestId','renew',1694707200,to_bitmap(0)), + ('GuestId','renew',1694793600,to_bitmap(0)), + ('GuestId','renew',1696003200,to_bitmap(0)), + ('GuestId','renew',1696694400,to_bitmap(0)), + ('GuestId','renew',1696780800,to_bitmap(0)), + ('GuestId','renew',1697558400,to_bitmap(0)), + ('GuestId','renew',1698336000,to_bitmap(0)), + ('GuestId','renew',1698508800,to_bitmap(0)), + ('GuestId','renew',1698940800,to_bitmap(0)), + ('GuestId','renew',1699372800,to_bitmap(0)), + ('GuestId','renew',1699632000,to_bitmap(0)), + ('GuestId','renew',1699718400,to_bitmap(0)), + ('GuestId','renew',1699891200,to_bitmap(0)), + ('GuestId','renew',1699977600,to_bitmap(0)), + ('MateId','renew',1684512000,to_bitmap(0)), + ('MateId','renew',1684598400,to_bitmap(0)), + ('MateId','renew',1684684800,to_bitmap(0)), + ('MateId','renew',1684771200,to_bitmap(0)), + ('MateId','renew',1685203200,to_bitmap(0)), + ('MateId','renew',1685462400,to_bitmap(0)), + ('MateId','renew',1685635200,to_bitmap(0)), + ('MateId','renew',1686326400,to_bitmap(0)), + ('MateId','renew',1686412800,to_bitmap(0)), + ('MateId','renew',1687190400,to_bitmap(0)), + ('MateId','renew',1689350400,to_bitmap(0)), + ('MateId','renew',1689436800,to_bitmap(0)), + ('MateId','renew',1689609600,to_bitmap(0)), + ('MateId','renew',1689696000,to_bitmap(0)), + ('MateId','renew',1690300800,to_bitmap(0)), + ('MateId','renew',1690732800,to_bitmap(0)), + ('MateId','renew',1690992000,to_bitmap(0)), + ('MateId','renew',1691078400,to_bitmap(0)), + ('MateId','renew',1691251200,to_bitmap(0)), + ('MateId','renew',1691769600,to_bitmap(0)), + ('MateId','renew',1691856000,to_bitmap(0)), + ('MateId','renew',1692115200,to_bitmap(0)), + ('MateId','renew',1692547200,to_bitmap(0)), + ('MateId','renew',1692633600,to_bitmap(0)), + ('MateId','renew',1693152000,to_bitmap(0)), + ('MateId','renew',1694275200,to_bitmap(0)), + ('MateId','renew',1694880000,to_bitmap(0)), + ('MateId','renew',1695052800,to_bitmap(0)), + ('MateId','renew',1695225600,to_bitmap(0)), + ('MateId','renew',1695312000,to_bitmap(0)), + ('MateId','renew',1695484800,to_bitmap(0)), + ('MateId','renew',1696003200,to_bitmap(0)), + ('MateId','renew',1696348800,to_bitmap(0)), + ('MateId','renew',1696608000,to_bitmap(0)), + ('MateId','renew',1697126400,to_bitmap(0)), + ('MateId','renew',1697904000,to_bitmap(0)), + ('MateId','renew',1697990400,to_bitmap(0)), + ('MateId','renew',1698076800,to_bitmap(0)), + ('MateId','renew',1698163200,to_bitmap(0)), + ('MateId','renew',1698940800,to_bitmap(0)), + ('MateId','renew',1699891200,to_bitmap(0)), + ('MateId','scrm',1684598400,to_bitmap(0)), + ('MateId','scrm',1684684800,to_bitmap(0)), + ('MateId','scrm',1685289600,to_bitmap(0)), + ('MateId','scrm',1685462400,to_bitmap(0)), + ('MateId','scrm',1685721600,to_bitmap(0)), + ('MateId','scrm',1686240000,to_bitmap(0)), + ('MateId','scrm',1687017600,to_bitmap(0)), + ('MateId','scrm',1687104000,to_bitmap(0)), + ('MateId','scrm',1687881600,to_bitmap(0)), + ('MateId','scrm',1687968000,to_bitmap(0)), + ('MateId','scrm',1688054400,to_bitmap(0)), + ('MateId','scrm',1688313600,to_bitmap(0)), + ('MateId','scrm',1689091200,to_bitmap(0)), + ('MateId','scrm',1689350400,to_bitmap(0)), + ('MateId','scrm',1689868800,to_bitmap(0)), + ('MateId','scrm',1690732800,to_bitmap(0)), + ('MateId','scrm',1690819200,to_bitmap(0)), + ('MateId','scrm',1690992000,to_bitmap(0)), + ('MateId','scrm',1691337600,to_bitmap(0)), + ('MateId','scrm',1691424000,to_bitmap(0)), + ('MateId','scrm',1692115200,to_bitmap(0)), + ('MateId','scrm',1692720000,to_bitmap(0)), + ('MateId','scrm',1692806400,to_bitmap(0)), + ('MateId','scrm',1693497600,to_bitmap(0)), + ('MateId','scrm',1694620800,to_bitmap(0)), + ('MateId','scrm',1695225600,to_bitmap(0)), + ('MateId','scrm',1695484800,to_bitmap(0)), + ('MateId','scrm',1695657600,to_bitmap(0)), + ('MateId','scrm',1696089600,to_bitmap(0)), + ('MateId','scrm',1696176000,to_bitmap(0)), + ('MateId','scrm',1696262400,to_bitmap(0)), + ('MateId','scrm',1696608000,to_bitmap(0)), + ('MateId','scrm',1696780800,to_bitmap(0)), + ('MateId','scrm',1696867200,to_bitmap(0)), + ('MateId','scrm',1697385600,to_bitmap(0)), + ('MateId','scrm',1697644800,to_bitmap(0)), + ('MateId','scrm',1698249600,to_bitmap(0)), + ('MateId','scrm',1699113600,to_bitmap(0)), + ('MateId','scrm',1699804800,to_bitmap(0)), + ('MateId','scrm',1699891200,to_bitmap(0)), + ('MateId','scrm',1699977600,to_bitmap(0)), + ('GuestId','renew',1684425600,to_bitmap(0)), + ('GuestId','renew',1685462400,to_bitmap(0)), + ('GuestId','renew',1685980800,to_bitmap(0)), + ('GuestId','renew',1686412800,to_bitmap(0)), + ('GuestId','renew',1686844800,to_bitmap(0)), + ('GuestId','renew',1686931200,to_bitmap(0)), + ('GuestId','renew',1687449600,to_bitmap(0)), + ('GuestId','renew',1688572800,to_bitmap(0)), + ('GuestId','renew',1688918400,to_bitmap(0)), + ('GuestId','renew',1689350400,to_bitmap(0)), + ('GuestId','renew',1689696000,to_bitmap(0)), + ('GuestId','renew',1689868800,to_bitmap(0)), + ('GuestId','renew',1689955200,to_bitmap(0)), + ('GuestId','renew',1690387200,to_bitmap(0)), + ('GuestId','renew',1690992000,to_bitmap(0)), + ('GuestId','renew',1691251200,to_bitmap(0)), + ('GuestId','renew',1691337600,to_bitmap(0)), + ('GuestId','renew',1691424000,to_bitmap(0)), + ('GuestId','renew',1692288000,to_bitmap(0)), + ('GuestId','renew',1692547200,to_bitmap(0)), + ('GuestId','renew',1692720000,to_bitmap(0)), + ('GuestId','renew',1692892800,to_bitmap(0)), + ('GuestId','renew',1693670400,to_bitmap(0)), + ('GuestId','renew',1694016000,to_bitmap(0)), + ('GuestId','renew',1694102400,to_bitmap(0)), + ('GuestId','renew',1694188800,to_bitmap(0)), + ('GuestId','renew',1694620800,to_bitmap(0)), + ('GuestId','renew',1694880000,to_bitmap(0)), + ('GuestId','renew',1694966400,to_bitmap(0)), + ('GuestId','renew',1695052800,to_bitmap(0)), + ('GuestId','renew',1695398400,to_bitmap(0)), + ('GuestId','renew',1695484800,to_bitmap(0)), + ('GuestId','renew',1695571200,to_bitmap(0)), + ('GuestId','renew',1695657600,to_bitmap(0)), + ('GuestId','renew',1695744000,to_bitmap(0)), + ('GuestId','renew',1696089600,to_bitmap(0)), + ('GuestId','renew',1696348800,to_bitmap(0)), + ('GuestId','renew',1696867200,to_bitmap(0)), + ('GuestId','renew',1698422400,to_bitmap(0)), + ('GuestId','renew',1698595200,to_bitmap(0)), + ('GuestId','renew',1698768000,to_bitmap(0)), + ('MateId','renew',1685030400,to_bitmap(0)), + ('MateId','renew',1685116800,to_bitmap(0)), + ('MateId','renew',1685289600,to_bitmap(0)), + ('MateId','renew',1685376000,to_bitmap(0)), + ('MateId','renew',1685808000,to_bitmap(0)), + ('MateId','renew',1686153600,to_bitmap(0)), + ('MateId','renew',1686240000,to_bitmap(0)), + ('MateId','renew',1686499200,to_bitmap(0)), + ('MateId','renew',1686585600,to_bitmap(0)), + ('MateId','renew',1686672000,to_bitmap(0)), + ('MateId','renew',1687104000,to_bitmap(0)), + ('MateId','renew',1687536000,to_bitmap(0)), + ('MateId','renew',1688054400,to_bitmap(0)), + ('MateId','renew',1688140800,to_bitmap(0)), + ('MateId','renew',1688227200,to_bitmap(0)), + ('MateId','renew',1688745600,to_bitmap(0)), + ('MateId','renew',1688918400,to_bitmap(0)), + ('MateId','renew',1689004800,to_bitmap(0)), + ('MateId','renew',1689264000,to_bitmap(0)), + ('MateId','renew',1690560000,to_bitmap(0)), + ('MateId','renew',1691337600,to_bitmap(0)), + ('MateId','renew',1691510400,to_bitmap(0)), + ('MateId','renew',1691596800,to_bitmap(0)), + ('MateId','renew',1692028800,to_bitmap(0)), + ('MateId','renew',1692460800,to_bitmap(0)), + ('MateId','renew',1692720000,to_bitmap(0)), + ('MateId','renew',1692806400,to_bitmap(0)), + ('MateId','renew',1694102400,to_bitmap(0)), + ('MateId','renew',1694534400,to_bitmap(0)), + ('MateId','renew',1695571200,to_bitmap(0)), + ('MateId','renew',1695657600,to_bitmap(0)), + ('MateId','renew',1695744000,to_bitmap(0)), + ('MateId','renew',1695916800,to_bitmap(0)), + ('MateId','renew',1696089600,to_bitmap(0)), + ('MateId','renew',1697299200,to_bitmap(0)), + ('MateId','renew',1697472000,to_bitmap(0)), + ('MateId','renew',1697558400,to_bitmap(0)), + ('MateId','renew',1697817600,to_bitmap(0)), + ('MateId','renew',1698249600,to_bitmap(0)), + ('MateId','renew',1698595200,to_bitmap(0)), + ('MateId','renew',1698768000,to_bitmap(0)), + ('MateId','renew',1699286400,to_bitmap(0)), + ('MateId','renew',1699372800,to_bitmap(0)), + ('MateId','renew',1699459200,to_bitmap(0)), + ('MateId','renew',1699545600,to_bitmap(0)), + ('MateId','renew',1699718400,to_bitmap(0)), + ('MateId','renew',1699977600,to_bitmap(0)), + ('MateId','scrm',1684425600,to_bitmap(0)), + ('MateId','scrm',1685030400,to_bitmap(0)), + ('MateId','scrm',1685116800,to_bitmap(0)), + ('MateId','scrm',1685203200,to_bitmap(0)), + ('MateId','scrm',1685548800,to_bitmap(0)), + ('MateId','scrm',1685635200,to_bitmap(0)), + ('MateId','scrm',1685808000,to_bitmap(0)), + ('MateId','scrm',1687190400,to_bitmap(0)), + ('MateId','scrm',1687363200,to_bitmap(0)), + ('MateId','scrm',1687622400,to_bitmap(0)), + ('MateId','scrm',1687708800,to_bitmap(0)), + ('MateId','scrm',1688227200,to_bitmap(0)), + ('MateId','scrm',1689177600,to_bitmap(0)), + ('MateId','scrm',1689264000,to_bitmap(0)), + ('MateId','scrm',1689696000,to_bitmap(0)), + ('MateId','scrm',1690041600,to_bitmap(0)), + ('MateId','scrm',1690128000,to_bitmap(0)), + ('MateId','scrm',1690646400,to_bitmap(0)), + ('MateId','scrm',1691510400,to_bitmap(0)), + ('MateId','scrm',1691683200,to_bitmap(0)), + ('MateId','scrm',1691856000,to_bitmap(0)), + ('MateId','scrm',1692201600,to_bitmap(0)), + ('MateId','scrm',1692288000,to_bitmap(0)), + ('MateId','scrm',1693411200,to_bitmap(0)), + ('MateId','scrm',1693843200,to_bitmap(0)), + ('MateId','scrm',1694188800,to_bitmap(0)), + ('MateId','scrm',1694361600,to_bitmap(0)), + ('MateId','scrm',1694534400,to_bitmap(0)), + ('MateId','scrm',1694707200,to_bitmap(0)), + ('MateId','scrm',1695052800,to_bitmap(0)), + ('MateId','scrm',1695744000,to_bitmap(0)), + ('MateId','scrm',1696953600,to_bitmap(0)), + ('MateId','scrm',1697299200,to_bitmap(0)), + ('MateId','scrm',1697817600,to_bitmap(0)), + ('MateId','scrm',1698768000,to_bitmap(0)), + ('MateId','scrm',1698854400,to_bitmap(0)), + ('MateId','scrm',1699027200,to_bitmap(0)), + ('GuestId','renew',1684857600,to_bitmap(0)), + ('GuestId','renew',1685203200,to_bitmap(0)), + ('GuestId','renew',1685548800,to_bitmap(0)), + ('GuestId','renew',1685894400,to_bitmap(0)), + ('GuestId','renew',1686672000,to_bitmap(0)), + ('GuestId','renew',1688054400,to_bitmap(0)), + ('GuestId','renew',1689004800,to_bitmap(0)), + ('GuestId','renew',1689091200,to_bitmap(0)), + ('GuestId','renew',1689264000,to_bitmap(0)), + ('GuestId','renew',1689523200,to_bitmap(0)), + ('GuestId','renew',1690041600,to_bitmap(0)), + ('GuestId','renew',1690128000,to_bitmap(0)), + ('GuestId','renew',1690300800,to_bitmap(0)), + ('GuestId','renew',1690905600,to_bitmap(0)), + ('GuestId','renew',1691596800,to_bitmap(0)), + ('GuestId','renew',1691942400,to_bitmap(0)), + ('GuestId','renew',1692201600,to_bitmap(0)), + ('GuestId','renew',1693152000,to_bitmap(0)), + ('GuestId','renew',1693238400,to_bitmap(0)), + ('GuestId','renew',1693497600,to_bitmap(0)), + ('GuestId','renew',1693929600,to_bitmap(0)), + ('GuestId','renew',1696176000,to_bitmap(0)), + ('GuestId','renew',1697126400,to_bitmap(0)), + ('GuestId','renew',1697731200,to_bitmap(0)), + ('GuestId','renew',1698076800,to_bitmap(0)), + ('GuestId','renew',1698249600,to_bitmap(0)), + ('GuestId','renew',1699027200,to_bitmap(0)), + ('GuestId','renew',1699286400,to_bitmap(0)), + ('GuestId','renew',1699459200,to_bitmap(0)), + ('MateId','renew',1684425600,to_bitmap(0)), + ('MateId','renew',1685548800,to_bitmap(0)), + ('MateId','renew',1685894400,to_bitmap(0)), + ('MateId','renew',1686758400,to_bitmap(0)), + ('MateId','renew',1687276800,to_bitmap(0)), + ('MateId','renew',1687363200,to_bitmap(0)), + ('MateId','renew',1687708800,to_bitmap(0)), + ('MateId','renew',1688486400,to_bitmap(0)), + ('MateId','renew',1688832000,to_bitmap(0)), + ('MateId','renew',1689177600,to_bitmap(0)), + ('MateId','renew',1689868800,to_bitmap(0)), + ('MateId','renew',1690473600,to_bitmap(0)), + ('MateId','renew',1690819200,to_bitmap(0)), + ('MateId','renew',1691424000,to_bitmap(0)), + ('MateId','renew',1691942400,to_bitmap(0)), + ('MateId','renew',1692201600,to_bitmap(0)), + ('MateId','renew',1692892800,to_bitmap(0)), + ('MateId','renew',1693065600,to_bitmap(0)), + ('MateId','renew',1694448000,to_bitmap(0)), + ('MateId','renew',1694793600,to_bitmap(0)), + ('MateId','renew',1694966400,to_bitmap(0)), + ('MateId','renew',1695139200,to_bitmap(0)), + ('MateId','renew',1695830400,to_bitmap(0)), + ('MateId','renew',1696176000,to_bitmap(0)), + ('MateId','renew',1696521600,to_bitmap(0)), + ('MateId','renew',1697385600,to_bitmap(0)), + ('MateId','renew',1698336000,to_bitmap(0)), + ('MateId','renew',1698422400,to_bitmap(0)), + ('MateId','renew',1699027200,to_bitmap(0)), + ('MateId','renew',1699200000,to_bitmap(0)), + ('MateId','scrm',1684512000,to_bitmap(0)), + ('MateId','scrm',1684944000,to_bitmap(0)), + ('MateId','scrm',1685376000,to_bitmap(0)), + ('MateId','scrm',1685980800,to_bitmap(0)), + ('MateId','scrm',1686067200,to_bitmap(0)), + ('MateId','scrm',1686585600,to_bitmap(0)), + ('MateId','scrm',1686758400,to_bitmap(0)), + ('MateId','scrm',1686844800,to_bitmap(0)), + ('MateId','scrm',1686931200,to_bitmap(0)), + ('MateId','scrm',1687449600,to_bitmap(0)), + ('MateId','scrm',1687536000,to_bitmap(0)), + ('MateId','scrm',1688572800,to_bitmap(0)), + ('MateId','scrm',1688745600,to_bitmap(0)), + ('MateId','scrm',1688918400,to_bitmap(0)), + ('MateId','scrm',1689004800,to_bitmap(0)), + ('MateId','scrm',1689436800,to_bitmap(0)), + ('MateId','scrm',1689609600,to_bitmap(0)), + ('MateId','scrm',1690300800,to_bitmap(0)), + ('MateId','scrm',1690387200,to_bitmap(0)), + ('MateId','scrm',1690473600,to_bitmap(0)), + ('MateId','scrm',1691251200,to_bitmap(0)), + ('MateId','scrm',1692547200,to_bitmap(0)), + ('MateId','scrm',1693152000,to_bitmap(0)), + ('MateId','scrm',1693756800,to_bitmap(0)), + ('MateId','scrm',1694016000,to_bitmap(0)), + ('MateId','scrm',1694275200,to_bitmap(0)), + ('MateId','scrm',1694448000,to_bitmap(0)), + ('MateId','scrm',1694793600,to_bitmap(0)), + ('MateId','scrm',1694880000,to_bitmap(0)), + ('MateId','scrm',1694966400,to_bitmap(0)), + ('MateId','scrm',1695571200,to_bitmap(0)), + ('MateId','scrm',1696003200,to_bitmap(0)), + ('MateId','scrm',1696348800,to_bitmap(0)), + ('MateId','scrm',1697040000,to_bitmap(0)), + ('MateId','scrm',1697126400,to_bitmap(0)), + ('MateId','scrm',1697731200,to_bitmap(0)), + ('MateId','scrm',1698076800,to_bitmap(0)), + ('MateId','scrm',1698336000,to_bitmap(0)), + ('MateId','scrm',1699200000,to_bitmap(0)), + ('MateId','scrm',1699459200,to_bitmap(0)), + ('MateId','scrm',1699632000,to_bitmap(0)); + """ + + sql """ + INSERT INTO `behavior_bitmap_base` VALUES + ('member_id','m_oneid',1,bitmap_from_string("1,5,6,8,9,11,12,13,14,18,19,22,24,25,29,31,34,36,40,41,45,46,47,50,56,57,58,59,64,65,66,67,68,70,71,72")), + ('customer_id','c_oneid',1,bitmap_from_string("2,3,4,7,10,15,16,17,20,21,23,26,27,28,30,32,33,35,37,38,39,42,43,44,48,49,51,52,53,54,55,60,61,62,63,69")); + """ + + for (int i = 1; i <= 30; i++) { + sql """ + select + a.identity_type_desc, + a.system_type, + a.statistic_data, + bitmap_xor(a.one_id, b.one_id) as one_id + from + ( + select + identity_type_desc, + system_type, + statistic_data, + one_id + from + behavior_bitmap_base + where + identity_type_desc = 'MateId' + ) a join + ( + select + one_id + from + behavior_bitmap_base + where + system_type = 'm_oneid' + ) b + union all + select + a.identity_type_desc, + a.system_type, + a.statistic_data, + bitmap_xor(a.one_id, b.one_id) as one_id + from + ( + select + identity_type_desc, + system_type, + statistic_data, + one_id + from + behavior_bitmap_base + where identity_type_desc = 'GuestId' + ) a join + ( + select + one_id + from + behavior_bitmap_base + where system_type = 'c_oneid' + ) b + """ + } +} From d74004ee25d07dcfe1a7dc5db198bb0f220ab95a Mon Sep 17 00:00:00 2001 From: meiyi Date: Fri, 22 Sep 2023 16:21:46 +0800 Subject: [PATCH 27/64] [feature-wip](merge-on-write) MOW table split primary key and sort key --- be/src/olap/delete_bitmap_calculator.cpp | 32 ++- be/src/olap/delete_bitmap_calculator.h | 9 +- be/src/olap/memtable.cpp | 54 ++++ be/src/olap/memtable.h | 1 + be/src/olap/primary_key_index.cpp | 2 +- be/src/olap/primary_key_index.h | 14 +- be/src/olap/rowset/segment_v2/segment.cpp | 41 ++- .../olap/rowset/segment_v2/segment_writer.cpp | 163 +++++++++-- .../olap/rowset/segment_v2/segment_writer.h | 14 +- be/src/olap/tablet.cpp | 41 ++- be/src/olap/tablet_meta.cpp | 3 + be/src/olap/tablet_schema.cpp | 12 +- be/src/olap/tablet_schema.h | 2 + be/test/olap/primary_key_index_test.cpp | 2 +- fe/fe-core/src/main/cup/sql_parser.cup | 16 +- .../org/apache/doris/analysis/ColumnDef.java | 8 +- .../doris/analysis/CreateTableStmt.java | 4 + .../org/apache/doris/analysis/KeysDesc.java | 88 ++++++ .../java/org/apache/doris/catalog/Column.java | 51 +++- .../java/org/apache/doris/catalog/Env.java | 41 ++- .../doris/datasource/InternalCatalog.java | 27 +- .../translator/PhysicalPlanTranslator.java | 16 +- .../apache/doris/task/CreateReplicaTask.java | 10 +- gensrc/proto/olap_file.proto | 1 + gensrc/thrift/AgentService.thrift | 1 + gensrc/thrift/Descriptors.thrift | 1 + .../cluster_key/ignore_mode.csv | 10 + .../test_delete_sign_delete_bitmap.out | 54 ++++ .../cluster_key/test_ignore_mode.out | 20 ++ .../test_mow_with_null_sequence.out | 14 + .../cluster_key/test_unique_mow_sequence.out | 25 ++ .../ssb_unique_sql_zstd_cluster/sql/q1.1.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q1.2.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q1.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q2.1.out | 43 +++ .../ssb_unique_sql_zstd_cluster/sql/q2.2.out | 11 + .../ssb_unique_sql_zstd_cluster/sql/q2.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q3.1.out | 28 ++ .../ssb_unique_sql_zstd_cluster/sql/q3.2.out | 51 ++++ .../ssb_unique_sql_zstd_cluster/sql/q3.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q3.4.out | 3 + .../ssb_unique_sql_zstd_cluster/sql/q4.1.out | 8 + .../ssb_unique_sql_zstd_cluster/sql/q4.2.out | 3 + .../ssb_unique_sql_zstd_cluster/sql/q4.3.out | 3 + .../cluster_key/test_create_table.groovy | 202 ++++++++++++++ .../test_delete_sign_delete_bitmap.groovy | 98 +++++++ .../cluster_key/test_ignore_mode.groovy | 114 ++++++++ .../test_mow_with_null_sequence.groovy | 94 +++++++ .../cluster_key/test_pk_uk_case.groovy | 260 ++++++++++++++++++ .../test_primary_key_simple_case.groovy | 115 ++++++++ .../test_unique_mow_sequence.groovy | 86 ++++++ .../ddl/customer_create.sql | 19 ++ .../ddl/customer_delete.sql | 1 + .../ddl/customer_part_delete.sql | 1 + .../ddl/customer_sequence_create.sql | 20 ++ .../ddl/date_create.sql | 28 ++ .../ddl/date_delete.sql | 1 + .../ddl/date_part_delete.sql | 1 + .../ddl/date_sequence_create.sql | 29 ++ .../ddl/lineorder_create.sql | 36 +++ .../ddl/lineorder_delete.sql | 1 + .../ddl/lineorder_part_delete.sql | 1 + .../ddl/lineorder_sequence_create.sql | 37 +++ .../ddl/part_create.sql | 20 ++ .../ddl/part_delete.sql | 1 + .../ddl/part_part_delete.sql | 1 + .../ddl/part_sequence_create.sql | 21 ++ .../ddl/supplier_create.sql | 18 ++ .../ddl/supplier_delete.sql | 1 + .../ddl/supplier_part_delete.sql | 1 + .../ddl/supplier_sequence_create.sql | 19 ++ .../four/load_four_step.groovy | 111 ++++++++ .../one/load_one_step.groovy | 63 +++++ .../three/load_three_step.groovy | 73 +++++ .../two/load_two_step.groovy | 70 +++++ .../ddl/customer_create.sql | 19 ++ .../ddl/customer_delete.sql | 1 + .../ddl/date_create.sql | 28 ++ .../ddl/date_delete.sql | 1 + .../ddl/lineorder_create.sql | 36 +++ .../ddl/lineorder_delete.sql | 1 + .../ddl/part_create.sql | 20 ++ .../ddl/part_delete.sql | 1 + .../ddl/supplier_create.sql | 18 ++ .../ddl/supplier_delete.sql | 1 + .../ssb_unique_sql_zstd_cluster/load.groovy | 80 ++++++ .../ssb_unique_sql_zstd_cluster/sql/q1.1.sql | 24 ++ .../ssb_unique_sql_zstd_cluster/sql/q1.2.sql | 24 ++ .../ssb_unique_sql_zstd_cluster/sql/q1.3.sql | 25 ++ .../ssb_unique_sql_zstd_cluster/sql/q2.1.sql | 26 ++ .../ssb_unique_sql_zstd_cluster/sql/q2.2.sql | 27 ++ .../ssb_unique_sql_zstd_cluster/sql/q2.3.sql | 26 ++ .../ssb_unique_sql_zstd_cluster/sql/q3.1.sql | 28 ++ .../ssb_unique_sql_zstd_cluster/sql/q3.2.sql | 28 ++ .../ssb_unique_sql_zstd_cluster/sql/q3.3.sql | 30 ++ .../ssb_unique_sql_zstd_cluster/sql/q3.4.sql | 30 ++ .../ssb_unique_sql_zstd_cluster/sql/q4.1.sql | 30 ++ .../ssb_unique_sql_zstd_cluster/sql/q4.2.sql | 31 +++ .../ssb_unique_sql_zstd_cluster/sql/q4.3.sql | 29 ++ 99 files changed, 2961 insertions(+), 93 deletions(-) create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.out create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.out create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.out create mode 100644 regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.out create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_create_table.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_pk_uk_case.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_primary_key_simple_case.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/four/load_four_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/one/load_one_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/three/load_three_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/two/load_two_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/load.groovy create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.sql create mode 100644 regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.sql diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index 86d82783e4effa..6e9e9e24caec5c 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -92,24 +92,26 @@ bool MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()( Slice key1, key2; RETURN_IF_ERROR(lhs->get_current_key(key1)); RETURN_IF_ERROR(rhs->get_current_key(key2)); - if (_sequence_length == 0) { + if (_sequence_length == 0 && _rowid_length == 0) { auto cmp_result = key1.compare(key2); // when key1 is the same as key2, // we want the one with greater segment id to be popped first return cmp_result ? (cmp_result > 0) : (lhs->segment_id() < rhs->segment_id()); } // smaller key popped first - auto key1_without_seq = Slice(key1.get_data(), key1.get_size() - _sequence_length); - auto key2_without_seq = Slice(key2.get_data(), key2.get_size() - _sequence_length); + auto key1_without_seq = + Slice(key1.get_data(), key1.get_size() - _sequence_length - _rowid_length); + auto key2_without_seq = + Slice(key2.get_data(), key2.get_size() - _sequence_length - _rowid_length); auto cmp_result = key1_without_seq.compare(key2_without_seq); if (cmp_result != 0) { return cmp_result > 0; } // greater sequence value popped first - auto key1_sequence_val = - Slice(key1.get_data() + key1.get_size() - _sequence_length, _sequence_length); - auto key2_sequence_val = - Slice(key2.get_data() + key2.get_size() - _sequence_length, _sequence_length); + auto key1_sequence_val = Slice( + key1.get_data() + key1.get_size() - _sequence_length - _rowid_length, _sequence_length); + auto key2_sequence_val = Slice( + key2.get_data() + key2.get_size() - _sequence_length - _rowid_length, _sequence_length); cmp_result = key1_sequence_val.compare(key2_sequence_val); if (cmp_result != 0) { return cmp_result < 0; @@ -120,19 +122,23 @@ bool MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()( bool MergeIndexDeleteBitmapCalculatorContext::Comparator::is_key_same(Slice const& lhs, Slice const& rhs) const { - DCHECK(lhs.get_size() >= _sequence_length); - DCHECK(rhs.get_size() >= _sequence_length); - auto lhs_without_seq = Slice(lhs.get_data(), lhs.get_size() - _sequence_length); - auto rhs_without_seq = Slice(rhs.get_data(), rhs.get_size() - _sequence_length); + DCHECK(lhs.get_size() >= _sequence_length + _rowid_length); + DCHECK(rhs.get_size() >= _sequence_length + _rowid_length); + auto lhs_without_seq = Slice(lhs.get_data(), lhs.get_size() - _sequence_length - _rowid_length); + auto rhs_without_seq = Slice(rhs.get_data(), rhs.get_size() - _sequence_length - _rowid_length); return lhs_without_seq.compare(rhs_without_seq) == 0; } Status MergeIndexDeleteBitmapCalculator::init(RowsetId rowset_id, std::vector const& segments, - size_t seq_col_length, size_t max_batch_size) { + size_t seq_col_length, + size_t rowdid_length, + size_t max_batch_size) { _rowset_id = rowset_id; _seq_col_length = seq_col_length; - _comparator = MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length); + _rowid_length = rowdid_length; + _comparator = + MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, _rowid_length); _contexts.reserve(segments.size()); _heap = std::make_unique(_comparator); diff --git a/be/src/olap/delete_bitmap_calculator.h b/be/src/olap/delete_bitmap_calculator.h index dd17fe7b686b96..0c526019723b55 100644 --- a/be/src/olap/delete_bitmap_calculator.h +++ b/be/src/olap/delete_bitmap_calculator.h @@ -47,13 +47,15 @@ class MergeIndexDeleteBitmapCalculatorContext { public: class Comparator { public: - Comparator(size_t sequence_length) : _sequence_length(sequence_length) {} + Comparator(size_t sequence_length, size_t rowid_length) + : _sequence_length(sequence_length), _rowid_length(rowid_length) {} bool operator()(MergeIndexDeleteBitmapCalculatorContext* lhs, MergeIndexDeleteBitmapCalculatorContext* rhs) const; bool is_key_same(Slice const& lhs, Slice const& rhs) const; private: size_t _sequence_length; + size_t _rowid_length; }; MergeIndexDeleteBitmapCalculatorContext(std::unique_ptr iter, @@ -90,7 +92,7 @@ class MergeIndexDeleteBitmapCalculator { MergeIndexDeleteBitmapCalculator() = default; Status init(RowsetId rowset_id, std::vector const& segments, - size_t seq_col_length = 0, size_t max_batch_size = 1024); + size_t seq_col_length = 0, size_t rowid_length = 0, size_t max_batch_size = 1024); Status calculate_one(RowLocation& loc); @@ -101,11 +103,12 @@ class MergeIndexDeleteBitmapCalculator { std::vector, MergeIndexDeleteBitmapCalculatorContext::Comparator>; std::vector _contexts; - MergeIndexDeleteBitmapCalculatorContext::Comparator _comparator {0}; + MergeIndexDeleteBitmapCalculatorContext::Comparator _comparator {0, 0}; RowsetId _rowset_id; std::unique_ptr _heap; std::string _last_key; size_t _seq_col_length; + size_t _rowid_length; }; } // namespace doris diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index d163abd26a7405..d63474463dd49e 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -290,6 +290,56 @@ size_t MemTable::_sort() { return same_keys_num; } +void MemTable::_sort_by_cluster_keys() { + SCOPED_RAW_TIMER(&_stat.sort_ns); + _stat.sort_times++; + // sort all rows + vectorized::Block in_block = _output_mutable_block.to_block(); + auto cloneBlock = in_block.clone_without_columns(); + _output_mutable_block = vectorized::MutableBlock::build_mutable_block(&cloneBlock); + vectorized::MutableBlock mutable_block = + vectorized::MutableBlock::build_mutable_block(&in_block); + + std::vector row_in_blocks; + std::unique_ptr> row_in_blocks_deleter((int*)0x01, [&](int*) { + std::for_each(row_in_blocks.begin(), row_in_blocks.end(), + std::default_delete()); + }); + row_in_blocks.reserve(mutable_block.rows()); + for (size_t i = 0; i < mutable_block.rows(); i++) { + row_in_blocks.emplace_back(new RowInBlock {i}); + } + Tie tie = Tie(0, mutable_block.rows()); + + for (auto i : _tablet_schema->cluster_key_idxes()) { + auto cmp = [&](const RowInBlock* lhs, const RowInBlock* rhs) -> int { + return mutable_block.compare_one_column(lhs->_row_pos, rhs->_row_pos, i, -1); + }; + _sort_one_column(row_in_blocks, tie, cmp); + } + + // sort extra round by _row_pos to make the sort stable + auto iter = tie.iter(); + while (iter.next()) { + pdqsort(std::next(row_in_blocks.begin(), iter.left()), + std::next(row_in_blocks.begin(), iter.right()), + [](const RowInBlock* lhs, const RowInBlock* rhs) -> bool { + return lhs->_row_pos < rhs->_row_pos; + }); + } + + in_block = mutable_block.to_block(); + SCOPED_RAW_TIMER(&_stat.put_into_output_ns); + std::vector row_pos_vec; + DCHECK(in_block.rows() <= std::numeric_limits::max()); + row_pos_vec.reserve(in_block.rows()); + for (int i = 0; i < row_in_blocks.size(); i++) { + row_pos_vec.emplace_back(row_in_blocks[i]->_row_pos); + } + _output_mutable_block.add_rows(&in_block, row_pos_vec.data(), + row_pos_vec.data() + in_block.rows()); +} + void MemTable::_sort_one_column(std::vector& row_in_blocks, Tie& tie, std::function cmp) { auto iter = tie.iter(); @@ -448,6 +498,10 @@ std::unique_ptr MemTable::to_block() { } else { _aggregate(); } + if (_keys_type == KeysType::UNIQUE_KEYS && _enable_unique_key_mow && + !_tablet_schema->cluster_key_idxes().empty()) { + _sort_by_cluster_keys(); + } return vectorized::Block::create_unique(_output_mutable_block.to_block()); } diff --git a/be/src/olap/memtable.h b/be/src/olap/memtable.h index cade509aac5ce1..a5289dbaf6b7ee 100644 --- a/be/src/olap/memtable.h +++ b/be/src/olap/memtable.h @@ -244,6 +244,7 @@ class MemTable { //return number of same keys size_t _sort(); + void _sort_by_cluster_keys(); void _sort_one_column(std::vector& row_in_blocks, Tie& tie, std::function cmp); template diff --git a/be/src/olap/primary_key_index.cpp b/be/src/olap/primary_key_index.cpp index cc39441220206d..b807b249a79371 100644 --- a/be/src/olap/primary_key_index.cpp +++ b/be/src/olap/primary_key_index.cpp @@ -54,7 +54,7 @@ Status PrimaryKeyIndexBuilder::init() { Status PrimaryKeyIndexBuilder::add_item(const Slice& key) { RETURN_IF_ERROR(_primary_key_index_builder->add(&key)); - Slice key_without_seq = Slice(key.get_data(), key.get_size() - _seq_col_length); + Slice key_without_seq = Slice(key.get_data(), key.get_size() - _seq_col_length - _rowid_length); _bloom_filter_index_builder->add_values(&key_without_seq, 1); // the key is already sorted, so the first key is min_key, and // the last key is max_key. diff --git a/be/src/olap/primary_key_index.h b/be/src/olap/primary_key_index.h index 59b88c2f72427a..644b67719ff81e 100644 --- a/be/src/olap/primary_key_index.h +++ b/be/src/olap/primary_key_index.h @@ -50,12 +50,13 @@ class PrimaryKeyIndexMetaPB; // NOTE: for now, it's only used when unique key merge-on-write property enabled. class PrimaryKeyIndexBuilder { public: - PrimaryKeyIndexBuilder(io::FileWriter* file_writer, size_t seq_col_length) + PrimaryKeyIndexBuilder(io::FileWriter* file_writer, size_t seq_col_length, size_t rowid_length) : _file_writer(file_writer), _num_rows(0), _size(0), _disk_size(0), - _seq_col_length(seq_col_length) {} + _seq_col_length(seq_col_length), + _rowid_length(rowid_length) {} Status init(); @@ -70,8 +71,12 @@ class PrimaryKeyIndexBuilder { // used for be ut uint32_t data_page_num() const { return _primary_key_index_builder->data_page_num(); } - Slice min_key() { return Slice(_min_key.data(), _min_key.size() - _seq_col_length); } - Slice max_key() { return Slice(_max_key.data(), _max_key.size() - _seq_col_length); } + Slice min_key() { + return Slice(_min_key.data(), _min_key.size() - _seq_col_length - _rowid_length); + } + Slice max_key() { + return Slice(_max_key.data(), _max_key.size() - _seq_col_length - _rowid_length); + } Status finalize(segment_v2::PrimaryKeyIndexMetaPB* meta); @@ -81,6 +86,7 @@ class PrimaryKeyIndexBuilder { uint64_t _size; uint64_t _disk_size; size_t _seq_col_length; + size_t _rowid_length; faststring _min_key; faststring _max_key; diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index bf41f3a12e99a9..c22939a8c2a0cd 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -404,13 +404,18 @@ Status Segment::new_inverted_index_iterator(const TabletColumn& tablet_column, Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* row_location) { RETURN_IF_ERROR(load_pk_index_and_bf()); bool has_seq_col = _tablet_schema->has_sequence_col(); + bool has_rowid = !_tablet_schema->cluster_key_idxes().empty(); size_t seq_col_length = 0; if (has_seq_col) { seq_col_length = _tablet_schema->column(_tablet_schema->sequence_col_idx()).length() + 1; } + size_t rowid_length = 0; + if (has_rowid) { + rowid_length = sizeof(uint32_t) + 1; + } - Slice key_without_seq = - Slice(key.get_data(), key.get_size() - (with_seq_col ? seq_col_length : 0)); + Slice key_without_seq = Slice( + key.get_data(), key.get_size() - (with_seq_col ? seq_col_length : 0) - rowid_length); DCHECK(_pk_index_reader != nullptr); if (!_pk_index_reader->check_present(key_without_seq)) { @@ -423,26 +428,26 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* if (!st.ok() && !st.is()) { return st; } - if (st.is() || (!has_seq_col && !exact_match)) { + if (st.is() || (!has_seq_col && !has_rowid && !exact_match)) { return Status::Error("Can't find key in the segment"); } row_location->row_id = index_iterator->get_current_ordinal(); row_location->segment_id = _segment_id; row_location->rowset_id = _rowset_id; + size_t num_to_read = 1; + auto index_type = vectorized::DataTypeFactory::instance().create_data_type( + _pk_index_reader->type_info()->type(), 1, 0); + auto index_column = index_type->create_column(); + size_t num_read = num_to_read; + RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); + DCHECK(num_to_read == num_read); + + Slice sought_key = Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); + if (has_seq_col) { - size_t num_to_read = 1; - auto index_type = vectorized::DataTypeFactory::instance().create_data_type( - _pk_index_reader->type_info()->type(), 1, 0); - auto index_column = index_type->create_column(); - size_t num_read = num_to_read; - RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); - DCHECK(num_to_read == num_read); - - Slice sought_key = - Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); Slice sought_key_without_seq = - Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length); + Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length - rowid_length); // compare key if (key_without_seq.compare(sought_key_without_seq) != 0) { @@ -463,6 +468,14 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* "key with higher sequence id exists"); } } + if (!has_seq_col && has_rowid) { + Slice sought_key_without_rowid = + Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); + // compare key + if (key_without_seq.compare(sought_key_without_rowid) != 0) { + return Status::NotFound("Can't find key in the segment"); + } + } return Status::OK(); } diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 329a7fa1e9252f..c6b42416b2f4ce 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -87,17 +87,40 @@ SegmentWriter::SegmentWriter(io::FileWriter* file_writer, uint32_t segment_id, CHECK_NOTNULL(file_writer); _num_key_columns = _tablet_schema->num_key_columns(); _num_short_key_columns = _tablet_schema->num_short_key_columns(); - DCHECK(_num_key_columns >= _num_short_key_columns); + if (_tablet_schema->cluster_key_idxes().empty()) { + DCHECK(_num_key_columns >= _num_short_key_columns) + << ", table_id=" << _tablet_schema->table_id() + << ", num_key_columns=" << _num_key_columns + << ", num_short_key_columns=" << _num_short_key_columns + << ", cluster_key_columns=" << _tablet_schema->cluster_key_idxes().size(); + } for (size_t cid = 0; cid < _num_key_columns; ++cid) { const auto& column = _tablet_schema->column(cid); _key_coders.push_back(get_key_coder(column.type())); _key_index_size.push_back(column.index_length()); } - // encode the sequence id into the primary key index - if (_tablet_schema->has_sequence_col() && _tablet_schema->keys_type() == UNIQUE_KEYS && - _opts.enable_unique_key_merge_on_write) { - const auto& column = _tablet_schema->column(_tablet_schema->sequence_col_idx()); - _seq_coder = get_key_coder(column.type()); + if (_tablet_schema->keys_type() == UNIQUE_KEYS && _opts.enable_unique_key_merge_on_write) { + // encode the sequence id into the primary key index + if (_tablet_schema->has_sequence_col()) { + const auto& column = _tablet_schema->column(_tablet_schema->sequence_col_idx()); + _seq_coder = get_key_coder(column.type()); + } + // encode the rowid into the primary key index + if (!_tablet_schema->cluster_key_idxes().empty()) { + const auto* type_info = get_scalar_type_info(); + _rowid_coder = get_key_coder(type_info->type()); + // primary keys + _primary_key_coders.swap(_key_coders); + // cluster keys + _key_coders.clear(); + _key_index_size.clear(); + _num_key_columns = _tablet_schema->cluster_key_idxes().size(); + for (auto cid : _tablet_schema->cluster_key_idxes()) { + const auto& column = _tablet_schema->column(cid); + _key_coders.push_back(get_key_coder(column.type())); + _key_index_size.push_back(column.index_length()); + } + } } } @@ -227,8 +250,14 @@ Status SegmentWriter::init(const std::vector& col_ids, bool has_key) { seq_col_length = _tablet_schema->column(_tablet_schema->sequence_col_idx()).length() + 1; } + size_t rowid_length = 0; + if (!_tablet_schema->cluster_key_idxes().empty()) { + rowid_length = sizeof(uint32_t) + 1; + _short_key_index_builder.reset( + new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); + } _primary_key_index_builder.reset( - new PrimaryKeyIndexBuilder(_file_writer, seq_col_length)); + new PrimaryKeyIndexBuilder(_file_writer, seq_col_length, rowid_length)); RETURN_IF_ERROR(_primary_key_index_builder->init()); } else { _short_key_index_builder.reset( @@ -681,7 +710,7 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po return converted_result.first; } auto cid = _column_ids[id]; - if (_has_key && cid < _num_key_columns) { + if (_has_key && cid < _tablet_schema->num_key_columns()) { key_columns.push_back(converted_result.second); } else if (_has_key && _tablet_schema->has_sequence_col() && cid == _tablet_schema->sequence_col_idx()) { @@ -691,22 +720,82 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po converted_result.second->get_data(), num_rows)); } if (_has_key) { - if (_tablet_schema->keys_type() == UNIQUE_KEYS && _opts.enable_unique_key_merge_on_write) { + bool need_primary_key_indexes = (_tablet_schema->keys_type() == UNIQUE_KEYS && + _opts.enable_unique_key_merge_on_write); + bool need_short_key_indexes = + !need_primary_key_indexes || + (need_primary_key_indexes && _tablet_schema->cluster_key_idxes().size() > 0); + if (need_primary_key_indexes) { // create primary indexes - std::string last_key; - for (size_t pos = 0; pos < num_rows; pos++) { - std::string key = _full_encode_keys(key_columns, pos); - _maybe_invalid_row_cache(key); - if (_tablet_schema->has_sequence_col()) { - _encode_seq_column(seq_column, pos, &key); + if (!need_short_key_indexes) { + std::string last_key; + for (size_t pos = 0; pos < num_rows; pos++) { + std::string key = _full_encode_keys(key_columns, pos); + if (_tablet_schema->has_sequence_col()) { + _encode_seq_column(seq_column, pos, &key); + } + DCHECK(key.compare(last_key) > 0) + << "found duplicate key or key is not sorted! current key: " << key + << ", last key" << last_key; + RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); + _maybe_invalid_row_cache(key); + last_key = std::move(key); + } + } else { + std::vector primary_key_columns; + primary_key_columns.swap(key_columns); + key_columns.clear(); + for (const auto& cid : _tablet_schema->cluster_key_idxes()) { + for (size_t id = 0; id < _column_writers.size(); ++id) { + // olap data convertor alway start from id = 0 + auto converted_result = _olap_data_convertor->convert_column_data(id); + if (cid == _column_ids[id]) { + key_columns.push_back(converted_result.second); + break; + } + } + } + std::vector primary_keys; + // keep primary keys in memory + for (uint32_t pos = 0; pos < num_rows; pos++) { + std::string key = + _full_encode_keys(_primary_key_coders, primary_key_columns, pos); + Slice slice(key); + if (_tablet_schema->has_sequence_col()) { + _encode_seq_column(seq_column, pos, &key); + } + _encode_rowid(pos, &key); + primary_keys.emplace_back(std::move(key)); + } + // sort primary keys + std::sort(primary_keys.begin(), primary_keys.end()); + // write primary keys + std::string last_key; + for (const auto& key : primary_keys) { + DCHECK(key.compare(last_key) > 0) + << "found duplicate key or key is not sorted! current key: " << key + << ", last key" << last_key; + RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); } - DCHECK(key.compare(last_key) > 0) - << "found duplicate key or key is not sorted! current key: " << key - << ", last key" << last_key; - RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); - last_key = std::move(key); } - } else { + } + if (need_short_key_indexes) { + if (need_primary_key_indexes) { + // short key is cluster key, key columns should be cluster key + min_max key + key_columns.clear(); + for (auto cid : _tablet_schema->cluster_key_idxes()) { + /*auto converted_result = _olap_data_convertor->convert_column_data(cid); + key_columns.push_back(converted_result.second);*/ + for (size_t id = 0; id < _column_writers.size(); ++id) { + // olap data convertor alway start from id = 0 + auto converted_result = _olap_data_convertor->convert_column_data(id); + if (cid == _column_ids[id]) { + key_columns.push_back(converted_result.second); + } + } + } + } + // TODO use cluster keys // create short key indexes' // for min_max key set_min_key(_full_encode_keys(key_columns, 0)); @@ -757,6 +846,33 @@ std::string SegmentWriter::_full_encode_keys( return encoded_keys; } +std::string SegmentWriter::_full_encode_keys( + std::vector& key_coders, + const std::vector& key_columns, size_t pos, + bool null_first) { + assert(key_columns.size() == key_coders.size()); + + std::string encoded_keys; + size_t cid = 0; + for (const auto& column : key_columns) { + auto field = column->get_data_at(pos); + if (UNLIKELY(!field)) { + if (null_first) { + encoded_keys.push_back(KEY_NULL_FIRST_MARKER); + } else { + encoded_keys.push_back(KEY_NULL_LAST_MARKER); + } + ++cid; + continue; + } + encoded_keys.push_back(KEY_NORMAL_MARKER); + DCHECK(key_coders[cid] != nullptr); + key_coders[cid]->full_encode_ascending(field, &encoded_keys); + ++cid; + } + return encoded_keys; +} + void SegmentWriter::_encode_seq_column(const vectorized::IOlapColumnDataAccessor* seq_column, size_t pos, string* encoded_keys) { auto field = seq_column->get_data_at(pos); @@ -773,6 +889,11 @@ void SegmentWriter::_encode_seq_column(const vectorized::IOlapColumnDataAccessor _seq_coder->full_encode_ascending(field, encoded_keys); } +void SegmentWriter::_encode_rowid(const uint32_t rowid, string* encoded_keys) { + encoded_keys->push_back(KEY_NORMAL_MARKER); + _rowid_coder->full_encode_ascending(&rowid, encoded_keys); +} + std::string SegmentWriter::_encode_keys( const std::vector& key_columns, size_t pos) { assert(key_columns.size() == _num_short_key_columns); diff --git a/be/src/olap/rowset/segment_v2/segment_writer.h b/be/src/olap/rowset/segment_v2/segment_writer.h index 3b50d0a4aac8c3..674ed54f7d3319 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.h +++ b/be/src/olap/rowset/segment_v2/segment_writer.h @@ -149,10 +149,18 @@ class SegmentWriter { size_t pos); // used for unique-key with merge on write and segment min_max key std::string _full_encode_keys( - const std::vector& key_columns, size_t pos); + const std::vector& key_columns, size_t pos, + bool null_first = true); + + std::string _full_encode_keys( + std::vector& key_coders, + const std::vector& key_columns, size_t pos, + bool null_first = true); + // used for unique-key with merge on write void _encode_seq_column(const vectorized::IOlapColumnDataAccessor* seq_column, size_t pos, string* encoded_keys); + void _encode_rowid(const uint32_t rowid, string* encoded_keys); void set_min_max_key(const Slice& key); void set_min_key(const Slice& key); void set_max_key(const Slice& key); @@ -181,8 +189,12 @@ class SegmentWriter { std::unique_ptr _olap_data_convertor; // used for building short key index or primary key index during vectorized write. + // for mow table with cluster keys, this is cluster keys std::vector _key_coders; + // for mow table with cluster keys, this is primary keys + std::vector _primary_key_coders; const KeyCoder* _seq_coder = nullptr; + const KeyCoder* _rowid_coder = nullptr; std::vector _key_index_size; size_t _short_key_row_pos = 0; diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index b9818589650181..34a867ce7c7e42 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2766,7 +2766,12 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, .length() + 1; } - Slice key_without_seq = Slice(encoded_key.get_data(), encoded_key.get_size() - seq_col_length); + size_t rowid_length = 0; + if (!_schema->cluster_key_idxes().empty()) { + rowid_length = sizeof(uint32_t) + 1; + } + Slice key_without_seq = + Slice(encoded_key.get_data(), encoded_key.get_size() - seq_col_length - rowid_length); RowLocation loc; for (size_t i = 0; i < specified_rowsets.size(); i++) { @@ -2776,9 +2781,12 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, DCHECK_EQ(segments_key_bounds.size(), num_segments); std::vector picked_segments; for (int i = num_segments - 1; i >= 0; i--) { - if (key_without_seq.compare(segments_key_bounds[i].max_key()) > 0 || - key_without_seq.compare(segments_key_bounds[i].min_key()) < 0) { - continue; + if (rowid_length > 0) { + // TODO min max key is sort key, not primary key + if (key_without_seq.compare(segments_key_bounds[i].max_key()) > 0 || + key_without_seq.compare(segments_key_bounds[i].min_key()) < 0) { + continue; + } } picked_segments.emplace_back(i); } @@ -2940,6 +2948,23 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, for (size_t i = 0; i < num_read; i++, row_id++) { Slice key = Slice(index_column->get_data_at(i).data, index_column->get_data_at(i).size); RowLocation loc; + // calculate row id + if (!_schema->cluster_key_idxes().empty()) { + size_t seq_col_length = 0; + if (_schema->has_sequence_col()) { + seq_col_length = _schema->column(_schema->sequence_col_idx()).length() + 1; + } + size_t rowid_length = sizeof(uint32_t) + 1; + Slice key_without_seq = + Slice(key.get_data(), key.get_size() - seq_col_length - rowid_length); + Slice rowid_slice = + Slice(key.get_data() + key_without_seq.get_size() + seq_col_length + 1, + rowid_length - 1); + // decode rowid + const auto* type_info = get_scalar_type_info(); + auto rowid_coder = get_key_coder(type_info->type()); + rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&row_id); + } // same row in segments should be filtered if (delete_bitmap->contains({rowset_id, seg->id(), DeleteBitmap::TEMP_VERSION_COMMON}, row_id)) { @@ -3008,7 +3033,7 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, } remaining -= num_read; } - DCHECK_EQ(total, row_id) << "segment total rows: " << total << " row_id:" << row_id; + // DCHECK_EQ(total, row_id) << "segment total rows: " << total << " row_id:" << row_id; if (config::enable_merge_on_write_correctness_check) { RowsetIdUnorderedSet rowsetids; @@ -3699,9 +3724,13 @@ Status Tablet::calc_delete_bitmap_between_segments( auto seq_col_idx = _tablet_meta->tablet_schema()->sequence_col_idx(); seq_col_length = _tablet_meta->tablet_schema()->column(seq_col_idx).length(); } + size_t rowid_length = 0; + if (!_schema->cluster_key_idxes().empty()) { + rowid_length = sizeof(uint32_t); + } MergeIndexDeleteBitmapCalculator calculator; - RETURN_IF_ERROR(calculator.init(rowset_id, segments, seq_col_length)); + RETURN_IF_ERROR(calculator.init(rowset_id, segments, seq_col_length, rowid_length)); RETURN_IF_ERROR(calculator.calculate_all(delete_bitmap)); diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp index 76cf14a75ba74d..237a1259cbf0c2 100644 --- a/be/src/olap/tablet_meta.cpp +++ b/be/src/olap/tablet_meta.cpp @@ -168,6 +168,9 @@ TabletMeta::TabletMeta(int64_t table_id, int64_t partition_id, int64_t tablet_id schema->set_sort_type(SortType::LEXICAL); } schema->set_sort_col_num(tablet_schema.sort_col_num); + for (const auto& i : tablet_schema.cluster_key_idxes) { + schema->add_cluster_key_idxes(i); + } tablet_meta_pb.set_in_restore_mode(false); // set column information diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp index d2b16a907a0b3b..af163275b33fc5 100644 --- a/be/src/olap/tablet_schema.cpp +++ b/be/src/olap/tablet_schema.cpp @@ -730,6 +730,10 @@ void TabletSchema::init_from_pb(const TabletSchemaPB& schema) { _indexes.clear(); _field_name_to_index.clear(); _field_id_to_index.clear(); + _cluster_key_idxes.clear(); + for (const auto& i : schema.cluster_key_idxes()) { + _cluster_key_idxes.push_back(i); + } for (auto& column_pb : schema.column()) { TabletColumn column; column.init_from_pb(column_pb); @@ -823,7 +827,10 @@ void TabletSchema::build_current_tablet_schema(int64_t index_id, int32_t version _delete_sign_idx = -1; _sequence_col_idx = -1; _version_col_idx = -1; - + _cluster_key_idxes.clear(); + for (const auto& i : ori_tablet_schema._cluster_key_idxes) { + _cluster_key_idxes.push_back(i); + } for (auto& column : index->columns) { if (column->is_key()) { _num_key_columns++; @@ -892,6 +899,9 @@ bool TabletSchema::is_dropped_column(const TabletColumn& col) const { } void TabletSchema::to_schema_pb(TabletSchemaPB* tablet_schema_pb) const { + for (const auto& i : _cluster_key_idxes) { + tablet_schema_pb->add_cluster_key_idxes(i); + } tablet_schema_pb->set_keys_type(_keys_type); for (auto& col : _cols) { ColumnPB* column = tablet_schema_pb->add_column(); diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h index 2fe6ea45581582..794c9b5b5b62ae 100644 --- a/be/src/olap/tablet_schema.h +++ b/be/src/olap/tablet_schema.h @@ -252,6 +252,7 @@ class TabletSchema { std::vector& mutable_columns(); size_t num_columns() const { return _num_columns; } size_t num_key_columns() const { return _num_key_columns; } + std::vector cluster_key_idxes() const { return _cluster_key_idxes; } size_t num_null_columns() const { return _num_null_columns; } size_t num_short_key_columns() const { return _num_short_key_columns; } size_t num_rows_per_row_block() const { return _num_rows_per_row_block; } @@ -373,6 +374,7 @@ class TabletSchema { size_t _num_columns = 0; size_t _num_variant_columns = 0; size_t _num_key_columns = 0; + std::vector _cluster_key_idxes; size_t _num_null_columns = 0; size_t _num_short_key_columns = 0; size_t _num_rows_per_row_block = 0; diff --git a/be/test/olap/primary_key_index_test.cpp b/be/test/olap/primary_key_index_test.cpp index fb96e7411e678f..6d3b19efb32199 100644 --- a/be/test/olap/primary_key_index_test.cpp +++ b/be/test/olap/primary_key_index_test.cpp @@ -57,7 +57,7 @@ TEST_F(PrimaryKeyIndexTest, builder) { auto fs = io::global_local_filesystem(); EXPECT_TRUE(fs->create_file(filename, &file_writer).ok()); - PrimaryKeyIndexBuilder builder(file_writer.get(), 0); + PrimaryKeyIndexBuilder builder(file_writer.get(), 0, 0); static_cast(builder.init()); size_t num_rows = 0; std::vector keys; diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index ee65d926e85bc2..7aade2756f6948 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -849,6 +849,8 @@ nonterminal DistributionDesc opt_distribution; nonterminal Integer opt_distribution_number; nonterminal Long opt_field_length; nonterminal KeysDesc opt_keys; +nonterminal KeysDesc opt_mv_keys; +nonterminal List opt_cluster_keys; nonterminal Long opt_id; nonterminal PartitionKeyDesc partition_key_desc; @@ -3185,8 +3187,9 @@ opt_keys ::= :} /* unique_keys */ | KW_UNIQUE KW_KEY LPAREN ident_list:keys RPAREN + opt_cluster_keys:cluster_keys {: - RESULT = new KeysDesc(KeysType.UNIQUE_KEYS, keys); + RESULT = new KeysDesc(KeysType.UNIQUE_KEYS, keys, cluster_keys); :} /* agg_keys */ | KW_AGGREGATE KW_KEY LPAREN ident_list:keys RPAREN @@ -3195,6 +3198,17 @@ opt_keys ::= :} ; +opt_cluster_keys ::= + /* Empty */ + {: + RESULT = null; + :} + | KW_CLUSTER KW_BY LPAREN ident_list:keys RPAREN + {: + RESULT = keys; + :} + ; + opt_all_partition_desc_list ::= /* Empty */ {: diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java index 83fdbf792df2ff..9cd1ca44815d08 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -181,6 +181,7 @@ public String getValue() { private DefaultValue defaultValue; private String comment; private boolean visible; + private int clusterKeyId = -1; public ColumnDef(String name, TypeDef typeDef) { this(name, typeDef, false, null, false, false, DefaultValue.NOT_SET, ""); @@ -306,6 +307,10 @@ public boolean isVisible() { return visible; } + public void setClusterKeyId(int clusterKeyId) { + this.clusterKeyId = clusterKeyId; + } + public void analyze(boolean isOlap) throws AnalysisException { if (name == null || typeDef == null) { throw new AnalysisException("No column name or column type in column definition."); @@ -578,7 +583,8 @@ public Column toColumn() { } return new Column(name, type, isKey, aggregateType, isAllowNull, isAutoInc, defaultValue.value, comment, - visible, defaultValue.defaultValueExprDef, Column.COLUMN_UNIQUE_ID_INIT_VALUE, defaultValue.getValue()); + visible, defaultValue.defaultValueExprDef, Column.COLUMN_UNIQUE_ID_INIT_VALUE, defaultValue.getValue(), + clusterKeyId); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java index aecee1465d56ce..97cac555742892 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java @@ -450,6 +450,10 @@ public void analyze(Analyzer analyzer) throws UserException, AnalysisException { } keysDesc.analyze(columnDefs); + if (!CollectionUtils.isEmpty(keysDesc.getClusterKeysColumnNames()) && !enableUniqueKeyMergeOnWrite) { + throw new AnalysisException("Cluster keys only support unique keys table which enabled " + + PropertyAnalyzer.ENABLE_UNIQUE_KEY_MERGE_ON_WRITE); + } for (int i = 0; i < keysDesc.keysColumnSize(); ++i) { columnDefs.get(i).setIsKey(true); } 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 6f2eb96a7d55bf..a3ed083ebdf746 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 @@ -32,6 +32,8 @@ public class KeysDesc implements Writable { private KeysType type; private List keysColumnNames; + private List clusterKeysColumnNames; + private List clusterKeysColumnIds = null; public KeysDesc() { this.type = KeysType.AGG_KEYS; @@ -43,6 +45,11 @@ public KeysDesc(KeysType type, List keysColumnNames) { this.keysColumnNames = keysColumnNames; } + public KeysDesc(KeysType type, List keysColumnNames, List clusterKeyColumnNames) { + this(type, keysColumnNames); + this.clusterKeysColumnNames = clusterKeyColumnNames; + } + public KeysType getKeysType() { return type; } @@ -51,6 +58,14 @@ public int keysColumnSize() { return keysColumnNames.size(); } + public List getClusterKeysColumnNames() { + return clusterKeysColumnNames; + } + + public List getClusterKeysColumnIds() { + return clusterKeysColumnIds; + } + public boolean containsCol(String colName) { return keysColumnNames.contains(colName); } @@ -68,6 +83,14 @@ public void analyze(List cols) throws AnalysisException { throw new AnalysisException("The number of key columns should be less than the number of columns."); } + if (clusterKeysColumnNames != null) { + if (type != KeysType.UNIQUE_KEYS) { + throw new AnalysisException("Cluster keys only support unique keys table."); + } + clusterKeysColumnIds = Lists.newArrayList(); + analyzeClusterKeys(cols); + } + for (int i = 0; i < keysColumnNames.size(); ++i) { String name = cols.get(i).getName(); if (!keysColumnNames.get(i).equalsIgnoreCase(name)) { @@ -100,6 +123,44 @@ public void analyze(List cols) throws AnalysisException { } } } + + if (clusterKeysColumnNames != null) { + int minKeySize = keysColumnNames.size() < clusterKeysColumnNames.size() ? keysColumnNames.size() + : clusterKeysColumnNames.size(); + boolean sameKey = true; + for (int i = 0; i < minKeySize; ++i) { + if (!keysColumnNames.get(i).equalsIgnoreCase(clusterKeysColumnNames.get(i))) { + sameKey = false; + break; + } + } + if (sameKey) { + throw new AnalysisException("Unique keys and cluster keys should be different."); + } + } + } + + private void analyzeClusterKeys(List cols) throws AnalysisException { + for (int i = 0; i < clusterKeysColumnNames.size(); ++i) { + String name = clusterKeysColumnNames.get(i); + // check if key is duplicate + for (int j = 0; j < i; j++) { + if (clusterKeysColumnNames.get(j).equalsIgnoreCase(name)) { + throw new AnalysisException("Duplicate cluster key column[" + name + "]."); + } + } + // check if key exists and generate key column ids + for (int j = 0; j < cols.size(); j++) { + if (cols.get(j).getName().equalsIgnoreCase(name)) { + cols.get(j).setClusterKeyId(clusterKeysColumnIds.size()); + clusterKeysColumnIds.add(j); + break; + } + if (j == cols.size() - 1) { + throw new AnalysisException("Key cluster column[" + name + "] doesn't exist."); + } + } + } } public String toSql() { @@ -114,6 +175,18 @@ public String toSql() { i++; } stringBuilder.append(")"); + if (clusterKeysColumnNames != null) { + stringBuilder.append("\nCLUSTER BY ("); + i = 0; + for (String columnName : clusterKeysColumnNames) { + if (i != 0) { + stringBuilder.append(", "); + } + stringBuilder.append("`").append(columnName).append("`"); + i++; + } + stringBuilder.append(")"); + } return stringBuilder.toString(); } @@ -132,6 +205,14 @@ public void write(DataOutput out) throws IOException { for (String colName : keysColumnNames) { Text.writeString(out, colName); } + if (clusterKeysColumnNames == null) { + out.writeInt(0); + } else { + out.writeInt(clusterKeysColumnNames.size()); + for (String colName : clusterKeysColumnNames) { + Text.writeString(out, colName); + } + } } public void readFields(DataInput in) throws IOException { @@ -141,5 +222,12 @@ public void readFields(DataInput in) throws IOException { for (int i = 0; i < count; i++) { keysColumnNames.add(Text.readString(in)); } + count = in.readInt(); + if (count > 0) { + clusterKeysColumnNames = Lists.newArrayList(); + for (int i = 0; i < count; i++) { + clusterKeysColumnNames.add(Text.readString(in)); + } + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java index 81c1edc2e2505c..591b67d625c746 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java @@ -128,6 +128,9 @@ public class Column implements Writable, GsonPostProcessable { @SerializedName(value = "genericAggregationName") private String genericAggregationName; + @SerializedName(value = "clusterKeyId") + private int clusterKeyId = -1; + private boolean isCompoundKey = false; @SerializedName(value = "hasOnUpdateDefaultValue") @@ -242,6 +245,14 @@ public Column(String name, Type type, boolean isKey, AggregateType aggregateType } } + public Column(String name, Type type, boolean isKey, AggregateType aggregateType, boolean isAllowNull, + boolean isAutoInc, String defaultValue, String comment, boolean visible, + DefaultValueExprDef defaultValueExprDef, int colUniqueId, String realDefaultValue, int clusterKeyId) { + this(name, type, isKey, aggregateType, isAllowNull, isAutoInc, defaultValue, comment, visible, + defaultValueExprDef, colUniqueId, realDefaultValue); + this.clusterKeyId = clusterKeyId; + } + public Column(Column column) { this.name = column.getName(); this.type = column.type; @@ -263,6 +274,7 @@ public Column(Column column) { this.defineName = column.getDefineName(); this.hasOnUpdateDefaultValue = column.hasOnUpdateDefaultValue; this.onUpdateDefaultValueExprDef = column.onUpdateDefaultValueExprDef; + this.clusterKeyId = column.getClusterKeyId(); } public void createChildrenColumn(Type type, Column column) { @@ -551,6 +563,7 @@ public TColumn toThrift() { tColumn.addToChildrenColumn(column.toThrift()); } } + tColumn.setClusterKeyId(this.clusterKeyId); // ATTN: // Currently, this `toThrift()` method is only used from CreateReplicaTask. // And CreateReplicaTask does not need `defineExpr` field. @@ -580,6 +593,7 @@ private void setChildrenTColumn(Column children, TColumn tColumn) { if (tColumn.getAggregationType() != null) { childrenTColumn.setAggregationType(tColumn.getAggregationType()); } + childrenTColumn.setClusterKeyId(children.clusterKeyId); tColumn.children_column.add(childrenTColumn); toChildrenThrift(children, childrenTColumn); @@ -660,6 +674,7 @@ public void checkSchemaChangeAllowed(Column other) throws DdlException { && (other.getDataType() == PrimitiveType.VARCHAR || other.getDataType() == PrimitiveType.STRING)) { return; } + // TODO check cluster key } public boolean nameEquals(String otherColName, boolean ignorePrefix) { @@ -718,6 +733,14 @@ public List getRefColumns() { } } + public boolean isClusterKey() { + return clusterKeyId != -1; + } + + public int getClusterKeyId() { + return clusterKeyId; + } + public String toSql() { return toSql(false, false); } @@ -811,7 +834,7 @@ public String toString() { public int hashCode() { return Objects.hash(name, getDataType(), getStrLen(), getPrecision(), getScale(), aggregationType, isAggregationTypeImplicit, isKey, isAllowNull, isAutoInc, defaultValue, comment, children, visible, - realDefaultValue); + realDefaultValue, clusterKeyId); } @Override @@ -839,7 +862,8 @@ && getScale() == other.getScale() && Objects.equals(comment, other.comment) && visible == other.visible && Objects.equals(children, other.children) - && Objects.equals(realDefaultValue, other.realDefaultValue); + && Objects.equals(realDefaultValue, other.realDefaultValue) + && clusterKeyId == other.clusterKeyId; } // distribution column compare only care about attrs which affect data, @@ -861,20 +885,22 @@ && getPrecision() == other.getPrecision() && getScale() == other.getScale() && visible == other.visible && Objects.equals(children, other.children) - && Objects.equals(realDefaultValue, other.realDefaultValue); + && Objects.equals(realDefaultValue, other.realDefaultValue) + && clusterKeyId == other.clusterKeyId; if (!ok) { LOG.info("this column: name {} default value {} aggregationType {} isAggregationTypeImplicit {} " - + "isKey {}, isAllowNull {}, datatype {}, strlen {}, precision {}, scale {}, visible {} " - + "children {} realDefaultValue {}", - name, getDefaultValue(), aggregationType, isAggregationTypeImplicit, isKey, isAllowNull, - getDataType(), getStrLen(), getPrecision(), getScale(), visible, children, realDefaultValue); + + "isKey {}, isAllowNull {}, datatype {}, strlen {}, precision {}, scale {}, visible {} " + + "children {}, realDefaultValue {}, clusterKeyId {}", + name, getDefaultValue(), aggregationType, isAggregationTypeImplicit, isKey, isAllowNull, + getDataType(), getStrLen(), getPrecision(), getScale(), visible, children, realDefaultValue, + clusterKeyId); LOG.info("other column: name {} default value {} aggregationType {} isAggregationTypeImplicit {} " - + "isKey {}, isAllowNull {}, datatype {}, strlen {}, precision {}, scale {}, visible {} " - + "children {} realDefaultValue {}", - other.name, other.getDefaultValue(), other.aggregationType, other.isAggregationTypeImplicit, - other.isKey, other.isAllowNull, other.getDataType(), other.getStrLen(), other.getPrecision(), - other.getScale(), other.visible, other.children, other.realDefaultValue); + + "isKey {}, isAllowNull {}, datatype {}, strlen {}, precision {}, scale {}, visible {}, " + + "children {}, realDefaultValue {}, clusterKeyId {}", + other.name, other.getDefaultValue(), other.aggregationType, other.isAggregationTypeImplicit, + other.isKey, other.isAllowNull, other.getDataType(), other.getStrLen(), other.getPrecision(), + other.getScale(), other.visible, other.children, other.realDefaultValue, other.clusterKeyId); } return ok; } @@ -943,6 +969,7 @@ public String getSignatureString(Map typeStringMap) { sb.append(isKey); sb.append(isAllowNull); sb.append(aggregationType); + sb.append(clusterKeyId); sb.append(defaultValue == null ? "" : defaultValue); return sb.toString(); } 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 78f83bb7c5d15c..01da64adbcfbe1 100755 --- 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 @@ -286,6 +286,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; @@ -3006,12 +3007,21 @@ public static void getDdlStmt(DdlStmt ddlStmt, String dbName, TableIf table, Lis : keySql.substring("DUPLICATE ".length())) .append("("); List keysColumnNames = Lists.newArrayList(); + Map clusterKeysColumnNamesToId = new TreeMap<>(); for (Column column : olapTable.getBaseSchema()) { if (column.isKey()) { keysColumnNames.add("`" + column.getName() + "`"); } + if (column.isClusterKey()) { + clusterKeysColumnNamesToId.put(column.getClusterKeyId(), column.getName()); + } } sb.append(Joiner.on(", ").join(keysColumnNames)).append(")"); + // show cluster keys + if (!clusterKeysColumnNamesToId.isEmpty()) { + sb.append("\n").append("CLUSTER BY (`"); + sb.append(Joiner.on("`, `").join(clusterKeysColumnNamesToId.values())).append("`)"); + } } if (specificVersion != -1) { @@ -3936,15 +3946,22 @@ public void setHaProtocol(HAProtocol protocol) { public static short calcShortKeyColumnCount(List columns, Map properties, boolean isKeysRequired) throws DdlException { List indexColumns = new ArrayList(); + Map clusterColumns = new TreeMap<>(); for (Column column : columns) { if (column.isKey()) { indexColumns.add(column); } + if (column.isClusterKey()) { + clusterColumns.put(column.getClusterKeyId(), column); + } } - LOG.debug("index column size: {}", indexColumns.size()); + LOG.debug("index column size: {}, cluster column size: {}", indexColumns.size(), clusterColumns.size()); if (isKeysRequired) { Preconditions.checkArgument(indexColumns.size() > 0); } + // sort by cluster keys for mow if set, otherwise by index columns + List sortKeyColumns = clusterColumns.isEmpty() ? indexColumns + : clusterColumns.values().stream().collect(Collectors.toList()); // figure out shortKeyColumnCount short shortKeyColumnCount = (short) -1; @@ -3959,12 +3976,12 @@ public static short calcShortKeyColumnCount(List columns, Map indexColumns.size()) { - throw new DdlException("Short key is too large. should less than: " + indexColumns.size()); + if (shortKeyColumnCount > sortKeyColumns.size()) { + throw new DdlException("Short key is too large. should less than: " + sortKeyColumns.size()); } for (int pos = 0; pos < shortKeyColumnCount; pos++) { - if (indexColumns.get(pos).getDataType() == PrimitiveType.VARCHAR && pos != shortKeyColumnCount - 1) { + if (sortKeyColumns.get(pos).getDataType() == PrimitiveType.VARCHAR && pos != shortKeyColumnCount - 1) { throw new DdlException("Varchar should not in the middle of short keys."); } } @@ -3979,9 +3996,9 @@ public static short calcShortKeyColumnCount(List columns, Map FeConstants.shortkey_maxsize_bytes) { if (column.getDataType().isCharFamily()) { @@ -4004,6 +4021,18 @@ public static short calcShortKeyColumnCount(List columns, Map 0 && shortKeyColumnCount < clusterColumns.size()) { + boolean sameKey = true; + for (int i = 0; i < shortKeyColumnCount; i++) { + if (!clusterColumns.get(i).getName().equals(indexColumns.get(i).getName())) { + sameKey = false; + break; + } + } + if (sameKey) { + throw new DdlException(shortKeyColumnCount + " short keys is a part of unique keys"); + } + } return shortKeyColumnCount; } 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 a8f548185c979e..9dee2e0cdef6b3 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 @@ -187,6 +187,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -1550,7 +1551,8 @@ public void addPartition(Database db, String tableName, AddPartitionClause addPa olapTable.getTimeSeriesCompactionFileCountThreshold(), olapTable.getTimeSeriesCompactionTimeThresholdSeconds(), olapTable.storeRowColumn(), - binlogConfig, dataProperty.isStorageMediumSpecified()); + binlogConfig, dataProperty.isStorageMediumSpecified(), null); + // TODO cluster key ids // check again olapTable = db.getOlapTableOrDdlException(tableName); @@ -1803,7 +1805,7 @@ private Partition createPartitionWithIndices(String clusterName, long dbId, long String compactionPolicy, Long timeSeriesCompactionGoalSizeMbytes, Long timeSeriesCompactionFileCountThreshold, Long timeSeriesCompactionTimeThresholdSeconds, boolean storeRowColumn, BinlogConfig binlogConfig, - boolean isStorageMediumSpecified) throws DdlException { + boolean isStorageMediumSpecified, List clusterKeyIndexes) throws DdlException { // create base index first. Preconditions.checkArgument(baseIndexId != -1); MaterializedIndex baseIndex = new MaterializedIndex(baseIndexId, IndexState.NORMAL); @@ -1871,6 +1873,7 @@ private Partition createPartitionWithIndices(String clusterName, long dbId, long storeRowColumn, binlogConfig); task.setStorageFormat(storageFormat); + task.setClusterKeyIndexes(clusterKeyIndexes); batchTask.addTask(task); // add to AgentTaskQueue for handling finish report. // not for resending task @@ -2138,8 +2141,10 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep olapTable.setCompressionType(compressionType); // check data sort properties + int keyColumnSize = CollectionUtils.isEmpty(keysDesc.getClusterKeysColumnIds()) ? keysDesc.keysColumnSize() : + keysDesc.getClusterKeysColumnIds().size(); DataSortInfo dataSortInfo = PropertyAnalyzer.analyzeDataSortInfo(properties, keysType, - keysDesc.keysColumnSize(), storageFormat); + keyColumnSize, storageFormat); olapTable.setDataSortInfo(dataSortInfo); boolean enableUniqueKeyMergeOnWrite = false; @@ -2468,7 +2473,8 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep olapTable.getTimeSeriesCompactionFileCountThreshold(), olapTable.getTimeSeriesCompactionTimeThresholdSeconds(), storeRowColumn, binlogConfigForTask, - partitionInfo.getDataProperty(partitionId).isStorageMediumSpecified()); + partitionInfo.getDataProperty(partitionId).isStorageMediumSpecified(), + keysDesc.getClusterKeysColumnIds()); olapTable.addPartition(partition); } else if (partitionInfo.getType() == PartitionType.RANGE || partitionInfo.getType() == PartitionType.LIST) { @@ -2543,7 +2549,7 @@ private void createOlapTable(Database db, CreateTableStmt stmt) throws UserExcep olapTable.getTimeSeriesCompactionFileCountThreshold(), olapTable.getTimeSeriesCompactionTimeThresholdSeconds(), storeRowColumn, binlogConfigForTask, - dataProperty.isStorageMediumSpecified()); + dataProperty.isStorageMediumSpecified(), keysDesc.getClusterKeysColumnIds()); olapTable.addPartition(partition); olapTable.getPartitionInfo().getDataProperty(partition.getId()) .setStoragePolicy(partionStoragePolicy); @@ -2942,6 +2948,14 @@ public void truncateTable(TruncateTableStmt truncateTableStmt) throws DdlExcepti Set tabletIdSet = Sets.newHashSet(); long bufferSize = IdGeneratorUtil.getBufferSizeForTruncateTable(copiedTbl, origPartitions.values()); IdGeneratorBuffer idGeneratorBuffer = Env.getCurrentEnv().getIdGeneratorBuffer(bufferSize); + Map clusterKeyMap = new TreeMap<>(); + for (int i = 0; i < olapTable.getBaseSchema().size(); i++) { + Column column = olapTable.getBaseSchema().get(i); + if (column.getClusterKeyId() != -1) { + clusterKeyMap.put(column.getClusterKeyId(), i); + } + } + List clusterKeyIdxes = clusterKeyMap.values().stream().collect(Collectors.toList()); try { for (Map.Entry entry : origPartitions.entrySet()) { // the new partition must use new id @@ -2967,7 +2981,8 @@ public void truncateTable(TruncateTableStmt truncateTableStmt) throws DdlExcepti olapTable.getTimeSeriesCompactionFileCountThreshold(), olapTable.getTimeSeriesCompactionTimeThresholdSeconds(), olapTable.storeRowColumn(), binlogConfig, - copiedTbl.getPartitionInfo().getDataProperty(oldPartitionId).isStorageMediumSpecified()); + copiedTbl.getPartitionInfo().getDataProperty(oldPartitionId).isStorageMediumSpecified(), + clusterKeyIdxes); newPartitions.add(newPartition); } } catch (DdlException e) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index b488dbe926a1a4..834495744172a0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -202,6 +202,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -2333,9 +2334,22 @@ private boolean checkPushSort(SortNode sortNode, OlapTable olapTable) { if (sortExprs.size() > olapTable.getDataSortInfo().getColNum()) { return false; } + List sortKeyColumns = olapTable.getFullSchema(); + if (olapTable.getEnableUniqueKeyMergeOnWrite()) { + Map clusterKeyMap = new TreeMap<>(); + for (Column column : olapTable.getFullSchema()) { + if (column.getClusterKeyId() != -1) { + clusterKeyMap.put(column.getClusterKeyId(), column); + } + } + if (!clusterKeyMap.isEmpty()) { + sortKeyColumns.clear(); + sortKeyColumns.addAll(clusterKeyMap.values()); + } + } for (int i = 0; i < sortExprs.size(); i++) { // table key. - Column tableKey = olapTable.getFullSchema().get(i); + Column tableKey = sortKeyColumns.get(i); // sort slot. Expr sortExpr = sortExprs.get(i); if (sortExpr instanceof SlotRef) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java index abb6f6e23d1edc..6842e273a6bd8d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/task/CreateReplicaTask.java @@ -114,6 +114,7 @@ public class CreateReplicaTask extends AgentTask { private boolean storeRowColumn; private BinlogConfig binlogConfig; + private List clusterKeyIndexes; public CreateReplicaTask(long backendId, long dbId, long tableId, long partitionId, long indexId, long tabletId, long replicaId, short shortKeyColumnCount, int schemaHash, long version, @@ -220,6 +221,10 @@ public void setStorageFormat(TStorageFormat storageFormat) { this.storageFormat = storageFormat; } + public void setClusterKeyIndexes(List clusterKeyIndexes) { + this.clusterKeyIndexes = clusterKeyIndexes; + } + public TCreateTabletReq toThrift() { TCreateTabletReq createTabletReq = new TCreateTabletReq(); createTabletReq.setTabletId(tabletId); @@ -265,7 +270,10 @@ public TCreateTabletReq toThrift() { tSchema.setDeleteSignIdx(deleteSign); tSchema.setSequenceColIdx(sequenceCol); tSchema.setVersionColIdx(versionCol); - + if (!CollectionUtils.isEmpty(clusterKeyIndexes)) { + tSchema.setClusterKeyIdxes(clusterKeyIndexes); + LOG.debug("cluster key index={}, table_id={}, tablet_id={}", clusterKeyIndexes, tableId, tabletId); + } if (CollectionUtils.isNotEmpty(indexes)) { List tIndexes = new ArrayList<>(); for (Index index : indexes) { diff --git a/gensrc/proto/olap_file.proto b/gensrc/proto/olap_file.proto index 4c49e31a7f47d2..68a792623aec8e 100644 --- a/gensrc/proto/olap_file.proto +++ b/gensrc/proto/olap_file.proto @@ -254,6 +254,7 @@ message TabletSchemaPB { repeated string partial_update_input_columns = 21; // deprecated optional bool enable_single_replica_compaction = 22 [default=false]; optional bool skip_write_index_on_load = 23 [default=false]; + repeated int32 cluster_key_idxes = 24; } enum TabletStatePB { diff --git a/gensrc/thrift/AgentService.thrift b/gensrc/thrift/AgentService.thrift index c161fc99e7139d..79bb014a90189b 100644 --- a/gensrc/thrift/AgentService.thrift +++ b/gensrc/thrift/AgentService.thrift @@ -44,6 +44,7 @@ struct TTabletSchema { 16: optional bool store_row_column = false 17: optional bool enable_single_replica_compaction = false 18: optional bool skip_write_index_on_load = false + 19: optional list cluster_key_idxes } // this enum stands for different storage format in src_backends diff --git a/gensrc/thrift/Descriptors.thrift b/gensrc/thrift/Descriptors.thrift index abaf8f8967daad..7c2f70b19ca8ee 100644 --- a/gensrc/thrift/Descriptors.thrift +++ b/gensrc/thrift/Descriptors.thrift @@ -41,6 +41,7 @@ struct TColumn { 16: optional string aggregation 17: optional bool result_is_nullable 18: optional bool is_auto_increment = false; + 19: optional i32 cluster_key_id = -1 } struct TSlotDescriptor { diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv b/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv new file mode 100644 index 00000000000000..693c484172459c --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv @@ -0,0 +1,10 @@ +1,"kevin",18,"shenzhen",4000 +10,"alex",28,"shenzhen",1111 +2,"bob",20,"beijing",5000 +20,"leo",30,"beijing",2222 +30,"sam",32,"shanghai",3333 +3,"alice",22,"shanghai",6000 +4,"jack",24,"hangzhou",7000 +40,"Ruth",34,"hangzhou",4444 +5,"tom",26,"guanzhou",8000 +50,"cynthia",36,"guanzhou",8000 \ No newline at end of file diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.out new file mode 100644 index 00000000000000..687aeab54a1009 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.out @@ -0,0 +1,54 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 1 1 1 1 +2 2 2 2 2 +3 3 3 3 3 +4 4 4 4 4 +5 5 5 5 5 + +-- !after_delete -- +2 2 2 2 2 +4 4 4 4 4 + +-- !1 -- +1 1 1 1 1 0 +1 1 1 1 1 1 +2 2 2 2 2 0 +3 3 3 3 3 0 +3 3 3 3 3 1 +4 4 4 4 4 0 +5 5 5 5 5 0 +5 5 5 5 5 1 + +-- !2 -- +2 2 2 2 2 0 +4 4 4 4 4 0 + +-- !sql -- +1 1 1 1 1 +2 2 2 2 2 +3 3 3 3 3 +4 4 4 4 4 +5 5 5 5 5 + +-- !after_delete -- +2 2 2 2 2 +4 4 4 4 4 + +-- !1 -- +1 1 1 1 1 0 +1 1 1 1 1 1 +2 2 2 2 2 0 +3 3 3 3 3 0 +3 3 3 3 3 1 +4 4 4 4 4 0 +5 5 5 5 5 0 +5 5 5 5 5 1 + +-- !2 -- +1 1 1 1 1 1 +2 2 2 2 2 0 +3 3 3 3 3 1 +4 4 4 4 4 0 +5 5 5 5 5 1 + diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out new file mode 100644 index 00000000000000..5c72f099d99f41 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out @@ -0,0 +1,20 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !origin_data -- +1 kevin 18 shenzhen 400 +2 bob 20 beijing 500 +3 alice 22 shanghai 600 +4 jack 24 hangzhou 700 +5 tom 26 guanzhou 800 + +-- !after_ignore_mode_stream_load -- +1 kevin 18 shenzhen 400 +2 bob 20 beijing 500 +3 alice 22 shanghai 600 +4 jack 24 hangzhou 700 +5 tom 26 guanzhou 800 +10 "alex" 28 "shenzhen" 1111 +20 "leo" 30 "beijing" 2222 +30 "sam" 32 "shanghai" 3333 +40 "Ruth" 34 "hangzhou" 4444 +50 "cynthia" 36 "guanzhou" 8000 + diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.out new file mode 100644 index 00000000000000..2c14cb05ec6031 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.out @@ -0,0 +1,14 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +a abc address2 2022-10-20 +aa1234 abc address4 2022-12-11 +aa1235 abc address6 \N +ab abc address6 2022-11-20 + +-- !sql -- +a abc address2 100 +aa1234 abc address4 -1 +aa1235 abc address6 -1 +aa1236 abc address6 0 +ab abc address6 110 + diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.out new file mode 100644 index 00000000000000..65b68e41521e10 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.out @@ -0,0 +1,25 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 Customer#000000001 j5JsirBM9P MOROCCO 0 MOROCCO AFRICA 25-989-741-2988 BUILDING +2 Customer#000000002 487LW1dovn6Q4dMVym JORDAN 1 JORDAN MIDDLE EAST 23-768-687-3665 AUTOMOBILE +3 Customer#000000003 fkRGN8n ARGENTINA7 ARGENTINA AMERICA 11-719-748-3364 AUTOMOBILE +4 Customer#000000004 4u58h f EGYPT 4 EGYPT MIDDLE EAST 14-128-190-5944 MACHINERY +5 Customer#000000005 hwBtxkoBF qSW4KrI CANADA 5 CANADA AMERICA 13-750-942-6364 HOUSEHOLD + +-- !sql -- +2996 Customer#000002996 PFd,H,pC PERU 1 PERU AMERICA 27-412-836-3763 FURNITURE +2997 Customer#000002997 LiVKxN3lQHLunID ALGERIA 0 ALGERIA AFRICA 10-600-583-9608 FURNITURE +2998 Customer#000002998 waJRUwjblh3sJbglX9gS9w PERU 7 PERU AMERICA 27-747-219-4938 AUTOMOBILE +2999 Customer#000002999 HaPy4sQ MiANd0pR5uA7 VIETNAM 5 VIETNAM ASIA 31-297-683-9811 MACHINERY +3000 Customer#000003000 ,5Yw1O EGYPT 4 EGYPT MIDDLE EAST 14-645-615-5901 FURNITURE + +-- !sql -- +1 Customer#000000001 j5JsirBM9P MOROCCO 0 MOROCCO AFRICA 25-989-741-2988 BUILDING + +-- !sql -- +3000 Customer#000003000 ,5Yw1O EGYPT 4 EGYPT MIDDLE EAST 14-645-615-5901 FURNITURE + +-- !sql -- + +-- !sql -- + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.out new file mode 100644 index 00000000000000..92604403fd0fc4 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.1 -- +\N + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.out new file mode 100644 index 00000000000000..22731ac444a62c --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.2 -- +\N + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.out new file mode 100644 index 00000000000000..71908d1f123bce --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.3 -- +\N + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.out new file mode 100644 index 00000000000000..9d56f6e633e060 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.out @@ -0,0 +1,43 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.1 -- +29165996 1992 MFGR#121 +23120066 1992 MFGR#1210 +52982362 1992 MFGR#1211 +30954680 1992 MFGR#1212 +15288453 1992 MFGR#1213 +7655070 1992 MFGR#1214 +22246540 1992 MFGR#1215 +19716439 1992 MFGR#1216 +43666251 1992 MFGR#1217 +22759602 1992 MFGR#1218 +23318799 1992 MFGR#1219 +74056106 1992 MFGR#122 +51050565 1992 MFGR#1220 +38878674 1992 MFGR#1221 +16558051 1992 MFGR#1222 +26690787 1992 MFGR#1223 +76498594 1992 MFGR#1224 +32608903 1992 MFGR#1225 +47636685 1992 MFGR#1226 +27691433 1992 MFGR#1227 +32513490 1992 MFGR#1228 +35514258 1992 MFGR#1229 +17199862 1992 MFGR#123 +24678908 1992 MFGR#1230 +26231337 1992 MFGR#1231 +36330900 1992 MFGR#1232 +24946678 1992 MFGR#1233 +36431683 1992 MFGR#1234 +39368479 1992 MFGR#1235 +44456974 1992 MFGR#1236 +31443810 1992 MFGR#1237 +49003021 1992 MFGR#1238 +31379822 1992 MFGR#1239 +24245603 1992 MFGR#124 +49870826 1992 MFGR#1240 +28194770 1992 MFGR#125 +40503844 1992 MFGR#126 +36027836 1992 MFGR#127 +35881895 1992 MFGR#128 +21732451 1992 MFGR#129 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.out new file mode 100644 index 00000000000000..debe1950128d6b --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.out @@ -0,0 +1,11 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.2 -- +28235270 1992 MFGR#2221 +64071827 1992 MFGR#2222 +48591160 1992 MFGR#2223 +20416501 1992 MFGR#2224 +74950776 1992 MFGR#2225 +60628045 1992 MFGR#2226 +39273349 1992 MFGR#2227 +66658087 1992 MFGR#2228 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.out new file mode 100644 index 00000000000000..40b32204064851 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.3 -- +89380397 1992 MFGR#2239 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.out new file mode 100644 index 00000000000000..a50f6a20d54f0f --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.out @@ -0,0 +1,28 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.1 -- +JAPAN CHINA 1992 637991852 +VIETNAM CHINA 1992 621845377 +INDONESIA CHINA 1992 621316255 +CHINA CHINA 1992 614550901 +INDIA CHINA 1992 561966207 +INDIA INDONESIA 1992 487449629 +INDONESIA INDONESIA 1992 477417717 +JAPAN INDONESIA 1992 476513261 +JAPAN VIETNAM 1992 468999429 +INDONESIA JAPAN 1992 465870469 +VIETNAM INDONESIA 1992 462424521 +INDIA JAPAN 1992 412186106 +JAPAN JAPAN 1992 399179790 +VIETNAM JAPAN 1992 395247587 +JAPAN INDIA 1992 393835589 +CHINA INDONESIA 1992 352903905 +CHINA INDIA 1992 348359904 +VIETNAM VIETNAM 1992 342176333 +INDIA VIETNAM 1992 334582962 +INDIA INDIA 1992 329354089 +CHINA JAPAN 1992 327558220 +CHINA VIETNAM 1992 324763767 +INDONESIA INDIA 1992 310417666 +VIETNAM INDIA 1992 296225919 +INDONESIA VIETNAM 1992 278083418 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.out new file mode 100644 index 00000000000000..1109fa3ce80b5c --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.out @@ -0,0 +1,51 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.2 -- +UNITED ST4 UNITED ST0 1992 34626982 +UNITED ST4 UNITED ST3 1992 29767238 +UNITED ST1 UNITED ST9 1992 25644597 +UNITED ST2 UNITED ST0 1992 23943154 +UNITED ST4 UNITED ST9 1992 21189183 +UNITED ST0 UNITED ST0 1992 18293852 +UNITED ST7 UNITED ST3 1992 17996772 +UNITED ST9 UNITED ST3 1992 17863433 +UNITED ST1 UNITED ST7 1992 17410800 +UNITED ST2 UNITED ST3 1992 15331073 +UNITED ST5 UNITED ST9 1992 14448179 +UNITED ST1 UNITED ST3 1992 13938002 +UNITED ST5 UNITED ST6 1992 12398029 +UNITED ST9 UNITED ST2 1992 12370917 +UNITED ST2 UNITED ST9 1992 12343455 +UNITED ST5 UNITED ST0 1992 12301234 +UNITED ST6 UNITED ST0 1992 11900889 +UNITED ST4 UNITED ST2 1992 11696334 +UNITED ST4 UNITED ST6 1992 11369008 +UNITED ST1 UNITED ST6 1992 11000283 +UNITED ST1 UNITED ST0 1992 10878084 +UNITED ST4 UNITED ST7 1992 10151573 +UNITED ST5 UNITED ST2 1992 9917834 +UNITED ST7 UNITED ST7 1992 9715656 +UNITED ST6 UNITED ST6 1992 8685228 +UNITED ST2 UNITED ST2 1992 8313714 +UNITED ST1 UNITED ST2 1992 8004700 +UNITED ST2 UNITED ST7 1992 7759164 +UNITED ST0 UNITED ST7 1992 7137641 +UNITED ST9 UNITED ST7 1992 6703890 +UNITED ST6 UNITED ST9 1992 6597261 +UNITED ST7 UNITED ST2 1992 6125476 +UNITED ST7 UNITED ST6 1992 6058017 +UNITED ST5 UNITED ST3 1992 5862031 +UNITED ST8 UNITED ST9 1992 5690491 +UNITED ST7 UNITED ST9 1992 5403152 +UNITED ST9 UNITED ST0 1992 4816370 +UNITED ST9 UNITED ST9 1992 4234523 +UNITED ST3 UNITED ST3 1992 4080199 +UNITED ST5 UNITED ST7 1992 3936271 +UNITED ST8 UNITED ST0 1992 3574169 +UNITED ST0 UNITED ST3 1992 3201624 +UNITED ST3 UNITED ST9 1992 2614811 +UNITED ST8 UNITED ST7 1992 2373825 +UNITED ST9 UNITED ST6 1992 2066609 +UNITED ST7 UNITED ST0 1992 1882015 +UNITED ST6 UNITED ST3 1992 1873819 +UNITED ST6 UNITED ST2 1992 291566 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.out new file mode 100644 index 00000000000000..6f33841912aace --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.3 -- +UNITED KI5 UNITED KI1 1992 4397192 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.out new file mode 100644 index 00000000000000..3738fc2859a8a4 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.4 -- + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.out new file mode 100644 index 00000000000000..00bc9ddd7ce760 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.out @@ -0,0 +1,8 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.1 -- +1992 ARGENTINA 533196600 +1992 BRAZIL 684224630 +1992 CANADA 532686194 +1992 PERU 586223155 +1992 UNITED STATES 682387184 + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.out new file mode 100644 index 00000000000000..30fae3d4bf6d8d --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.2 -- + diff --git a/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.out b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.out new file mode 100644 index 00000000000000..741016a89d2750 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.3 -- + diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_create_table.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_create_table.groovy new file mode 100644 index 00000000000000..91c2bc6ba6e3f9 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_create_table.groovy @@ -0,0 +1,202 @@ +// 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_create_table") { + def tableName = "cluster_key_test_create_table" + sql """ DROP TABLE IF EXISTS ${tableName} """ + onFinish { + try_sql("DROP TABLE IF EXISTS ${tableName}") + } + + // duplicate table with cluster keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + DUPLICATE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_address`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ); + """ + exception "Syntax error" + } + + // mor unique table with cluster keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_address`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ); + """ + exception "Cluster keys only support unique keys table which enabled enable_unique_key_merge_on_write" + } + + // mor unique table with cluster keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_address`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "false" + ); + """ + exception "Cluster keys only support unique keys table which enabled enable_unique_key_merge_on_write" + } + + // mow unique table with invalid cluster keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_addresses`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + exception "Key cluster column[c_addresses] doesn't exist" + } + + // mow unique table with duplicate cluster keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_address`, `c_name`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + exception "Duplicate cluster key column[c_name]" + } + + // mow unique table with same cluster and unique keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_custkey`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + exception "Unique keys and cluster keys should be different" + } + + // mow unique table with short key is part of unique keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_age` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`, `c_age`, `c_name`) + CLUSTER BY (`c_custkey`, `c_age`, `c_address`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true", + "short_key" = "2" + ); + """ + exception "2 short keys is a part of unique keys" + } + + // mow unique table with short key is part of unique keys + test { + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_age` int(11) NOT NULL COMMENT "", + `c_name` varchar(100) NOT NULL COMMENT "", + `c_address` varchar(100) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`, `c_age`, `c_name`, `c_address`) + CLUSTER BY (`c_custkey`, `c_age`, `c_name`, `c_city`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + exception "3 short keys is a part of unique keys" + } + + // success to create mow unique table with cluster keys + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_name`, `c_city`, `c_address`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy new file mode 100644 index 00000000000000..3b0fbba783ff0b --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy @@ -0,0 +1,98 @@ +// 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_delete_sign_delete_bitmap') { + + def tableName1 = "test_delete_sign_delete_bitmap1" + sql "DROP TABLE IF EXISTS ${tableName1};" + sql """ CREATE TABLE IF NOT EXISTS ${tableName1} ( + `k1` int NOT NULL, + `c1` int, + `c2` int, + `c3` int, + `c4` int + )UNIQUE KEY(k1) + CLUSTER BY(c1, c2) + DISTRIBUTED BY HASH(k1) BUCKETS 1 + PROPERTIES ( + "enable_unique_key_merge_on_write" = "true", + "disable_auto_compaction" = "true", + "replication_num" = "1" + );""" + + sql "insert into ${tableName1} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" + qt_sql "select * from ${tableName1} order by k1,c1,c2,c3,c4;" + // sql "insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) select k1,c1,c2,c3,c4,1 from ${tableName1} where k1 in (1,3,5);" + sql """insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" + sql "sync" + qt_after_delete "select * from ${tableName1} order by k1,c1,c2,c3,c4;" + sql "set skip_delete_sign=true;" + sql "set skip_storage_engine_merge=true;" + sql "set skip_delete_bitmap=true;" + sql "sync" + // skip_delete_bitmap=true, skip_delete_sign=true + qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" + + sql "set skip_delete_sign=true;" + sql "set skip_delete_bitmap=false;" + sql "sync" + // skip_delete_bitmap=false, skip_delete_sign=true + qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" + sql "drop table if exists ${tableName1};" + + + sql "set skip_delete_sign=false;" + sql "set skip_storage_engine_merge=false;" + sql "set skip_delete_bitmap=false;" + sql "sync" + def tableName2 = "test_delete_sign_delete_bitmap2" + sql "DROP TABLE IF EXISTS ${tableName2};" + sql """ CREATE TABLE IF NOT EXISTS ${tableName2} ( + `k1` int NOT NULL, + `c1` int, + `c2` int, + `c3` int, + `c4` int + )UNIQUE KEY(k1) + CLUSTER BY(c4, c3) + DISTRIBUTED BY HASH(k1) BUCKETS 1 + PROPERTIES ( + "enable_unique_key_merge_on_write" = "true", + "disable_auto_compaction" = "true", + "replication_num" = "1", + "function_column.sequence_col" = 'c4' + );""" + + sql "insert into ${tableName2} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" + qt_sql "select * from ${tableName2} order by k1,c1,c2,c3,c4;" + sql """insert into ${tableName2}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" + sql "sync" + qt_after_delete "select * from ${tableName2} order by k1,c1,c2,c3,c4;" + sql "set skip_delete_sign=true;" + sql "set skip_storage_engine_merge=true;" + sql "set skip_delete_bitmap=true;" + sql "sync" + // skip_delete_bitmap=true, skip_delete_sign=true + qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" + + sql "set skip_delete_sign=true;" + sql "set skip_delete_bitmap=false;" + sql "sync" + // skip_delete_bitmap=false, skip_delete_sign=true + qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" + sql "drop table if exists ${tableName2};" +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy new file mode 100644 index 00000000000000..3e7cafa06ab9ec --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy @@ -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. + +suite("test_mow_table_ignore_mode") { + + def tableName = "test_mow_table_ignore_mode1" + sql """ DROP TABLE IF EXISTS ${tableName} FORCE;""" + sql """ + CREATE TABLE ${tableName} ( + `id` int(11) NULL, + `name` varchar(10) NULL, + `age` int(11) NULL DEFAULT "20", + `city` varchar(10) NOT NULL DEFAULT "beijing", + `balance` decimalv3(9, 0) NULL + ) ENGINE = OLAP UNIQUE KEY(`id`) + CLUSTER BY(`city`, `age`, `name`) + COMMENT 'OLAP' DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "disable_auto_compaction" = "true", + "enable_single_replica_compaction" = "false" + ); + """ + sql """insert into ${tableName} values + (1,"kevin",18,"shenzhen",400), + (2,"bob",20,"beijing",500), + (3,"alice",22,"shanghai",600), + (4,"jack",24,"hangzhou",700), + (5,"tom",26,"guanzhou",800);""" + qt_origin_data "select * from ${tableName} order by id;" + + // some rows are with existing keys, some are not + streamLoad { + table "${tableName}" + + set 'column_separator', ',' + set 'format', 'csv' + set 'columns', 'id,name,age,city,balance' + set 'ignore_mode', 'true' + + file 'ignore_mode.csv' + time 10000 // limit inflight 10s + } + sql "sync" + + qt_after_ignore_mode_stream_load "select * from ${tableName} order by id;" + sql """ DROP TABLE IF EXISTS ${tableName};""" + + + // test illegal case + def tableName2 = "test_mow_table_ignore_mode2" + sql """ DROP TABLE IF EXISTS ${tableName2} FORCE;""" + sql """ + CREATE TABLE ${tableName2} ( + `id` int(11) NULL, + `name` varchar(10) NULL, + `age` int(11) NULL DEFAULT "20", + `city` varchar(10) NOT NULL DEFAULT "beijing", + `balance` decimalv3(9, 0) NULL + ) ENGINE = OLAP UNIQUE KEY(`id`) + CLUSTER BY(`balance`, `name`) + COMMENT 'OLAP' DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "disable_auto_compaction" = "true", + "enable_single_replica_compaction" = "false" + );""" + sql """insert into ${tableName2} values + (1,"kevin",18,"shenzhen",400), + (2,"bob",20,"beijing",500), + (3,"alice",22,"shanghai",600), + (4,"jack",24,"hangzhou",700), + (5,"tom",26,"guanzhou",800);""" + // some rows are with existing keys, some are not + streamLoad { + table "${tableName2}" + + set 'column_separator', ',' + set 'format', 'csv' + set 'columns', 'id,balance' + set 'partial_columns', 'true' + set 'ignore_mode', 'true' + + file 'ignore_mode.csv' + time 10000 // limit inflight 10s + + check {result, exception, startTime, endTime -> + assertTrue(exception == null) + def json = parseJson(result) + assertEquals("Fail", json.Status) + assertTrue(json.Message.contains("ignore mode can't be used in partial update.")) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.groovy new file mode 100644 index 00000000000000..bf3ce215a90540 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_mow_with_null_sequence.groovy @@ -0,0 +1,94 @@ +// 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_mow_with_null_sequence") { + def tableName = "test_null_sequence" + sql """ DROP TABLE IF EXISTS $tableName """ + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` varchar(20) NOT NULL COMMENT "", + `c_name` varchar(20) NOT NULL COMMENT "", + `c_address` varchar(20) NOT NULL COMMENT "", + `c_date` date NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY(`c_name`, `c_date`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 + PROPERTIES ( + "function_column.sequence_col" = 'c_date', + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + + sql """ insert into $tableName values('a', 'abc', 'address1', NULL) """ + sql """ insert into $tableName values('a', 'abc', 'address2', '2022-10-20') """ + sql """ insert into $tableName values('a', 'abc', 'address3', NULL) """ + sql """ insert into $tableName values('ab', 'abc', 'address4', NULL) """ + sql """ insert into $tableName values('ab', 'abc', 'address5', '2022-10-20') """ + sql """ insert into $tableName values('ab', 'abc', 'address6', '2022-11-20') """ + sql """ insert into $tableName values('ab', 'abc', 'address6', '2022-11-15') """ + sql """ insert into $tableName values('aa1234', 'abc', 'address4', '2022-12-11') """ + sql """ insert into $tableName values('aa1234', 'abc', 'address5', NULL) """ + sql """ insert into $tableName values('aa1235', 'abc', 'address6', NULL) """ + + order_qt_sql "select * from $tableName" + + sql """ DROP TABLE IF EXISTS $tableName """ + + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` varchar(20) NOT NULL COMMENT "", + `c_name` varchar(20) NOT NULL COMMENT "", + `c_address` varchar(20) NOT NULL COMMENT "", + `c_int` int NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY(`c_int`, `c_name`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 + PROPERTIES ( + "function_column.sequence_col" = 'c_int', + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + sql """ insert into $tableName values('a', 'abc', 'address1', NULL) """ + sql """ insert into $tableName values('a', 'abc', 'address2', 100) """ + sql """ insert into $tableName values('a', 'abc', 'address3', NULL) """ + + sql """ insert into $tableName values('ab', 'abc', 'address4', NULL) """ + sql """ insert into $tableName values('ab', 'abc', 'address5', -10) """ + sql """ insert into $tableName values('ab', 'abc', 'address6', 110) """ + sql """ insert into $tableName values('ab', 'abc', 'address6', 100) """ + + sql """ insert into $tableName values('aa1234', 'abc', 'address4', -1) """ + sql """ insert into $tableName values('aa1234', 'abc', 'address5', NULL) """ + + sql """ insert into $tableName values('aa1235', 'abc', 'address6', NULL) """ + sql """ insert into $tableName values('aa1235', 'abc', 'address6', -1) """ + + sql """ insert into $tableName values('aa1236', 'abc', 'address6', NULL) """ + sql """ insert into $tableName values('aa1236', 'abc', 'address6', 0) """ + sql """ insert into $tableName values('aa1236', 'abc', 'address6', NULL) """ + + order_qt_sql "select * from $tableName" + + sql """ DROP TABLE IF EXISTS $tableName """ +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_pk_uk_case.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_pk_uk_case.groovy new file mode 100644 index 00000000000000..337bf3c1a772b2 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_pk_uk_case.groovy @@ -0,0 +1,260 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods; +import java.util.Random; +import org.apache.commons.lang.RandomStringUtils; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.UUID; +import java.time.format.DateTimeFormatter; + +suite("test_pk_uk_case") { + def tableNamePk = "primary_key_pk_uk" + def tableNameUk = "unique_key_pk_uk" + + onFinish { + try_sql("DROP TABLE IF EXISTS ${tableNamePk}") + try_sql("DROP TABLE IF EXISTS ${tableNameUk}") + } + + sql """ DROP TABLE IF EXISTS ${tableNamePk} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableNamePk} ( + L_ORDERKEY INTEGER NOT NULL, + L_PARTKEY INTEGER NOT NULL, + L_SUPPKEY INTEGER NOT NULL, + L_LINENUMBER INTEGER NOT NULL, + L_QUANTITY DECIMAL(15,2) NOT NULL, + L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, + L_DISCOUNT DECIMAL(15,2) NOT NULL, + L_TAX DECIMAL(15,2) NOT NULL, + L_RETURNFLAG CHAR(1) NOT NULL, + L_LINESTATUS CHAR(1) NOT NULL, + L_SHIPDATE DATE NOT NULL, + L_COMMITDATE DATE NOT NULL, + L_RECEIPTDATE DATE NOT NULL, + L_SHIPINSTRUCT CHAR(60) NOT NULL, + L_SHIPMODE CHAR(60) NOT NULL, + L_COMMENT VARCHAR(60) NOT NULL + ) + UNIQUE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER) + CLUSTER BY(L_PARTKEY, L_RETURNFLAG) + DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ) + """ + + sql """ DROP TABLE IF EXISTS ${tableNameUk} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableNameUk} ( + L_ORDERKEY INTEGER NOT NULL, + L_PARTKEY INTEGER NOT NULL, + L_SUPPKEY INTEGER NOT NULL, + L_LINENUMBER INTEGER NOT NULL, + L_QUANTITY DECIMAL(15,2) NOT NULL, + L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, + L_DISCOUNT DECIMAL(15,2) NOT NULL, + L_TAX DECIMAL(15,2) NOT NULL, + L_RETURNFLAG CHAR(1) NOT NULL, + L_LINESTATUS CHAR(1) NOT NULL, + L_SHIPDATE DATE NOT NULL, + L_COMMITDATE DATE NOT NULL, + L_RECEIPTDATE DATE NOT NULL, + L_SHIPINSTRUCT CHAR(60) NOT NULL, + L_SHIPMODE CHAR(60) NOT NULL, + L_COMMENT VARCHAR(60) NOT NULL + ) + UNIQUE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER) + DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "false" + ) + """ + + Random rd = new Random() + def order_key = rd.nextInt(1000) + def part_key = rd.nextInt(1000) + def sub_key = 13 + def line_num = 29 + def decimal = 111.11 + def city = RandomStringUtils.randomAlphabetic(10) + def name = UUID.randomUUID().toString() + def date = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now()) + for (int idx = 0; idx < 10; idx++) { + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + // insert batch key + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + sql "sync" + + // count(*) + def result0 = sql """ SELECT count(*) FROM ${tableNamePk}; """ + def result1 = sql """ SELECT count(*) FROM ${tableNameUk}; """ + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + assertTrue(result0[0]==result1[0]) + if (result0[0][0]!=result1[0][0]) { + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + } + + result0 = sql """ SELECT + l_returnflag, + l_linestatus, + sum(l_quantity) AS sum_qty, + sum(l_extendedprice) AS sum_base_price, + sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + avg(l_quantity) AS avg_qty, + avg(l_extendedprice) AS avg_price, + avg(l_discount) AS avg_disc, + count(*) AS count_order + FROM + ${tableNamePk} + GROUP BY + l_returnflag, + l_linestatus + ORDER BY + l_returnflag, + l_linestatus + """ + result1 = sql """ SELECT + l_returnflag, + l_linestatus, + sum(l_quantity) AS sum_qty, + sum(l_extendedprice) AS sum_base_price, + sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + avg(l_quantity) AS avg_qty, + avg(l_extendedprice) AS avg_price, + avg(l_discount) AS avg_disc, + count(*) AS count_order + FROM + ${tableNameUk} + GROUP BY + l_returnflag, + l_linestatus + ORDER BY + l_returnflag, + l_linestatus + """ + assertTrue(result0.size()==result1.size()) + for (int i = 0; i < result0.size(); ++i) { + for (j = 0; j < result0[0].size(); j++) { + logger.info("result: " + result0[i][j] + "|" + result1[i][j]) + assertTrue(result0[i][j]==result1[i][j]) + } + } + + // delete + if (idx % 10 == 0) { + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + result0 = sql """ SELECT count(*) FROM ${tableNamePk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key; """ + result1 = sql """ SELECT count(*) FROM ${tableNameUk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key""" + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + sql "DELETE FROM ${tableNamePk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key" + sql "DELETE FROM ${tableNameUk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key" + } + } +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_primary_key_simple_case.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_primary_key_simple_case.groovy new file mode 100644 index 00000000000000..788f934fdf044f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_primary_key_simple_case.groovy @@ -0,0 +1,115 @@ +// 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_primary_key_simple_case") { + def tableName = "cluster_key_test_primary_key_simple_case" + onFinish { + // try_sql("DROP TABLE IF EXISTS ${tableName}") + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `city`, `age`, `sex`) + CLUSTER BY(`user_id`, `age`, `cost`, `sex`) + DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2020-01-03', 1, 32, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (4, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} VALUES + (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + result = sql """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + assertTrue(result.size() == 5) + assertTrue(result[0].size() == 11) + + // insert a duplicate key + sql """ INSERT INTO ${tableName} VALUES + (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 21) + """ + result = sql """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + assertTrue(result.size() == 5) + assertTrue(result[4][10] == 21) + + // insert a duplicate key + sql """ INSERT INTO ${tableName} VALUES + (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22) + """ + result = sql """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + assertTrue(result.size() == 5) + logger.info("fuck: " + result.size()) + assertTrue(result[4][10] == 22) + + result = sql """ SELECT * FROM ${tableName} t where user_id = 5; """ + assertTrue(result.size() == 1) + assertTrue(result[0][10] == 22) + + result = sql """ SELECT COUNT(*) FROM ${tableName};""" + assertTrue(result.size() == 1) + assertTrue(result[0][0] == 5) + + // insert a new key + sql """ INSERT INTO ${tableName} VALUES + (6, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22) + """ + result = sql """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + assertTrue(result.size() == 6) + + // insert batch key + sql """ INSERT INTO ${tableName} VALUES + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 23), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 24), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 25) + """ + result = sql """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + assertTrue(result.size() == 7) + assertTrue(result[6][10] == 25) +} diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy new file mode 100644 index 00000000000000..80bbe053f58c27 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy @@ -0,0 +1,86 @@ +// 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_mow_sequence") { + def tableName = "test_mow_sequence" + sql """ DROP TABLE IF EXISTS $tableName """ + sql """ + CREATE TABLE `$tableName` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" + ) + UNIQUE KEY (`c_custkey`) + CLUSTER BY (`c_nation`, `c_mktsegment`, `c_region`) + DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 + PROPERTIES ( + "function_column.sequence_type" = 'int', + "compression"="zstd", + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + streamLoad { + table "${tableName}" + + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', 'c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use' + set 'function_column.sequence_col', 'c_custkey' + + file """${getS3Url()}/regression/ssb/sf0.1/customer.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + + sql "sync" + + // TODO + /*order_qt_sql "select * from $tableName where c_custkey < 6;" + + order_qt_sql "select * from $tableName where c_custkey > 2995;" + + qt_sql "select * from $tableName where c_custkey = 1;" + + qt_sql "select * from $tableName where c_custkey = 3000;" + + qt_sql "select * from $tableName where c_custkey = 3001;" + + qt_sql "select * from $tableName where c_custkey = 0;"*/ +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_create.sql new file mode 100644 index 00000000000000..789c8fd79b8972 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_name`, `c_phone`, `c_city`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_delete.sql new file mode 100644 index 00000000000000..fe22a226fedf85 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_delete.sql @@ -0,0 +1 @@ +truncate table customer; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql new file mode 100644 index 00000000000000..a9d1b34d68cc0f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql @@ -0,0 +1 @@ +delete from customer where c_custkey > 1500 ; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql new file mode 100644 index 00000000000000..2b560cfdacb133 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_nation`, `c_phone`, `c_city`, `c_name`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_create.sql new file mode 100644 index 00000000000000..cf6b4b6a73739f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_create.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_holidayfl`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_delete.sql new file mode 100644 index 00000000000000..12933cbbad92da --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_delete.sql @@ -0,0 +1 @@ +truncate table `date`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_part_delete.sql new file mode 100644 index 00000000000000..0c21b27cc48c53 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_part_delete.sql @@ -0,0 +1 @@ +delete from `date` where d_datekey >= '19920701' and d_datekey <= '19920731'; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql new file mode 100644 index 00000000000000..4ff7ba2208a5e8 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql @@ -0,0 +1,29 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_yearmonth`, `d_holidayfl`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql new file mode 100644 index 00000000000000..0f58608a9cfa6a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql @@ -0,0 +1,36 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_orderdata`, `lo_suppkey`, `lo_shipmode`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql new file mode 100644 index 00000000000000..329e040060edc6 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql @@ -0,0 +1 @@ +truncate table lineorder; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql new file mode 100644 index 00000000000000..abb7ded4331f2a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql @@ -0,0 +1 @@ +delete from lineorder where lo_orderkey >= 240001 and lo_orderkey <= 360000; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql new file mode 100644 index 00000000000000..d639e7f2bba1fd --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql @@ -0,0 +1,37 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_quantity`, `lo_suppkey`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_create.sql new file mode 100644 index 00000000000000..b1b01bcaeca32d --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_color`, `p_name`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_delete.sql new file mode 100644 index 00000000000000..02c6abd2539add --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_delete.sql @@ -0,0 +1 @@ +truncate table `part`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_part_delete.sql new file mode 100644 index 00000000000000..32ec2aa18b2397 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_part_delete.sql @@ -0,0 +1 @@ +delete from `part` where p_partkey > 10000; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql new file mode 100644 index 00000000000000..ab2b62a52da81d --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_size`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_create.sql new file mode 100644 index 00000000000000..53b607a53ffb01 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_create.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_region`, `s_address`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_delete.sql new file mode 100644 index 00000000000000..39e663134cabd0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_delete.sql @@ -0,0 +1 @@ +truncate table `supplier`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql new file mode 100644 index 00000000000000..ac6a7030fd07b3 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql @@ -0,0 +1 @@ +delete from `supplier` where s_suppkey > 100; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql new file mode 100644 index 00000000000000..9fef263bf07312 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_region`, `s_city`, `s_name`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/four/load_four_step.groovy b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/four/load_four_step.groovy new file mode 100644 index 00000000000000..49e7904191971a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/four/load_four_step.groovy @@ -0,0 +1,111 @@ +// 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. + +// Most of the cases are copied from https://github.com/trinodb/trino/tree/master +// /testing/trino-product-tests/src/main/resources/sql-tests/testcases +// and modified by Doris. + +suite("load_four_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey", 1500], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey", 224], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey", 100]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + for (j in 0..<2) { + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } + sql """ set delete_without_partition = true; """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_part_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[3]) + } + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/one/load_one_step.groovy b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/one/load_one_step.groovy new file mode 100644 index 00000000000000..74ff14bf68ed5f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/one/load_one_step.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("load_one_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_create.sql""").text + streamLoad { + table "${tableName}" + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', "${rows[0]}" + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/three/load_three_step.groovy b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/three/load_three_step.groovy new file mode 100644 index 00000000000000..b33f77d9ef688c --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/three/load_three_step.groovy @@ -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. + + +suite("load_three_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey"], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey"], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey"]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + for (j in 0..<2) { + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == 0) + } + sql """ ANALYZE TABLE $tableName WITH SYNC """ + } +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/two/load_two_step.groovy b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/two/load_two_step.groovy new file mode 100644 index 00000000000000..7b9a3ab0b8a24d --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/two/load_two_step.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("load_two_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey"], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey"], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey"]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == 0) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql new file mode 100644 index 00000000000000..3640400704c873 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_region`, `c_city`, `c_name`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql new file mode 100644 index 00000000000000..573451e6c0154a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql @@ -0,0 +1 @@ +drop table customer; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_create.sql new file mode 100644 index 00000000000000..6a065537829884 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_create.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_year`, `d_month`, `d_weeknuminyear`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql new file mode 100644 index 00000000000000..12933cbbad92da --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql @@ -0,0 +1 @@ +truncate table `date`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql new file mode 100644 index 00000000000000..d56c8aee33cae4 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql @@ -0,0 +1,36 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_orderdate`, `lo_orderpriority`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql new file mode 100644 index 00000000000000..329e040060edc6 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql @@ -0,0 +1 @@ +truncate table lineorder; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_create.sql new file mode 100644 index 00000000000000..34a1555fa52af7 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_category`, `p_brand`, `p_size`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql new file mode 100644 index 00000000000000..74480abba297e0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql @@ -0,0 +1 @@ +drop table `part`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql new file mode 100644 index 00000000000000..662aca9847d1fc --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_region`, `s_city`, `s_name`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql new file mode 100644 index 00000000000000..fca2493cd988c3 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql @@ -0,0 +1 @@ +drop table `supplier`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/load.groovy b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/load.groovy new file mode 100644 index 00000000000000..1715ac09c69ba7 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/load.groovy @@ -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. + +// Most of the cases are copied from https://github.com/trinodb/trino/tree/master +// /testing/trino-product-tests/src/main/resources/sql-tests/testcases +// and modified by Doris. + +// Note: To filter out tables from sql files, use the following one-liner comamnd +// sed -nr 's/.*tables: (.*)$/\1/gp' /path/to/*.sql | sed -nr 's/,/\n/gp' | sort | uniq +suite("load") { + def tables = ["customer", "lineorder", "part", "date", "supplier"] + def columns = ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", + """lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", + """p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", + """d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", + """s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy"""] + + for (String table in tables) { + sql new File("""${context.file.parent}/ddl/${table}_delete.sql""").text + sql new File("""${context.file.parent}/ddl/${table}_create.sql""").text + } + def i = 0 + for (String tableName in tables) { + streamLoad { + // a default db 'regression_test' is specified in + // ${DORIS_HOME}/conf/regression-conf.groovy + table tableName + + // default label is UUID: + // set 'label' UUID.randomUUID().toString() + + // default column_separator is specify in doris fe config, usually is '\t'. + // this line change to ',' + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', columns[i] + + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + i++ + } +} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.sql new file mode 100644 index 00000000000000..4ef15e93ea2f5f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.1.sql @@ -0,0 +1,24 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_year = 1993 +AND lo_discount BETWEEN 1 AND 3 +AND lo_quantity < 25; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.sql new file mode 100644 index 00000000000000..1b8442bd939454 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.2.sql @@ -0,0 +1,24 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_yearmonth = 'Jan1994' +AND lo_discount BETWEEN 4 AND 6 +AND lo_quantity BETWEEN 26 AND 35; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.sql new file mode 100644 index 00000000000000..ed6e51b1cfd264 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q1.3.sql @@ -0,0 +1,25 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_weeknuminyear= 6 +AND d_year = 1994 +AND lo_discount BETWEEN 5 AND 7 +AND lo_quantity BETWEEN 26 AND 35; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.sql new file mode 100644 index 00000000000000..e1a1f52d189e4e --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.1.sql @@ -0,0 +1,26 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_category = 'MFGR#12' +AND s_region = 'AMERICA' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.sql new file mode 100644 index 00000000000000..3db617011947ef --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.2.sql @@ -0,0 +1,27 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_brand BETWEEN 'MFGR#2221' +AND 'MFGR#2228' +AND s_region = 'ASIA' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.sql new file mode 100644 index 00000000000000..b70ca90666b8fe --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q2.3.sql @@ -0,0 +1,26 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_brand = 'MFGR#2239' +AND s_region = 'EUROPE' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.sql new file mode 100644 index 00000000000000..70f17d789b45a2 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.1.sql @@ -0,0 +1,28 @@ +-- 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. + +SELECT c_nation, s_nation, d_year, +SUM(lo_revenue) AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND c_region = 'ASIA' +AND s_region = 'ASIA' +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_nation, s_nation, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.sql new file mode 100644 index 00000000000000..a416fbea8b1768 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.2.sql @@ -0,0 +1,28 @@ +-- 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. + +SELECT c_city, s_city, d_year, sum(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND c_nation = 'UNITED STATES' +AND s_nation = 'UNITED STATES' +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.sql new file mode 100644 index 00000000000000..98e29b72e70bf0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.3.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT c_city, s_city, d_year, SUM(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND (c_city='UNITED KI1' +OR c_city='UNITED KI5') +AND (s_city='UNITED KI1' +OR s_city='UNITED KI5') +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.sql new file mode 100644 index 00000000000000..65fe992ca4f12b --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q3.4.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT c_city, s_city, d_year, SUM(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND (c_city='UNITED KI1' +OR c_city='UNITED KI5') +AND (s_city='UNITED KI1' +OR s_city='UNITED KI5') +AND d_yearmonth = 'Dec1997' +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.sql new file mode 100644 index 00000000000000..bdcd730bf922fe --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.1.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT d_year, c_nation, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND c_region = 'AMERICA' +AND s_region = 'AMERICA' +AND (p_mfgr = 'MFGR#1' +OR p_mfgr = 'MFGR#2') +GROUP BY d_year, c_nation +ORDER BY d_year, c_nation; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.sql new file mode 100644 index 00000000000000..24c82cf682d155 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.2.sql @@ -0,0 +1,31 @@ +-- 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. + +SELECT d_year, s_nation, p_category, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND c_region = 'AMERICA' +AND s_region = 'AMERICA' +AND (d_year = 1997 OR d_year = 1998) +AND (p_mfgr = 'MFGR#1' +OR p_mfgr = 'MFGR#2') +GROUP BY d_year, s_nation, p_category +ORDER BY d_year, s_nation, p_category; diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.sql new file mode 100644 index 00000000000000..0dcc08bd26c8ad --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/sql/q4.3.sql @@ -0,0 +1,29 @@ +-- 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. + +SELECT d_year, s_city, p_brand, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND s_nation = 'UNITED STATES' +AND (d_year = 1997 OR d_year = 1998) +AND p_category = 'MFGR#14' +GROUP BY d_year, s_city, p_brand +ORDER BY d_year, s_city, p_brand; From 9326c7fb60ad18f2fda8e73f3639f742ade58616 Mon Sep 17 00:00:00 2001 From: meiyi Date: Fri, 22 Sep 2023 16:38:41 +0800 Subject: [PATCH 28/64] fix code format --- be/src/olap/delete_bitmap_calculator.cpp | 3 +-- be/src/olap/tablet.cpp | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index 6e9e9e24caec5c..7d78dd8ff28def 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -131,8 +131,7 @@ bool MergeIndexDeleteBitmapCalculatorContext::Comparator::is_key_same(Slice cons Status MergeIndexDeleteBitmapCalculator::init(RowsetId rowset_id, std::vector const& segments, - size_t seq_col_length, - size_t rowdid_length, + size_t seq_col_length, size_t rowdid_length, size_t max_batch_size) { _rowset_id = rowset_id; _seq_col_length = seq_col_length; diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 34a867ce7c7e42..e30759cf819c06 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2961,7 +2961,8 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, Slice(key.get_data() + key_without_seq.get_size() + seq_col_length + 1, rowid_length - 1); // decode rowid - const auto* type_info = get_scalar_type_info(); + const auto* type_info = + get_scalar_type_info(); auto rowid_coder = get_key_coder(type_info->type()); rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&row_id); } From 4379e274f9fd21895633f84a66a2467cfbadb804 Mon Sep 17 00:00:00 2001 From: meiyi Date: Fri, 22 Sep 2023 19:31:22 +0800 Subject: [PATCH 29/64] fix regression --- .../cluster_key/ignore_mode.csv | 10 -- .../cluster_key/test_ignore_mode.out | 20 --- .../cluster_key/test_ignore_mode.groovy | 114 ------------------ .../ddl/customer_delete.sql | 2 +- .../ddl/date_delete.sql | 2 +- .../ddl/lineorder_delete.sql | 2 +- .../ddl/part_delete.sql | 2 +- .../ddl/supplier_delete.sql | 2 +- 8 files changed, 5 insertions(+), 149 deletions(-) delete mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv delete mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out delete mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv b/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv deleted file mode 100644 index 693c484172459c..00000000000000 --- a/regression-test/data/unique_with_mow_p0/cluster_key/ignore_mode.csv +++ /dev/null @@ -1,10 +0,0 @@ -1,"kevin",18,"shenzhen",4000 -10,"alex",28,"shenzhen",1111 -2,"bob",20,"beijing",5000 -20,"leo",30,"beijing",2222 -30,"sam",32,"shanghai",3333 -3,"alice",22,"shanghai",6000 -4,"jack",24,"hangzhou",7000 -40,"Ruth",34,"hangzhou",4444 -5,"tom",26,"guanzhou",8000 -50,"cynthia",36,"guanzhou",8000 \ No newline at end of file diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out deleted file mode 100644 index 5c72f099d99f41..00000000000000 --- a/regression-test/data/unique_with_mow_p0/cluster_key/test_ignore_mode.out +++ /dev/null @@ -1,20 +0,0 @@ --- This file is automatically generated. You should know what you did if you want to edit this --- !origin_data -- -1 kevin 18 shenzhen 400 -2 bob 20 beijing 500 -3 alice 22 shanghai 600 -4 jack 24 hangzhou 700 -5 tom 26 guanzhou 800 - --- !after_ignore_mode_stream_load -- -1 kevin 18 shenzhen 400 -2 bob 20 beijing 500 -3 alice 22 shanghai 600 -4 jack 24 hangzhou 700 -5 tom 26 guanzhou 800 -10 "alex" 28 "shenzhen" 1111 -20 "leo" 30 "beijing" 2222 -30 "sam" 32 "shanghai" 3333 -40 "Ruth" 34 "hangzhou" 4444 -50 "cynthia" 36 "guanzhou" 8000 - diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy deleted file mode 100644 index 3e7cafa06ab9ec..00000000000000 --- a/regression-test/suites/unique_with_mow_p0/cluster_key/test_ignore_mode.groovy +++ /dev/null @@ -1,114 +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_mow_table_ignore_mode") { - - def tableName = "test_mow_table_ignore_mode1" - sql """ DROP TABLE IF EXISTS ${tableName} FORCE;""" - sql """ - CREATE TABLE ${tableName} ( - `id` int(11) NULL, - `name` varchar(10) NULL, - `age` int(11) NULL DEFAULT "20", - `city` varchar(10) NOT NULL DEFAULT "beijing", - `balance` decimalv3(9, 0) NULL - ) ENGINE = OLAP UNIQUE KEY(`id`) - CLUSTER BY(`city`, `age`, `name`) - COMMENT 'OLAP' DISTRIBUTED BY HASH(`id`) BUCKETS 1 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "storage_format" = "V2", - "enable_unique_key_merge_on_write" = "true", - "light_schema_change" = "true", - "disable_auto_compaction" = "true", - "enable_single_replica_compaction" = "false" - ); - """ - sql """insert into ${tableName} values - (1,"kevin",18,"shenzhen",400), - (2,"bob",20,"beijing",500), - (3,"alice",22,"shanghai",600), - (4,"jack",24,"hangzhou",700), - (5,"tom",26,"guanzhou",800);""" - qt_origin_data "select * from ${tableName} order by id;" - - // some rows are with existing keys, some are not - streamLoad { - table "${tableName}" - - set 'column_separator', ',' - set 'format', 'csv' - set 'columns', 'id,name,age,city,balance' - set 'ignore_mode', 'true' - - file 'ignore_mode.csv' - time 10000 // limit inflight 10s - } - sql "sync" - - qt_after_ignore_mode_stream_load "select * from ${tableName} order by id;" - sql """ DROP TABLE IF EXISTS ${tableName};""" - - - // test illegal case - def tableName2 = "test_mow_table_ignore_mode2" - sql """ DROP TABLE IF EXISTS ${tableName2} FORCE;""" - sql """ - CREATE TABLE ${tableName2} ( - `id` int(11) NULL, - `name` varchar(10) NULL, - `age` int(11) NULL DEFAULT "20", - `city` varchar(10) NOT NULL DEFAULT "beijing", - `balance` decimalv3(9, 0) NULL - ) ENGINE = OLAP UNIQUE KEY(`id`) - CLUSTER BY(`balance`, `name`) - COMMENT 'OLAP' DISTRIBUTED BY HASH(`id`) BUCKETS 1 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "storage_format" = "V2", - "enable_unique_key_merge_on_write" = "true", - "light_schema_change" = "true", - "disable_auto_compaction" = "true", - "enable_single_replica_compaction" = "false" - );""" - sql """insert into ${tableName2} values - (1,"kevin",18,"shenzhen",400), - (2,"bob",20,"beijing",500), - (3,"alice",22,"shanghai",600), - (4,"jack",24,"hangzhou",700), - (5,"tom",26,"guanzhou",800);""" - // some rows are with existing keys, some are not - streamLoad { - table "${tableName2}" - - set 'column_separator', ',' - set 'format', 'csv' - set 'columns', 'id,balance' - set 'partial_columns', 'true' - set 'ignore_mode', 'true' - - file 'ignore_mode.csv' - time 10000 // limit inflight 10s - - check {result, exception, startTime, endTime -> - assertTrue(exception == null) - def json = parseJson(result) - assertEquals("Fail", json.Status) - assertTrue(json.Message.contains("ignore mode can't be used in partial update.")) - } - } -} diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql index 573451e6c0154a..68a98512b29d17 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql @@ -1 +1 @@ -drop table customer; \ No newline at end of file +drop table if exists customer; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql index 12933cbbad92da..c6cf155575829f 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql @@ -1 +1 @@ -truncate table `date`; \ No newline at end of file +drop table if exists `date`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql index 329e040060edc6..d8f94cfe9fcd8e 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql @@ -1 +1 @@ -truncate table lineorder; \ No newline at end of file +drop table if exists lineorder; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql index 74480abba297e0..4ad502e24dc68b 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql @@ -1 +1 @@ -drop table `part`; \ No newline at end of file +drop table if exists `part`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql index fca2493cd988c3..72e1c39dae174a 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql @@ -1 +1 @@ -drop table `supplier`; \ No newline at end of file +drop table if exists `supplier`; \ No newline at end of file From dc808730f90b3f0c912cc7b3ef92a3d7c911f0c7 Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 25 Sep 2023 20:04:01 +0800 Subject: [PATCH 30/64] add some regression --- be/src/olap/delete_bitmap_calculator.cpp | 17 ++- be/src/olap/delete_bitmap_calculator.h | 2 + be/src/olap/tablet.cpp | 4 +- .../ssb_unique_sql_zstd_cluster/sql/q1.1.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q1.2.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q1.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q2.1.out | 43 +++++++ .../ssb_unique_sql_zstd_cluster/sql/q2.2.out | 11 ++ .../ssb_unique_sql_zstd_cluster/sql/q2.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q3.1.out | 28 +++++ .../ssb_unique_sql_zstd_cluster/sql/q3.2.out | 51 ++++++++ .../ssb_unique_sql_zstd_cluster/sql/q3.3.out | 4 + .../ssb_unique_sql_zstd_cluster/sql/q3.4.out | 3 + .../ssb_unique_sql_zstd_cluster/sql/q4.1.out | 8 ++ .../ssb_unique_sql_zstd_cluster/sql/q4.2.out | 3 + .../ssb_unique_sql_zstd_cluster/sql/q4.3.out | 3 + .../ddl/lineorder_create.sql | 2 +- .../ddl/customer_create.sql | 19 +++ .../ddl/customer_delete.sql | 1 + .../ddl/customer_part_delete.sql | 1 + .../ddl/customer_sequence_create.sql | 20 +++ .../ddl/date_create.sql | 28 +++++ .../ddl/date_delete.sql | 1 + .../ddl/date_part_delete.sql | 1 + .../ddl/date_sequence_create.sql | 29 +++++ .../ddl/lineorder_create.sql | 36 ++++++ .../ddl/lineorder_delete.sql | 1 + .../ddl/lineorder_part_delete.sql | 1 + .../ddl/lineorder_sequence_create.sql | 37 ++++++ .../ddl/part_create.sql | 20 +++ .../ddl/part_delete.sql | 1 + .../ddl/part_part_delete.sql | 1 + .../ddl/part_sequence_create.sql | 21 ++++ .../ddl/supplier_create.sql | 18 +++ .../ddl/supplier_delete.sql | 1 + .../ddl/supplier_part_delete.sql | 1 + .../ddl/supplier_sequence_create.sql | 19 +++ .../four/load_four_step.groovy | 116 ++++++++++++++++++ .../one/load_one_step.groovy | 67 ++++++++++ .../three/load_three_step.groovy | 76 ++++++++++++ .../two/load_two_step.groovy | 74 +++++++++++ .../ddl/customer_create.sql | 19 +++ .../ddl/customer_delete.sql | 1 + .../ddl/date_create.sql | 28 +++++ .../ddl/date_delete.sql | 1 + .../ddl/lineorder_create.sql | 36 ++++++ .../ddl/lineorder_delete.sql | 1 + .../ddl/part_create.sql | 20 +++ .../ddl/part_delete.sql | 1 + .../ddl/supplier_create.sql | 18 +++ .../ddl/supplier_delete.sql | 1 + .../ssb_unique_sql_zstd_cluster/load.groovy | 82 +++++++++++++ .../ssb_unique_sql_zstd_cluster/sql/q1.1.sql | 24 ++++ .../ssb_unique_sql_zstd_cluster/sql/q1.2.sql | 24 ++++ .../ssb_unique_sql_zstd_cluster/sql/q1.3.sql | 25 ++++ .../ssb_unique_sql_zstd_cluster/sql/q2.1.sql | 26 ++++ .../ssb_unique_sql_zstd_cluster/sql/q2.2.sql | 27 ++++ .../ssb_unique_sql_zstd_cluster/sql/q2.3.sql | 26 ++++ .../ssb_unique_sql_zstd_cluster/sql/q3.1.sql | 28 +++++ .../ssb_unique_sql_zstd_cluster/sql/q3.2.sql | 28 +++++ .../ssb_unique_sql_zstd_cluster/sql/q3.3.sql | 30 +++++ .../ssb_unique_sql_zstd_cluster/sql/q3.4.sql | 30 +++++ .../ssb_unique_sql_zstd_cluster/sql/q4.1.sql | 30 +++++ .../ssb_unique_sql_zstd_cluster/sql/q4.2.sql | 31 +++++ .../ssb_unique_sql_zstd_cluster/sql/q4.3.sql | 29 +++++ 65 files changed, 1346 insertions(+), 5 deletions(-) create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.out create mode 100644 regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.out create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/four/load_four_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/one/load_one_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/three/load_three_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/two/load_two_step.groovy create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/load.groovy create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.sql create mode 100644 regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.sql diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index 7d78dd8ff28def..4124be93bece12 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -151,6 +151,10 @@ Status MergeIndexDeleteBitmapCalculator::init(RowsetId rowset_id, _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(); } @@ -164,6 +168,14 @@ Status MergeIndexDeleteBitmapCalculator::calculate_one(RowLocation& loc) { if (!_last_key.empty() && _comparator.is_key_same(cur_key, _last_key)) { loc.segment_id = cur_ctx->segment_id(); loc.row_id = cur_ctx->row_id(); + if (_rowid_length > 0) { + Slice key_without_seq = Slice(cur_key.get_data(), + cur_key.get_size() - _seq_col_length - _rowid_length); + Slice rowid_slice = + Slice(cur_key.get_data() + key_without_seq.get_size() + _seq_col_length + 1, + _rowid_length - 1); + _rowid_coder->decode_ascending(&rowid_slice, _rowid_length, (uint8_t*)&loc.row_id); + } auto st = cur_ctx->advance(); if (st.ok()) { _heap->push(cur_ctx); @@ -181,8 +193,9 @@ Status MergeIndexDeleteBitmapCalculator::calculate_one(RowLocation& loc) { RETURN_IF_ERROR(nxt_ctx->get_current_key(nxt_key)); Status st = _comparator.is_key_same(cur_key, nxt_key) ? cur_ctx->advance() - : cur_ctx->seek_at_or_after(Slice( - nxt_key.get_data(), nxt_key.get_size() - _seq_col_length)); + : cur_ctx->seek_at_or_after( + Slice(nxt_key.get_data(), + nxt_key.get_size() - _seq_col_length - _rowid_length)); if (st.is()) { continue; } diff --git a/be/src/olap/delete_bitmap_calculator.h b/be/src/olap/delete_bitmap_calculator.h index 0c526019723b55..42421972793eb5 100644 --- a/be/src/olap/delete_bitmap_calculator.h +++ b/be/src/olap/delete_bitmap_calculator.h @@ -29,6 +29,7 @@ #include "olap/base_tablet.h" #include "olap/binlog_config.h" #include "olap/data_dir.h" +#include "olap/key_coder.h" #include "olap/olap_common.h" #include "olap/rowset/rowset.h" #include "olap/rowset/rowset_meta.h" @@ -109,6 +110,7 @@ class MergeIndexDeleteBitmapCalculator { std::string _last_key; size_t _seq_col_length; size_t _rowid_length; + const KeyCoder* _rowid_coder = nullptr; }; } // namespace doris diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index e30759cf819c06..1a852c856e73ea 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -3726,8 +3726,8 @@ Status Tablet::calc_delete_bitmap_between_segments( seq_col_length = _tablet_meta->tablet_schema()->column(seq_col_idx).length(); } size_t rowid_length = 0; - if (!_schema->cluster_key_idxes().empty()) { - rowid_length = sizeof(uint32_t); + if (!_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { + rowid_length = sizeof(uint32_t) + 1; } MergeIndexDeleteBitmapCalculator calculator; diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.out new file mode 100644 index 00000000000000..92604403fd0fc4 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.1 -- +\N + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.out new file mode 100644 index 00000000000000..22731ac444a62c --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.2 -- +\N + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.out new file mode 100644 index 00000000000000..71908d1f123bce --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q1.3 -- +\N + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.out new file mode 100644 index 00000000000000..9d56f6e633e060 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.out @@ -0,0 +1,43 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.1 -- +29165996 1992 MFGR#121 +23120066 1992 MFGR#1210 +52982362 1992 MFGR#1211 +30954680 1992 MFGR#1212 +15288453 1992 MFGR#1213 +7655070 1992 MFGR#1214 +22246540 1992 MFGR#1215 +19716439 1992 MFGR#1216 +43666251 1992 MFGR#1217 +22759602 1992 MFGR#1218 +23318799 1992 MFGR#1219 +74056106 1992 MFGR#122 +51050565 1992 MFGR#1220 +38878674 1992 MFGR#1221 +16558051 1992 MFGR#1222 +26690787 1992 MFGR#1223 +76498594 1992 MFGR#1224 +32608903 1992 MFGR#1225 +47636685 1992 MFGR#1226 +27691433 1992 MFGR#1227 +32513490 1992 MFGR#1228 +35514258 1992 MFGR#1229 +17199862 1992 MFGR#123 +24678908 1992 MFGR#1230 +26231337 1992 MFGR#1231 +36330900 1992 MFGR#1232 +24946678 1992 MFGR#1233 +36431683 1992 MFGR#1234 +39368479 1992 MFGR#1235 +44456974 1992 MFGR#1236 +31443810 1992 MFGR#1237 +49003021 1992 MFGR#1238 +31379822 1992 MFGR#1239 +24245603 1992 MFGR#124 +49870826 1992 MFGR#1240 +28194770 1992 MFGR#125 +40503844 1992 MFGR#126 +36027836 1992 MFGR#127 +35881895 1992 MFGR#128 +21732451 1992 MFGR#129 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.out new file mode 100644 index 00000000000000..debe1950128d6b --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.out @@ -0,0 +1,11 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.2 -- +28235270 1992 MFGR#2221 +64071827 1992 MFGR#2222 +48591160 1992 MFGR#2223 +20416501 1992 MFGR#2224 +74950776 1992 MFGR#2225 +60628045 1992 MFGR#2226 +39273349 1992 MFGR#2227 +66658087 1992 MFGR#2228 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.out new file mode 100644 index 00000000000000..40b32204064851 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q2.3 -- +89380397 1992 MFGR#2239 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.out new file mode 100644 index 00000000000000..a50f6a20d54f0f --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.out @@ -0,0 +1,28 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.1 -- +JAPAN CHINA 1992 637991852 +VIETNAM CHINA 1992 621845377 +INDONESIA CHINA 1992 621316255 +CHINA CHINA 1992 614550901 +INDIA CHINA 1992 561966207 +INDIA INDONESIA 1992 487449629 +INDONESIA INDONESIA 1992 477417717 +JAPAN INDONESIA 1992 476513261 +JAPAN VIETNAM 1992 468999429 +INDONESIA JAPAN 1992 465870469 +VIETNAM INDONESIA 1992 462424521 +INDIA JAPAN 1992 412186106 +JAPAN JAPAN 1992 399179790 +VIETNAM JAPAN 1992 395247587 +JAPAN INDIA 1992 393835589 +CHINA INDONESIA 1992 352903905 +CHINA INDIA 1992 348359904 +VIETNAM VIETNAM 1992 342176333 +INDIA VIETNAM 1992 334582962 +INDIA INDIA 1992 329354089 +CHINA JAPAN 1992 327558220 +CHINA VIETNAM 1992 324763767 +INDONESIA INDIA 1992 310417666 +VIETNAM INDIA 1992 296225919 +INDONESIA VIETNAM 1992 278083418 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.out new file mode 100644 index 00000000000000..1109fa3ce80b5c --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.out @@ -0,0 +1,51 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.2 -- +UNITED ST4 UNITED ST0 1992 34626982 +UNITED ST4 UNITED ST3 1992 29767238 +UNITED ST1 UNITED ST9 1992 25644597 +UNITED ST2 UNITED ST0 1992 23943154 +UNITED ST4 UNITED ST9 1992 21189183 +UNITED ST0 UNITED ST0 1992 18293852 +UNITED ST7 UNITED ST3 1992 17996772 +UNITED ST9 UNITED ST3 1992 17863433 +UNITED ST1 UNITED ST7 1992 17410800 +UNITED ST2 UNITED ST3 1992 15331073 +UNITED ST5 UNITED ST9 1992 14448179 +UNITED ST1 UNITED ST3 1992 13938002 +UNITED ST5 UNITED ST6 1992 12398029 +UNITED ST9 UNITED ST2 1992 12370917 +UNITED ST2 UNITED ST9 1992 12343455 +UNITED ST5 UNITED ST0 1992 12301234 +UNITED ST6 UNITED ST0 1992 11900889 +UNITED ST4 UNITED ST2 1992 11696334 +UNITED ST4 UNITED ST6 1992 11369008 +UNITED ST1 UNITED ST6 1992 11000283 +UNITED ST1 UNITED ST0 1992 10878084 +UNITED ST4 UNITED ST7 1992 10151573 +UNITED ST5 UNITED ST2 1992 9917834 +UNITED ST7 UNITED ST7 1992 9715656 +UNITED ST6 UNITED ST6 1992 8685228 +UNITED ST2 UNITED ST2 1992 8313714 +UNITED ST1 UNITED ST2 1992 8004700 +UNITED ST2 UNITED ST7 1992 7759164 +UNITED ST0 UNITED ST7 1992 7137641 +UNITED ST9 UNITED ST7 1992 6703890 +UNITED ST6 UNITED ST9 1992 6597261 +UNITED ST7 UNITED ST2 1992 6125476 +UNITED ST7 UNITED ST6 1992 6058017 +UNITED ST5 UNITED ST3 1992 5862031 +UNITED ST8 UNITED ST9 1992 5690491 +UNITED ST7 UNITED ST9 1992 5403152 +UNITED ST9 UNITED ST0 1992 4816370 +UNITED ST9 UNITED ST9 1992 4234523 +UNITED ST3 UNITED ST3 1992 4080199 +UNITED ST5 UNITED ST7 1992 3936271 +UNITED ST8 UNITED ST0 1992 3574169 +UNITED ST0 UNITED ST3 1992 3201624 +UNITED ST3 UNITED ST9 1992 2614811 +UNITED ST8 UNITED ST7 1992 2373825 +UNITED ST9 UNITED ST6 1992 2066609 +UNITED ST7 UNITED ST0 1992 1882015 +UNITED ST6 UNITED ST3 1992 1873819 +UNITED ST6 UNITED ST2 1992 291566 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.out new file mode 100644 index 00000000000000..6f33841912aace --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.3 -- +UNITED KI5 UNITED KI1 1992 4397192 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.out new file mode 100644 index 00000000000000..3738fc2859a8a4 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q3.4 -- + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.out new file mode 100644 index 00000000000000..00bc9ddd7ce760 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.out @@ -0,0 +1,8 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.1 -- +1992 ARGENTINA 533196600 +1992 BRAZIL 684224630 +1992 CANADA 532686194 +1992 PERU 586223155 +1992 UNITED STATES 682387184 + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.out new file mode 100644 index 00000000000000..30fae3d4bf6d8d --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.2 -- + diff --git a/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.out b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.out new file mode 100644 index 00000000000000..741016a89d2750 --- /dev/null +++ b/regression-test/data/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q4.3 -- + diff --git a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql index 0f58608a9cfa6a..2dff3181c9d686 100644 --- a/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql +++ b/regression-test/suites/unique_with_mow_p0/ssb_unique_load_zstd_c/ddl/lineorder_create.sql @@ -18,7 +18,7 @@ CREATE TABLE IF NOT EXISTS `lineorder` ( `lo_shipmode` varchar(11) NOT NULL COMMENT "" ) UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) -CLUSTER BY (`lo_orderdata`, `lo_suppkey`, `lo_shipmode`) +CLUSTER BY (`lo_orderdate`, `lo_suppkey`, `lo_shipmode`) PARTITION BY RANGE(`lo_orderdate`) (PARTITION p1992 VALUES [("-2147483648"), ("19930101")), PARTITION p1993 VALUES [("19930101"), ("19940101")), diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_create.sql new file mode 100644 index 00000000000000..0bf16f3911ad52 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_region`, `c_phone`, `c_city`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_delete.sql new file mode 100644 index 00000000000000..fe22a226fedf85 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_delete.sql @@ -0,0 +1 @@ +truncate table customer; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql new file mode 100644 index 00000000000000..a9d1b34d68cc0f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_part_delete.sql @@ -0,0 +1 @@ +delete from customer where c_custkey > 1500 ; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql new file mode 100644 index 00000000000000..892384684bf540 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/customer_sequence_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_mktsegment`, `c_city`, `c_region`, `c_nation`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_create.sql new file mode 100644 index 00000000000000..32b4e24f6cbbb3 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_create.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_sellingseason`, `d_holidayfl`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_delete.sql new file mode 100644 index 00000000000000..12933cbbad92da --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_delete.sql @@ -0,0 +1 @@ +truncate table `date`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_part_delete.sql new file mode 100644 index 00000000000000..0c21b27cc48c53 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_part_delete.sql @@ -0,0 +1 @@ +delete from `date` where d_datekey >= '19920701' and d_datekey <= '19920731'; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql new file mode 100644 index 00000000000000..9ec46190c794f2 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/date_sequence_create.sql @@ -0,0 +1,29 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_sellingseason`, `d_lastdayinweekfl`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_create.sql new file mode 100644 index 00000000000000..8cb2ae73098772 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_create.sql @@ -0,0 +1,36 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_orderdate`, `lo_orderkey`, `lo_shipmode`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql new file mode 100644 index 00000000000000..329e040060edc6 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_delete.sql @@ -0,0 +1 @@ +truncate table lineorder; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql new file mode 100644 index 00000000000000..abb7ded4331f2a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_part_delete.sql @@ -0,0 +1 @@ +delete from lineorder where lo_orderkey >= 240001 and lo_orderkey <= 360000; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql new file mode 100644 index 00000000000000..a9b1d4115612f0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/lineorder_sequence_create.sql @@ -0,0 +1,37 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_supplycost`, `lo_orderdate`, `lo_orderkey`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_create.sql new file mode 100644 index 00000000000000..722b7eba1a826f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_color`, `p_name`, `p_category`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_delete.sql new file mode 100644 index 00000000000000..02c6abd2539add --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_delete.sql @@ -0,0 +1 @@ +truncate table `part`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_part_delete.sql new file mode 100644 index 00000000000000..32ec2aa18b2397 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_part_delete.sql @@ -0,0 +1 @@ +delete from `part` where p_partkey > 10000; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql new file mode 100644 index 00000000000000..5ba4038e12d709 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/part_sequence_create.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_size`, `p_type`, `p_partkey`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_create.sql new file mode 100644 index 00000000000000..aa798357e819d3 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_create.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_address`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_delete.sql new file mode 100644 index 00000000000000..39e663134cabd0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_delete.sql @@ -0,0 +1 @@ +truncate table `supplier`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql new file mode 100644 index 00000000000000..ac6a7030fd07b3 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_part_delete.sql @@ -0,0 +1 @@ +delete from `supplier` where s_suppkey > 100; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql new file mode 100644 index 00000000000000..fd109360fda7a2 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/ddl/supplier_sequence_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_nation`, `s_region`, `s_city`, `s_name`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"function_column.sequence_type" = 'int', +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/four/load_four_step.groovy b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/four/load_four_step.groovy new file mode 100644 index 00000000000000..81702248a8f086 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/four/load_four_step.groovy @@ -0,0 +1,116 @@ +// 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. + +// Most of the cases are copied from https://github.com/trinodb/trino/tree/master +// /testing/trino-product-tests/src/main/resources/sql-tests/testcases +// and modified by Doris. + +suite("load_four_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey", 1500], + "lineorder": ["""lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", 600572, "lo_orderkey", 481137], + "part": ["""p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", 20000, "p_partkey", 10000], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey", 224], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey", 100]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + for (j in 0..<2) { + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + int flag = 1 + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } + sql """ set delete_without_partition = true; """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_part_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[3]) + } + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/one/load_one_step.groovy b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/one/load_one_step.groovy new file mode 100644 index 00000000000000..31a8344d7309d0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/one/load_one_step.groovy @@ -0,0 +1,67 @@ +// 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("load_one_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000], + "lineorder": ["""lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", 600572], + "part": ["""p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", 20000], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_create.sql""").text + streamLoad { + table "${tableName}" + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', "${rows[0]}" + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/three/load_three_step.groovy b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/three/load_three_step.groovy new file mode 100644 index 00000000000000..aae1b16426c417 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/three/load_three_step.groovy @@ -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. + + +suite("load_three_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey"], + "lineorder": ["""lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", 600572, "lo_orderkey"], + "part": ["""p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", 20000, "p_partkey"], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey"], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey"]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + for (j in 0..<2) { + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + } + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == 0) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/two/load_two_step.groovy b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/two/load_two_step.groovy new file mode 100644 index 00000000000000..f309aaeba3ebcb --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_load_zstd_c/two/load_two_step.groovy @@ -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. + + +suite("load_two_step") { + def tables = ["customer": ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", 3000, "c_custkey"], + "lineorder": ["""lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", 600572, "lo_orderkey"], + "part": ["""p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", 20000, "p_partkey"], + "date": ["""d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", 255, "d_datekey"], + "supplier": ["""s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy""", 200, "s_suppkey"]] + + tables.each { tableName, rows -> + sql """ DROP TABLE IF EXISTS $tableName """ + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_sequence_create.sql""").text + streamLoad { + table tableName + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', rows[0] + set 'function_column.sequence_col', rows[2] + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + sql 'sync' + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == rows[1]) + } + sql new File("""${context.file.parentFile.parent}/ddl/${tableName}_delete.sql""").text + for (int i = 1; i <= 5; i++) { + def loadRowCount = sql "select count(1) from ${tableName}" + logger.info("select ${tableName} numbers: ${loadRowCount[0][0]}".toString()) + assertTrue(loadRowCount[0][0] == 0) + } + } +} diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql new file mode 100644 index 00000000000000..8240bd709ce371 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_create.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS `customer` ( + `c_custkey` int(11) NOT NULL COMMENT "", + `c_name` varchar(26) NOT NULL COMMENT "", + `c_address` varchar(41) NOT NULL COMMENT "", + `c_city` varchar(11) NOT NULL COMMENT "", + `c_nation` varchar(16) NOT NULL COMMENT "", + `c_region` varchar(13) NOT NULL COMMENT "", + `c_phone` varchar(16) NOT NULL COMMENT "", + `c_mktsegment` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`c_custkey`) +CLUSTER BY (`c_region`, `c_address`, `c_city`, `c_name`) +DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql new file mode 100644 index 00000000000000..68a98512b29d17 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/customer_delete.sql @@ -0,0 +1 @@ +drop table if exists customer; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_create.sql new file mode 100644 index 00000000000000..1ff610fd69022a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_create.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS `date` ( + `d_datekey` int(11) NOT NULL COMMENT "", + `d_date` varchar(20) NOT NULL COMMENT "", + `d_dayofweek` varchar(10) NOT NULL COMMENT "", + `d_month` varchar(11) NOT NULL COMMENT "", + `d_year` int(11) NOT NULL COMMENT "", + `d_yearmonthnum` int(11) NOT NULL COMMENT "", + `d_yearmonth` varchar(9) NOT NULL COMMENT "", + `d_daynuminweek` int(11) NOT NULL COMMENT "", + `d_daynuminmonth` int(11) NOT NULL COMMENT "", + `d_daynuminyear` int(11) NOT NULL COMMENT "", + `d_monthnuminyear` int(11) NOT NULL COMMENT "", + `d_weeknuminyear` int(11) NOT NULL COMMENT "", + `d_sellingseason` varchar(14) NOT NULL COMMENT "", + `d_lastdayinweekfl` int(11) NOT NULL COMMENT "", + `d_lastdayinmonthfl` int(11) NOT NULL COMMENT "", + `d_holidayfl` int(11) NOT NULL COMMENT "", + `d_weekdayfl` int(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`d_datekey`) +CLUSTER BY (`d_weeknuminyear`, `d_month`) +DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql new file mode 100644 index 00000000000000..c6cf155575829f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/date_delete.sql @@ -0,0 +1 @@ +drop table if exists `date`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql new file mode 100644 index 00000000000000..829b8d65bd423a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_create.sql @@ -0,0 +1,36 @@ +CREATE TABLE IF NOT EXISTS `lineorder` ( + `lo_orderdate` int(11) NOT NULL COMMENT "", + `lo_orderkey` bigint(20) NOT NULL COMMENT "", + `lo_linenumber` bigint(20) NOT NULL COMMENT "", + `lo_custkey` int(11) NOT NULL COMMENT "", + `lo_partkey` int(11) NOT NULL COMMENT "", + `lo_suppkey` int(11) NOT NULL COMMENT "", + `lo_orderpriority` varchar(16) NOT NULL COMMENT "", + `lo_shippriority` int(11) NOT NULL COMMENT "", + `lo_quantity` bigint(20) NOT NULL COMMENT "", + `lo_extendedprice` bigint(20) NOT NULL COMMENT "", + `lo_ordtotalprice` bigint(20) NOT NULL COMMENT "", + `lo_discount` bigint(20) NOT NULL COMMENT "", + `lo_revenue` bigint(20) NOT NULL COMMENT "", + `lo_supplycost` bigint(20) NOT NULL COMMENT "", + `lo_tax` bigint(20) NOT NULL COMMENT "", + `lo_commitdate` bigint(20) NOT NULL COMMENT "", + `lo_shipmode` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`lo_orderdate`,`lo_orderkey`,`lo_linenumber`) +CLUSTER BY (`lo_revenue`, `lo_orderdate`, `lo_orderpriority`) +PARTITION BY RANGE(`lo_orderdate`) +(PARTITION p1992 VALUES [("-2147483648"), ("19930101")), +PARTITION p1993 VALUES [("19930101"), ("19940101")), +PARTITION p1994 VALUES [("19940101"), ("19950101")), +PARTITION p1995 VALUES [("19950101"), ("19960101")), +PARTITION p1996 VALUES [("19960101"), ("19970101")), +PARTITION p1997 VALUES [("19970101"), ("19980101")), +PARTITION p1998 VALUES [("19980101"), ("19990101"))) +DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 48 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql new file mode 100644 index 00000000000000..d8f94cfe9fcd8e --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/lineorder_delete.sql @@ -0,0 +1 @@ +drop table if exists lineorder; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_create.sql new file mode 100644 index 00000000000000..9dda02c7b7266e --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_create.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `part` ( + `p_partkey` int(11) NOT NULL COMMENT "", + `p_name` varchar(23) NOT NULL COMMENT "", + `p_mfgr` varchar(7) NOT NULL COMMENT "", + `p_category` varchar(8) NOT NULL COMMENT "", + `p_brand` varchar(10) NOT NULL COMMENT "", + `p_color` varchar(12) NOT NULL COMMENT "", + `p_type` varchar(26) NOT NULL COMMENT "", + `p_size` int(11) NOT NULL COMMENT "", + `p_container` varchar(11) NOT NULL COMMENT "" +) +UNIQUE KEY (`p_partkey`) +CLUSTER BY (`p_color`, `p_container`) +DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql new file mode 100644 index 00000000000000..4ad502e24dc68b --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/part_delete.sql @@ -0,0 +1 @@ +drop table if exists `part`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql new file mode 100644 index 00000000000000..b827e9b6db4b68 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_create.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `supplier` ( + `s_suppkey` int(11) NOT NULL COMMENT "", + `s_name` varchar(26) NOT NULL COMMENT "", + `s_address` varchar(26) NOT NULL COMMENT "", + `s_city` varchar(11) NOT NULL COMMENT "", + `s_nation` varchar(16) NOT NULL COMMENT "", + `s_region` varchar(13) NOT NULL COMMENT "", + `s_phone` varchar(16) NOT NULL COMMENT "" +) +UNIQUE KEY (`s_suppkey`) +CLUSTER BY (`s_address`, `s_name`) +DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 10 +PROPERTIES ( +"compression"="zstd", +"replication_num" = "1", +"disable_auto_compaction" = "true", +"enable_unique_key_merge_on_write" = "true" +); diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql new file mode 100644 index 00000000000000..72e1c39dae174a --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/ddl/supplier_delete.sql @@ -0,0 +1 @@ +drop table if exists `supplier`; \ No newline at end of file diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/load.groovy b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/load.groovy new file mode 100644 index 00000000000000..f348280242c54e --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/load.groovy @@ -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. + +// Most of the cases are copied from https://github.com/trinodb/trino/tree/master +// /testing/trino-product-tests/src/main/resources/sql-tests/testcases +// and modified by Doris. + +// Note: To filter out tables from sql files, use the following one-liner comamnd +// sed -nr 's/.*tables: (.*)$/\1/gp' /path/to/*.sql | sed -nr 's/,/\n/gp' | sort | uniq +suite("load") { + def tables = ["customer", "lineorder", "part", "date", "supplier"] + def columns = ["""c_custkey,c_name,c_address,c_city,c_nation,c_region,c_phone,c_mktsegment,no_use""", + """lo_orderkey,lo_linenumber,lo_custkey,lo_partkey,lo_suppkey,lo_orderdate,lo_orderpriority, + lo_shippriority,lo_quantity,lo_extendedprice,lo_ordtotalprice,lo_discount, + lo_revenue,lo_supplycost,lo_tax,lo_commitdate,lo_shipmode,lo_dummy""", + """p_partkey,p_name,p_mfgr,p_category,p_brand,p_color,p_type,p_size,p_container,p_dummy""", + """d_datekey,d_date,d_dayofweek,d_month,d_year,d_yearmonthnum,d_yearmonth, + d_daynuminweek,d_daynuminmonth,d_daynuminyear,d_monthnuminyear,d_weeknuminyear, + d_sellingseason,d_lastdayinweekfl,d_lastdayinmonthfl,d_holidayfl,d_weekdayfl,d_dummy""", + """s_suppkey,s_name,s_address,s_city,s_nation,s_region,s_phone,s_dummy"""] + + for (String table in tables) { + sql new File("""${context.file.parent}/ddl/${table}_delete.sql""").text + sql new File("""${context.file.parent}/ddl/${table}_create.sql""").text + } + for (int j = 0; j < 10; j++) { + def i = 0 + for (String tableName in tables) { + streamLoad { + // a default db 'regression_test' is specified in + // ${DORIS_HOME}/conf/regression-conf.groovy + table tableName + + // default label is UUID: + // set 'label' UUID.randomUUID().toString() + + // default column_separator is specify in doris fe config, usually is '\t'. + // this line change to ',' + set 'column_separator', '|' + set 'compress_type', 'GZ' + set 'columns', columns[i] + + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/ssb/sf0.1/${tableName}.tbl.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + 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(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + i++ + } + } +} diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.sql new file mode 100644 index 00000000000000..4ef15e93ea2f5f --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.1.sql @@ -0,0 +1,24 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_year = 1993 +AND lo_discount BETWEEN 1 AND 3 +AND lo_quantity < 25; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.sql new file mode 100644 index 00000000000000..1b8442bd939454 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.2.sql @@ -0,0 +1,24 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_yearmonth = 'Jan1994' +AND lo_discount BETWEEN 4 AND 6 +AND lo_quantity BETWEEN 26 AND 35; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.sql new file mode 100644 index 00000000000000..ed6e51b1cfd264 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q1.3.sql @@ -0,0 +1,25 @@ +-- 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. + +SELECT SUM(lo_extendedprice*lo_discount) AS +REVENUE +FROM lineorder, date +WHERE lo_orderdate = d_datekey +AND d_weeknuminyear= 6 +AND d_year = 1994 +AND lo_discount BETWEEN 5 AND 7 +AND lo_quantity BETWEEN 26 AND 35; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.sql new file mode 100644 index 00000000000000..e1a1f52d189e4e --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.1.sql @@ -0,0 +1,26 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_category = 'MFGR#12' +AND s_region = 'AMERICA' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.sql new file mode 100644 index 00000000000000..3db617011947ef --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.2.sql @@ -0,0 +1,27 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_brand BETWEEN 'MFGR#2221' +AND 'MFGR#2228' +AND s_region = 'ASIA' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.sql new file mode 100644 index 00000000000000..b70ca90666b8fe --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q2.3.sql @@ -0,0 +1,26 @@ +-- 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. + +SELECT SUM(lo_revenue), d_year, p_brand +FROM lineorder, date, part, supplier +WHERE lo_orderdate = d_datekey +AND lo_partkey = p_partkey +AND lo_suppkey = s_suppkey +AND p_brand = 'MFGR#2239' +AND s_region = 'EUROPE' +GROUP BY d_year, p_brand +ORDER BY d_year, p_brand; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.sql new file mode 100644 index 00000000000000..70f17d789b45a2 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.1.sql @@ -0,0 +1,28 @@ +-- 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. + +SELECT c_nation, s_nation, d_year, +SUM(lo_revenue) AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND c_region = 'ASIA' +AND s_region = 'ASIA' +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_nation, s_nation, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.sql new file mode 100644 index 00000000000000..a416fbea8b1768 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.2.sql @@ -0,0 +1,28 @@ +-- 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. + +SELECT c_city, s_city, d_year, sum(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND c_nation = 'UNITED STATES' +AND s_nation = 'UNITED STATES' +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.sql new file mode 100644 index 00000000000000..98e29b72e70bf0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.3.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT c_city, s_city, d_year, SUM(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND (c_city='UNITED KI1' +OR c_city='UNITED KI5') +AND (s_city='UNITED KI1' +OR s_city='UNITED KI5') +AND d_year >= 1992 AND d_year <= 1997 +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.sql new file mode 100644 index 00000000000000..65fe992ca4f12b --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q3.4.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT c_city, s_city, d_year, SUM(lo_revenue) +AS REVENUE +FROM customer, lineorder, supplier, date +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_orderdate = d_datekey +AND (c_city='UNITED KI1' +OR c_city='UNITED KI5') +AND (s_city='UNITED KI1' +OR s_city='UNITED KI5') +AND d_yearmonth = 'Dec1997' +GROUP BY c_city, s_city, d_year +ORDER BY d_year ASC, REVENUE DESC; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.sql new file mode 100644 index 00000000000000..bdcd730bf922fe --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.1.sql @@ -0,0 +1,30 @@ +-- 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. + +SELECT d_year, c_nation, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND c_region = 'AMERICA' +AND s_region = 'AMERICA' +AND (p_mfgr = 'MFGR#1' +OR p_mfgr = 'MFGR#2') +GROUP BY d_year, c_nation +ORDER BY d_year, c_nation; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.sql new file mode 100644 index 00000000000000..24c82cf682d155 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.2.sql @@ -0,0 +1,31 @@ +-- 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. + +SELECT d_year, s_nation, p_category, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND c_region = 'AMERICA' +AND s_region = 'AMERICA' +AND (d_year = 1997 OR d_year = 1998) +AND (p_mfgr = 'MFGR#1' +OR p_mfgr = 'MFGR#2') +GROUP BY d_year, s_nation, p_category +ORDER BY d_year, s_nation, p_category; diff --git a/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.sql b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.sql new file mode 100644 index 00000000000000..0dcc08bd26c8ad --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/ssb_unique_sql_zstd_cluster/sql/q4.3.sql @@ -0,0 +1,29 @@ +-- 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. + +SELECT d_year, s_city, p_brand, +SUM(lo_revenue - lo_supplycost) AS PROFIT +FROM date, customer, supplier, part, lineorder +WHERE lo_custkey = c_custkey +AND lo_suppkey = s_suppkey +AND lo_partkey = p_partkey +AND lo_orderdate = d_datekey +AND s_nation = 'UNITED STATES' +AND (d_year = 1997 OR d_year = 1998) +AND p_category = 'MFGR#14' +GROUP BY d_year, s_city, p_brand +ORDER BY d_year, s_city, p_brand; From 8ede80372073e051a4f9b6a8b4e09c89d6fc62ec Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 26 Sep 2023 19:19:13 +0800 Subject: [PATCH 31/64] fix write --- be/src/olap/delete_bitmap_calculator.cpp | 18 ++++++++++-------- be/src/olap/rowset/segment_v2/segment.cpp | 12 +++++++++++- .../olap/rowset/segment_v2/segment_writer.cpp | 1 - be/src/olap/tablet.cpp | 1 - 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index 4124be93bece12..ba091a74decb05 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -107,14 +107,16 @@ bool MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()( if (cmp_result != 0) { return cmp_result > 0; } - // greater sequence value popped first - auto key1_sequence_val = Slice( - key1.get_data() + key1.get_size() - _sequence_length - _rowid_length, _sequence_length); - auto key2_sequence_val = Slice( - key2.get_data() + key2.get_size() - _sequence_length - _rowid_length, _sequence_length); - cmp_result = key1_sequence_val.compare(key2_sequence_val); - if (cmp_result != 0) { - return cmp_result < 0; + if (_sequence_length > 0) { + // greater sequence value popped first + auto key1_sequence_val = + Slice(key1.get_data() + key1_without_seq.get_size() + 1, _sequence_length - 1); + auto key2_sequence_val = + Slice(key2.get_data() + key2_without_seq.get_size() + 1, _sequence_length - 1); + cmp_result = key1_sequence_val.compare(key2_sequence_val); + if (cmp_result != 0) { + return cmp_result < 0; + } } // greater segment id popped first return lhs->segment_id() < rhs->segment_id(); diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index c22939a8c2a0cd..46ff134201c1b2 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -415,7 +415,7 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* } Slice key_without_seq = Slice( - key.get_data(), key.get_size() - (with_seq_col ? seq_col_length : 0) - rowid_length); + key.get_data(), key.get_size() - (with_seq_col ? seq_col_length + rowid_length : 0)); DCHECK(_pk_index_reader != nullptr); if (!_pk_index_reader->check_present(key_without_seq)) { @@ -476,6 +476,16 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* return Status::NotFound("Can't find key in the segment"); } } + if (has_rowid) { + Slice sought_key_without_seq = + Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length - rowid_length); + Slice rowid_slice = Slice( + sought_key.get_data() + sought_key_without_seq.get_size() + seq_col_length + 1, + rowid_length - 1); + const auto* type_info = get_scalar_type_info(); + auto rowid_coder = get_key_coder(type_info->type()); + rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&row_location->row_id); + } return Status::OK(); } diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index c6b42416b2f4ce..7d92ea3b452b70 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -795,7 +795,6 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po } } } - // TODO use cluster keys // create short key indexes' // for min_max key set_min_key(_full_encode_keys(key_columns, 0)); diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 1a852c856e73ea..b49cffacf626b7 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2960,7 +2960,6 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, Slice rowid_slice = Slice(key.get_data() + key_without_seq.get_size() + seq_col_length + 1, rowid_length - 1); - // decode rowid const auto* type_info = get_scalar_type_info(); auto rowid_coder = get_key_coder(type_info->type()); From 3f96b2c6be6917429454c1acdc439bea31d75c84 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 28 Sep 2023 17:39:25 +0800 Subject: [PATCH 32/64] fix write --- be/src/olap/rowset/segment_v2/segment.cpp | 13 +++++++++---- be/src/olap/rowset/segment_v2/segment.h | 4 ++-- .../olap/rowset/segment_v2/segment_writer.cpp | 19 ++++++++++++++----- be/src/olap/tablet.cpp | 4 ++-- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 46ff134201c1b2..8e44873a589ca4 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -284,13 +284,17 @@ Status Segment::load_index() { Status Segment::_load_index_impl() { return _load_index_once.call([this] { + bool load_short_key_index = _tablet_schema->keys_type() != UNIQUE_KEYS || + _pk_index_meta == nullptr || + (_tablet_schema->keys_type() == UNIQUE_KEYS && + !_tablet_schema->cluster_key_idxes().empty()); if (_tablet_schema->keys_type() == UNIQUE_KEYS && _pk_index_meta != nullptr) { _pk_index_reader.reset(new PrimaryKeyIndexReader()); RETURN_IF_ERROR(_pk_index_reader->parse_index(_file_reader, *_pk_index_meta)); _meta_mem_usage += _pk_index_reader->get_memory_size(); _segment_meta_mem_tracker->consume(_pk_index_reader->get_memory_size()); - return Status::OK(); - } else { + } + if (load_short_key_index) { // read and parse short key index page OlapReaderStatistics tmp_stats; PageReadOptions opts { @@ -313,8 +317,9 @@ Status Segment::_load_index_impl() { _meta_mem_usage += body.get_size(); _segment_meta_mem_tracker->consume(body.get_size()); _sk_index_decoder.reset(new ShortKeyIndexDecoder); - return _sk_index_decoder->parse(body, footer.short_key_page_footer()); + RETURN_IF_ERROR(_sk_index_decoder->parse(body, footer.short_key_page_footer())); } + return Status::OK(); }); } @@ -473,7 +478,7 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); // compare key if (key_without_seq.compare(sought_key_without_rowid) != 0) { - return Status::NotFound("Can't find key in the segment"); + return Status::Error("Can't find key in the segment"); } } if (has_rowid) { diff --git a/be/src/olap/rowset/segment_v2/segment.h b/be/src/olap/rowset/segment_v2/segment.h index ea8ab43bd2d27f..527bd5848a77a7 100644 --- a/be/src/olap/rowset/segment_v2/segment.h +++ b/be/src/olap/rowset/segment_v2/segment.h @@ -95,12 +95,12 @@ class Segment : public std::enable_shared_from_this { std::unique_ptr* iter); const ShortKeyIndexDecoder* get_short_key_index() const { - DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); + // DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); return _sk_index_decoder.get(); } const PrimaryKeyIndexReader* get_primary_key_index() const { - DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); + // DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); return _pk_index_reader.get(); } diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 7d92ea3b452b70..0228fad99162bf 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -1007,12 +1007,19 @@ Status SegmentWriter::finalize_columns_index(uint64_t* index_size) { *index_size = _file_writer->bytes_appended() - index_start; if (_has_key) { + bool write_short_key_index = _tablet_schema->keys_type() != UNIQUE_KEYS || + (_tablet_schema->keys_type() == UNIQUE_KEYS && + !_opts.enable_unique_key_merge_on_write) || + (_tablet_schema->keys_type() == UNIQUE_KEYS && + _opts.enable_unique_key_merge_on_write && + !_tablet_schema->cluster_key_idxes().empty()); if (_tablet_schema->keys_type() == UNIQUE_KEYS && _opts.enable_unique_key_merge_on_write) { RETURN_IF_ERROR(_write_primary_key_index()); // IndexedColumnWriter write data pages mixed with segment data, we should use // the stat from primary key index builder. *index_size += _primary_key_index_builder->disk_size(); - } else { + } + if (write_short_key_index) { RETURN_IF_ERROR(_write_short_key_index()); *index_size = _file_writer->bytes_appended() - index_start; } @@ -1155,12 +1162,14 @@ Status SegmentWriter::_write_raw_data(const std::vector& slices) { } Slice SegmentWriter::min_encoded_key() { - return (_primary_key_index_builder == nullptr) ? Slice(_min_key.data(), _min_key.size()) - : _primary_key_index_builder->min_key(); + return (_primary_key_index_builder == nullptr || !_tablet_schema->cluster_key_idxes().empty()) + ? Slice(_min_key.data(), _min_key.size()) + : _primary_key_index_builder->min_key(); } Slice SegmentWriter::max_encoded_key() { - return (_primary_key_index_builder == nullptr) ? Slice(_max_key.data(), _max_key.size()) - : _primary_key_index_builder->max_key(); + return (_primary_key_index_builder == nullptr || !_tablet_schema->cluster_key_idxes().empty()) + ? Slice(_max_key.data(), _max_key.size()) + : _primary_key_index_builder->max_key(); } void SegmentWriter::set_min_max_key(const Slice& key) { diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index b49cffacf626b7..15e0c2263f0a34 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2781,8 +2781,8 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, DCHECK_EQ(segments_key_bounds.size(), num_segments); std::vector picked_segments; for (int i = num_segments - 1; i >= 0; i--) { - if (rowid_length > 0) { - // TODO min max key is sort key, not primary key + // rowid_length > 0 means the key bounds is short key, not primary key + if (rowid_length == 0) { if (key_without_seq.compare(segments_key_bounds[i].max_key()) > 0 || key_without_seq.compare(segments_key_bounds[i].min_key()) < 0) { continue; From 8691d422315e39490b0d71c7ce53cd3455ea4581 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sat, 7 Oct 2023 10:42:01 +0800 Subject: [PATCH 33/64] Check status when get rowid --- be/src/olap/delete_bitmap_calculator.cpp | 3 ++- be/src/olap/rowset/segment_v2/segment.cpp | 3 ++- be/src/olap/tablet.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/be/src/olap/delete_bitmap_calculator.cpp b/be/src/olap/delete_bitmap_calculator.cpp index ba091a74decb05..6f6e0ec8889954 100644 --- a/be/src/olap/delete_bitmap_calculator.cpp +++ b/be/src/olap/delete_bitmap_calculator.cpp @@ -176,7 +176,8 @@ Status MergeIndexDeleteBitmapCalculator::calculate_one(RowLocation& loc) { Slice rowid_slice = Slice(cur_key.get_data() + key_without_seq.get_size() + _seq_col_length + 1, _rowid_length - 1); - _rowid_coder->decode_ascending(&rowid_slice, _rowid_length, (uint8_t*)&loc.row_id); + RETURN_IF_ERROR(_rowid_coder->decode_ascending(&rowid_slice, _rowid_length, + (uint8_t*)&loc.row_id)); } auto st = cur_ctx->advance(); if (st.ok()) { diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 8e44873a589ca4..46812c89c54cb8 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -489,7 +489,8 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* rowid_length - 1); const auto* type_info = get_scalar_type_info(); auto rowid_coder = get_key_coder(type_info->type()); - rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&row_location->row_id); + RETURN_IF_ERROR(rowid_coder->decode_ascending(&rowid_slice, rowid_length, + (uint8_t*)&row_location->row_id)); } return Status::OK(); diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 15e0c2263f0a34..b792b82fd2c841 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2963,7 +2963,8 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, const auto* type_info = get_scalar_type_info(); auto rowid_coder = get_key_coder(type_info->type()); - rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&row_id); + RETURN_IF_ERROR(rowid_coder->decode_ascending(&rowid_slice, rowid_length, + (uint8_t*)&row_id)); } // same row in segments should be filtered if (delete_bitmap->contains({rowset_id, seg->id(), DeleteBitmap::TEMP_VERSION_COMMON}, From 288cd3b4760b275f80f20733909ed43d8a8801d1 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sat, 7 Oct 2023 18:08:05 +0800 Subject: [PATCH 34/64] fix read --- .../rowset/segment_v2/segment_iterator.cpp | 127 +++++++++++++++--- .../olap/rowset/segment_v2/segment_iterator.h | 3 + .../test_unique_mow_sequence.groovy | 4 +- 3 files changed, 114 insertions(+), 20 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 42772a21ae1bee..8534ff88c5a3bb 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -371,23 +371,30 @@ Status SegmentIterator::_get_row_ranges_by_keys() { } RowRanges result_ranges; - for (auto& key_range : _opts.key_ranges) { - rowid_t lower_rowid = 0; - rowid_t upper_rowid = num_rows(); - RETURN_IF_ERROR(_prepare_seek(key_range)); - if (key_range.upper_key != nullptr) { - // If client want to read upper_bound, the include_upper is true. So we - // should get the first ordinal at which key is larger than upper_bound. - // So we call _lookup_ordinal with include_upper's negate - RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, - num_rows(), &upper_rowid)); - } - if (upper_rowid > 0 && key_range.lower_key != nullptr) { - RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, - upper_rowid, &lower_rowid)); - } - auto row_range = RowRanges::create_single(lower_rowid, upper_rowid); - RowRanges::ranges_union(result_ranges, row_range, &result_ranges); + if (_segment->_tablet_schema->cluster_key_idxes().empty()) { + for (auto& key_range : _opts.key_ranges) { + rowid_t lower_rowid = 0; + rowid_t upper_rowid = num_rows(); + RETURN_IF_ERROR(_prepare_seek(key_range)); + if (key_range.upper_key != nullptr) { + // If client want to read upper_bound, the include_upper is true. So we + // should get the first ordinal at which key is larger than upper_bound. + // So we call _lookup_ordinal with include_upper's negate + RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, + num_rows(), &upper_rowid)); + } + if (upper_rowid > 0 && key_range.lower_key != nullptr) { + RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, + upper_rowid, &lower_rowid)); + } + auto row_range = RowRanges::create_single(lower_rowid, upper_rowid); + RowRanges::ranges_union(result_ranges, row_range, &result_ranges); + } + } else { + for (auto& key_range : _opts.key_ranges) { + RETURN_IF_ERROR(_prepare_seek(key_range)); + RETURN_IF_ERROR(_lookup_ordinal(key_range, &result_ranges)); + } } // pre-condition: _row_ranges == [0, num_rows) size_t pre_size = _row_bitmap.cardinality(); @@ -1289,6 +1296,67 @@ Status SegmentIterator::_lookup_ordinal_from_sk_index(const RowCursor& key, bool return Status::OK(); } +Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_range, + RowRanges* result_ranges) { + rowid_t lower_rowid = 0; + rowid_t upper_rowid = num_rows(); + DCHECK(_segment->_tablet_schema->keys_type() == UNIQUE_KEYS && + !_segment->_tablet_schema->cluster_key_idxes().empty() && + _segment->get_primary_key_index() != nullptr); + if (key_range.upper_key != nullptr) { + // If client want to read upper_bound, the include_upper is true. So we + // should get the first ordinal at which key is larger than upper_bound. + // So we call _lookup_ordinal with include_upper's negate + RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, + num_rows(), &upper_rowid)); + } + if (upper_rowid > 0 && key_range.lower_key != nullptr) { + RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, + upper_rowid, &lower_rowid)); + } + DCHECK(lower_rowid <= upper_rowid); + + const PrimaryKeyIndexReader* pk_index_reader = _segment->get_primary_key_index(); + DCHECK(pk_index_reader != nullptr); + std::unique_ptr index_iterator; + RETURN_IF_ERROR(pk_index_reader->new_iterator(&index_iterator)); + auto index_type = vectorized::DataTypeFactory::instance().create_data_type( + pk_index_reader->type_info()->type(), 1, 0); + + bool has_rowid = !_segment->_tablet_schema->cluster_key_idxes().empty(); + size_t rowid_length = 0; + if (has_rowid) { + rowid_length = sizeof(uint32_t) + 1; + } + const auto* type_info = get_scalar_type_info(); + auto rowid_coder = get_key_coder(type_info->type()); + + size_t num_read = 1; + for (auto i = lower_rowid; i < upper_rowid; ++i) { + Status st = index_iterator->seek_to_ordinal(i); + if (st.ok()) { + auto index_column = index_type->create_column(); + RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); + Slice sought_key = + Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); + // get row_id from key + rowid_t rowid = 0; + Slice rowid_slice = Slice(sought_key.get_data() + sought_key.size - rowid_length + 1, + rowid_length - 1); + RETURN_IF_ERROR( + rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&rowid)); + auto row_range = RowRanges::create_single(rowid, rowid + 1); + RowRanges::ranges_union(*result_ranges, row_range, result_ranges); + } else if (st.is()) { + // to the end + return Status::OK(); + } else { + return st; + } + } + return Status::OK(); +} + Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool is_include, rowid_t* rowid) { DCHECK(_segment->_tablet_schema->keys_type() == UNIQUE_KEYS); @@ -1324,6 +1392,12 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool // The sequence column needs to be removed from primary key index when comparing key bool has_seq_col = _segment->_tablet_schema->has_sequence_col(); + bool has_rowid = !_segment->_tablet_schema->cluster_key_idxes().empty(); + size_t rowid_length = 0; + if (has_rowid) { + rowid_length = sizeof(uint32_t) + 1; + } + if (has_seq_col) { size_t seq_col_length = _segment->_tablet_schema->column(_segment->_tablet_schema->sequence_col_idx()) @@ -1340,13 +1414,30 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool Slice sought_key = Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); Slice sought_key_without_seq = - Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length); + Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length - rowid_length); // compare key if (Slice(index_key).compare(sought_key_without_seq) == 0) { exact_match = true; } } + if (!has_seq_col && has_rowid) { + auto index_type = vectorized::DataTypeFactory::instance().create_data_type( + _segment->_pk_index_reader->type_info()->type(), 1, 0); + auto index_column = index_type->create_column(); + size_t num_to_read = 1; + size_t num_read = num_to_read; + RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); + DCHECK(num_to_read == num_read); + + Slice sought_key = Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); + Slice sought_key_without_rowid = + Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); + // compare key + if (Slice(index_key).compare(sought_key_without_rowid) == 0) { + exact_match = true; + } + } // find the key in primary key index, and the is_include is false, so move // to the next row. diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.h b/be/src/olap/rowset/segment_v2/segment_iterator.h index 352929678b3588..ac7ad084629326 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.h +++ b/be/src/olap/rowset/segment_v2/segment_iterator.h @@ -162,7 +162,10 @@ class SegmentIterator : public RowwiseIterator { [[nodiscard]] Status _prepare_seek(const StorageReadOptions::KeyRange& key_range); [[nodiscard]] Status _lookup_ordinal(const RowCursor& key, bool is_include, rowid_t upper_bound, rowid_t* rowid); + [[nodiscard]] Status _lookup_ordinal(const StorageReadOptions::KeyRange& key_range, + RowRanges* result_ranges); // lookup the ordinal of given key from short key index + // the returned rowid is rowid in primary index, not the rowid encoded in primary key [[nodiscard]] Status _lookup_ordinal_from_sk_index(const RowCursor& key, bool is_include, rowid_t upper_bound, rowid_t* rowid); // lookup the ordinal of given key from primary key index diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy index 80bbe053f58c27..a7e3ef1f87f5f9 100644 --- a/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy @@ -72,7 +72,7 @@ suite("test_unique_mow_sequence") { sql "sync" // TODO - /*order_qt_sql "select * from $tableName where c_custkey < 6;" + order_qt_sql "select * from $tableName where c_custkey < 6;" order_qt_sql "select * from $tableName where c_custkey > 2995;" @@ -82,5 +82,5 @@ suite("test_unique_mow_sequence") { qt_sql "select * from $tableName where c_custkey = 3001;" - qt_sql "select * from $tableName where c_custkey = 0;"*/ + qt_sql "select * from $tableName where c_custkey = 0;" } From aacb6454470cc3d6958a1ee7199bf4cfae59f76b Mon Sep 17 00:00:00 2001 From: meiyi Date: Sat, 7 Oct 2023 19:52:06 +0800 Subject: [PATCH 35/64] improve --- .../rowset/segment_v2/segment_iterator.cpp | 21 ++++++++++--------- .../olap/rowset/segment_v2/segment_iterator.h | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 8534ff88c5a3bb..3fa057c0978dff 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -370,8 +370,10 @@ Status SegmentIterator::_get_row_ranges_by_keys() { return Status::OK(); } - RowRanges result_ranges; + // pre-condition: _row_ranges == [0, num_rows) + size_t pre_size = _row_bitmap.cardinality(); if (_segment->_tablet_schema->cluster_key_idxes().empty()) { + RowRanges result_ranges; for (auto& key_range : _opts.key_ranges) { rowid_t lower_rowid = 0; rowid_t upper_rowid = num_rows(); @@ -390,15 +392,15 @@ Status SegmentIterator::_get_row_ranges_by_keys() { auto row_range = RowRanges::create_single(lower_rowid, upper_rowid); RowRanges::ranges_union(result_ranges, row_range, &result_ranges); } + _row_bitmap = RowRanges::ranges_to_roaring(result_ranges); } else { + roaring::Roaring row_bitmap; for (auto& key_range : _opts.key_ranges) { RETURN_IF_ERROR(_prepare_seek(key_range)); - RETURN_IF_ERROR(_lookup_ordinal(key_range, &result_ranges)); + RETURN_IF_ERROR(_lookup_ordinal(key_range, &row_bitmap)); } + _row_bitmap = row_bitmap; } - // pre-condition: _row_ranges == [0, num_rows) - size_t pre_size = _row_bitmap.cardinality(); - _row_bitmap = RowRanges::ranges_to_roaring(result_ranges); _opts.stats->rows_key_range_filtered += (pre_size - _row_bitmap.cardinality()); return Status::OK(); @@ -1297,7 +1299,7 @@ Status SegmentIterator::_lookup_ordinal_from_sk_index(const RowCursor& key, bool } Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_range, - RowRanges* result_ranges) { + roaring::Roaring* row_bitmap) { rowid_t lower_rowid = 0; rowid_t upper_rowid = num_rows(); DCHECK(_segment->_tablet_schema->keys_type() == UNIQUE_KEYS && @@ -1332,8 +1334,8 @@ Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_ auto rowid_coder = get_key_coder(type_info->type()); size_t num_read = 1; - for (auto i = lower_rowid; i < upper_rowid; ++i) { - Status st = index_iterator->seek_to_ordinal(i); + for (auto cur_rowid = lower_rowid; cur_rowid < upper_rowid; ++cur_rowid) { + Status st = index_iterator->seek_to_ordinal(cur_rowid); if (st.ok()) { auto index_column = index_type->create_column(); RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); @@ -1345,8 +1347,7 @@ Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_ rowid_length - 1); RETURN_IF_ERROR( rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&rowid)); - auto row_range = RowRanges::create_single(rowid, rowid + 1); - RowRanges::ranges_union(*result_ranges, row_range, result_ranges); + row_bitmap->add(rowid); } else if (st.is()) { // to the end return Status::OK(); diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.h b/be/src/olap/rowset/segment_v2/segment_iterator.h index ac7ad084629326..2ab2dbe23c6c5e 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.h +++ b/be/src/olap/rowset/segment_v2/segment_iterator.h @@ -163,7 +163,7 @@ class SegmentIterator : public RowwiseIterator { [[nodiscard]] Status _lookup_ordinal(const RowCursor& key, bool is_include, rowid_t upper_bound, rowid_t* rowid); [[nodiscard]] Status _lookup_ordinal(const StorageReadOptions::KeyRange& key_range, - RowRanges* result_ranges); + roaring::Roaring* row_bitmap); // lookup the ordinal of given key from short key index // the returned rowid is rowid in primary index, not the rowid encoded in primary key [[nodiscard]] Status _lookup_ordinal_from_sk_index(const RowCursor& key, bool is_include, From 87bfda9f9efe66294542a3809c560ef248a4f962 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sat, 7 Oct 2023 22:52:36 +0800 Subject: [PATCH 36/64] fix be format --- be/src/olap/rowset/segment_v2/segment_iterator.cpp | 11 ++++++----- 1 file changed, 6 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 3fa057c0978dff..a894f88f02cda6 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -1309,12 +1309,12 @@ Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_ // If client want to read upper_bound, the include_upper is true. So we // should get the first ordinal at which key is larger than upper_bound. // So we call _lookup_ordinal with include_upper's negate - RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, - num_rows(), &upper_rowid)); + RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, num_rows(), + &upper_rowid)); } if (upper_rowid > 0 && key_range.lower_key != nullptr) { - RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, - upper_rowid, &lower_rowid)); + RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, upper_rowid, + &lower_rowid)); } DCHECK(lower_rowid <= upper_rowid); @@ -1431,7 +1431,8 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); DCHECK(num_to_read == num_read); - Slice sought_key = Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); + Slice sought_key = + Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); Slice sought_key_without_rowid = Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); // compare key From 6d9db37b81dd7f493a8c1daab95c4f0527fce6e6 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sun, 8 Oct 2023 09:58:19 +0800 Subject: [PATCH 37/64] improve get pk row range --- be/src/olap/rowset/segment_v2/segment_iterator.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index a894f88f02cda6..22f6274ea01ab4 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -1317,6 +1317,10 @@ Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_ &lower_rowid)); } DCHECK(lower_rowid <= upper_rowid); + if (lower_rowid == 0 && upper_rowid == num_rows()) { + row_bitmap->addRange(lower_rowid, upper_rowid); + return Status::OK(); + } const PrimaryKeyIndexReader* pk_index_reader = _segment->get_primary_key_index(); DCHECK(pk_index_reader != nullptr); From 373eedbe8d2c254d46fc5ed236bd75f685201e26 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sun, 8 Oct 2023 10:35:24 +0800 Subject: [PATCH 38/64] Add p2 regression --- .../test_pk_uk_case_cluster.groovy | 258 ++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 regression-test/suites/unique_with_mow_p2/test_pk_uk_case_cluster.groovy diff --git a/regression-test/suites/unique_with_mow_p2/test_pk_uk_case_cluster.groovy b/regression-test/suites/unique_with_mow_p2/test_pk_uk_case_cluster.groovy new file mode 100644 index 00000000000000..ec124132760d4c --- /dev/null +++ b/regression-test/suites/unique_with_mow_p2/test_pk_uk_case_cluster.groovy @@ -0,0 +1,258 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods; +import java.util.Random; +import org.apache.commons.lang.RandomStringUtils; +import java.util.Date; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.UUID; +import java.time.format.DateTimeFormatter; + +suite("test_pk_uk_case_cluster") { + def tableNamePk = "primary_key_pk_uk_cluster" + def tableNameUk = "unique_key_pk_uk_cluster" + + onFinish { + try_sql("DROP TABLE IF EXISTS ${tableNamePk}") + try_sql("DROP TABLE IF EXISTS ${tableNameUk}") + } + + sql """ DROP TABLE IF EXISTS ${tableNamePk} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableNamePk} ( + L_ORDERKEY INTEGER NOT NULL, + L_PARTKEY INTEGER NOT NULL, + L_SUPPKEY INTEGER NOT NULL, + L_LINENUMBER INTEGER NOT NULL, + L_QUANTITY DECIMAL(15,2) NOT NULL, + L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, + L_DISCOUNT DECIMAL(15,2) NOT NULL, + L_TAX DECIMAL(15,2) NOT NULL, + L_RETURNFLAG CHAR(1) NOT NULL, + L_LINESTATUS CHAR(1) NOT NULL, + L_SHIPDATE DATE NOT NULL, + L_COMMITDATE DATE NOT NULL, + L_RECEIPTDATE DATE NOT NULL, + L_SHIPINSTRUCT CHAR(60) NOT NULL, + L_SHIPMODE CHAR(60) NOT NULL, + L_COMMENT VARCHAR(60) NOT NULL + ) + UNIQUE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER) + CLUSTER BY (L_PARTKEY, L_SUPPKEY, L_SHIPDATE) + DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ) + """ + + sql """ DROP TABLE IF EXISTS ${tableNameUk} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableNameUk} ( + L_ORDERKEY INTEGER NOT NULL, + L_PARTKEY INTEGER NOT NULL, + L_SUPPKEY INTEGER NOT NULL, + L_LINENUMBER INTEGER NOT NULL, + L_QUANTITY DECIMAL(15,2) NOT NULL, + L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, + L_DISCOUNT DECIMAL(15,2) NOT NULL, + L_TAX DECIMAL(15,2) NOT NULL, + L_RETURNFLAG CHAR(1) NOT NULL, + L_LINESTATUS CHAR(1) NOT NULL, + L_SHIPDATE DATE NOT NULL, + L_COMMITDATE DATE NOT NULL, + L_RECEIPTDATE DATE NOT NULL, + L_SHIPINSTRUCT CHAR(60) NOT NULL, + L_SHIPMODE CHAR(60) NOT NULL, + L_COMMENT VARCHAR(60) NOT NULL + ) + UNIQUE KEY(L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER) + DISTRIBUTED BY HASH(L_ORDERKEY) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "false" + ) + """ + + Random rd = new Random() + def order_key = rd.nextInt(1000) + def part_key = rd.nextInt(1000) + def sub_key = 13 + def line_num = 29 + def decimal = rd.nextInt(1000) + 0.11 + def city = RandomStringUtils.randomAlphabetic(10) + def name = UUID.randomUUID().toString() + def date = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now()) + for (int idx = 0; idx < 500; idx++) { + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, + $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + // insert batch key + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + city = RandomStringUtils.randomAlphabetic(10) + name = UUID.randomUUID().toString() + sql """ INSERT INTO ${tableNamePk} VALUES + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + sql """ INSERT INTO ${tableNameUk} VALUES + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city'), + ($order_key, $part_key, $sub_key, $line_num, $decimal, $decimal, $decimal, $decimal, '1', '1', '$date', '$date', '$date', '$name', '$name', '$city') + """ + + sql "sync" + + // count(*) + def result0 = sql """ SELECT count(*) FROM ${tableNamePk}; """ + def result1 = sql """ SELECT count(*) FROM ${tableNameUk}; """ + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + assertTrue(result0[0]==result1[0]) + if (result0[0][0]!=result1[0][0]) { + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + } + + result0 = sql """ SELECT + l_returnflag, + l_linestatus, + sum(l_quantity) AS sum_qty, + sum(l_extendedprice) AS sum_base_price, + sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + avg(l_quantity) AS avg_qty, + avg(l_extendedprice) AS avg_price, + avg(l_discount) AS avg_disc, + count(*) AS count_order + FROM + ${tableNamePk} + GROUP BY + l_returnflag, + l_linestatus + ORDER BY + l_returnflag, + l_linestatus + """ + result1 = sql """ SELECT + l_returnflag, + l_linestatus, + sum(l_quantity) AS sum_qty, + sum(l_extendedprice) AS sum_base_price, + sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + avg(l_quantity) AS avg_qty, + avg(l_extendedprice) AS avg_price, + avg(l_discount) AS avg_disc, + count(*) AS count_order + FROM + ${tableNameUk} + GROUP BY + l_returnflag, + l_linestatus + ORDER BY + l_returnflag, + l_linestatus + """ + assertTrue(result0.size()==result1.size()) + for (int i = 0; i < result0.size(); ++i) { + for (j = 0; j < result0[0].size(); j++) { + logger.info("result: " + result0[i][j] + "|" + result1[i][j]) + assertTrue(result0[i][j]==result1[i][j]) + } + } + + // delete + if (idx % 10 == 0) { + order_key = rd.nextInt(10) + part_key = rd.nextInt(10) + result0 = sql """ SELECT count(*) FROM ${tableNamePk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key; """ + result1 = sql """ SELECT count(*) FROM ${tableNameUk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key""" + logger.info("result:" + result0[0][0] + "|" + result1[0][0]) + sql "DELETE FROM ${tableNamePk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key" + sql "DELETE FROM ${tableNameUk} where L_ORDERKEY < $order_key and L_PARTKEY < $part_key" + } + } +} From 6251ba5a7f4859bd896b61277c295bd261fc89c7 Mon Sep 17 00:00:00 2001 From: meiyi Date: Sun, 8 Oct 2023 12:05:16 +0800 Subject: [PATCH 39/64] Support point query --- be/src/olap/rowset/segment_v2/segment.cpp | 8 +- be/src/olap/rowset/segment_v2/segment.h | 3 +- be/src/olap/tablet.cpp | 11 +- be/src/olap/tablet.h | 2 +- be/src/service/point_query_executor.cpp | 2 +- .../test_point_query_cluster_key.out | 85 +++++++ .../test_point_query_cluster_key.groovy | 234 ++++++++++++++++++ 7 files changed, 334 insertions(+), 11 deletions(-) create mode 100644 regression-test/data/point_query_p0/test_point_query_cluster_key.out create mode 100644 regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 46812c89c54cb8..fb3cd3ebaac008 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -406,7 +406,8 @@ Status Segment::new_inverted_index_iterator(const TabletColumn& tablet_column, return Status::OK(); } -Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* row_location) { +Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, bool with_rowid, + RowLocation* row_location) { RETURN_IF_ERROR(load_pk_index_and_bf()); bool has_seq_col = _tablet_schema->has_sequence_col(); bool has_rowid = !_tablet_schema->cluster_key_idxes().empty(); @@ -419,8 +420,9 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* rowid_length = sizeof(uint32_t) + 1; } - Slice key_without_seq = Slice( - key.get_data(), key.get_size() - (with_seq_col ? seq_col_length + rowid_length : 0)); + Slice key_without_seq = + Slice(key.get_data(), key.get_size() - (with_seq_col ? seq_col_length : 0) - + (with_rowid ? rowid_length : 0)); DCHECK(_pk_index_reader != nullptr); if (!_pk_index_reader->check_present(key_without_seq)) { diff --git a/be/src/olap/rowset/segment_v2/segment.h b/be/src/olap/rowset/segment_v2/segment.h index 527bd5848a77a7..d5ddbe65cd4c39 100644 --- a/be/src/olap/rowset/segment_v2/segment.h +++ b/be/src/olap/rowset/segment_v2/segment.h @@ -104,7 +104,8 @@ class Segment : public std::enable_shared_from_this { return _pk_index_reader.get(); } - Status lookup_row_key(const Slice& key, bool with_seq_col, RowLocation* row_location); + Status lookup_row_key(const Slice& key, bool with_seq_col, bool with_rowid, + RowLocation* row_location); Status read_key_by_rowid(uint32_t row_id, std::string* key); diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index b792b82fd2c841..bd7d19c83db6a4 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2757,7 +2757,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, const std::vector& specified_rowsets, RowLocation* row_location, uint32_t version, std::vector>& segment_caches, - RowsetSharedPtr* rowset) { + RowsetSharedPtr* rowset, bool with_rowid) { SCOPED_BVAR_LATENCY(g_tablet_lookup_rowkey_latency); size_t seq_col_length = 0; if (_tablet_meta->tablet_schema()->has_sequence_col() && with_seq_col) { @@ -2767,7 +2767,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, 1; } size_t rowid_length = 0; - if (!_schema->cluster_key_idxes().empty()) { + if (with_rowid && !_schema->cluster_key_idxes().empty()) { rowid_length = sizeof(uint32_t) + 1; } Slice key_without_seq = @@ -2781,8 +2781,9 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, DCHECK_EQ(segments_key_bounds.size(), num_segments); std::vector picked_segments; for (int i = num_segments - 1; i >= 0; i--) { - // rowid_length > 0 means the key bounds is short key, not primary key - if (rowid_length == 0) { + // If mow table has cluster keys, the key bounds is short keys, not primary keys + // use PrimaryKeyIndexMetaPB in primary key index? + if (_schema->cluster_key_idxes().empty()) { if (key_without_seq.compare(segments_key_bounds[i].max_key()) > 0 || key_without_seq.compare(segments_key_bounds[i].min_key()) < 0) { continue; @@ -2803,7 +2804,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, DCHECK_EQ(segments.size(), num_segments); for (auto id : picked_segments) { - Status s = segments[id]->lookup_row_key(encoded_key, with_seq_col, &loc); + Status s = segments[id]->lookup_row_key(encoded_key, with_seq_col, with_rowid, &loc); if (s.is()) { continue; } diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h index 5efeb25dd7ca1d..374f67c2bc5c16 100644 --- a/be/src/olap/tablet.h +++ b/be/src/olap/tablet.h @@ -411,7 +411,7 @@ class Tablet final : public BaseTablet { const std::vector& specified_rowsets, RowLocation* row_location, uint32_t version, std::vector>& segment_caches, - RowsetSharedPtr* rowset = nullptr); + RowsetSharedPtr* rowset = nullptr, bool with_rowid = true); // Lookup a row with TupleDescriptor and fill Block Status lookup_row_data(const Slice& encoded_key, const RowLocation& row_location, diff --git a/be/src/service/point_query_executor.cpp b/be/src/service/point_query_executor.cpp index 12e1f9f67736fa..4974bcc40b4a89 100644 --- a/be/src/service/point_query_executor.cpp +++ b/be/src/service/point_query_executor.cpp @@ -286,7 +286,7 @@ Status PointQueryExecutor::_lookup_row_key() { auto rowset_ptr = std::make_unique(); st = (_tablet->lookup_row_key(_row_read_ctxs[i]._primary_key, false, specified_rowsets, &location, INT32_MAX /*rethink?*/, segment_caches, - rowset_ptr.get())); + rowset_ptr.get(), false)); if (st.is()) { continue; } diff --git a/regression-test/data/point_query_p0/test_point_query_cluster_key.out b/regression-test/data/point_query_p0/test_point_query_cluster_key.out new file mode 100644 index 00000000000000..e6f5ad49e69a2b --- /dev/null +++ b/regression-test/data/point_query_p0/test_point_query_cluster_key.out @@ -0,0 +1,85 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] + +-- !point_select -- +1232 12222.991211350 xxx laooq 2023-01-02 2020-01-01 12:36:38 522.762 2022-01-01 true 212.111 \N \N + +-- !point_select -- +251 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 251.0 7022-01-01 true 90696620686827832.374 [11111.000000000] [] + +-- !point_select -- +252 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 252.0 7022-01-01 false 90696620686827832.374 \N [0.000000000] + +-- !point_select -- +298 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 298.0 7022-01-01 true 90696620686827832.374 [] [] + +-- !point_select -- +1235 991129292901.111380000 dd \N 2120-01-02 2020-01-01 12:36:38 652.692 5022-01-01 false 90696620686827832.374 [119181.111100000] ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +6120202020646464 6C616F6F71 32.92200050354004 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +0 1 2 3 + diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy new file mode 100644 index 00000000000000..0d69fbedaeb9cc --- /dev/null +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -0,0 +1,234 @@ +// 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.math.BigDecimal; + +suite("test_point_query_cluster_key") { + + // nereids do not support point query now + sql """set enable_nereids_planner=false""" + + def user = context.config.jdbcUser + def password = context.config.jdbcPassword + def realDb = "regression_test_serving_p0" + def tableName = realDb + ".tbl_point_query_cluster_key" + sql "CREATE DATABASE IF NOT EXISTS ${realDb}" + + // Parse url + String jdbcUrl = context.config.jdbcUrl + String urlWithoutSchema = jdbcUrl.substring(jdbcUrl.indexOf("://") + 3) + def sql_ip = urlWithoutSchema.substring(0, urlWithoutSchema.indexOf(":")) + def sql_port + if (urlWithoutSchema.indexOf("/") >= 0) { + // e.g: jdbc:mysql://locahost:8080/?a=b + sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1, urlWithoutSchema.indexOf("/")) + } else { + // e.g: jdbc:mysql://locahost:8080 + sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1) + } + // set server side prepared statment url + def url="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true" + + def generateString = {len -> + def str = "" + for (int i = 0; i < len; i++) { + str += "a" + } + return str + } + + sql """DROP TABLE IF EXISTS ${tableName}""" + test { + // abnormal case + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int NULL COMMENT "" + ) ENGINE=OLAP + UNIQUE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "store_row_column" = "true", + "light_schema_change" = "false" + ) + """ + exception "errCode = 2, detailMessage = Row store column rely on light schema change, enable light schema change first" + } + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int(11) NULL COMMENT "", + `k2` decimalv3(27, 9) NULL COMMENT "", + `k3` varchar(300) NULL COMMENT "", + `k4` varchar(30) NULL COMMENT "", + `k5` date NULL COMMENT "", + `k6` datetime NULL COMMENT "", + `k7` float NULL COMMENT "", + `k8` datev2 NULL COMMENT "", + `k9` boolean NULL COMMENT "", + `k10` decimalv3(20, 3) NULL COMMENT "", + `k11` array NULL COMMENT "", + `k12` array NULL COMMENT "" + ) ENGINE=OLAP + UNIQUE KEY(`k1`, `k2`, `k3`) + CLUSTER BY(`k9`, `k5`, `k4`, `k2`) + DISTRIBUTED BY HASH(`k1`, k2, k3) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "store_row_column" = "true", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "storage_format" = "V2" + ) + """ + sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """ + sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """ + sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """ + sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """ + sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """ + sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """ + sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """ + sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """ + + def nprep_sql = {sql_str-> + def url_without_prep ="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + connect(user=user, password=password, url=url_without_prep) { + sql sql_str + } + } + // def url = context.config.jdbcUrl + def result1 = connect(user=user, password=password, url=url) { + def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1237) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, "a ddd") + qe_point_select stmt + + stmt.setInt(1, 1232) + stmt.setBigDecimal(2, new BigDecimal("12222.99121135")) + stmt.setString(3, 'xxx') + qe_point_select stmt + + stmt.setInt(1, 251) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(251)) + qe_point_select stmt + + stmt.setInt(1, 252) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(252)) + qe_point_select stmt + + stmt.setInt(1, 298) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(298)) + qe_point_select stmt + stmt.close() + + stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setBigDecimal(1, new BigDecimal("991129292901.11138")) + stmt.setString(2, "dd") + qe_point_select stmt + + def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?" + assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt_fn.setInt(1, 1231) + stmt_fn.setBigDecimal(2, new BigDecimal("119291.11")) + stmt_fn.setString(3, "ddd") + qe_point_select stmt_fn + qe_point_select stmt_fn + qe_point_select stmt_fn + + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column0 INT default "0"; + """ + sleep(1); + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """ + stmt.setBigDecimal(1, new BigDecimal("120939.11130")) + stmt.setString(2, "a ddd") + qe_point_select stmt + qe_point_select stmt + // invalidate cache + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """ + qe_point_select stmt + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + """ + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} DROP COLUMN new_column1; + """ + qe_point_select stmt + qe_point_select stmt + + // sql """ + // ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + // """ + // qe_point_select stmt + } + // disable useServerPrepStmts + url = context.config.jdbcUrl + def result2 = connect(user=user, password=password, url=url) { + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + // prepared text + sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """ + qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')""" + + sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" + qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" + tableName = "test_query" + sql """DROP TABLE IF EXISTS ${tableName}""" + sql """CREATE TABLE ${tableName} ( + `customer_key` bigint(20) NULL, + `customer_btm_value_0` text NULL, + `customer_btm_value_1` text NULL, + `customer_btm_value_2` text NULL + ) ENGINE=OLAP + UNIQUE KEY(`customer_key`) + CLUSTER BY(`customer_btm_value_1`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "light_schema_change" = "true", + "store_row_column" = "true", + "enable_unique_key_merge_on_write" = "true", + "disable_auto_compaction" = "false" + );""" + sql """insert into ${tableName} values (0, "1", "2", "3")""" + qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + } +} From 384bf64b3d5c27e8323383d80f045c51298682ac Mon Sep 17 00:00:00 2001 From: meiyi Date: Sun, 8 Oct 2023 17:39:29 +0800 Subject: [PATCH 40/64] Fix read bug --- be/src/olap/rowset/segment_v2/segment_iterator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 22f6274ea01ab4..6301a2b70bbbbc 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -372,7 +372,9 @@ Status SegmentIterator::_get_row_ranges_by_keys() { // pre-condition: _row_ranges == [0, num_rows) size_t pre_size = _row_bitmap.cardinality(); - if (_segment->_tablet_schema->cluster_key_idxes().empty()) { + if (_segment->_tablet_schema->keys_type() != KeysType::UNIQUE_KEYS || + (_segment->_tablet_schema->keys_type() == KeysType::UNIQUE_KEYS && + _segment->_tablet_schema->cluster_key_idxes().empty())) { RowRanges result_ranges; for (auto& key_range : _opts.key_ranges) { rowid_t lower_rowid = 0; From 6edd2676dbba1ecb38028b5f3fd7bab2dfee8e3e Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 12 Oct 2023 17:19:55 +0800 Subject: [PATCH 41/64] Modify point query regression --- .../test_point_query_cluster_key.out | 168 ++++++++++ .../test_point_query_cluster_key.groovy | 311 +++++++++--------- 2 files changed, 323 insertions(+), 156 deletions(-) diff --git a/regression-test/data/point_query_p0/test_point_query_cluster_key.out b/regression-test/data/point_query_p0/test_point_query_cluster_key.out index e6f5ad49e69a2b..b5a2aaa9cb615e 100644 --- a/regression-test/data/point_query_p0/test_point_query_cluster_key.out +++ b/regression-test/data/point_query_p0/test_point_query_cluster_key.out @@ -83,3 +83,171 @@ -- !sql -- 0 1 2 3 +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] + +-- !point_select -- +1232 12222.991211350 xxx laooq 2023-01-02 2020-01-01 12:36:38 522.762 2022-01-01 true 212.111 \N \N + +-- !point_select -- +251 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 251.0 7022-01-01 true 90696620686827832.374 [11111.000000000] [] + +-- !point_select -- +252 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 252.0 7022-01-01 false 90696620686827832.374 \N [0.000000000] + +-- !point_select -- +298 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 298.0 7022-01-01 true 90696620686827832.374 [] [] + +-- !point_select -- +1235 991129292901.111380000 dd \N 2120-01-02 2020-01-01 12:36:38 652.692 5022-01-01 false 90696620686827832.374 [119181.111100000] ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +6120202020646464 6C616F6F71 32.92200050354004 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +0 1 2 3 + +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] + +-- !point_select -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] + +-- !point_select -- +1232 12222.991211350 xxx laooq 2023-01-02 2020-01-01 12:36:38 522.762 2022-01-01 true 212.111 \N \N + +-- !point_select -- +251 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 251.0 7022-01-01 true 90696620686827832.374 [11111.000000000] [] + +-- !point_select -- +252 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 252.0 7022-01-01 false 90696620686827832.374 \N [0.000000000] + +-- !point_select -- +298 120939.111300000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa laooq 2030-01-02 2020-01-01 12:36:38 298.0 7022-01-01 true 90696620686827832.374 [] [] + +-- !point_select -- +1235 991129292901.111380000 dd \N 2120-01-02 2020-01-01 12:36:38 652.692 5022-01-01 false 90696620686827832.374 [119181.111100000] ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +646464 6C616F6F71 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 true 1.111 [119291.192910000] ["111", "222", "333"] 1 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +6120202020646464 6C616F6F71 32.92200050354004 + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N + +-- !sql -- +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N + +-- !sql -- +0 1 2 3 + diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy index 0d69fbedaeb9cc..264acc2b3f8312 100644 --- a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -40,8 +40,8 @@ suite("test_point_query_cluster_key") { // e.g: jdbc:mysql://locahost:8080 sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1) } - // set server side prepared statment url - def url="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true" + // set server side prepared statement url + def prepare_url = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true" def generateString = {len -> def str = "" @@ -51,24 +51,15 @@ suite("test_point_query_cluster_key") { return str } - sql """DROP TABLE IF EXISTS ${tableName}""" - test { - // abnormal case - sql """ - CREATE TABLE IF NOT EXISTS ${tableName} ( - `k1` int NULL COMMENT "" - ) ENGINE=OLAP - UNIQUE KEY(`k1`) - DISTRIBUTED BY HASH(`k1`) BUCKETS 1 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "store_row_column" = "true", - "light_schema_change" = "false" - ) - """ - exception "errCode = 2, detailMessage = Row store column rely on light schema change, enable light schema change first" + def nprep_sql = { sql_str -> + def url_without_prep = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + connect(user = user, password = password, url = url_without_prep) { + sql sql_str + } } - sql """ + + def create_table_sql = { property -> + return String.format(""" CREATE TABLE IF NOT EXISTS ${tableName} ( `k1` int(11) NULL COMMENT "", `k2` decimalv3(27, 9) NULL COMMENT "", @@ -91,144 +82,152 @@ suite("test_point_query_cluster_key") { "store_row_column" = "true", "enable_unique_key_merge_on_write" = "true", "light_schema_change" = "true", - "storage_format" = "V2" - ) - """ - sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """ - sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """ - sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """ - sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """ - sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """ - sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """ - sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """ - sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """ - sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """ - sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """ - - def nprep_sql = {sql_str-> - def url_without_prep ="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb - connect(user=user, password=password, url=url_without_prep) { - sql sql_str - } + %s + "storage_format" = "V2") + """, property) } - // def url = context.config.jdbcUrl - def result1 = connect(user=user, password=password, url=url) { - def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?" - assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt.setInt(1, 1231) - stmt.setBigDecimal(2, new BigDecimal("119291.11")) - stmt.setString(3, "ddd") - qe_point_select stmt - stmt.setInt(1, 1231) - stmt.setBigDecimal(2, new BigDecimal("119291.11")) - stmt.setString(3, "ddd") - qe_point_select stmt - stmt.setInt(1, 1237) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, "a ddd") - qe_point_select stmt - - stmt.setInt(1, 1232) - stmt.setBigDecimal(2, new BigDecimal("12222.99121135")) - stmt.setString(3, 'xxx') - qe_point_select stmt - - stmt.setInt(1, 251) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(251)) - qe_point_select stmt - - stmt.setInt(1, 252) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(252)) - qe_point_select stmt - - stmt.setInt(1, 298) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(298)) - qe_point_select stmt - stmt.close() - - stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?" - assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt.setBigDecimal(1, new BigDecimal("991129292901.11138")) - stmt.setString(2, "dd") - qe_point_select stmt - - def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?" - assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt_fn.setInt(1, 1231) - stmt_fn.setBigDecimal(2, new BigDecimal("119291.11")) - stmt_fn.setString(3, "ddd") - qe_point_select stmt_fn - qe_point_select stmt_fn - qe_point_select stmt_fn - - nprep_sql """ - ALTER table ${tableName} ADD COLUMN new_column0 INT default "0"; - """ - sleep(1); - nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """ - stmt.setBigDecimal(1, new BigDecimal("120939.11130")) - stmt.setString(2, "a ddd") - qe_point_select stmt - qe_point_select stmt - // invalidate cache - nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """ - qe_point_select stmt - qe_point_select stmt - qe_point_select stmt - nprep_sql """ - ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; - """ - qe_point_select stmt - qe_point_select stmt - nprep_sql """ - ALTER table ${tableName} DROP COLUMN new_column1; - """ - qe_point_select stmt - qe_point_select stmt - - // sql """ - // ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; - // """ - // qe_point_select stmt - } - // disable useServerPrepStmts - url = context.config.jdbcUrl - def result2 = connect(user=user, password=password, url=url) { - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'""" - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" - // prepared text - sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """ - qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')""" - qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')""" - - sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" - qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" - qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" - tableName = "test_query" + + for (int i = 0; i < 3; i++) { + tableName = realDb + ".tbl_point_query" + i sql """DROP TABLE IF EXISTS ${tableName}""" - sql """CREATE TABLE ${tableName} ( - `customer_key` bigint(20) NULL, - `customer_btm_value_0` text NULL, - `customer_btm_value_1` text NULL, - `customer_btm_value_2` text NULL - ) ENGINE=OLAP - UNIQUE KEY(`customer_key`) - CLUSTER BY(`customer_btm_value_1`) - COMMENT 'OLAP' - DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "storage_format" = "V2", - "light_schema_change" = "true", - "store_row_column" = "true", - "enable_unique_key_merge_on_write" = "true", - "disable_auto_compaction" = "false" - );""" - sql """insert into ${tableName} values (0, "1", "2", "3")""" - qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + if (i == 0) { + def sql0 = create_table_sql("") + sql """ ${sql0} """ + } else if (i == 1) { + def sql1 = create_table_sql("\"function_column.sequence_type\" = 'int',") + sql """ ${sql1} """ + } else { + def sql2 = create_table_sql("\"function_column.sequence_col\" = 'k6',") + sql """ ${sql2} """ + } + sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """ + sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """ + sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """ + sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """ + sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """ + sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """ + sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """ + sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """ + + def result1 = connect(user=user, password=password, url=prepare_url) { + def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1237) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, "a ddd") + qe_point_select stmt + + stmt.setInt(1, 1232) + stmt.setBigDecimal(2, new BigDecimal("12222.99121135")) + stmt.setString(3, 'xxx') + qe_point_select stmt + + stmt.setInt(1, 251) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(251)) + qe_point_select stmt + + stmt.setInt(1, 252) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(252)) + qe_point_select stmt + + stmt.setInt(1, 298) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(298)) + qe_point_select stmt + stmt.close() + + stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setBigDecimal(1, new BigDecimal("991129292901.11138")) + stmt.setString(2, "dd") + qe_point_select stmt + + def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?" + assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt_fn.setInt(1, 1231) + stmt_fn.setBigDecimal(2, new BigDecimal("119291.11")) + stmt_fn.setString(3, "ddd") + qe_point_select stmt_fn + qe_point_select stmt_fn + qe_point_select stmt_fn + + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column0 INT default "0"; + """ + sleep(1); + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """ + stmt.setBigDecimal(1, new BigDecimal("120939.11130")) + stmt.setString(2, "a ddd") + qe_point_select stmt + qe_point_select stmt + // invalidate cache + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """ + qe_point_select stmt + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + """ + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} DROP COLUMN new_column1; + """ + qe_point_select stmt + qe_point_select stmt + + // sql """ + // ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + // """ + // qe_point_select stmt + } + // disable useServerPrepStmts + def result2 = connect(user=user, password=password, url=context.config.jdbcUrl) { + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + // prepared text + sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """ + qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')""" + + sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" + qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" + tableName = "test_query" + sql """DROP TABLE IF EXISTS ${tableName}""" + sql """CREATE TABLE ${tableName} ( + `customer_key` bigint(20) NULL, + `customer_btm_value_0` text NULL, + `customer_btm_value_1` text NULL, + `customer_btm_value_2` text NULL + ) ENGINE=OLAP + UNIQUE KEY(`customer_key`) + CLUSTER BY(`customer_btm_value_1`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "light_schema_change" = "true", + "store_row_column" = "true", + "enable_unique_key_merge_on_write" = "true", + "disable_auto_compaction" = "false" + );""" + sql """insert into ${tableName} values (0, "1", "2", "3")""" + qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + } } } From 08b65dc4dbb59023c4655a42fd9407d135ab69bd Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 25 Oct 2023 16:52:04 +0800 Subject: [PATCH 42/64] Fix rebase compile error --- be/src/olap/tablet.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index bd7d19c83db6a4..3d630066d5ba72 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2767,7 +2767,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, 1; } size_t rowid_length = 0; - if (with_rowid && !_schema->cluster_key_idxes().empty()) { + if (with_rowid && !_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { rowid_length = sizeof(uint32_t) + 1; } Slice key_without_seq = @@ -2783,7 +2783,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, for (int i = num_segments - 1; i >= 0; i--) { // If mow table has cluster keys, the key bounds is short keys, not primary keys // use PrimaryKeyIndexMetaPB in primary key index? - if (_schema->cluster_key_idxes().empty()) { + if (_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { if (key_without_seq.compare(segments_key_bounds[i].max_key()) > 0 || key_without_seq.compare(segments_key_bounds[i].min_key()) < 0) { continue; @@ -2950,10 +2950,14 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, Slice key = Slice(index_column->get_data_at(i).data, index_column->get_data_at(i).size); RowLocation loc; // calculate row id - if (!_schema->cluster_key_idxes().empty()) { + if (!_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { size_t seq_col_length = 0; - if (_schema->has_sequence_col()) { - seq_col_length = _schema->column(_schema->sequence_col_idx()).length() + 1; + if (_tablet_meta->tablet_schema()->has_sequence_col()) { + seq_col_length = + _tablet_meta->tablet_schema() + ->column(_tablet_meta->tablet_schema()->sequence_col_idx()) + .length() + + 1; } size_t rowid_length = sizeof(uint32_t) + 1; Slice key_without_seq = From e13bd2a24ba6efc7266060d099f4bcb873bc2592 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 25 Oct 2023 17:21:18 +0800 Subject: [PATCH 43/64] Fix point query out --- .../test_point_query_cluster_key.out | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/regression-test/data/point_query_p0/test_point_query_cluster_key.out b/regression-test/data/point_query_p0/test_point_query_cluster_key.out index b5a2aaa9cb615e..71a6c480d4b09c 100644 --- a/regression-test/data/point_query_p0/test_point_query_cluster_key.out +++ b/regression-test/data/point_query_p0/test_point_query_cluster_key.out @@ -48,10 +48,10 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 @@ -59,26 +59,29 @@ -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 + -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 0 1 2 3 @@ -132,10 +135,10 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 @@ -143,26 +146,29 @@ -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 + -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 0 1 2 3 @@ -216,10 +222,10 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- -1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] \N 5630 0 +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 @@ -227,26 +233,29 @@ -- !point_select -- 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 +-- !point_select -- +1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 + -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N \N +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 -- !sql -- -1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] \N +1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- 0 1 2 3 From d5c82d329a806cacee9d5f158db4b31bbca79422 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 26 Oct 2023 11:56:04 +0800 Subject: [PATCH 44/64] Support schema change --- .../doris/alter/SchemaChangeHandler.java | 23 +- .../cluster_key/test_schema_change.out | 159 +++++++++ .../cluster_key/test_schema_change.groovy | 334 ++++++++++++++++++ 3 files changed, 505 insertions(+), 11 deletions(-) create mode 100644 regression-test/data/unique_with_mow_p0/cluster_key/test_schema_change.out create mode 100644 regression-test/suites/unique_with_mow_p0/cluster_key/test_schema_change.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index 3a6cae64027522..e77e7f11d2257a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -310,24 +310,19 @@ private boolean processDropColumn(DropColumnClause alterClause, OlapTable olapTa */ if (KeysType.UNIQUE_KEYS == olapTable.getKeysType()) { List baseSchema = indexSchemaMap.get(baseIndexId); - boolean isKey = false; for (Column column : baseSchema) { - if (column.isKey() && column.getName().equalsIgnoreCase(dropColName)) { - lightSchemaChange = false; - isKey = true; - break; + if (column.getName().equalsIgnoreCase(dropColName)) { + if (column.isKey()) { + throw new DdlException("Can not drop key column in Unique data model table"); + } else if (column.isClusterKey()) { + throw new DdlException("Can not drop cluster key column in Unique data model table"); + } } } - - if (isKey) { - throw new DdlException("Can not drop key column in Unique data model table"); - } - if (olapTable.hasSequenceCol() && dropColName.equalsIgnoreCase(olapTable.getSequenceMapCol())) { throw new DdlException("Can not drop sequence mapping column[" + dropColName + "] in Unique data model table[" + olapTable.getName() + "]"); } - } else if (KeysType.AGG_KEYS == olapTable.getKeysType()) { if (null == targetIndexName) { // drop column in base table @@ -595,6 +590,9 @@ private boolean processModifyColumn(ModifyColumnClause alterClause, OlapTable ol col.checkSchemaChangeAllowed(modColumn); lightSchemaChange = olapTable.getEnableLightSchemaChange(); } + if (col.isClusterKey()) { + throw new DdlException("Can not modify cluster key column: " + col.getName()); + } } } if (hasColPos) { @@ -808,6 +806,9 @@ private void processReorderColumn(ReorderColumnsClause alterClause, OlapTable ol if (!column.isVisible()) { newSchema.add(column); } + if (column.isClusterKey()) { + throw new DdlException("Can not modify column order in Unique data model table"); + } } } if (newSchema.size() != targetIndexSchema.size()) { diff --git a/regression-test/data/unique_with_mow_p0/cluster_key/test_schema_change.out b/regression-test/data/unique_with_mow_p0/cluster_key/test_schema_change.out new file mode 100644 index 00000000000000..7381d98730f204 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/cluster_key/test_schema_change.out @@ -0,0 +1,159 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 20 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 21 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +5 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 20 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 21 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +7 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 20 +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 21 +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 + +-- !sql -- +7 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +1 2017-10-01 Beijing 10 1 2020-01-01T00:00 2020-01-01T00:00 1 \N 30 20 +2 2017-10-01 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 1 \N 31 21 +3 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 20 +4 2017-10-01 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 1 \N 32 22 +5 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +6 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 22 +7 2017-10-01 Beijing 10 1 \N 2020-01-05T00:00 1 \N 34 25 + +-- !sql -- +6 2017-10-01 Beijing 10 1 \N \N 2020-01-05T00:00 1 \N 34 22 + diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_schema_change.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_schema_change.groovy new file mode 100644 index 00000000000000..3dafd0d0a845c0 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_schema_change.groovy @@ -0,0 +1,334 @@ +// 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_schema_change") { + def tableName = "test_schema_change" + onFinish { + // try_sql("DROP TABLE IF EXISTS ${tableName}") + } + + def getAlterTableState = { + def retry = 0 + while (true) { + sleep(2000) + def state = sql "show alter table column where tablename = '${tableName}' order by CreateTime desc " + logger.info("alter table state: ${state}") + if (state.size()> 0 && state[0][9] == "FINISHED") { + return true + } + retry++ + if (retry >= 10) { + return false + } + } + return false + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `comment` VARCHAR(5), + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `city`, `age`, `sex`) + CLUSTER BY(`cost`, `comment`) + DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + // 1. add a value column(any position after key column) + for (int i = 0; i < 2; i++) { + if (i == 1) { + sql """ alter table ${tableName} ADD column score int after sex; """ + assertTrue(getAlterTableState(), "add column should success") + } + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (1, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (2, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (3, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2020-01-03', 1, 32, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (4, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 21) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + qt_sql """ + SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 5; + """ + + qt_sql """ SELECT COUNT(*) FROM ${tableName};""" + + // insert a new key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (6, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert batch key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 22), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 23), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 24), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, NULL, '2020-01-05', 1, 34, 25) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + qt_sql """ + SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_visit_date`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 6 and sex = 1 ORDER BY user_id; + """ + } + + // 2. drop a value column + sql """ alter table ${tableName} DROP column last_visit_date; """ + assertTrue(getAlterTableState(), "drop column should success"); + { + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (1, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (2, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (3, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', 1, 32, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (4, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 6 and sex = 1 ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 21) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 5; """ + + qt_sql """ SELECT COUNT(*) FROM ${tableName};""" + + // insert a new key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (6, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert batch key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 23), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 24), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 25) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + qt_sql """ SELECT * FROM ${tableName} t + where user_id = 6 and sex = 1 ORDER BY user_id; """ + } + + // 3.0 add a cluster key key column is not support + // 3.1 drop a cluster key column is not support + // unique table key column also can not be dropped: Can not drop key column in Unique data model table + test { + sql """ alter table ${tableName} DROP column cost; """ + exception "Can not drop cluster key column in Unique data model table" + } + + // 4. modify a cluster key column + test { + sql """ alter table ${tableName} MODIFY column `comment` varchar(20); """ + exception "Can not modify cluster key column" + } + + // 5. modify column order should success (Temporarily throw exception) + test { + sql """ + alter table ${tableName} ORDER BY (`user_id`, `date`, `city`, `age`, `sex`, `max_dwell_time`, `comment`, `min_dwell_time`, `last_visit_date_not_null`, `cost`, `score`, `last_update_date`); + """ + exception "Can not modify column order in Unique data model table" + } + /*assertTrue(getAlterTableState(), "alter column order should success"); + { + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (1, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (2, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (3, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', 1, 32, 20) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (4, '2017-10-01', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 6 and sex = 1 ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 21) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert a duplicate key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (5, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t where user_id = 5; """ + + qt_sql """ SELECT COUNT(*) FROM ${tableName};""" + + // insert a new key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES (6, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + + // insert batch key + sql """ INSERT INTO ${tableName} + (`user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, + `cost`, `max_dwell_time`, `min_dwell_time`) + VALUES + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 22), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 23), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 24), + (7, '2017-10-01', 'Beijing', 10, 1, NULL, '2020-01-05', 1, 34, 25) + """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t ORDER BY user_id; """ + qt_sql """ SELECT `user_id`, `date`, `city`, `age`, `sex`, `last_update_date`, `last_visit_date_not_null`, `cost`, `comment`, `max_dwell_time`, `min_dwell_time` FROM ${tableName} t + where user_id = 6 and sex = 1 ORDER BY user_id; """ + }*/ +} From ebac9bba7f5d0e942e9a9e3f99827571c9357005 Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 30 Oct 2023 15:13:12 +0800 Subject: [PATCH 45/64] fix read --- .../rowset/segment_v2/segment_iterator.cpp | 116 ++++-------------- .../olap/rowset/segment_v2/segment_iterator.h | 2 - .../apache/doris/planner/OlapScanNode.java | 4 + .../test_unique_mow_sequence.groovy | 1 - 4 files changed, 25 insertions(+), 98 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 6301a2b70bbbbc..49517560bb5249 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -332,7 +332,8 @@ Status SegmentIterator::_lazy_init() { DorisMetrics::instance()->segment_read_total->increment(1); _row_bitmap.addRange(0, _segment->num_rows()); // z-order can not use prefix index - if (_segment->_tablet_schema->sort_type() != SortType::ZORDER) { + if (_segment->_tablet_schema->sort_type() != SortType::ZORDER && + _segment->_tablet_schema->cluster_key_idxes().empty()) { RETURN_IF_ERROR(_get_row_ranges_by_keys()); } RETURN_IF_ERROR(_get_row_ranges_by_column_conditions()); @@ -370,39 +371,28 @@ Status SegmentIterator::_get_row_ranges_by_keys() { return Status::OK(); } - // pre-condition: _row_ranges == [0, num_rows) - size_t pre_size = _row_bitmap.cardinality(); - if (_segment->_tablet_schema->keys_type() != KeysType::UNIQUE_KEYS || - (_segment->_tablet_schema->keys_type() == KeysType::UNIQUE_KEYS && - _segment->_tablet_schema->cluster_key_idxes().empty())) { - RowRanges result_ranges; - for (auto& key_range : _opts.key_ranges) { - rowid_t lower_rowid = 0; - rowid_t upper_rowid = num_rows(); - RETURN_IF_ERROR(_prepare_seek(key_range)); - if (key_range.upper_key != nullptr) { - // If client want to read upper_bound, the include_upper is true. So we - // should get the first ordinal at which key is larger than upper_bound. - // So we call _lookup_ordinal with include_upper's negate - RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, - num_rows(), &upper_rowid)); - } - if (upper_rowid > 0 && key_range.lower_key != nullptr) { - RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, - upper_rowid, &lower_rowid)); - } - auto row_range = RowRanges::create_single(lower_rowid, upper_rowid); - RowRanges::ranges_union(result_ranges, row_range, &result_ranges); + RowRanges result_ranges; + for (auto& key_range : _opts.key_ranges) { + rowid_t lower_rowid = 0; + rowid_t upper_rowid = num_rows(); + RETURN_IF_ERROR(_prepare_seek(key_range)); + if (key_range.upper_key != nullptr) { + // If client want to read upper_bound, the include_upper is true. So we + // should get the first ordinal at which key is larger than upper_bound. + // So we call _lookup_ordinal with include_upper's negate + RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, + num_rows(), &upper_rowid)); } - _row_bitmap = RowRanges::ranges_to_roaring(result_ranges); - } else { - roaring::Roaring row_bitmap; - for (auto& key_range : _opts.key_ranges) { - RETURN_IF_ERROR(_prepare_seek(key_range)); - RETURN_IF_ERROR(_lookup_ordinal(key_range, &row_bitmap)); + if (upper_rowid > 0 && key_range.lower_key != nullptr) { + RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, + upper_rowid, &lower_rowid)); } - _row_bitmap = row_bitmap; + auto row_range = RowRanges::create_single(lower_rowid, upper_rowid); + RowRanges::ranges_union(result_ranges, row_range, &result_ranges); } + // pre-condition: _row_ranges == [0, num_rows) + size_t pre_size = _row_bitmap.cardinality(); + _row_bitmap = RowRanges::ranges_to_roaring(result_ranges); _opts.stats->rows_key_range_filtered += (pre_size - _row_bitmap.cardinality()); return Status::OK(); @@ -1300,70 +1290,6 @@ Status SegmentIterator::_lookup_ordinal_from_sk_index(const RowCursor& key, bool return Status::OK(); } -Status SegmentIterator::_lookup_ordinal(const StorageReadOptions::KeyRange& key_range, - roaring::Roaring* row_bitmap) { - rowid_t lower_rowid = 0; - rowid_t upper_rowid = num_rows(); - DCHECK(_segment->_tablet_schema->keys_type() == UNIQUE_KEYS && - !_segment->_tablet_schema->cluster_key_idxes().empty() && - _segment->get_primary_key_index() != nullptr); - if (key_range.upper_key != nullptr) { - // If client want to read upper_bound, the include_upper is true. So we - // should get the first ordinal at which key is larger than upper_bound. - // So we call _lookup_ordinal with include_upper's negate - RETURN_IF_ERROR(_lookup_ordinal(*key_range.upper_key, !key_range.include_upper, num_rows(), - &upper_rowid)); - } - if (upper_rowid > 0 && key_range.lower_key != nullptr) { - RETURN_IF_ERROR(_lookup_ordinal(*key_range.lower_key, key_range.include_lower, upper_rowid, - &lower_rowid)); - } - DCHECK(lower_rowid <= upper_rowid); - if (lower_rowid == 0 && upper_rowid == num_rows()) { - row_bitmap->addRange(lower_rowid, upper_rowid); - return Status::OK(); - } - - const PrimaryKeyIndexReader* pk_index_reader = _segment->get_primary_key_index(); - DCHECK(pk_index_reader != nullptr); - std::unique_ptr index_iterator; - RETURN_IF_ERROR(pk_index_reader->new_iterator(&index_iterator)); - auto index_type = vectorized::DataTypeFactory::instance().create_data_type( - pk_index_reader->type_info()->type(), 1, 0); - - bool has_rowid = !_segment->_tablet_schema->cluster_key_idxes().empty(); - size_t rowid_length = 0; - if (has_rowid) { - rowid_length = sizeof(uint32_t) + 1; - } - const auto* type_info = get_scalar_type_info(); - auto rowid_coder = get_key_coder(type_info->type()); - - size_t num_read = 1; - for (auto cur_rowid = lower_rowid; cur_rowid < upper_rowid; ++cur_rowid) { - Status st = index_iterator->seek_to_ordinal(cur_rowid); - if (st.ok()) { - auto index_column = index_type->create_column(); - RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); - Slice sought_key = - Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); - // get row_id from key - rowid_t rowid = 0; - Slice rowid_slice = Slice(sought_key.get_data() + sought_key.size - rowid_length + 1, - rowid_length - 1); - RETURN_IF_ERROR( - rowid_coder->decode_ascending(&rowid_slice, rowid_length, (uint8_t*)&rowid)); - row_bitmap->add(rowid); - } else if (st.is()) { - // to the end - return Status::OK(); - } else { - return st; - } - } - return Status::OK(); -} - Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool is_include, rowid_t* rowid) { DCHECK(_segment->_tablet_schema->keys_type() == UNIQUE_KEYS); diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.h b/be/src/olap/rowset/segment_v2/segment_iterator.h index 2ab2dbe23c6c5e..32d13369151f8d 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.h +++ b/be/src/olap/rowset/segment_v2/segment_iterator.h @@ -162,8 +162,6 @@ class SegmentIterator : public RowwiseIterator { [[nodiscard]] Status _prepare_seek(const StorageReadOptions::KeyRange& key_range); [[nodiscard]] Status _lookup_ordinal(const RowCursor& key, bool is_include, rowid_t upper_bound, rowid_t* rowid); - [[nodiscard]] Status _lookup_ordinal(const StorageReadOptions::KeyRange& key_range, - roaring::Roaring* row_bitmap); // lookup the ordinal of given key from short key index // the returned rowid is rowid in primary index, not the rowid encoded in primary key [[nodiscard]] Status _lookup_ordinal_from_sk_index(const RowCursor& key, bool is_include, 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 96d8c08f129090..530a9a78305bba 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 @@ -1391,6 +1391,10 @@ protected void toThrift(TPlanNode msg) { } msg.node_type = TPlanNodeType.OLAP_SCAN_NODE; + if (olapTable.getBaseSchema().stream().anyMatch(Column::isClusterKey)) { + keyColumnNames.clear(); + keyColumnTypes.clear(); + } msg.olap_scan_node = new TOlapScanNode(desc.getId().asInt(), keyColumnNames, keyColumnTypes, isPreAggregation); msg.olap_scan_node.setColumnsDesc(columnsDesc); msg.olap_scan_node.setIndexesDesc(indexDesc); diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy index a7e3ef1f87f5f9..c3ded30c048be1 100644 --- a/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_unique_mow_sequence.groovy @@ -71,7 +71,6 @@ suite("test_unique_mow_sequence") { sql "sync" - // TODO order_qt_sql "select * from $tableName where c_custkey < 6;" order_qt_sql "select * from $tableName where c_custkey > 2995;" From 35746c0c33234ee6c7c51b7ba3f3dea0022fb964 Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 30 Oct 2023 17:36:26 +0800 Subject: [PATCH 46/64] fix be ut --- be/test/olap/primary_key_index_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/test/olap/primary_key_index_test.cpp b/be/test/olap/primary_key_index_test.cpp index 6d3b19efb32199..a88614f0541ef7 100644 --- a/be/test/olap/primary_key_index_test.cpp +++ b/be/test/olap/primary_key_index_test.cpp @@ -174,7 +174,7 @@ TEST_F(PrimaryKeyIndexTest, multiple_pages) { EXPECT_TRUE(fs->create_file(filename, &file_writer).ok()); config::primary_key_data_page_size = 5 * 5; - PrimaryKeyIndexBuilder builder(file_writer.get(), 0); + PrimaryKeyIndexBuilder builder(file_writer.get(), 0, 0); static_cast(builder.init()); size_t num_rows = 0; std::vector keys {"00000", "00002", "00004", "00006", "00008", @@ -258,7 +258,7 @@ TEST_F(PrimaryKeyIndexTest, single_page) { EXPECT_TRUE(fs->create_file(filename, &file_writer).ok()); config::primary_key_data_page_size = 32768; - PrimaryKeyIndexBuilder builder(file_writer.get(), 0); + PrimaryKeyIndexBuilder builder(file_writer.get(), 0, 0); static_cast(builder.init()); size_t num_rows = 0; std::vector keys {"00000", "00002", "00004", "00006", "00008", From cc8d2da40d95278d2cdeaef0f106f5daa810151d Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 31 Oct 2023 10:24:33 +0800 Subject: [PATCH 47/64] support row compaction --- be/src/olap/compaction.cpp | 3 +- be/src/olap/merger.cpp | 3 + .../test_compaction_uniq_keys_cluster_key.out | 13 ++ ...st_compaction_uniq_keys_cluster_key.groovy | 161 ++++++++++++++++++ 4 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 regression-test/data/compaction/test_compaction_uniq_keys_cluster_key.out create mode 100644 regression-test/suites/compaction/test_compaction_uniq_keys_cluster_key.groovy diff --git a/be/src/olap/compaction.cpp b/be/src/olap/compaction.cpp index b57e6dcdc58c30..47d607518e1783 100644 --- a/be/src/olap/compaction.cpp +++ b/be/src/olap/compaction.cpp @@ -660,7 +660,8 @@ Status Compaction::modify_rowsets(const Merger::Statistics* stats) { output_rowsets.push_back(_output_rowset); if (_tablet->keys_type() == KeysType::UNIQUE_KEYS && - _tablet->enable_unique_key_merge_on_write()) { + _tablet->enable_unique_key_merge_on_write() && + _tablet->tablet_schema()->cluster_key_idxes().empty()) { Version version = _tablet->max_version(); DeleteBitmap output_rowset_delete_bitmap(_tablet->tablet_id()); std::set missed_rows; diff --git a/be/src/olap/merger.cpp b/be/src/olap/merger.cpp index 82f1662d010857..6a869c2556b352 100644 --- a/be/src/olap/merger.cpp +++ b/be/src/olap/merger.cpp @@ -79,6 +79,9 @@ Status Merger::vmerge_rowsets(TabletSharedPtr tablet, ReaderType reader_type, merge_tablet_schema->merge_dropped_columns(*del_pred_rs->tablet_schema()); } reader_params.tablet_schema = merge_tablet_schema; + if (!tablet->tablet_schema()->cluster_key_idxes().empty()) { + reader_params.delete_bitmap = &tablet->tablet_meta()->delete_bitmap(); + } if (stats_output && stats_output->rowid_conversion) { reader_params.record_rowids = true; diff --git a/regression-test/data/compaction/test_compaction_uniq_keys_cluster_key.out b/regression-test/data/compaction/test_compaction_uniq_keys_cluster_key.out new file mode 100644 index 00000000000000..0ab6761ce2ff5e --- /dev/null +++ b/regression-test/data/compaction/test_compaction_uniq_keys_cluster_key.out @@ -0,0 +1,13 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_default -- +1 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2017-10-01T11:11:11.160 2017-10-01T11:11:11.100111 2020-01-02T00:00 1 31 19 +2 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2017-10-01T11:11:11.140 2017-10-01T11:11:11.120111 2020-01-03T00:00 1 32 20 +3 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 +4 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 + +-- !select_default2 -- +1 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 2020-01-02T00:00 2020-01-02T00:00 2017-10-01T11:11:11.160 2017-10-01T11:11:11.100111 2020-01-02T00:00 1 31 19 +2 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2017-10-01T11:11:11.140 2017-10-01T11:11:11.120111 2020-01-03T00:00 1 32 20 +3 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 +4 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 + diff --git a/regression-test/suites/compaction/test_compaction_uniq_keys_cluster_key.groovy b/regression-test/suites/compaction/test_compaction_uniq_keys_cluster_key.groovy new file mode 100644 index 00000000000000..39d485c35f3158 --- /dev/null +++ b/regression-test/suites/compaction/test_compaction_uniq_keys_cluster_key.groovy @@ -0,0 +1,161 @@ +// 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_compaction_uniq_keys_cluster_key") { + def tableName = "compaction_uniq_keys_cluster_key" + + try { + String backend_id; + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + 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 + + boolean disableAutoCompaction = true + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + } + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `datev2` DATEV2 NOT NULL COMMENT "数据灌入日期时间", + `datetimev2_1` DATETIMEV2(3) NOT NULL COMMENT "数据灌入日期时间", + `datetimev2_2` DATETIMEV2(6) NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `datetime_val1` DATETIMEV2(3) DEFAULT "1970-01-01 00:00:00.111" COMMENT "用户最后一次访问时间", + `datetime_val2` DATETIME(6) DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `datev2`, `datetimev2_1`, `datetimev2_2`, `city`, `age`, `sex`) + CLUSTER BY(`last_visit_date_not_null`, `age`, `sex`, `city`) + DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2017-10-01 11:11:11.170000', '2017-10-01 11:11:11.110111', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2017-10-01 11:11:11.160000', '2017-10-01 11:11:11.100111', '2020-01-02', 1, 31, 19) + """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2017-10-01 11:11:11.150000', '2017-10-01 11:11:11.130111', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2017-10-01 11:11:11.140000', '2017-10-01 11:11:11.120111', '2020-01-03', 1, 32, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2017-10-01 11:11:11.100000', '2017-10-01 11:11:11.140111', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-04', '2020-01-04', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.150111', '2020-01-04', 1, 33, 21) + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, NULL, NULL, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (4, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, NULL, NULL, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_select_default """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,QueryHits,PathHash,MetaUrl,CompactionStatus + String[][] tablets = sql """ show tablets from ${tableName}; """ + + // trigger compactions for all tablets in ${tableName} + for (String[] tablet in tablets) { + String tablet_id = tablet[0] + backend_id = tablet[2] + (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()) + if (compactJson.status.toLowerCase() == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactJson.status.toLowerCase()) + } + } + + // wait for all compactions done + for (String[] tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet[0] + backend_id = tablet[2] + (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + + int rowCount = 0 + for (String[] tablet in tablets) { + String tablet_id = tablet[0] + def compactionStatusUrlIndex = 18 + (code, out, err) = curl("GET", tablet[compactionStatusUrlIndex]) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + for (String rowset in (List) tabletJson.rowsets) { + rowCount += Integer.parseInt(rowset.split(" ")[1]) + } + } + assert (rowCount < 8) + qt_select_default2 """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + } finally { + // try_sql("DROP TABLE IF EXISTS ${tableName}") + } +} From ad57b4038d4b77d4c863c1b964eff30a8690c469 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 31 Oct 2023 11:52:47 +0800 Subject: [PATCH 48/64] add compaction regression case --- ...mpaction_uniq_cluster_keys_with_delete.out | 15 ++ ...ction_uniq_cluster_keys_with_delete.groovy | 177 ++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 regression-test/data/compaction/test_compaction_uniq_cluster_keys_with_delete.out create mode 100644 regression-test/suites/compaction/test_compaction_uniq_cluster_keys_with_delete.groovy diff --git a/regression-test/data/compaction/test_compaction_uniq_cluster_keys_with_delete.out b/regression-test/data/compaction/test_compaction_uniq_cluster_keys_with_delete.out new file mode 100644 index 00000000000000..ea06a5aa3c74ca --- /dev/null +++ b/regression-test/data/compaction/test_compaction_uniq_cluster_keys_with_delete.out @@ -0,0 +1,15 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_default -- +2 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 2020-01-03T00:00 2020-01-03T00:00 2017-10-01T11:11:11.140 2017-10-01T11:11:11.120111 2020-01-03T00:00 1 32 20 + +-- !select_default1 -- +3 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 + +-- !select_default2 -- +3 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 +4 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 + +-- !select_default3 -- +3 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 +4 2017-10-01 2017-10-01 2017-10-01T11:11:11.110 2017-10-01T11:11:11.110111 Beijing 10 1 \N \N \N \N 2020-01-05T00:00 1 34 20 + diff --git a/regression-test/suites/compaction/test_compaction_uniq_cluster_keys_with_delete.groovy b/regression-test/suites/compaction/test_compaction_uniq_cluster_keys_with_delete.groovy new file mode 100644 index 00000000000000..dc6cfe72082233 --- /dev/null +++ b/regression-test/suites/compaction/test_compaction_uniq_cluster_keys_with_delete.groovy @@ -0,0 +1,177 @@ +// 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_compaction_uniq_cluster_keys_with_delete") { + def tableName = "test_compaction_uniq_cluster_keys_with_delete" + + try { + String backend_id; + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + 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 + + boolean disableAutoCompaction = true + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + } + } + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `datev2` DATEV2 NOT NULL COMMENT "数据灌入日期时间", + `datetimev2_1` DATETIMEV2(3) NOT NULL COMMENT "数据灌入日期时间", + `datetimev2_2` DATETIMEV2(6) NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `datetime_val1` DATETIMEV2(3) DEFAULT "1970-01-01 00:00:00.111" COMMENT "用户最后一次访问时间", + `datetime_val2` DATETIME(6) DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `datev2`, `datetimev2_1`, `datetimev2_2`, `city`, `age`, `sex`) + CLUSTER BY(`sex`, `date`, `cost`) + DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( + "replication_num" = "1", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2017-10-01 11:11:11.170000', '2017-10-01 11:11:11.110111', '2020-01-01', 1, 30, 20) + """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2017-10-01 11:11:11.160000', '2017-10-01 11:11:11.100111', '2020-01-02', 1, 31, 19) + """ + + sql """ + DELETE FROM ${tableName} where user_id <= 5 + """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2017-10-01 11:11:11.150000', '2017-10-01 11:11:11.130111', '2020-01-02', 1, 31, 21) + """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2017-10-01 11:11:11.140000', '2017-10-01 11:11:11.120111', '2020-01-03', 1, 32, 20) + """ + + sql """ + DELETE FROM ${tableName} where user_id <= 1 + """ + + qt_select_default """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-03', '2020-01-03', '2017-10-01 11:11:11.100000', '2017-10-01 11:11:11.140111', '2020-01-03', 1, 32, 22) + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, '2020-01-04', '2020-01-04', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.150111', '2020-01-04', 1, 33, 21) + """ + + sql """ + DELETE FROM ${tableName} where user_id <= 2 + """ + + sql """ INSERT INTO ${tableName} VALUES + (3, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, NULL, NULL, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_select_default1 """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + + sql """ INSERT INTO ${tableName} VALUES + (4, '2017-10-01', '2017-10-01', '2017-10-01 11:11:11.110000', '2017-10-01 11:11:11.110111', 'Beijing', 10, 1, NULL, NULL, NULL, NULL, '2020-01-05', 1, 34, 20) + """ + + qt_select_default2 """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + String[][] tablets = sql """ show tablets from ${tableName}; """ + + // trigger compactions for all tablets in ${tableName} + for (String[] tablet in tablets) { + String tablet_id = tablet[0] + backend_id = tablet[2] + (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()) + if (compactJson.status.toLowerCase() == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactJson.status.toLowerCase()) + } + } + + // wait for all compactions done + for (String[] tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet[0] + backend_id = tablet[2] + (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + + int rowCount = 0 + for (String[] tablet in tablets) { + String tablet_id = tablet[0] + def compactionStatusUrlIndex = 18 + (code, out, err) = curl("GET", tablet[compactionStatusUrlIndex]) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + for (String rowset in (List) tabletJson.rowsets) { + rowCount += Integer.parseInt(rowset.split(" ")[1]) + } + } + assert (rowCount < 8) + qt_select_default3 """ SELECT * FROM ${tableName} t ORDER BY user_id; """ + } finally { + try_sql("DROP TABLE IF EXISTS ${tableName}") + } +} From 5ecf38a1f68980d7b467126d13d6dfb21b9b9603 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 31 Oct 2023 15:21:44 +0800 Subject: [PATCH 49/64] support vertical compaction --- be/src/olap/merger.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/be/src/olap/merger.cpp b/be/src/olap/merger.cpp index 6a869c2556b352..cad20e42f59ce3 100644 --- a/be/src/olap/merger.cpp +++ b/be/src/olap/merger.cpp @@ -167,6 +167,13 @@ void Merger::vertical_split_columns(TabletSchemaSPtr tablet_schema, if (delete_sign_idx != -1) { key_columns.emplace_back(delete_sign_idx); } + if (!tablet_schema->cluster_key_idxes().empty()) { + for (const auto& cid : tablet_schema->cluster_key_idxes()) { + if (cid >= num_key_cols) { + key_columns.emplace_back(cid); + } + } + } } VLOG_NOTICE << "sequence_col_idx=" << sequence_col_idx << ", delete_sign_idx=" << delete_sign_idx; @@ -176,7 +183,8 @@ void Merger::vertical_split_columns(TabletSchemaSPtr tablet_schema, } std::vector value_columns; for (auto i = num_key_cols; i < total_cols; ++i) { - if (i == sequence_col_idx || i == delete_sign_idx) { + if (i == sequence_col_idx || i == delete_sign_idx || + key_columns.end() != std::find(key_columns.begin(), key_columns.end(), i)) { continue; } if ((i - num_key_cols) % config::vertical_compaction_num_columns_per_group == 0) { @@ -217,6 +225,9 @@ Status Merger::vertical_compact_one_group( } reader_params.tablet_schema = merge_tablet_schema; + if (!tablet->tablet_schema()->cluster_key_idxes().empty()) { + reader_params.delete_bitmap = &tablet->tablet_meta()->delete_bitmap(); + } if (is_key && stats_output && stats_output->rowid_conversion) { reader_params.record_rowids = true; From cc3b92dda1297c8691232c63622c1ba64acb57bb Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 2 Nov 2023 17:13:50 +0800 Subject: [PATCH 50/64] Fix vertical compaction --- be/src/olap/merger.cpp | 24 ++++++++++++++++++--- be/src/olap/merger.h | 2 +- be/src/olap/reader.h | 1 + be/src/vec/olap/vertical_block_reader.cpp | 12 +++++++---- be/src/vec/olap/vertical_merge_iterator.cpp | 20 ++++++++++++----- be/src/vec/olap/vertical_merge_iterator.h | 17 ++++++++++----- 6 files changed, 58 insertions(+), 18 deletions(-) diff --git a/be/src/olap/merger.cpp b/be/src/olap/merger.cpp index cad20e42f59ce3..a3bfb906072a70 100644 --- a/be/src/olap/merger.cpp +++ b/be/src/olap/merger.cpp @@ -181,7 +181,6 @@ void Merger::vertical_split_columns(TabletSchemaSPtr tablet_schema, if (!key_columns.empty()) { column_groups->emplace_back(std::move(key_columns)); } - std::vector value_columns; for (auto i = num_key_cols; i < total_cols; ++i) { if (i == sequence_col_idx || i == delete_sign_idx || key_columns.end() != std::find(key_columns.begin(), key_columns.end(), i)) { @@ -198,12 +197,14 @@ Status Merger::vertical_compact_one_group( TabletSharedPtr tablet, ReaderType reader_type, TabletSchemaSPtr tablet_schema, bool is_key, const std::vector& column_group, vectorized::RowSourcesBuffer* row_source_buf, const std::vector& src_rowset_readers, - RowsetWriter* dst_rowset_writer, int64_t max_rows_per_segment, Statistics* stats_output) { + RowsetWriter* dst_rowset_writer, int64_t max_rows_per_segment, Statistics* stats_output, + std::vector key_group_cluster_key_idxes) { // build tablet reader VLOG_NOTICE << "vertical compact one group, max_rows_per_segment=" << max_rows_per_segment; vectorized::VerticalBlockReader reader(row_source_buf); TabletReader::ReaderParams reader_params; reader_params.is_key_column_group = is_key; + reader_params.key_group_cluster_key_idxes = key_group_cluster_key_idxes; reader_params.tablet = tablet; reader_params.reader_type = reader_type; @@ -355,6 +356,22 @@ Status Merger::vertical_merge_rowsets(TabletSharedPtr tablet, ReaderType reader_ std::vector> column_groups; vertical_split_columns(tablet_schema, &column_groups); + std::vector key_group_cluster_key_idxes; + if (column_groups.size() > 0) { + if (!tablet_schema->cluster_key_idxes().empty()) { + auto& key_column_group = column_groups[0]; + for (const auto& index_in_tablet_schema : tablet_schema->cluster_key_idxes()) { + for (auto j = 0; j < key_column_group.size(); ++j) { + auto cid = key_column_group[j]; + if (cid == index_in_tablet_schema) { + key_group_cluster_key_idxes.emplace_back(j); + break; + } + } + } + } + } + vectorized::RowSourcesBuffer row_sources_buf(tablet->tablet_id(), tablet->tablet_path(), reader_type); // compact group one by one @@ -363,7 +380,8 @@ Status Merger::vertical_merge_rowsets(TabletSharedPtr tablet, ReaderType reader_ bool is_key = (i == 0); RETURN_IF_ERROR(vertical_compact_one_group( tablet, reader_type, tablet_schema, is_key, column_groups[i], &row_sources_buf, - src_rowset_readers, dst_rowset_writer, max_rows_per_segment, stats_output)); + src_rowset_readers, dst_rowset_writer, max_rows_per_segment, stats_output, + key_group_cluster_key_idxes)); if (is_key) { RETURN_IF_ERROR(row_sources_buf.flush()); } diff --git a/be/src/olap/merger.h b/be/src/olap/merger.h index 37291c548c38a6..a5bc6b50784f83 100644 --- a/be/src/olap/merger.h +++ b/be/src/olap/merger.h @@ -75,7 +75,7 @@ class Merger { vectorized::RowSourcesBuffer* row_source_buf, const std::vector& src_rowset_readers, RowsetWriter* dst_rowset_writer, int64_t max_rows_per_segment, - Statistics* stats_output); + Statistics* stats_output, std::vector key_group_cluster_key_idxes); // for segcompaction static Status vertical_compact_one_group(TabletSharedPtr tablet, ReaderType reader_type, diff --git a/be/src/olap/reader.h b/be/src/olap/reader.h index b0d5ed1fa280c9..044eff78086d0b 100644 --- a/be/src/olap/reader.h +++ b/be/src/olap/reader.h @@ -172,6 +172,7 @@ class TabletReader { // for vertical compaction bool is_key_column_group = false; + std::vector key_group_cluster_key_idxes; bool is_segcompaction = false; diff --git a/be/src/vec/olap/vertical_block_reader.cpp b/be/src/vec/olap/vertical_block_reader.cpp index 161209432674f9..52d35283b503c4 100644 --- a/be/src/vec/olap/vertical_block_reader.cpp +++ b/be/src/vec/olap/vertical_block_reader.cpp @@ -146,7 +146,7 @@ Status VerticalBlockReader::_init_collect_iter(const ReaderParams& read_params) _vcollect_iter = new_vertical_heap_merge_iterator( std::move(*segment_iters_ptr), iterator_init_flag, rowset_ids, ori_return_col_size, read_params.tablet->keys_type(), seq_col_idx, - _row_sources_buffer); + _row_sources_buffer, read_params.key_group_cluster_key_idxes); } } else { _vcollect_iter = new_vertical_mask_merge_iterator(std::move(*segment_iters_ptr), @@ -224,9 +224,13 @@ Status VerticalBlockReader::init(const ReaderParams& read_params) { _next_block_func = &VerticalBlockReader::_direct_next_block; break; case KeysType::UNIQUE_KEYS: - _next_block_func = &VerticalBlockReader::_unique_key_next_block; - if (_filter_delete) { - _delete_filter_column = ColumnUInt8::create(); + if (tablet()->tablet_meta()->tablet_schema()->cluster_key_idxes().empty()) { + _next_block_func = &VerticalBlockReader::_unique_key_next_block; + if (_filter_delete) { + _delete_filter_column = ColumnUInt8::create(); + } + } else { + _next_block_func = &VerticalBlockReader::_direct_next_block; } break; case KeysType::AGG_KEYS: diff --git a/be/src/vec/olap/vertical_merge_iterator.cpp b/be/src/vec/olap/vertical_merge_iterator.cpp index f912ee7dffc592..a0a24b5142896d 100644 --- a/be/src/vec/olap/vertical_merge_iterator.cpp +++ b/be/src/vec/olap/vertical_merge_iterator.cpp @@ -259,8 +259,14 @@ Status VerticalMergeIteratorContext::block_reset(const std::shared_ptr& b } bool VerticalMergeIteratorContext::compare(const VerticalMergeIteratorContext& rhs) const { - int cmp_res = _block->compare_at(_index_in_block, rhs._index_in_block, _num_key_columns, + int cmp_res; + if (_key_group_cluster_key_idxes.empty()) { + cmp_res = _block->compare_at(_index_in_block, rhs._index_in_block, _num_key_columns, *rhs._block, -1); + } else { + cmp_res = _block->compare_at(_index_in_block, rhs._index_in_block, + &_key_group_cluster_key_idxes, *rhs._block, -1); + } if (cmp_res != 0) { return cmp_res > 0; } @@ -425,7 +431,8 @@ Status VerticalHeapMergeIterator::next_batch(Block* block) { tmp_row_sources.emplace_back(ctx->order(), false); } if (ctx->is_same() && - (_keys_type == KeysType::UNIQUE_KEYS || _keys_type == KeysType::AGG_KEYS)) { + ((_keys_type == KeysType::UNIQUE_KEYS && _key_group_cluster_key_idxes.empty()) || + _keys_type == KeysType::AGG_KEYS)) { // skip cur row, copy pre ctx ++_merged_rows; if (pre_ctx) { @@ -504,7 +511,8 @@ Status VerticalHeapMergeIterator::init(const StorageReadOptions& opts) { bool pre_iter_invalid = false; for (auto& iter : _origin_iters) { VerticalMergeIteratorContext* ctx = new VerticalMergeIteratorContext( - std::move(iter), _rowset_ids[seg_order], _ori_return_cols, seg_order, _seq_col_idx); + std::move(iter), _rowset_ids[seg_order], _ori_return_cols, seg_order, _seq_col_idx, + _key_group_cluster_key_idxes); _ori_iter_ctx.push_back(ctx); if (_iterator_init_flags[seg_order] || pre_iter_invalid) { RETURN_IF_ERROR(ctx->init(opts)); @@ -764,10 +772,12 @@ Status VerticalMaskMergeIterator::init(const StorageReadOptions& opts) { std::shared_ptr new_vertical_heap_merge_iterator( std::vector&& inputs, const std::vector& iterator_init_flag, const std::vector& rowset_ids, size_t ori_return_cols, KeysType keys_type, - uint32_t seq_col_idx, RowSourcesBuffer* row_sources) { + uint32_t seq_col_idx, RowSourcesBuffer* row_sources, + std::vector key_group_cluster_key_idxes) { return std::make_shared(std::move(inputs), iterator_init_flag, rowset_ids, ori_return_cols, keys_type, - seq_col_idx, row_sources); + seq_col_idx, row_sources, + key_group_cluster_key_idxes); } std::shared_ptr new_vertical_fifo_merge_iterator( diff --git a/be/src/vec/olap/vertical_merge_iterator.h b/be/src/vec/olap/vertical_merge_iterator.h index 70a452b2b6ddb3..760835e6d3109f 100644 --- a/be/src/vec/olap/vertical_merge_iterator.h +++ b/be/src/vec/olap/vertical_merge_iterator.h @@ -147,13 +147,15 @@ class RowSourcesBuffer { class VerticalMergeIteratorContext { public: VerticalMergeIteratorContext(RowwiseIteratorUPtr&& iter, RowsetId rowset_id, - size_t ori_return_cols, uint32_t order, uint32_t seq_col_idx) + size_t ori_return_cols, uint32_t order, uint32_t seq_col_idx, + std::vector key_group_cluster_key_idxes = {}) : _iter(std::move(iter)), _rowset_id(rowset_id), _ori_return_cols(ori_return_cols), _order(order), _seq_col_idx(seq_col_idx), - _num_key_columns(_iter->schema().num_key_columns()) {} + _num_key_columns(_iter->schema().num_key_columns()), + _key_group_cluster_key_idxes(key_group_cluster_key_idxes) {} VerticalMergeIteratorContext(const VerticalMergeIteratorContext&) = delete; VerticalMergeIteratorContext(VerticalMergeIteratorContext&&) = delete; @@ -217,6 +219,7 @@ class VerticalMergeIteratorContext { int32_t _index_in_block = -1; size_t _block_row_max = 0; int _num_key_columns; + const std::vector _key_group_cluster_key_idxes; size_t _cur_batch_num = 0; // used to store data load from iterator->next_batch(Block*) @@ -237,14 +240,16 @@ class VerticalHeapMergeIterator : public RowwiseIterator { std::vector iterator_init_flags, std::vector rowset_ids, size_t ori_return_cols, KeysType keys_type, int32_t seq_col_idx, - RowSourcesBuffer* row_sources_buf) + RowSourcesBuffer* row_sources_buf, + std::vector key_group_cluster_key_idxes) : _origin_iters(std::move(iters)), _iterator_init_flags(iterator_init_flags), _rowset_ids(rowset_ids), _ori_return_cols(ori_return_cols), _keys_type(keys_type), _seq_col_idx(seq_col_idx), - _row_sources_buf(row_sources_buf) {} + _row_sources_buf(row_sources_buf), + _key_group_cluster_key_idxes(key_group_cluster_key_idxes) {} ~VerticalHeapMergeIterator() override { while (!_merge_heap.empty()) { @@ -296,6 +301,7 @@ class VerticalHeapMergeIterator : public RowwiseIterator { StorageReadOptions _opts; bool _record_rowids = false; std::vector _block_row_locations; + std::vector _key_group_cluster_key_idxes; }; // --------------- VerticalFifoMergeIterator ------------- // @@ -400,7 +406,8 @@ class VerticalMaskMergeIterator : public RowwiseIterator { std::shared_ptr new_vertical_heap_merge_iterator( std::vector&& inputs, const std::vector& iterator_init_flag, const std::vector& rowset_ids, size_t _ori_return_cols, KeysType key_type, - uint32_t seq_col_idx, RowSourcesBuffer* row_sources_buf); + uint32_t seq_col_idx, RowSourcesBuffer* row_sources_buf, + std::vector key_group_cluster_key_idxes); std::shared_ptr new_vertical_fifo_merge_iterator( std::vector&& inputs, const std::vector& iterator_init_flag, From 052c927a5cf9f694c80a4940347c74e4db299651 Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 13 Nov 2023 14:27:40 +0800 Subject: [PATCH 51/64] rebase master --- be/src/olap/rowset/segment_v2/segment_writer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 0228fad99162bf..2bd93925ff5236 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -738,7 +738,6 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po << "found duplicate key or key is not sorted! current key: " << key << ", last key" << last_key; RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); - _maybe_invalid_row_cache(key); last_key = std::move(key); } } else { @@ -825,7 +824,8 @@ int64_t SegmentWriter::max_row_to_add(size_t row_avg_size_in_bytes) { } std::string SegmentWriter::_full_encode_keys( - const std::vector& key_columns, size_t pos) { + const std::vector& key_columns, size_t pos, + bool null_first) { assert(_key_index_size.size() == _num_key_columns); assert(key_columns.size() == _num_key_columns && _key_coders.size() == _num_key_columns); @@ -859,7 +859,7 @@ std::string SegmentWriter::_full_encode_keys( if (null_first) { encoded_keys.push_back(KEY_NULL_FIRST_MARKER); } else { - encoded_keys.push_back(KEY_NULL_LAST_MARKER); + encoded_keys.push_back(KEY_NORMAL_MARKER); } ++cid; continue; From a68ecd0b17435d05aa5b03030b38522b1f96948c Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 13 Nov 2023 15:44:16 +0800 Subject: [PATCH 52/64] fix comments --- be/src/olap/memtable.cpp | 4 ++-- be/src/olap/merger.h | 4 ++-- be/src/olap/rowset/segment_v2/segment.cpp | 12 ++++------- be/src/olap/rowset/segment_v2/segment.h | 4 ++-- .../rowset/segment_v2/segment_iterator.cpp | 3 +-- .../olap/rowset/segment_v2/segment_writer.cpp | 20 ++++--------------- .../olap/rowset/segment_v2/segment_writer.h | 2 +- be/src/vec/olap/vertical_merge_iterator.cpp | 7 +++---- 8 files changed, 19 insertions(+), 37 deletions(-) diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index d63474463dd49e..093c241573e888 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -295,10 +295,10 @@ void MemTable::_sort_by_cluster_keys() { _stat.sort_times++; // sort all rows vectorized::Block in_block = _output_mutable_block.to_block(); - auto cloneBlock = in_block.clone_without_columns(); - _output_mutable_block = vectorized::MutableBlock::build_mutable_block(&cloneBlock); vectorized::MutableBlock mutable_block = vectorized::MutableBlock::build_mutable_block(&in_block); + auto clone_block = in_block.clone_without_columns(); + _output_mutable_block = vectorized::MutableBlock::build_mutable_block(&clone_block); std::vector row_in_blocks; std::unique_ptr> row_in_blocks_deleter((int*)0x01, [&](int*) { diff --git a/be/src/olap/merger.h b/be/src/olap/merger.h index a5bc6b50784f83..ea7080182aac24 100644 --- a/be/src/olap/merger.h +++ b/be/src/olap/merger.h @@ -74,8 +74,8 @@ class Merger { bool is_key, const std::vector& column_group, vectorized::RowSourcesBuffer* row_source_buf, const std::vector& src_rowset_readers, - RowsetWriter* dst_rowset_writer, int64_t max_rows_per_segment, - Statistics* stats_output, std::vector key_group_cluster_key_idxes); + RowsetWriter* dst_rowset_writer, int64_t max_rows_per_segment, Statistics* stats_output, + std::vector key_group_cluster_key_idxes); // for segcompaction static Status vertical_compact_one_group(TabletSharedPtr tablet, ReaderType reader_type, diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index fb3cd3ebaac008..5ba2d5a5078be2 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -284,17 +284,13 @@ Status Segment::load_index() { Status Segment::_load_index_impl() { return _load_index_once.call([this] { - bool load_short_key_index = _tablet_schema->keys_type() != UNIQUE_KEYS || - _pk_index_meta == nullptr || - (_tablet_schema->keys_type() == UNIQUE_KEYS && - !_tablet_schema->cluster_key_idxes().empty()); if (_tablet_schema->keys_type() == UNIQUE_KEYS && _pk_index_meta != nullptr) { _pk_index_reader.reset(new PrimaryKeyIndexReader()); RETURN_IF_ERROR(_pk_index_reader->parse_index(_file_reader, *_pk_index_meta)); _meta_mem_usage += _pk_index_reader->get_memory_size(); _segment_meta_mem_tracker->consume(_pk_index_reader->get_memory_size()); - } - if (load_short_key_index) { + return Status::OK(); + } else { // read and parse short key index page OlapReaderStatistics tmp_stats; PageReadOptions opts { @@ -317,9 +313,8 @@ Status Segment::_load_index_impl() { _meta_mem_usage += body.get_size(); _segment_meta_mem_tracker->consume(body.get_size()); _sk_index_decoder.reset(new ShortKeyIndexDecoder); - RETURN_IF_ERROR(_sk_index_decoder->parse(body, footer.short_key_page_footer())); + return _sk_index_decoder->parse(body, footer.short_key_page_footer()); } - return Status::OK(); }); } @@ -483,6 +478,7 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, bool with_ro return Status::Error("Can't find key in the segment"); } } + // found the key, use rowid in pk index if necessary. if (has_rowid) { Slice sought_key_without_seq = Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length - rowid_length); diff --git a/be/src/olap/rowset/segment_v2/segment.h b/be/src/olap/rowset/segment_v2/segment.h index d5ddbe65cd4c39..d24381a8fb517d 100644 --- a/be/src/olap/rowset/segment_v2/segment.h +++ b/be/src/olap/rowset/segment_v2/segment.h @@ -95,12 +95,12 @@ class Segment : public std::enable_shared_from_this { std::unique_ptr* iter); const ShortKeyIndexDecoder* get_short_key_index() const { - // DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); + DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); return _sk_index_decoder.get(); } const PrimaryKeyIndexReader* get_primary_key_index() const { - // DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); + DCHECK(_load_index_once.has_called() && _load_index_once.stored_result().ok()); return _pk_index_reader.get(); } diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 49517560bb5249..5db937587fc475 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -1353,8 +1353,7 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool if (Slice(index_key).compare(sought_key_without_seq) == 0) { exact_match = true; } - } - if (!has_seq_col && has_rowid) { + } else if (has_rowid) { auto index_type = vectorized::DataTypeFactory::instance().create_data_type( _segment->_pk_index_reader->type_info()->type(), 1, 0); auto index_column = index_type->create_column(); diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 2bd93925ff5236..e6e9da886561ea 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -720,6 +720,8 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po converted_result.second->get_data(), num_rows)); } if (_has_key) { + // for now we don't need to query short key index for CLUSTER BY feature, + // but we still write the index for future usage. bool need_primary_key_indexes = (_tablet_schema->keys_type() == UNIQUE_KEYS && _opts.enable_unique_key_merge_on_write); bool need_short_key_indexes = @@ -828,25 +830,11 @@ std::string SegmentWriter::_full_encode_keys( bool null_first) { assert(_key_index_size.size() == _num_key_columns); assert(key_columns.size() == _num_key_columns && _key_coders.size() == _num_key_columns); - - std::string encoded_keys; - size_t cid = 0; - for (const auto& column : key_columns) { - auto field = column->get_data_at(pos); - if (UNLIKELY(!field)) { - encoded_keys.push_back(KEY_NULL_FIRST_MARKER); - ++cid; - continue; - } - encoded_keys.push_back(KEY_NORMAL_MARKER); - _key_coders[cid]->full_encode_ascending(field, &encoded_keys); - ++cid; - } - return encoded_keys; + return _full_encode_keys(_key_coders, key_columns, pos, null_first); } std::string SegmentWriter::_full_encode_keys( - std::vector& key_coders, + const std::vector& key_coders, const std::vector& key_columns, size_t pos, bool null_first) { assert(key_columns.size() == key_coders.size()); diff --git a/be/src/olap/rowset/segment_v2/segment_writer.h b/be/src/olap/rowset/segment_v2/segment_writer.h index 674ed54f7d3319..50bea7f8e10832 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.h +++ b/be/src/olap/rowset/segment_v2/segment_writer.h @@ -153,7 +153,7 @@ class SegmentWriter { bool null_first = true); std::string _full_encode_keys( - std::vector& key_coders, + const std::vector& key_coders, const std::vector& key_columns, size_t pos, bool null_first = true); diff --git a/be/src/vec/olap/vertical_merge_iterator.cpp b/be/src/vec/olap/vertical_merge_iterator.cpp index a0a24b5142896d..fe521c2705177e 100644 --- a/be/src/vec/olap/vertical_merge_iterator.cpp +++ b/be/src/vec/olap/vertical_merge_iterator.cpp @@ -774,10 +774,9 @@ std::shared_ptr new_vertical_heap_merge_iterator( const std::vector& rowset_ids, size_t ori_return_cols, KeysType keys_type, uint32_t seq_col_idx, RowSourcesBuffer* row_sources, std::vector key_group_cluster_key_idxes) { - return std::make_shared(std::move(inputs), iterator_init_flag, - rowset_ids, ori_return_cols, keys_type, - seq_col_idx, row_sources, - key_group_cluster_key_idxes); + return std::make_shared( + std::move(inputs), iterator_init_flag, rowset_ids, ori_return_cols, keys_type, + seq_col_idx, row_sources, key_group_cluster_key_idxes); } std::shared_ptr new_vertical_fifo_merge_iterator( From de54393c1b40f2719e46874f11bbf48d0bdd6230 Mon Sep 17 00:00:00 2001 From: meiyi Date: Mon, 13 Nov 2023 16:34:59 +0800 Subject: [PATCH 53/64] disable test_delete_sign_delete_bitmap --- .../test_delete_sign_delete_bitmap.groovy | 156 +++++++++--------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy b/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy index 3b0fbba783ff0b..ea7e2c5e7dc3da 100644 --- a/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy +++ b/regression-test/suites/unique_with_mow_p0/cluster_key/test_delete_sign_delete_bitmap.groovy @@ -17,82 +17,82 @@ suite('test_delete_sign_delete_bitmap') { - def tableName1 = "test_delete_sign_delete_bitmap1" - sql "DROP TABLE IF EXISTS ${tableName1};" - sql """ CREATE TABLE IF NOT EXISTS ${tableName1} ( - `k1` int NOT NULL, - `c1` int, - `c2` int, - `c3` int, - `c4` int - )UNIQUE KEY(k1) - CLUSTER BY(c1, c2) - DISTRIBUTED BY HASH(k1) BUCKETS 1 - PROPERTIES ( - "enable_unique_key_merge_on_write" = "true", - "disable_auto_compaction" = "true", - "replication_num" = "1" - );""" - - sql "insert into ${tableName1} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" - qt_sql "select * from ${tableName1} order by k1,c1,c2,c3,c4;" - // sql "insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) select k1,c1,c2,c3,c4,1 from ${tableName1} where k1 in (1,3,5);" - sql """insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" - sql "sync" - qt_after_delete "select * from ${tableName1} order by k1,c1,c2,c3,c4;" - sql "set skip_delete_sign=true;" - sql "set skip_storage_engine_merge=true;" - sql "set skip_delete_bitmap=true;" - sql "sync" - // skip_delete_bitmap=true, skip_delete_sign=true - qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" - - sql "set skip_delete_sign=true;" - sql "set skip_delete_bitmap=false;" - sql "sync" - // skip_delete_bitmap=false, skip_delete_sign=true - qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" - sql "drop table if exists ${tableName1};" - - - sql "set skip_delete_sign=false;" - sql "set skip_storage_engine_merge=false;" - sql "set skip_delete_bitmap=false;" - sql "sync" - def tableName2 = "test_delete_sign_delete_bitmap2" - sql "DROP TABLE IF EXISTS ${tableName2};" - sql """ CREATE TABLE IF NOT EXISTS ${tableName2} ( - `k1` int NOT NULL, - `c1` int, - `c2` int, - `c3` int, - `c4` int - )UNIQUE KEY(k1) - CLUSTER BY(c4, c3) - DISTRIBUTED BY HASH(k1) BUCKETS 1 - PROPERTIES ( - "enable_unique_key_merge_on_write" = "true", - "disable_auto_compaction" = "true", - "replication_num" = "1", - "function_column.sequence_col" = 'c4' - );""" - - sql "insert into ${tableName2} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" - qt_sql "select * from ${tableName2} order by k1,c1,c2,c3,c4;" - sql """insert into ${tableName2}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" - sql "sync" - qt_after_delete "select * from ${tableName2} order by k1,c1,c2,c3,c4;" - sql "set skip_delete_sign=true;" - sql "set skip_storage_engine_merge=true;" - sql "set skip_delete_bitmap=true;" - sql "sync" - // skip_delete_bitmap=true, skip_delete_sign=true - qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" - - sql "set skip_delete_sign=true;" - sql "set skip_delete_bitmap=false;" - sql "sync" - // skip_delete_bitmap=false, skip_delete_sign=true - qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" - sql "drop table if exists ${tableName2};" +// def tableName1 = "test_delete_sign_delete_bitmap1" +// sql "DROP TABLE IF EXISTS ${tableName1};" +// sql """ CREATE TABLE IF NOT EXISTS ${tableName1} ( +// `k1` int NOT NULL, +// `c1` int, +// `c2` int, +// `c3` int, +// `c4` int +// )UNIQUE KEY(k1) +// CLUSTER BY(c1, c2) +// DISTRIBUTED BY HASH(k1) BUCKETS 1 +// PROPERTIES ( +// "enable_unique_key_merge_on_write" = "true", +// "disable_auto_compaction" = "true", +// "replication_num" = "1" +// );""" +// +// sql "insert into ${tableName1} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" +// qt_sql "select * from ${tableName1} order by k1,c1,c2,c3,c4;" +// // sql "insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) select k1,c1,c2,c3,c4,1 from ${tableName1} where k1 in (1,3,5);" +// sql """insert into ${tableName1}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" +// sql "sync" +// qt_after_delete "select * from ${tableName1} order by k1,c1,c2,c3,c4;" +// sql "set skip_delete_sign=true;" +// sql "set skip_storage_engine_merge=true;" +// sql "set skip_delete_bitmap=true;" +// sql "sync" +// // skip_delete_bitmap=true, skip_delete_sign=true +// qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" +// +// sql "set skip_delete_sign=true;" +// sql "set skip_delete_bitmap=false;" +// sql "sync" +// // skip_delete_bitmap=false, skip_delete_sign=true +// qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName1} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" +// sql "drop table if exists ${tableName1};" +// +// +// sql "set skip_delete_sign=false;" +// sql "set skip_storage_engine_merge=false;" +// sql "set skip_delete_bitmap=false;" +// sql "sync" +// def tableName2 = "test_delete_sign_delete_bitmap2" +// sql "DROP TABLE IF EXISTS ${tableName2};" +// sql """ CREATE TABLE IF NOT EXISTS ${tableName2} ( +// `k1` int NOT NULL, +// `c1` int, +// `c2` int, +// `c3` int, +// `c4` int +// )UNIQUE KEY(k1) +// CLUSTER BY(c4, c3) +// DISTRIBUTED BY HASH(k1) BUCKETS 1 +// PROPERTIES ( +// "enable_unique_key_merge_on_write" = "true", +// "disable_auto_compaction" = "true", +// "replication_num" = "1", +// "function_column.sequence_col" = 'c4' +// );""" +// +// sql "insert into ${tableName2} values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5);" +// qt_sql "select * from ${tableName2} order by k1,c1,c2,c3,c4;" +// sql """insert into ${tableName2}(k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__) values(1,1,1,1,1,1),(3,3,3,3,3,1),(5,5,5,5,5,1);""" +// sql "sync" +// qt_after_delete "select * from ${tableName2} order by k1,c1,c2,c3,c4;" +// sql "set skip_delete_sign=true;" +// sql "set skip_storage_engine_merge=true;" +// sql "set skip_delete_bitmap=true;" +// sql "sync" +// // skip_delete_bitmap=true, skip_delete_sign=true +// qt_1 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" +// +// sql "set skip_delete_sign=true;" +// sql "set skip_delete_bitmap=false;" +// sql "sync" +// // skip_delete_bitmap=false, skip_delete_sign=true +// qt_2 "select k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__ from ${tableName2} order by k1,c1,c2,c3,c4,__DORIS_DELETE_SIGN__;" +// sql "drop table if exists ${tableName2};" } From ebf35e0874aef978899ba870a83a1470ac7242e2 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 14 Nov 2023 16:08:44 +0800 Subject: [PATCH 54/64] fix --- be/src/olap/rowset/beta_rowset_writer.cpp | 3 +- .../olap/rowset/segment_v2/segment_writer.cpp | 150 +++++++++--------- .../olap/rowset/segment_v2/segment_writer.h | 6 + 3 files changed, 85 insertions(+), 74 deletions(-) diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index f3db8689a3e5d8..564ad4de833304 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -361,7 +361,8 @@ bool BetaRowsetWriter::_check_and_set_is_doing_segcompaction() { Status BetaRowsetWriter::_segcompaction_if_necessary() { Status status = Status::OK(); if (!config::enable_segcompaction || !_context.enable_segcompaction || - !_check_and_set_is_doing_segcompaction()) { + !_check_and_set_is_doing_segcompaction() || + !_context.tablet_schema->cluster_key_idxes().empty()) { return status; } if (_segcompaction_status.load() != OK) { diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index e6e9da886561ea..e04ec977754921 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -727,84 +727,31 @@ Status SegmentWriter::append_block(const vectorized::Block* block, size_t row_po bool need_short_key_indexes = !need_primary_key_indexes || (need_primary_key_indexes && _tablet_schema->cluster_key_idxes().size() > 0); - if (need_primary_key_indexes) { - // create primary indexes - if (!need_short_key_indexes) { - std::string last_key; - for (size_t pos = 0; pos < num_rows; pos++) { - std::string key = _full_encode_keys(key_columns, pos); - if (_tablet_schema->has_sequence_col()) { - _encode_seq_column(seq_column, pos, &key); - } - DCHECK(key.compare(last_key) > 0) - << "found duplicate key or key is not sorted! current key: " << key - << ", last key" << last_key; - RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); - last_key = std::move(key); - } - } else { - std::vector primary_key_columns; - primary_key_columns.swap(key_columns); - key_columns.clear(); - for (const auto& cid : _tablet_schema->cluster_key_idxes()) { - for (size_t id = 0; id < _column_writers.size(); ++id) { - // olap data convertor alway start from id = 0 - auto converted_result = _olap_data_convertor->convert_column_data(id); - if (cid == _column_ids[id]) { - key_columns.push_back(converted_result.second); - break; - } - } - } - std::vector primary_keys; - // keep primary keys in memory - for (uint32_t pos = 0; pos < num_rows; pos++) { - std::string key = - _full_encode_keys(_primary_key_coders, primary_key_columns, pos); - Slice slice(key); - if (_tablet_schema->has_sequence_col()) { - _encode_seq_column(seq_column, pos, &key); - } - _encode_rowid(pos, &key); - primary_keys.emplace_back(std::move(key)); - } - // sort primary keys - std::sort(primary_keys.begin(), primary_keys.end()); - // write primary keys - std::string last_key; - for (const auto& key : primary_keys) { - DCHECK(key.compare(last_key) > 0) - << "found duplicate key or key is not sorted! current key: " << key - << ", last key" << last_key; - RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); - } - } - } - if (need_short_key_indexes) { - if (need_primary_key_indexes) { - // short key is cluster key, key columns should be cluster key + min_max key - key_columns.clear(); - for (auto cid : _tablet_schema->cluster_key_idxes()) { - /*auto converted_result = _olap_data_convertor->convert_column_data(cid); - key_columns.push_back(converted_result.second);*/ - for (size_t id = 0; id < _column_writers.size(); ++id) { - // olap data convertor alway start from id = 0 + if (need_primary_key_indexes && !need_short_key_indexes) { // mow table without cluster keys + RETURN_IF_ERROR(_generate_primary_key_index(_key_coders, key_columns, seq_column, + num_rows, false)); + } else if (!need_primary_key_indexes && need_short_key_indexes) { // other tables + RETURN_IF_ERROR(_generate_short_key_index(key_columns, num_rows, short_key_pos)); + } else if (need_primary_key_indexes && need_short_key_indexes) { // mow with cluster keys + // 1. generate primary key index, the key_columns is primary_key_columns + RETURN_IF_ERROR(_generate_primary_key_index(_primary_key_coders, key_columns, + seq_column, num_rows, true)); + // 2. generate short key index (use cluster key) + key_columns.clear(); + for (const auto& cid : _tablet_schema->cluster_key_idxes()) { + for (size_t id = 0; id < _column_writers.size(); ++id) { + // olap data convertor always start from id = 0 + if (cid == _column_ids[id]) { auto converted_result = _olap_data_convertor->convert_column_data(id); - if (cid == _column_ids[id]) { - key_columns.push_back(converted_result.second); + if (!converted_result.first.ok()) { + return converted_result.first; } + key_columns.push_back(converted_result.second); + break; } } } - // create short key indexes' - // for min_max key - set_min_key(_full_encode_keys(key_columns, 0)); - set_max_key(_full_encode_keys(key_columns, num_rows - 1)); - - key_columns.resize(_num_short_key_columns); - for (const auto pos : short_key_pos) { - RETURN_IF_ERROR(_short_key_index_builder->add_item(_encode_keys(key_columns, pos))); - } + RETURN_IF_ERROR(_generate_short_key_index(key_columns, num_rows, short_key_pos)); } } @@ -1187,5 +1134,62 @@ void SegmentWriter::set_mow_context(std::shared_ptr mow_context) { _mow_context = mow_context; } +Status SegmentWriter::_generate_primary_key_index( + const std::vector& primary_key_coders, + const std::vector& primary_key_columns, + vectorized::IOlapColumnDataAccessor* seq_column, size_t num_rows, bool need_sort) { + if (!need_sort) { // mow table without cluster key + std::string last_key; + for (size_t pos = 0; pos < num_rows; pos++) { + // use _key_coders + std::string key = _full_encode_keys(primary_key_columns, pos); + if (_tablet_schema->has_sequence_col()) { + _encode_seq_column(seq_column, pos, &key); + } + DCHECK(key.compare(last_key) > 0) + << "found duplicate key or key is not sorted! current key: " << key + << ", last key" << last_key; + RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); + last_key = std::move(key); + } + } else { // mow table with cluster key + // 1. generate primary keys in memory + std::vector primary_keys; + for (uint32_t pos = 0; pos < num_rows; pos++) { + std::string key = _full_encode_keys(primary_key_coders, primary_key_columns, pos); + if (_tablet_schema->has_sequence_col()) { + _encode_seq_column(seq_column, pos, &key); + } + _encode_rowid(pos, &key); + primary_keys.emplace_back(std::move(key)); + } + // 2. sort primary keys + std::sort(primary_keys.begin(), primary_keys.end()); + // 3. write primary keys index + std::string last_key; + for (const auto& key : primary_keys) { + DCHECK(key.compare(last_key) > 0) + << "found duplicate key or key is not sorted! current key: " << key + << ", last key" << last_key; + RETURN_IF_ERROR(_primary_key_index_builder->add_item(key)); + } + } + return Status::OK(); +} + +Status SegmentWriter::_generate_short_key_index( + std::vector& key_columns, size_t num_rows, + const std::vector& short_key_pos) { + // use _key_coders + set_min_key(_full_encode_keys(key_columns, 0)); + set_max_key(_full_encode_keys(key_columns, num_rows - 1)); + + key_columns.resize(_num_short_key_columns); + for (const auto pos : short_key_pos) { + RETURN_IF_ERROR(_short_key_index_builder->add_item(_encode_keys(key_columns, pos))); + } + return Status::OK(); +} + } // namespace segment_v2 } // namespace doris diff --git a/be/src/olap/rowset/segment_v2/segment_writer.h b/be/src/olap/rowset/segment_v2/segment_writer.h index 50bea7f8e10832..37011fdf0f0490 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.h +++ b/be/src/olap/rowset/segment_v2/segment_writer.h @@ -166,6 +166,12 @@ class SegmentWriter { void set_max_key(const Slice& key); bool _should_create_writers_with_dynamic_block(size_t num_columns_in_block); void _serialize_block_to_row_column(vectorized::Block& block); + Status _generate_primary_key_index( + const std::vector& primary_key_coders, + const std::vector& primary_key_columns, + vectorized::IOlapColumnDataAccessor* seq_column, size_t num_rows, bool need_sort); + Status _generate_short_key_index(std::vector& key_columns, + size_t num_rows, const std::vector& short_key_pos); private: uint32_t _segment_id; From bb75b9596a32449ab6e776297e06d94b52e9e053 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 16 Nov 2023 10:56:25 +0800 Subject: [PATCH 55/64] fix compile --- .../olap/rowset/segment_v2/vertical_segment_writer.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp index 23ae7cfd4240f7..96b8d51dd64844 100644 --- a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp @@ -231,7 +231,14 @@ Status VerticalSegmentWriter::init() { seq_col_length = _tablet_schema->column(_tablet_schema->sequence_col_idx()).length() + 1; } - _primary_key_index_builder.reset(new PrimaryKeyIndexBuilder(_file_writer, seq_col_length)); + size_t rowid_length = 0; + if (!_tablet_schema->cluster_key_idxes().empty()) { + rowid_length = sizeof(uint32_t) + 1; + _short_key_index_builder.reset( + new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); + } + _primary_key_index_builder.reset( + new PrimaryKeyIndexBuilder(_file_writer, seq_col_length, rowid_length)); RETURN_IF_ERROR(_primary_key_index_builder->init()); } else { _short_key_index_builder.reset( From f29ce6683a65185ceb1c0d6681d1f41dcacffd9d Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 16 Nov 2023 18:58:48 +0800 Subject: [PATCH 56/64] skip vertical segment writer --- be/src/olap/rowset/segment_creator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/be/src/olap/rowset/segment_creator.cpp b/be/src/olap/rowset/segment_creator.cpp index 043fcff876aefa..eb8173609c58fc 100644 --- a/be/src/olap/rowset/segment_creator.cpp +++ b/be/src/olap/rowset/segment_creator.cpp @@ -51,7 +51,8 @@ Status SegmentFlusher::flush_single_block(const vectorized::Block* block, int32_ return Status::OK(); } bool no_compression = block->bytes() <= config::segment_compression_threshold_kb * 1024; - if (config::enable_vertical_segment_writer) { + if (config::enable_vertical_segment_writer && + _context.tablet_schema->cluster_key_idxes().empty()) { std::unique_ptr writer; RETURN_IF_ERROR(_create_segment_writer(writer, segment_id, no_compression, flush_schema)); RETURN_IF_ERROR(_add_rows(writer, block, 0, block->rows())); From a3618f46646eefa75ef79f979ae3b630e8f01ada Mon Sep 17 00:00:00 2001 From: meiyi Date: Sat, 18 Nov 2023 11:46:38 +0800 Subject: [PATCH 57/64] some fix --- be/src/olap/rowset/segment_v2/segment.cpp | 3 +- fe/fe-core/src/main/cup/sql_parser.cup | 1 - .../test_point_query_cluster_key.out | 30 +++++++++---------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 5ba2d5a5078be2..86f5eecc39dfb9 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -469,8 +469,7 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, bool with_ro return Status::Error( "key with higher sequence id exists"); } - } - if (!has_seq_col && has_rowid) { + } else if (has_rowid) { Slice sought_key_without_rowid = Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); // compare key diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 7aade2756f6948..5c0719cb6cad04 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -849,7 +849,6 @@ nonterminal DistributionDesc opt_distribution; nonterminal Integer opt_distribution_number; nonterminal Long opt_field_length; nonterminal KeysDesc opt_keys; -nonterminal KeysDesc opt_mv_keys; nonterminal List opt_cluster_keys; nonterminal Long opt_id; diff --git a/regression-test/data/point_query_p0/test_point_query_cluster_key.out b/regression-test/data/point_query_p0/test_point_query_cluster_key.out index 71a6c480d4b09c..d23a62474c3388 100644 --- a/regression-test/data/point_query_p0/test_point_query_cluster_key.out +++ b/regression-test/data/point_query_p0/test_point_query_cluster_key.out @@ -1,9 +1,9 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] @@ -63,7 +63,7 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 @@ -72,13 +72,13 @@ 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 @@ -87,10 +87,10 @@ 0 1 2 3 -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] @@ -150,7 +150,7 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 @@ -159,13 +159,13 @@ 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 @@ -174,10 +174,10 @@ 0 1 2 3 -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- -1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, NULL] +1231 119291.110000000 ddd laooq \N 2020-01-01 12:36:38 \N 1022-01-01 \N 1.111 \N [119181.111100000, 819019.119100000, null] -- !point_select -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] @@ -237,7 +237,7 @@ 1235 120939.111300000 a ddd xxxxxx 2030-01-02 2020-01-01 12:36:38 22.822 7022-01-01 false 1929111.111 [119291.192910000] ["111", "222", "333"] 2 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 @@ -246,13 +246,13 @@ 6120202020646464 6C616F6F71 32.92200050354004 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 -- !sql -- -1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, NULL] \N 0 0 +1231 119291.110000000 ddd laooq \N 2020-01-01T12:36:38 \N 1022-01-01 \N 1.111 [119181.111100000, 819019.119100000, null] \N 0 0 -- !sql -- 1237 120939.111300000 a ddd laooq 2030-01-02 2020-01-01T12:36:38 22.822 7022-01-01 false 90696620686827832.374 [1.100000000, 2.200000000, 3.300000000, 4.400000000, 5.500000000] [] 0 0 From db1b557b3517b90b9d4644b6c4e6c2611e6b66e7 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 21 Nov 2023 14:45:45 +0800 Subject: [PATCH 58/64] modify by comments --- be/src/olap/merger.cpp | 33 ++++++++------- be/src/olap/merger.h | 6 +++ be/src/olap/primary_key_index.h | 2 + be/src/olap/rowset/segment_v2/segment.cpp | 40 +++++++++++-------- .../rowset/segment_v2/segment_iterator.cpp | 27 ++----------- .../olap/rowset/segment_v2/segment_writer.cpp | 2 +- .../segment_v2/vertical_segment_writer.cpp | 2 +- be/src/olap/tablet.cpp | 8 ++-- .../translator/PhysicalPlanTranslator.java | 8 ++-- 9 files changed, 64 insertions(+), 64 deletions(-) diff --git a/be/src/olap/merger.cpp b/be/src/olap/merger.cpp index a3bfb906072a70..9a57bcd3874270 100644 --- a/be/src/olap/merger.cpp +++ b/be/src/olap/merger.cpp @@ -357,20 +357,8 @@ Status Merger::vertical_merge_rowsets(TabletSharedPtr tablet, ReaderType reader_ vertical_split_columns(tablet_schema, &column_groups); std::vector key_group_cluster_key_idxes; - if (column_groups.size() > 0) { - if (!tablet_schema->cluster_key_idxes().empty()) { - auto& key_column_group = column_groups[0]; - for (const auto& index_in_tablet_schema : tablet_schema->cluster_key_idxes()) { - for (auto j = 0; j < key_column_group.size(); ++j) { - auto cid = key_column_group[j]; - if (cid == index_in_tablet_schema) { - key_group_cluster_key_idxes.emplace_back(j); - break; - } - } - } - } - } + _generate_key_group_cluster_key_idxes(tablet_schema, column_groups, + key_group_cluster_key_idxes); vectorized::RowSourcesBuffer row_sources_buf(tablet->tablet_id(), tablet->tablet_path(), reader_type); @@ -395,4 +383,21 @@ Status Merger::vertical_merge_rowsets(TabletSharedPtr tablet, ReaderType reader_ return Status::OK(); } +void Merger::_generate_key_group_cluster_key_idxes( + TabletSchemaSPtr tablet_schema, std::vector>& column_groups, + std::vector& key_group_cluster_key_idxes) { + if (column_groups.size() > 0 && !tablet_schema->cluster_key_idxes().empty()) { + auto& key_column_group = column_groups[0]; + for (const auto& index_in_tablet_schema : tablet_schema->cluster_key_idxes()) { + for (auto j = 0; j < key_column_group.size(); ++j) { + auto cid = key_column_group[j]; + if (cid == index_in_tablet_schema) { + key_group_cluster_key_idxes.emplace_back(j); + break; + } + } + } + } +} + } // namespace doris diff --git a/be/src/olap/merger.h b/be/src/olap/merger.h index ea7080182aac24..ab948f55ed9e61 100644 --- a/be/src/olap/merger.h +++ b/be/src/olap/merger.h @@ -86,6 +86,12 @@ class Merger { segment_v2::SegmentWriter& dst_segment_writer, int64_t max_rows_per_segment, Statistics* stats_output, uint64_t* index_size, KeyBoundsPB& key_bounds); + + // for mow with cluster key table, the key group also contains cluster key columns. + // the `key_group_cluster_key_idxes` marks the positions of cluster key columns in key group. + static void _generate_key_group_cluster_key_idxes( + TabletSchemaSPtr tablet_schema, std::vector>& column_groups, + std::vector& key_group_cluster_key_idxes); }; } // namespace doris diff --git a/be/src/olap/primary_key_index.h b/be/src/olap/primary_key_index.h index 644b67719ff81e..3fda3a763eae63 100644 --- a/be/src/olap/primary_key_index.h +++ b/be/src/olap/primary_key_index.h @@ -135,6 +135,8 @@ class PrimaryKeyIndexReader { return _index_reader->get_memory_size(); } + static constexpr size_t ROW_ID_LENGTH = sizeof(uint32_t) + 1; + private: bool _index_parsed; bool _bf_parsed; diff --git a/be/src/olap/rowset/segment_v2/segment.cpp b/be/src/olap/rowset/segment_v2/segment.cpp index 86f5eecc39dfb9..a8c2c095e13d9c 100644 --- a/be/src/olap/rowset/segment_v2/segment.cpp +++ b/be/src/olap/rowset/segment_v2/segment.cpp @@ -410,10 +410,7 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, bool with_ro if (has_seq_col) { seq_col_length = _tablet_schema->column(_tablet_schema->sequence_col_idx()).length() + 1; } - size_t rowid_length = 0; - if (has_rowid) { - rowid_length = sizeof(uint32_t) + 1; - } + size_t rowid_length = has_rowid ? PrimaryKeyIndexReader::ROW_ID_LENGTH : 0; Slice key_without_seq = Slice(key.get_data(), key.get_size() - (with_seq_col ? seq_col_length : 0) - @@ -456,18 +453,17 @@ Status Segment::lookup_row_key(const Slice& key, bool with_seq_col, bool with_ro return Status::Error("Can't find key in the segment"); } - if (!with_seq_col) { - return Status::OK(); - } - - // compare sequence id - Slice sequence_id = - Slice(key.get_data() + key_without_seq.get_size() + 1, seq_col_length - 1); - Slice previous_sequence_id = Slice( - sought_key.get_data() + sought_key_without_seq.get_size() + 1, seq_col_length - 1); - if (sequence_id.compare(previous_sequence_id) < 0) { - return Status::Error( - "key with higher sequence id exists"); + if (with_seq_col) { + // compare sequence id + Slice sequence_id = + Slice(key.get_data() + key_without_seq.get_size() + 1, seq_col_length - 1); + Slice previous_sequence_id = + Slice(sought_key.get_data() + sought_key_without_seq.get_size() + 1, + seq_col_length - 1); + if (sequence_id.compare(previous_sequence_id) < 0) { + return Status::Error( + "key with higher sequence id exists"); + } } } else if (has_rowid) { Slice sought_key_without_rowid = @@ -505,7 +501,17 @@ Status Segment::read_key_by_rowid(uint32_t row_id, std::string* key) { size_t num_read = 1; RETURN_IF_ERROR(iter->next_batch(&num_read, index_column)); CHECK(num_read == 1); - *key = index_column->get_data_at(0).to_string(); + // trim row id + if (_tablet_schema->cluster_key_idxes().empty()) { + *key = index_column->get_data_at(0).to_string(); + } else { + Slice sought_key = + Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); + Slice sought_key_without_rowid = + Slice(sought_key.get_data(), + sought_key.get_size() - PrimaryKeyIndexReader::ROW_ID_LENGTH); + *key = sought_key_without_rowid.to_string(); + } return Status::OK(); } diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index 5db937587fc475..d0ffcfdd6d42a0 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -1325,11 +1325,9 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool // The sequence column needs to be removed from primary key index when comparing key bool has_seq_col = _segment->_tablet_schema->has_sequence_col(); - bool has_rowid = !_segment->_tablet_schema->cluster_key_idxes().empty(); - size_t rowid_length = 0; - if (has_rowid) { - rowid_length = sizeof(uint32_t) + 1; - } + // Used to get key range from primary key index, + // for mow with cluster key table, we should get key range from short key index. + DCHECK(_segment->_tablet_schema->cluster_key_idxes().empty()); if (has_seq_col) { size_t seq_col_length = @@ -1347,29 +1345,12 @@ Status SegmentIterator::_lookup_ordinal_from_pk_index(const RowCursor& key, bool Slice sought_key = Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); Slice sought_key_without_seq = - Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length - rowid_length); + Slice(sought_key.get_data(), sought_key.get_size() - seq_col_length); // compare key if (Slice(index_key).compare(sought_key_without_seq) == 0) { exact_match = true; } - } else if (has_rowid) { - auto index_type = vectorized::DataTypeFactory::instance().create_data_type( - _segment->_pk_index_reader->type_info()->type(), 1, 0); - auto index_column = index_type->create_column(); - size_t num_to_read = 1; - size_t num_read = num_to_read; - RETURN_IF_ERROR(index_iterator->next_batch(&num_read, index_column)); - DCHECK(num_to_read == num_read); - - Slice sought_key = - Slice(index_column->get_data_at(0).data, index_column->get_data_at(0).size); - Slice sought_key_without_rowid = - Slice(sought_key.get_data(), sought_key.get_size() - rowid_length); - // compare key - if (Slice(index_key).compare(sought_key_without_rowid) == 0) { - exact_match = true; - } } // find the key in primary key index, and the is_include is false, so move diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index e04ec977754921..55991f4ead7e89 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -252,7 +252,7 @@ Status SegmentWriter::init(const std::vector& col_ids, bool has_key) { } size_t rowid_length = 0; if (!_tablet_schema->cluster_key_idxes().empty()) { - rowid_length = sizeof(uint32_t) + 1; + rowid_length = PrimaryKeyIndexReader::ROW_ID_LENGTH; _short_key_index_builder.reset( new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); } diff --git a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp index 96b8d51dd64844..4b0df03d35dcfd 100644 --- a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp @@ -233,7 +233,7 @@ Status VerticalSegmentWriter::init() { } size_t rowid_length = 0; if (!_tablet_schema->cluster_key_idxes().empty()) { - rowid_length = sizeof(uint32_t) + 1; + rowid_length = PrimaryKeyIndexReader::ROW_ID_LENGTH; _short_key_index_builder.reset( new ShortKeyIndexBuilder(_segment_id, _opts.num_rows_per_block)); } diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 3d630066d5ba72..5af7febebf9d18 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -2768,7 +2768,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, bool with_seq_col, } size_t rowid_length = 0; if (with_rowid && !_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { - rowid_length = sizeof(uint32_t) + 1; + rowid_length = PrimaryKeyIndexReader::ROW_ID_LENGTH; } Slice key_without_seq = Slice(encoded_key.get_data(), encoded_key.get_size() - seq_col_length - rowid_length); @@ -2959,7 +2959,7 @@ Status Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset, .length() + 1; } - size_t rowid_length = sizeof(uint32_t) + 1; + size_t rowid_length = PrimaryKeyIndexReader::ROW_ID_LENGTH; Slice key_without_seq = Slice(key.get_data(), key.get_size() - seq_col_length - rowid_length); Slice rowid_slice = @@ -3728,11 +3728,11 @@ Status Tablet::calc_delete_bitmap_between_segments( size_t seq_col_length = 0; if (_tablet_meta->tablet_schema()->has_sequence_col()) { auto seq_col_idx = _tablet_meta->tablet_schema()->sequence_col_idx(); - seq_col_length = _tablet_meta->tablet_schema()->column(seq_col_idx).length(); + seq_col_length = _tablet_meta->tablet_schema()->column(seq_col_idx).length() + 1; } size_t rowid_length = 0; if (!_tablet_meta->tablet_schema()->cluster_key_idxes().empty()) { - rowid_length = sizeof(uint32_t) + 1; + rowid_length = PrimaryKeyIndexReader::ROW_ID_LENGTH; } MergeIndexDeleteBitmapCalculator calculator; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index 834495744172a0..6eb9f2d75e9885 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -2348,16 +2348,16 @@ private boolean checkPushSort(SortNode sortNode, OlapTable olapTable) { } } for (int i = 0; i < sortExprs.size(); i++) { - // table key. - Column tableKey = sortKeyColumns.get(i); + // sort key. + Column sortColumn = sortKeyColumns.get(i); // sort slot. Expr sortExpr = sortExprs.get(i); if (sortExpr instanceof SlotRef) { SlotRef slotRef = (SlotRef) sortExpr; - if (tableKey.equals(slotRef.getColumn())) { + if (sortColumn.equals(slotRef.getColumn())) { // ORDER BY DESC NULLS FIRST can not be optimized to only read file tail, // since NULLS is at file head but data is at tail - if (tableKey.isAllowNull() && nullsFirsts.get(i) && !isAscOrders.get(i)) { + if (sortColumn.isAllowNull() && nullsFirsts.get(i) && !isAscOrders.get(i)) { return false; } } else { From 1d1f6c5d04cb265d41fa58ce90f14c8d8c14b8c0 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 21 Nov 2023 15:17:56 +0800 Subject: [PATCH 59/64] fix DeleteBitmapCalculatorTest --- be/test/olap/delete_bitmap_calculator_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/test/olap/delete_bitmap_calculator_test.cpp b/be/test/olap/delete_bitmap_calculator_test.cpp index 898e6f2f5a0c79..250ac9adff3a7b 100644 --- a/be/test/olap/delete_bitmap_calculator_test.cpp +++ b/be/test/olap/delete_bitmap_calculator_test.cpp @@ -227,7 +227,7 @@ class DeleteBitmapCalculatorTest : public testing::Test { MergeIndexDeleteBitmapCalculator calculator; size_t seq_col_len = 0; if (has_sequence_col) { - seq_col_len = tablet_schema->column(tablet_schema->sequence_col_idx()).length(); + seq_col_len = tablet_schema->column(tablet_schema->sequence_col_idx()).length() + 1; } ASSERT_TRUE(calculator.init(rowset_id, segments, seq_col_len).ok()); From 0233921507ad8360d24ef6b55ada9d6b9ec2a9f1 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 22 Nov 2023 16:09:04 +0800 Subject: [PATCH 60/64] Fix segment compaction --- be/src/olap/rowset/beta_rowset_writer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index 564ad4de833304..62c32c9a57bb6e 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -360,9 +360,11 @@ bool BetaRowsetWriter::_check_and_set_is_doing_segcompaction() { Status BetaRowsetWriter::_segcompaction_if_necessary() { Status status = Status::OK(); + // leave _check_and_set_is_doing_segcompaction as the last condition + // otherwise _segcompacting_cond will never get notified if (!config::enable_segcompaction || !_context.enable_segcompaction || - !_check_and_set_is_doing_segcompaction() || - !_context.tablet_schema->cluster_key_idxes().empty()) { + !_context.tablet_schema->cluster_key_idxes().empty() || + !_check_and_set_is_doing_segcompaction()) { return status; } if (_segcompaction_status.load() != OK) { From 80bbd6976336e7e88a501e8558a6e3d0a1aeb912 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 22 Nov 2023 17:49:34 +0800 Subject: [PATCH 61/64] Fix test_point_query_cluster_key --- .../suites/point_query_p0/test_point_query_cluster_key.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy index 264acc2b3f8312..2c46d0e6a18230 100644 --- a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -88,7 +88,7 @@ suite("test_point_query_cluster_key") { } for (int i = 0; i < 3; i++) { - tableName = realDb + ".tbl_point_query" + i + tableName = realDb + ".tbl_point_query_cluster_key" + i sql """DROP TABLE IF EXISTS ${tableName}""" if (i == 0) { def sql0 = create_table_sql("") From fbb6aa852ffb39cefc0028d2945131d69c52ab69 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 22 Nov 2023 20:42:04 +0800 Subject: [PATCH 62/64] Fix test_point_query_cluster_key --- .../olap/rowset/segment_v2/segment_writer.cpp | 2 + .../test_point_query_cluster_key.groovy | 430 ++++++++++-------- 2 files changed, 233 insertions(+), 199 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 55991f4ead7e89..90663090f05cb0 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -1143,6 +1143,7 @@ Status SegmentWriter::_generate_primary_key_index( for (size_t pos = 0; pos < num_rows; pos++) { // use _key_coders std::string key = _full_encode_keys(primary_key_columns, pos); + _maybe_invalid_row_cache(key); if (_tablet_schema->has_sequence_col()) { _encode_seq_column(seq_column, pos, &key); } @@ -1157,6 +1158,7 @@ Status SegmentWriter::_generate_primary_key_index( std::vector primary_keys; for (uint32_t pos = 0; pos < num_rows; pos++) { std::string key = _full_encode_keys(primary_key_coders, primary_key_columns, pos); + _maybe_invalid_row_cache(key); if (_tablet_schema->has_sequence_col()) { _encode_seq_column(seq_column, pos, &key); } diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy index 2c46d0e6a18230..66d9dbe8f88568 100644 --- a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -18,216 +18,248 @@ import java.math.BigDecimal; suite("test_point_query_cluster_key") { + def set_be_config = { key, value -> + String backend_id; + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); - // nereids do not support point query now - sql """set enable_nereids_planner=false""" - - def user = context.config.jdbcUser - def password = context.config.jdbcPassword - def realDb = "regression_test_serving_p0" - def tableName = realDb + ".tbl_point_query_cluster_key" - sql "CREATE DATABASE IF NOT EXISTS ${realDb}" - - // Parse url - String jdbcUrl = context.config.jdbcUrl - String urlWithoutSchema = jdbcUrl.substring(jdbcUrl.indexOf("://") + 3) - def sql_ip = urlWithoutSchema.substring(0, urlWithoutSchema.indexOf(":")) - def sql_port - if (urlWithoutSchema.indexOf("/") >= 0) { - // e.g: jdbc:mysql://locahost:8080/?a=b - sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1, urlWithoutSchema.indexOf("/")) - } else { - // e.g: jdbc:mysql://locahost:8080 - sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1) + backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) + logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) } - // set server side prepared statement url - def prepare_url = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true" + try { + set_be_config.call("disable_storage_row_cache", "false") + // nereids do not support point query now + sql """set enable_nereids_planner=false""" - def generateString = {len -> - def str = "" - for (int i = 0; i < len; i++) { - str += "a" + def user = context.config.jdbcUser + def password = context.config.jdbcPassword + def realDb = "regression_test_serving_p0" + def tableName = realDb + ".tbl_point_query_cluster_key" + sql "CREATE DATABASE IF NOT EXISTS ${realDb}" + + // Parse url + String jdbcUrl = context.config.jdbcUrl + String urlWithoutSchema = jdbcUrl.substring(jdbcUrl.indexOf("://") + 3) + def sql_ip = urlWithoutSchema.substring(0, urlWithoutSchema.indexOf(":")) + def sql_port + if (urlWithoutSchema.indexOf("/") >= 0) { + // e.g: jdbc:mysql://locahost:8080/?a=b + sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1, urlWithoutSchema.indexOf("/")) + } else { + // e.g: jdbc:mysql://locahost:8080 + sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1) } - return str - } + // set server side prepared statement url + def prepare_url = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true" - def nprep_sql = { sql_str -> - def url_without_prep = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb - connect(user = user, password = password, url = url_without_prep) { - sql sql_str + def generateString = {len -> + def str = "" + for (int i = 0; i < len; i++) { + str += "a" + } + return str } - } - def create_table_sql = { property -> - return String.format(""" - CREATE TABLE IF NOT EXISTS ${tableName} ( - `k1` int(11) NULL COMMENT "", - `k2` decimalv3(27, 9) NULL COMMENT "", - `k3` varchar(300) NULL COMMENT "", - `k4` varchar(30) NULL COMMENT "", - `k5` date NULL COMMENT "", - `k6` datetime NULL COMMENT "", - `k7` float NULL COMMENT "", - `k8` datev2 NULL COMMENT "", - `k9` boolean NULL COMMENT "", - `k10` decimalv3(20, 3) NULL COMMENT "", - `k11` array NULL COMMENT "", - `k12` array NULL COMMENT "" - ) ENGINE=OLAP - UNIQUE KEY(`k1`, `k2`, `k3`) - CLUSTER BY(`k9`, `k5`, `k4`, `k2`) - DISTRIBUTED BY HASH(`k1`, k2, k3) BUCKETS 1 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "store_row_column" = "true", - "enable_unique_key_merge_on_write" = "true", - "light_schema_change" = "true", - %s - "storage_format" = "V2") - """, property) - } + def nprep_sql = { sql_str -> + def url_without_prep = "jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + connect(user = user, password = password, url = url_without_prep) { + sql sql_str + } + } - for (int i = 0; i < 3; i++) { - tableName = realDb + ".tbl_point_query_cluster_key" + i sql """DROP TABLE IF EXISTS ${tableName}""" - if (i == 0) { - def sql0 = create_table_sql("") - sql """ ${sql0} """ - } else if (i == 1) { - def sql1 = create_table_sql("\"function_column.sequence_type\" = 'int',") - sql """ ${sql1} """ - } else { - def sql2 = create_table_sql("\"function_column.sequence_col\" = 'k6',") - sql """ ${sql2} """ + test { + // abnormal case + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int NULL COMMENT "" + ) ENGINE=OLAP + UNIQUE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "store_row_column" = "true", + "light_schema_change" = "false" + ) + """ + exception "errCode = 2, detailMessage = Row store column rely on light schema change, enable light schema change first" } - sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """ - sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """ - sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """ - sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """ - sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """ - sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """ - sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """ - sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """ - sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """ - sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """ - - def result1 = connect(user=user, password=password, url=prepare_url) { - def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?" - assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt.setInt(1, 1231) - stmt.setBigDecimal(2, new BigDecimal("119291.11")) - stmt.setString(3, "ddd") - qe_point_select stmt - stmt.setInt(1, 1231) - stmt.setBigDecimal(2, new BigDecimal("119291.11")) - stmt.setString(3, "ddd") - qe_point_select stmt - stmt.setInt(1, 1237) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, "a ddd") - qe_point_select stmt - - stmt.setInt(1, 1232) - stmt.setBigDecimal(2, new BigDecimal("12222.99121135")) - stmt.setString(3, 'xxx') - qe_point_select stmt - - stmt.setInt(1, 251) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(251)) - qe_point_select stmt - - stmt.setInt(1, 252) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(252)) - qe_point_select stmt - - stmt.setInt(1, 298) - stmt.setBigDecimal(2, new BigDecimal("120939.11130")) - stmt.setString(3, generateString(298)) - qe_point_select stmt - stmt.close() - - stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?" - assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt.setBigDecimal(1, new BigDecimal("991129292901.11138")) - stmt.setString(2, "dd") - qe_point_select stmt - - def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?" - assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement); - stmt_fn.setInt(1, 1231) - stmt_fn.setBigDecimal(2, new BigDecimal("119291.11")) - stmt_fn.setString(3, "ddd") - qe_point_select stmt_fn - qe_point_select stmt_fn - qe_point_select stmt_fn - - nprep_sql """ - ALTER table ${tableName} ADD COLUMN new_column0 INT default "0"; - """ - sleep(1); - nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """ - stmt.setBigDecimal(1, new BigDecimal("120939.11130")) - stmt.setString(2, "a ddd") - qe_point_select stmt - qe_point_select stmt - // invalidate cache - nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """ - qe_point_select stmt - qe_point_select stmt - qe_point_select stmt - nprep_sql """ - ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; - """ - qe_point_select stmt - qe_point_select stmt - nprep_sql """ - ALTER table ${tableName} DROP COLUMN new_column1; - """ - qe_point_select stmt - qe_point_select stmt - - // sql """ - // ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; - // """ - // qe_point_select stmt + + def create_table_sql = { property -> + return String.format(""" + CREATE TABLE IF NOT EXISTS ${tableName} ( + `k1` int(11) NULL COMMENT "", + `k2` decimalv3(27, 9) NULL COMMENT "", + `k3` varchar(300) NULL COMMENT "", + `k4` varchar(30) NULL COMMENT "", + `k5` date NULL COMMENT "", + `k6` datetime NULL COMMENT "", + `k7` float NULL COMMENT "", + `k8` datev2 NULL COMMENT "", + `k9` boolean NULL COMMENT "", + `k10` decimalv3(20, 3) NULL COMMENT "", + `k11` array NULL COMMENT "", + `k12` array NULL COMMENT "" + ) ENGINE=OLAP + UNIQUE KEY(`k1`, `k2`, `k3`) + CLUSTER BY(`k9`, `k5`, `k4`, `k2`) + DISTRIBUTED BY HASH(`k1`, k2, k3) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "store_row_column" = "true", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + %s + "storage_format" = "V2") + """, property) } - // disable useServerPrepStmts - def result2 = connect(user=user, password=password, url=context.config.jdbcUrl) { - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'""" - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" - qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" - // prepared text - sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """ - qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')""" - qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')""" - - sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" - qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" - qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" - tableName = "test_query" + + for (int i = 0; i < 3; i++) { + tableName = realDb + ".tbl_point_query_cluster_key" + i sql """DROP TABLE IF EXISTS ${tableName}""" - sql """CREATE TABLE ${tableName} ( - `customer_key` bigint(20) NULL, - `customer_btm_value_0` text NULL, - `customer_btm_value_1` text NULL, - `customer_btm_value_2` text NULL - ) ENGINE=OLAP - UNIQUE KEY(`customer_key`) - CLUSTER BY(`customer_btm_value_1`) - COMMENT 'OLAP' - DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16 - PROPERTIES ( - "replication_allocation" = "tag.location.default: 1", - "storage_format" = "V2", - "light_schema_change" = "true", - "store_row_column" = "true", - "enable_unique_key_merge_on_write" = "true", - "disable_auto_compaction" = "false" - );""" - sql """insert into ${tableName} values (0, "1", "2", "3")""" - qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + if (i == 0) { + def sql0 = create_table_sql("") + sql """ ${sql0} """ + } else if (i == 1) { + def sql1 = create_table_sql("\"function_column.sequence_type\" = 'int',") + sql """ ${sql1} """ + } else { + def sql2 = create_table_sql("\"function_column.sequence_col\" = 'k6',") + sql """ ${sql2} """ + } + sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """ + sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """ + sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """ + sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """ + sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """ + sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """ + sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """ + sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """ + sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """ + + def result1 = connect(user=user, password=password, url=prepare_url) { + def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1231) + stmt.setBigDecimal(2, new BigDecimal("119291.11")) + stmt.setString(3, "ddd") + qe_point_select stmt + stmt.setInt(1, 1237) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, "a ddd") + qe_point_select stmt + + stmt.setInt(1, 1232) + stmt.setBigDecimal(2, new BigDecimal("12222.99121135")) + stmt.setString(3, 'xxx') + qe_point_select stmt + + stmt.setInt(1, 251) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(251)) + qe_point_select stmt + + stmt.setInt(1, 252) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(252)) + qe_point_select stmt + + stmt.setInt(1, 298) + stmt.setBigDecimal(2, new BigDecimal("120939.11130")) + stmt.setString(3, generateString(298)) + qe_point_select stmt + stmt.close() + + stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?" + assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt.setBigDecimal(1, new BigDecimal("991129292901.11138")) + stmt.setString(2, "dd") + qe_point_select stmt + + def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?" + assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement); + stmt_fn.setInt(1, 1231) + stmt_fn.setBigDecimal(2, new BigDecimal("119291.11")) + stmt_fn.setString(3, "ddd") + qe_point_select stmt_fn + qe_point_select stmt_fn + qe_point_select stmt_fn + + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column0 INT default "0"; + """ + sleep(1); + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """ + stmt.setBigDecimal(1, new BigDecimal("120939.11130")) + stmt.setString(2, "a ddd") + qe_point_select stmt + qe_point_select stmt + // invalidate cache + nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """ + qe_point_select stmt + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + """ + qe_point_select stmt + qe_point_select stmt + nprep_sql """ + ALTER table ${tableName} DROP COLUMN new_column1; + """ + qe_point_select stmt + qe_point_select stmt + + sql """ + ALTER table ${tableName} ADD COLUMN new_column1 INT default "0"; + """ + qe_point_select stmt + } + // disable useServerPrepStmts + def result2 = connect(user=user, password=password, url=context.config.jdbcUrl) { + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'""" + // prepared text + sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """ + qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')""" + + sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" + qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" + qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" + tableName = "test_query" + sql """DROP TABLE IF EXISTS ${tableName}""" + sql """CREATE TABLE ${tableName} ( + `customer_key` bigint(20) NULL, + `customer_btm_value_0` text NULL, + `customer_btm_value_1` text NULL, + `customer_btm_value_2` text NULL + ) ENGINE=OLAP + UNIQUE KEY(`customer_key`) + CLUSTER BY(`customer_btm_value_1`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "light_schema_change" = "true", + "store_row_column" = "true", + "enable_unique_key_merge_on_write" = "true", + "disable_auto_compaction" = "false" + );""" + sql """insert into ${tableName} values (0, "1", "2", "3")""" + qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + } } + } finally { + set_be_config.call("disable_storage_row_cache", "true") } -} +} \ No newline at end of file From 520a15ce5eeded480515169c6e1a0e4ee63adb26 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 22 Nov 2023 22:15:09 +0800 Subject: [PATCH 63/64] Fix test_point_query_cluster_key --- .../suites/point_query_p0/test_point_query_cluster_key.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy index 66d9dbe8f88568..8c99c8b982c1d3 100644 --- a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -235,7 +235,7 @@ suite("test_point_query_cluster_key") { sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %""" qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')""" qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')""" - tableName = "test_query" + tableName = "test_query_cluster_key" sql """DROP TABLE IF EXISTS ${tableName}""" sql """CREATE TABLE ${tableName} ( `customer_key` bigint(20) NULL, From 378c20a7f4f6bb8147ab75198eaf52eadb7f51f4 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 23 Nov 2023 10:19:23 +0800 Subject: [PATCH 64/64] Fix test_point_query_cluster_key --- regression-test/suites/point_query_p0/test_point_query.groovy | 2 +- .../suites/point_query_p0/test_point_query_cluster_key.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/regression-test/suites/point_query_p0/test_point_query.groovy b/regression-test/suites/point_query_p0/test_point_query.groovy index 8c01c8cc208341..de562c086d81e0 100644 --- a/regression-test/suites/point_query_p0/test_point_query.groovy +++ b/regression-test/suites/point_query_p0/test_point_query.groovy @@ -254,7 +254,7 @@ suite("test_point_query") { "disable_auto_compaction" = "false" );""" sql """insert into ${tableName} values (0, "1", "2", "3")""" - qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where customer_key = 0""" } } } finally { diff --git a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy index 8c99c8b982c1d3..f1bc1e8913e7cb 100644 --- a/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy +++ b/regression-test/suites/point_query_p0/test_point_query_cluster_key.groovy @@ -256,7 +256,7 @@ suite("test_point_query_cluster_key") { "disable_auto_compaction" = "false" );""" sql """insert into ${tableName} values (0, "1", "2", "3")""" - qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0" + qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where customer_key = 0""" } } } finally {