diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java index 6b8746bcad325..bef61a4b72dca 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java @@ -20,6 +20,7 @@ package org.apache.iotdb.db.it.auth; import org.apache.iotdb.commons.auth.entity.PrivilegeType; +import org.apache.iotdb.commons.conf.CommonDescriptor; import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.db.it.utils.TestUtils; @@ -1508,6 +1509,7 @@ public void testStrongPassword() throws SQLException { public void testPasswordHistory() { try (Connection connection = EnvFactory.getEnv().getConnection(); Statement statement = connection.createStatement()) { + testPasswordHistoryEncrypted(statement); testPasswordHistoryCreateAndDrop(statement); testPasswordHistoryAlter(statement); } catch (SQLException e) { @@ -1516,6 +1518,18 @@ public void testPasswordHistory() { } } + public void testPasswordHistoryEncrypted(Statement statement) throws SQLException { + ResultSet resultSet = + statement.executeQuery("SELECT password,oldPassword from root.__audit.password_history._0"); + assertTrue(resultSet.next()); + assertEquals( + AuthUtils.encryptPassword(CommonDescriptor.getInstance().getConfig().getAdminPassword()), + resultSet.getString("root.__audit.password_history._0.password")); + assertEquals( + AuthUtils.encryptPassword(CommonDescriptor.getInstance().getConfig().getAdminPassword()), + resultSet.getString("root.__audit.password_history._0.oldPassword")); + } + public void testPasswordHistoryCreateAndDrop(Statement statement) throws SQLException { statement.execute("create user userA 'abcdef123456'"); diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java index f81ea2dd225d7..46bc9e7160795 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java @@ -367,71 +367,83 @@ private List> generateTabletResultSetForTable( switch (sourceType) { case INT64: case TIMESTAMP: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case INT32: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DOUBLE: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case FLOAT: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DATE: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) - ? null - : DateUtils.parseDateExpressionToInt(((LocalDate[]) values[j])[i])); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((LocalDate[]) values[j])[i]; + if (targetType == TSDataType.DATE) { + insertRecord.add(value); + break; + } + if (value != null) { + value = DateUtils.parseDateExpressionToInt((LocalDate) value); + } + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case TEXT: case STRING: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); - break; case BLOB: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case BOOLEAN: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; } } diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java index b973c2ad06ca3..d2d3d4ee2055c 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java @@ -434,7 +434,11 @@ private void validateResultSet( break; case TEXT: case STRING: - assertEquals(field.getStringValue(), rowValues.get(i)); + if (rowValues.get(i) instanceof Binary) { + assertEquals(field.getStringValue(), rowValues.get(i).toString()); + } else { + assertEquals(field.getStringValue(), rowValues.get(i)); + } break; case INT32: assertEquals(field.getIntV(), (int) rowValues.get(i)); @@ -602,44 +606,87 @@ private List> generateTabletResultSetForTable( switch (sourceType) { case INT64: case TIMESTAMP: - value = ValueConverter.convert(sourceType, targetType, ((long[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case INT32: - value = ValueConverter.convert(sourceType, targetType, ((int[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DOUBLE: - value = ValueConverter.convert(sourceType, targetType, ((double[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case FLOAT: - value = ValueConverter.convert(sourceType, targetType, ((float[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DATE: - value = - ValueConverter.convert( - sourceType, - targetType, - DateUtils.parseDateExpressionToInt(((LocalDate[]) values[j])[i])); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((LocalDate[]) values[j])[i]; + if (targetType == TSDataType.DATE) { + insertRecord.add(value); + break; + } + if (value != null) { + value = DateUtils.parseDateExpressionToInt((LocalDate) value); + } + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case TEXT: case STRING: - value = ValueConverter.convert(sourceType, targetType, ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); - break; case BLOB: - value = ValueConverter.convert(sourceType, targetType, ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case BOOLEAN: - value = ValueConverter.convert(sourceType, targetType, ((boolean[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; } } + insertRecord.add(tablet.getTimestamp(i)); insertRecords.add(insertRecord); } diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java index 22e3e0ccd348e..8f76adb3be815 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java @@ -1452,12 +1452,22 @@ private void testOneCastWithTablet( rec = dataSet.next(); assertEquals(1, rec.getFields().get(0).getLongV()); assertEquals("d1", rec.getFields().get(1).toString()); - if (to == TSDataType.BLOB) { - assertEquals(genValue(to, 1), rec.getFields().get(2).getBinaryV()); - } else if (to == TSDataType.DATE) { - assertEquals(genValue(to, 1), rec.getFields().get(2).getDateV()); - } else { - assertEquals(genValue(to, 1).toString(), rec.getFields().get(2).toString()); + + switch (to) { + case BLOB: + assertEquals(genValue(to, 1), rec.getFields().get(2).getBinaryV()); + break; + case DATE: + assertEquals(genValue(to, 1), rec.getFields().get(2).getDateV()); + break; + case FLOAT: + assertEquals(genValue(to, 1), rec.getFields().get(2).getFloatV()); + break; + case DOUBLE: + assertEquals(genValue(to, 1), rec.getFields().get(2).getDoubleV()); + break; + default: + assertEquals(String.valueOf(genValue(from, 1)), rec.getFields().get(2).toString()); } assertFalse(dataSet.hasNext()); } else { @@ -1621,17 +1631,19 @@ public void insertRelationalTabletWithAutoCastTest() dataTypes.remove(TSDataType.VECTOR); dataTypes.remove(TSDataType.UNKNOWN); - for (TSDataType from : dataTypes) { - for (TSDataType to : dataTypes) { - System.out.println("from: " + from + ", to: " + to); - testOneCastWithTablet(from, to, testNum, false); - System.out.println("partial insert"); - testOneCastWithTablet(from, to, testNum, true); + try { + for (TSDataType from : dataTypes) { + for (TSDataType to : dataTypes) { + System.out.println("from: " + from + ", to: " + to); + testOneCastWithTablet(from, to, testNum, false); + System.out.println("partial insert"); + testOneCastWithTablet(from, to, testNum, true); + } + } + } finally { + try (ISession session = EnvFactory.getEnv().getSessionConnection()) { + session.executeNonQueryStatement("SET CONFIGURATION \"enable_partial_insert\"=\"true\""); } - } - - try (ISession session = EnvFactory.getEnv().getSessionConnection()) { - session.executeNonQueryStatement("SET CONFIGURATION \"enable_partial_insert\"=\"true\""); } } diff --git a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java index 53bb5e1fa7609..ef7bffdb9f06a 100644 --- a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java @@ -498,10 +498,6 @@ public void testHybridAutoExtendSchemaTemplate() e.getMessage() .contains( "data type of root.db.v4.d2.b is not consistent, registered type FLOAT, inserting type DOUBLE")); - Assert.assertTrue( - e.getMessage() - .contains( - "data type of root.db.v4.d2.c is not consistent, registered type TEXT, inserting type INT32")); } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java index 570e53374f092..91adb0bc859ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java @@ -31,6 +31,7 @@ import org.apache.iotdb.commons.service.metric.MetricService; import org.apache.iotdb.commons.service.metric.enums.Metric; import org.apache.iotdb.commons.service.metric.enums.Tag; +import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.commons.utils.CommonDateTimeUtils; import org.apache.iotdb.db.audit.DNAuditLogger; import org.apache.iotdb.db.auth.AuthorityChecker; @@ -175,7 +176,8 @@ public BasicOpenSessionResp login( username); long currentTime = CommonDateTimeUtils.currentTime(); TSStatus tsStatus = - DataNodeAuthUtils.recordPasswordHistory(userId, password, password, currentTime); + DataNodeAuthUtils.recordPasswordHistory( + userId, password, AuthUtils.encryptPassword(password), currentTime); if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { openSessionResp .sessionId(-1) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java index 3586aface40ba..7ee43a93aea8d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java @@ -210,6 +210,9 @@ public boolean isModified() { return false; } + @Override + public void setModified(boolean modified) {} + @Override public void initTsBlockBuilder(List dataTypes) { builder = new TsBlockBuilder(dataTypes); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java index 90231d1bedfb5..a868024007222 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java @@ -225,6 +225,9 @@ public boolean isModified() { return false; } + @Override + public void setModified(boolean modified) {} + @Override public void initTsBlockBuilder(List dataTypes) { // non-aligned page reader don't need to init TsBlockBuilder at the very beginning diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java index 656527a097d4f..187575c58da7b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java @@ -159,7 +159,7 @@ public static void verifyPasswordReuse(long userId, String password) { } public static TSStatus recordPasswordHistory( - long userId, String password, String oldPassword, long timeToRecord) { + long userId, String password, String oldEncryptedPassword, long timeToRecord) { InsertRowStatement insertRowStatement = new InsertRowStatement(); try { insertRowStatement.setDevicePath( @@ -169,7 +169,9 @@ public static TSStatus recordPasswordHistory( insertRowStatement.setValues( new Object[] { new Binary(AuthUtils.encryptPassword(password), StandardCharsets.UTF_8), - oldPassword == null ? null : new Binary(oldPassword, StandardCharsets.UTF_8) + oldEncryptedPassword == null + ? null + : new Binary(oldEncryptedPassword, StandardCharsets.UTF_8) }); insertRowStatement.setDataTypes(new TSDataType[] {TSDataType.STRING, TSDataType.STRING}); } catch (IllegalPathException ignored) { diff --git a/pom.xml b/pom.xml index 8f962181a0276..c86df5f482d93 100644 --- a/pom.xml +++ b/pom.xml @@ -177,7 +177,7 @@ 0.14.1 1.9 1.5.6-3 - 2.2.0-250825-SNAPSHOT + 2.2.0-251010-SNAPSHOT