This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch TableModelIngestion
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/TableModelIngestion by this
push:
new 44a687251f1 add test for InsertTabletStatement.swap and insertColumn
44a687251f1 is described below
commit 44a687251f18f81a5a018bc50c8d5dfb7609b886
Author: jt2594838 <[email protected]>
AuthorDate: Thu Jul 4 10:50:25 2024 +0800
add test for InsertTabletStatement.swap and insertColumn
---
.../plan/parser/StatementGenerator.java | 6 +-
.../fetcher/TableHeaderSchemaValidator.java | 9 +-
.../plan/statement/crud/InsertBaseStatement.java | 7 +
.../plan/parser/StatementGeneratorTest.java | 152 +++++++++++++++++++++
4 files changed, 167 insertions(+), 7 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
index 37441d0ce43..ed1cfc5b1bf 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGenerator.java
@@ -101,6 +101,7 @@ import
org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.utils.ReadWriteIOUtils;
import org.apache.tsfile.utils.TimeDuration;
+import org.apache.tsfile.write.record.Tablet.ColumnType;
import java.nio.ByteBuffer;
import java.time.ZoneId;
@@ -110,11 +111,8 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import org.apache.tsfile.write.record.Tablet.ColumnType;
-/**
- * Convert SQL and RPC requests to {@link Statement}.
- */
+/** Convert SQL and RPC requests to {@link Statement}. */
public class StatementGenerator {
private static final PerformanceOverviewMetrics PERFORMANCE_OVERVIEW_METRICS
=
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
index dfd4a5febe9..cef7ad3a799 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
@@ -122,15 +122,18 @@ public class TableHeaderSchemaValidator {
// check and validate column data type and category
if (!columnSchema.getType().equals(UnknownType.UNKNOWN)
&& !TypeFactory.getType(existingColumn.getDataType())
- .equals(columnSchema.getType())) {
+ .equals(columnSchema.getType())) {
throw new SemanticException(
String.format("Wrong data type at column %s.",
columnSchema.getName()));
}
if (columnSchema.getColumnCategory() != null
&&
!existingColumn.getColumnCategory().equals(columnSchema.getColumnCategory())) {
throw new SemanticException(
- String.format("Wrong category at column %s : %s/%s",
columnSchema.getName(),
- columnSchema.getColumnCategory(),
existingColumn.getColumnCategory()));
+ String.format(
+ "Wrong category at column %s : %s/%s",
+ columnSchema.getName(),
+ columnSchema.getColumnCategory(),
+ existingColumn.getColumnCategory()));
}
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
index 84b7e7a2ef2..a7dc15dab53 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java
@@ -433,6 +433,10 @@ public abstract class InsertBaseStatement extends
Statement {
}
public void insertColumn(int pos, ColumnSchema columnSchema) {
+ if (pos < 0 || pos > measurements.length) {
+ throw new ArrayIndexOutOfBoundsException(pos);
+ }
+
if (measurementSchemas != null) {
MeasurementSchema[] tmp = new
MeasurementSchema[measurementSchemas.length + 1];
System.arraycopy(measurementSchemas, 0, tmp, 0, pos);
@@ -464,6 +468,9 @@ public abstract class InsertBaseStatement extends Statement
{
}
public void swapColumn(int src, int target) {
+ if (src < 0 || src >= measurements.length || target < 0 || target >=
measurements.length) {
+ throw new ArrayIndexOutOfBoundsException(src + "/" + target);
+ }
if (measurementSchemas != null) {
CommonUtils.swapArray(measurementSchemas, src, target);
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
index ec152ba06bd..1a75ab49d5b 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
@@ -34,7 +34,10 @@ import
org.apache.iotdb.db.queryengine.plan.expression.leaf.ConstantOperand;
import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand;
import
org.apache.iotdb.db.queryengine.plan.expression.multi.FunctionExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
+import
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+import org.apache.iotdb.db.queryengine.plan.statement.StatementTestUtils;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.component.ResultColumn;
import org.apache.iotdb.db.queryengine.plan.statement.crud.DeleteDataStatement;
@@ -82,6 +85,8 @@ import org.apache.iotdb.session.template.MeasurementNode;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.read.common.type.TypeFactory;
+import org.apache.tsfile.utils.BitMap;
import org.junit.Assert;
import org.junit.Test;
@@ -100,8 +105,10 @@ import java.util.stream.Collectors;
import static
org.apache.iotdb.db.schemaengine.template.TemplateQueryType.SHOW_MEASUREMENTS;
import static org.apache.tsfile.file.metadata.enums.CompressionType.SNAPPY;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
@@ -229,6 +236,150 @@ public class StatementGeneratorTest {
assertTrue(statement.isWriteToTable());
}
+ @Test
+ public void testTabletInsertColumn() {
+ final InsertTabletStatement insertTabletStatement =
+ StatementTestUtils.genInsertTabletStatement(false);
+ // insert at head
+ int insertPos = 0;
+
+ ColumnSchema columnSchema =
+ new ColumnSchema(
+ "s1", TypeFactory.getType(TSDataType.STRING), false,
TsTableColumnCategory.ID);
+ insertTabletStatement.insertColumn(insertPos, columnSchema);
+ assertEquals(4, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnSchema.getName(),
insertTabletStatement.getMeasurements()[insertPos]);
+ assertEquals(
+ InternalTypeManager.getTSDataType(columnSchema.getType()),
+ insertTabletStatement.getDataType(insertPos));
+ assertEquals(
+ columnSchema.getColumnCategory(),
insertTabletStatement.getColumnCategories()[insertPos]);
+ final Object[] column1 = (Object[])
insertTabletStatement.getColumns()[insertPos];
+ for (Object o : column1) {
+ assertNull(o);
+ }
+
+ // insert at middle
+ insertPos = 2;
+ columnSchema =
+ new ColumnSchema(
+ "s2", TypeFactory.getType(TSDataType.INT64), false,
TsTableColumnCategory.ATTRIBUTE);
+ insertTabletStatement.insertColumn(insertPos, columnSchema);
+ assertEquals(5, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnSchema.getName(),
insertTabletStatement.getMeasurements()[insertPos]);
+ assertEquals(
+ InternalTypeManager.getTSDataType(columnSchema.getType()),
+ insertTabletStatement.getDataType(insertPos));
+ assertEquals(
+ columnSchema.getColumnCategory(),
insertTabletStatement.getColumnCategories()[insertPos]);
+ final long[] column2 = (long[])
insertTabletStatement.getColumns()[insertPos];
+ for (long o : column2) {
+ assertEquals(0, o);
+ }
+
+ // insert at last
+ insertPos = 5;
+ columnSchema =
+ new ColumnSchema(
+ "s3",
+ TypeFactory.getType(TSDataType.BOOLEAN),
+ false,
+ TsTableColumnCategory.MEASUREMENT);
+ insertTabletStatement.insertColumn(insertPos, columnSchema);
+ assertEquals(6, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnSchema.getName(),
insertTabletStatement.getMeasurements()[insertPos]);
+ assertEquals(
+ InternalTypeManager.getTSDataType(columnSchema.getType()),
+ insertTabletStatement.getDataType(insertPos));
+ assertEquals(
+ columnSchema.getColumnCategory(),
insertTabletStatement.getColumnCategories()[insertPos]);
+ final boolean[] column3 = (boolean[])
insertTabletStatement.getColumns()[insertPos];
+ for (boolean o : column3) {
+ assertFalse(o);
+ }
+
+ // illegal insertion
+ ColumnSchema finalColumnSchema = columnSchema;
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class,
+ () -> insertTabletStatement.insertColumn(-1, finalColumnSchema));
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class,
+ () -> insertTabletStatement.insertColumn(7, finalColumnSchema));
+ }
+
+ @Test
+ public void testInsertTabletSwapColumn() {
+ final String[] columnNames = StatementTestUtils.genColumnNames();
+ final Object[] columns = StatementTestUtils.genColumns();
+ final TSDataType[] tsDataTypes = StatementTestUtils.genDataTypes();
+ final TsTableColumnCategory[] columnCategories =
StatementTestUtils.genColumnCategories();
+
+ final InsertTabletStatement insertTabletStatement =
+ StatementTestUtils.genInsertTabletStatement(false);
+ BitMap[] bitMaps = new BitMap[columnNames.length];
+ for (int i = 0; i < bitMaps.length; i++) {
+ bitMaps[i] = new BitMap(3);
+ bitMaps[i].mark(i);
+ }
+ insertTabletStatement.setBitMaps(bitMaps);
+
+ // [0, 1, 2] -> [2, 1, 0]
+ insertTabletStatement.swapColumn(0, 2);
+ assertEquals(3, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnNames[0], insertTabletStatement.getMeasurements()[2]);
+ assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[0]);
+ assertEquals(tsDataTypes[0], insertTabletStatement.getDataType(2));
+ assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(0));
+ assertEquals(columnCategories[0],
insertTabletStatement.getColumnCategories()[2]);
+ assertEquals(columnCategories[2],
insertTabletStatement.getColumnCategories()[0]);
+ assertArrayEquals(
+ ((double[]) columns[2]), ((double[])
insertTabletStatement.getColumns()[0]), 0.0001);
+ assertArrayEquals(((String[]) columns[0]), ((String[])
insertTabletStatement.getColumns()[2]));
+ assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(2));
+ assertTrue(insertTabletStatement.getBitMaps()[2].isMarked(0));
+
+ // [2, 1, 0] -> [1, 2, 0]
+ insertTabletStatement.swapColumn(0, 1);
+ assertEquals(3, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnNames[1], insertTabletStatement.getMeasurements()[0]);
+ assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[1]);
+ assertEquals(tsDataTypes[1], insertTabletStatement.getDataType(0));
+ assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(1));
+ assertEquals(columnCategories[1],
insertTabletStatement.getColumnCategories()[0]);
+ assertEquals(columnCategories[2],
insertTabletStatement.getColumnCategories()[1]);
+ assertArrayEquals(((String[]) columns[1]), ((String[])
insertTabletStatement.getColumns()[0]));
+ assertArrayEquals(
+ ((double[]) columns[2]), ((double[])
insertTabletStatement.getColumns()[1]), 0.0001);
+ assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(1));
+ assertTrue(insertTabletStatement.getBitMaps()[1].isMarked(2));
+
+ // [1, 2, 0] -> [1, 2, 0]
+ insertTabletStatement.swapColumn(1, 1);
+ assertEquals(3, insertTabletStatement.getMeasurements().length);
+ assertEquals(columnNames[1], insertTabletStatement.getMeasurements()[0]);
+ assertEquals(columnNames[2], insertTabletStatement.getMeasurements()[1]);
+ assertEquals(tsDataTypes[1], insertTabletStatement.getDataType(0));
+ assertEquals(tsDataTypes[2], insertTabletStatement.getDataType(1));
+ assertEquals(columnCategories[1],
insertTabletStatement.getColumnCategories()[0]);
+ assertEquals(columnCategories[2],
insertTabletStatement.getColumnCategories()[1]);
+ assertArrayEquals(((String[]) columns[1]), ((String[])
insertTabletStatement.getColumns()[0]));
+ assertArrayEquals(
+ ((double[]) columns[2]), ((double[])
insertTabletStatement.getColumns()[1]), 0.0001);
+ assertTrue(insertTabletStatement.getBitMaps()[0].isMarked(1));
+ assertTrue(insertTabletStatement.getBitMaps()[1].isMarked(2));
+
+ // illegal
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class, () ->
insertTabletStatement.swapColumn(-1, 1));
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class, () ->
insertTabletStatement.swapColumn(3, 1));
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class, () ->
insertTabletStatement.swapColumn(1, -1));
+ assertThrows(
+ ArrayIndexOutOfBoundsException.class, () ->
insertTabletStatement.swapColumn(1, 3));
+ }
+
@Test
public void testInsertTablets() throws IllegalPathException {
TSInsertTabletsReq req =
@@ -529,6 +680,7 @@ public class StatementGeneratorTest {
@FunctionalInterface
interface grantRevokeCheck {
+
void checkParser(String privilege, String name, boolean isuser, String
path, boolean grantOpt);
}