[fix](sequence-column) Fix sequence_col column used default expr insert failed (#18933)

This commit is contained in:
lvshaokang
2023-05-08 17:18:25 +08:00
committed by GitHub
parent bc1bf420d1
commit af04c3acab
3 changed files with 74 additions and 5 deletions

View File

@ -70,6 +70,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Insert into is performed to load data from the result of query stmt.
@ -715,29 +716,38 @@ public class InsertStmt extends DdlStmt {
selectList.set(i, expr);
exprByName.put(col.getName(), expr);
}
List<Pair<String, Expr>> resultExprByName = Lists.newArrayList();
// reorder resultExprs in table column order
for (Column col : targetTable.getFullSchema()) {
if (exprByName.containsKey(col.getName())) {
resultExprs.add(exprByName.get(col.getName()));
resultExprByName.add(Pair.of(col.getName(), exprByName.get(col.getName())));
} else {
// process sequence col, map sequence column to other column
if (targetTable instanceof OlapTable && ((OlapTable) targetTable).hasSequenceCol()
&& col.getName().equals(Column.SEQUENCE_COL)
&& ((OlapTable) targetTable).getSequenceMapCol() != null) {
resultExprs.add(exprByName.get(((OlapTable) targetTable).getSequenceMapCol()));
if (resultExprByName.stream().map(Pair::key)
.anyMatch(key -> key.equals(((OlapTable) targetTable).getSequenceMapCol()))) {
resultExprByName.add(Pair.of(Column.SEQUENCE_COL,
resultExprByName.stream()
.filter(p -> p.key().equals(((OlapTable) targetTable).getSequenceMapCol()))
.map(Pair::value).findFirst().orElse(null)));
}
} else if (col.getDefaultValue() == null) {
resultExprs.add(NullLiteral.create(col.getType()));
resultExprByName.add(Pair.of(col.getName(), NullLiteral.create(col.getType())));
} else {
if (col.getDefaultValueExprDef() != null) {
resultExprs.add(col.getDefaultValueExpr());
resultExprByName.add(Pair.of(col.getName(), col.getDefaultValueExpr()));
} else {
StringLiteral defaultValueExpr;
defaultValueExpr = new StringLiteral(col.getDefaultValue());
resultExprs.add(defaultValueExpr.checkTypeCompatibility(col.getType()));
resultExprByName.add(Pair.of(col.getName(),
defaultValueExpr.checkTypeCompatibility(col.getType())));
}
}
}
}
resultExprs.addAll(resultExprByName.stream().map(Pair::value).collect(Collectors.toList()));
}
private DataSink createDataSink() throws AnalysisException {