From 0b5a0ce38e8f45500b42e3e3c4106c0dcfd45b5e Mon Sep 17 00:00:00 2001 From: feiniaofeiafei Date: Tue, 25 Jun 2024 19:38:45 +0800 Subject: [PATCH 1/2] [Fix](nereids) fix generated column, static variables should not be used in ExpressionToExpr. An error will occur when shared by multiple threads. --- .../trees/plans/commands/info/CreateTableInfo.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java index 1ec8bd47a7de61..5c83252ace0690 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java @@ -874,7 +874,6 @@ private void generatedColumnCheck(ConnectContext ctx) { slotRef.setType(column.getType().toCatalogDataType()); translateMap.put(slot, new SlotRefAndIdx(slotRef, i, column.getGeneratedColumnDesc().isPresent())); } - ExpressionToExpr.initializeslotRefMap(translateMap); PlanTranslatorContext planTranslatorContext = new PlanTranslatorContext(cascadesContext); List slots = Lists.newArrayList(columnToSlotReference.values()); List exprAndnames = Lists.newArrayList(); @@ -898,7 +897,7 @@ private void generatedColumnCheck(ConnectContext ctx) { } checkExpressionInGeneratedColumn(expr, column, nameToColumnDefinition); TypeCoercionUtils.checkCanCastTo(expr.getDataType(), column.getType()); - ExpressionToExpr translator = new ExpressionToExpr(i); + ExpressionToExpr translator = new ExpressionToExpr(i, translateMap); Expr e = expr.accept(translator, planTranslatorContext); info.get().setExpr(e); exprAndnames.add(new GeneratedColumnUtil.ExprAndname(e.clone(), column.getName())); @@ -998,15 +997,12 @@ boolean checkFunctionInGeneratedColumn(Expression expr) { } private static class ExpressionToExpr extends ExpressionTranslator { - private static Map slotRefMap; + private final Map slotRefMap; private final int index; - public ExpressionToExpr(int index) { + public ExpressionToExpr(int index, Map slotRefMap) { this.index = index; - } - - public static void initializeslotRefMap(Map map) { - slotRefMap = map; + this.slotRefMap = slotRefMap; } @Override From b7e5443676228b8ed71aabfbeb4fa7063d09de78 Mon Sep 17 00:00:00 2001 From: feiniaofeiafei Date: Tue, 25 Jun 2024 19:51:24 +0800 Subject: [PATCH 2/2] [Fix]fix generated column, static variables should not be used in ExpressionToExpr. An error will occur when shared by multiple threads. --- .../org/apache/doris/analysis/CreateTableStmt.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java index b4972931fb79ef..46d0dbd35e8e89 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java @@ -732,14 +732,13 @@ private void generatedColumnCheck(Analyzer analyzer) throws AnalysisException { ColumnDef columnDef = columnDefs.get(i); nameToColumnDef.put(columnDef.getName(), Pair.of(columnDef, i)); } - SlotRefRewriteRule.initializeslotRefMap(nameToColumnDef); List exprAndnames = Lists.newArrayList(); for (int i = 0; i < columnDefs.size(); i++) { ColumnDef columnDef = columnDefs.get(i); if (!columnDef.getGeneratedColumnInfo().isPresent()) { continue; } - SlotRefRewriteRule slotRefRewriteRule = new SlotRefRewriteRule(i); + SlotRefRewriteRule slotRefRewriteRule = new SlotRefRewriteRule(i, nameToColumnDef); ExprRewriter rewriter = new ExprRewriter(slotRefRewriteRule); GeneratedColumnInfo generatedColumnInfo = columnDef.getGeneratedColumnInfo().get(); Expr expr = rewriter.rewrite(generatedColumnInfo.getExpr(), analyzer); @@ -830,15 +829,12 @@ private boolean checkFunctionInGeneratedColumn(FunctionCallExpr funcExpr) { } public static final class SlotRefRewriteRule implements ExprRewriteRule { - private static Map> nameToColumnDefMap = new HashMap<>(); + private final Map> nameToColumnDefMap; private final int index; - public SlotRefRewriteRule(int index) { + public SlotRefRewriteRule(int index, Map> nameToColumnDefMap) { this.index = index; - } - - public static void initializeslotRefMap(Map> map) { - nameToColumnDefMap = map; + this.nameToColumnDefMap = nameToColumnDefMap; } @Override