[Fix](Nereids)fix insert into default value exception (#21924)

default value in the first cell of values when rise a cast exception, we filter it when check the types of values in insert, when the literal is string and value is the specific default value string, we skip type check.
This commit is contained in:
mch_ucchi
2023-07-24 12:08:43 +08:00
committed by GitHub
parent e141409171
commit ea35437c44
3 changed files with 14 additions and 9 deletions

View File

@ -529,7 +529,7 @@ public class NativeInsertStmt extends InsertStmt {
final List<Expr> resultExprs = queryStmt.getResultExprs();
Preconditions.checkState(resultExprs.isEmpty(), "result exprs should be empty.");
for (int i = 0; i < rowSize; i++) {
resultExprs.add(new IntLiteral(1));
resultExprs.add(new StringLiteral(SelectStmt.DEFAULT_VALUE));
final DefaultValueExpr defaultValueExpr = new DefaultValueExpr();
valueList.getFirstRow().add(defaultValueExpr);
colLabels.add(defaultValueExpr.toColumnLabel());
@ -545,11 +545,15 @@ public class NativeInsertStmt extends InsertStmt {
// Check if all columns mentioned is enough
checkColumnCoverage(mentionedColumns, targetTable.getBaseSchema());
realTargetColumnNames = targetColumns.stream().map(column -> column.getName()).collect(Collectors.toList());
realTargetColumnNames = targetColumns.stream().map(Column::getName).collect(Collectors.toList());
Map<String, Expr> slotToIndex = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
for (int i = 0; i < queryStmt.getResultExprs().size(); i++) {
slotToIndex.put(realTargetColumnNames.get(i), queryStmt.getResultExprs().get(i)
.checkTypeCompatibility(targetTable.getColumn(realTargetColumnNames.get(i)).getType()));
Expr expr = queryStmt.getResultExprs().get(i);
if (!(expr instanceof StringLiteral && ((StringLiteral) expr).getValue()
.equals(SelectStmt.DEFAULT_VALUE))) {
slotToIndex.put(realTargetColumnNames.get(i), queryStmt.getResultExprs().get(i)
.checkTypeCompatibility(targetTable.getColumn(realTargetColumnNames.get(i)).getType()));
}
}
for (Column column : targetTable.getBaseSchema()) {

View File

@ -80,6 +80,7 @@ import java.util.stream.Collectors;
*/
public class SelectStmt extends QueryStmt {
private static final Logger LOG = LogManager.getLogger(SelectStmt.class);
public static final String DEFAULT_VALUE = "__DEFAULT_VALUE__";
private UUID id = UUID.randomUUID();
// ///////////////////////////////////////
@ -575,7 +576,7 @@ public class SelectStmt extends QueryStmt {
}
for (Expr expr : valueList.getFirstRow()) {
if (expr instanceof DefaultValueExpr) {
resultExprs.add(new IntLiteral(1));
resultExprs.add(new StringLiteral(DEFAULT_VALUE));
} else {
resultExprs.add(rewriteQueryExprByMvColumnExpr(expr, analyzer));
}

View File

@ -161,9 +161,9 @@ public class InsertStmtTest {
ConnectContext ctx = UtFrameUtils.createDefaultCtx();
String sql = "values(1,'a',2,'b')";
SqlScanner input = new SqlScanner(new StringReader(sql),
org.apache.doris.analysis.SqlScanner input = new org.apache.doris.analysis.SqlScanner(new StringReader(sql),
ctx.getSessionVariable().getSqlMode());
SqlParser parser = new SqlParser(input);
org.apache.doris.analysis.SqlParser parser = new org.apache.doris.analysis.SqlParser(input);
Analyzer analyzer = new Analyzer(ctx.getEnv(), ctx);
StatementBase statementBase = null;
try {
@ -233,9 +233,9 @@ public class InsertStmtTest {
ConnectContext ctx = UtFrameUtils.createDefaultCtx();
String sql = "select kk1, kk2, kk3, kk4 from db.tbl";
SqlScanner input = new SqlScanner(new StringReader(sql),
org.apache.doris.analysis.SqlScanner input = new org.apache.doris.analysis.SqlScanner(new StringReader(sql),
ctx.getSessionVariable().getSqlMode());
SqlParser parser = new SqlParser(input);
org.apache.doris.analysis.SqlParser parser = new org.apache.doris.analysis.SqlParser(input);
Analyzer analyzer = new Analyzer(ctx.getEnv(), ctx);
StatementBase statementBase = null;
try {