in features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java [137:175]
private EncryptAssignmentToken generateValuesSQLToken(final EncryptTable encryptTable, final ColumnAssignmentSegment assignmentSegment, final FunctionSegment functionSegment,
final QuoteCharacter quoteCharacter) {
ColumnSegment columnSegment = assignmentSegment.getColumns().get(0);
String column = columnSegment.getIdentifier().getValue();
Optional<ExpressionSegment> valueColumnSegment = functionSegment.getParameters().stream().findFirst();
Preconditions.checkState(valueColumnSegment.isPresent());
String valueColumn = ((ColumnSegment) valueColumnSegment.get()).getIdentifier().getValue();
EncryptFunctionAssignmentToken result =
new EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), assignmentSegment.getStopIndex(), quoteCharacter);
boolean isEncryptColumn = encryptTable.isEncryptColumn(column);
boolean isEncryptValueColumn = encryptTable.isEncryptColumn(valueColumn);
EncryptColumn encryptColumn = encryptTable.getEncryptColumn(column);
EncryptColumn encryptValueColumn = encryptTable.getEncryptColumn(column);
if (isEncryptColumn && isEncryptValueColumn) {
String cipherColumn = encryptColumn.getCipher().getName();
String cipherValueColumn = encryptValueColumn.getCipher().getName();
result.addAssignment(cipherColumn, "VALUES(" + cipherValueColumn + ")");
} else if (isEncryptColumn != isEncryptValueColumn) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
Optional<AssistedQueryColumnItem> assistedQueryColumn = encryptColumn.getAssistedQuery();
Optional<AssistedQueryColumnItem> valueAssistedQueryColumn = encryptValueColumn.getAssistedQuery();
if (assistedQueryColumn.isPresent() && valueAssistedQueryColumn.isPresent()) {
result.addAssignment(assistedQueryColumn.get().getName(), "VALUES(" + valueAssistedQueryColumn.get().getName() + ")");
} else if (assistedQueryColumn.isPresent() != valueAssistedQueryColumn.isPresent()) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
Optional<LikeQueryColumnItem> likeQueryColumn = encryptColumn.getLikeQuery();
Optional<LikeQueryColumnItem> valueLikeQueryColumn = encryptValueColumn.getLikeQuery();
if (likeQueryColumn.isPresent() && valueLikeQueryColumn.isPresent()) {
result.addAssignment(likeQueryColumn.get().getName(), "VALUES(" + valueLikeQueryColumn.get().getName() + ")");
} else if (likeQueryColumn.isPresent() != valueLikeQueryColumn.isPresent()) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
if (result.isAssignmentsEmpty()) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
return result;
}