This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 1c5926a659d [fix](generated column) static variables should not be used in ExpressionToExpr (#36824) 1c5926a659d is described below commit 1c5926a659d05dc82f3b4119603168082da2337d Author: feiniaofeiafei <53502832+feiniaofeia...@users.noreply.github.com> AuthorDate: Wed Jun 26 14:52:47 2024 +0800 [fix](generated column) static variables should not be used in ExpressionToExpr (#36824) introduced by #35284 Fix generated column, static variables should not be used in ExpressionToExpr. There is only one static variable slotRefMap in the ExpressionToExpr class globally. It may be used by multiple threads at the same time and assigned repeatedly, which is problematic. The same reason applies to the modification of class slotRefRewriteRule. No regression case added because this problem does not occur every time. --------- Co-authored-by: feiniaofeiafei <moail...@selectdb.com> --- .../main/java/org/apache/doris/analysis/CreateTableStmt.java | 12 ++++-------- .../nereids/trees/plans/commands/info/CreateTableInfo.java | 12 ++++-------- 2 files changed, 8 insertions(+), 16 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 b4972931fb7..46d0dbd35e8 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 @@ public class CreateTableStmt extends DdlStmt { ColumnDef columnDef = columnDefs.get(i); nameToColumnDef.put(columnDef.getName(), Pair.of(columnDef, i)); } - SlotRefRewriteRule.initializeslotRefMap(nameToColumnDef); List<GeneratedColumnUtil.ExprAndname> 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 @@ public class CreateTableStmt extends DdlStmt { } public static final class SlotRefRewriteRule implements ExprRewriteRule { - private static Map<String, Pair<ColumnDef, Integer>> nameToColumnDefMap = new HashMap<>(); + private final Map<String, Pair<ColumnDef, Integer>> nameToColumnDefMap; private final int index; - public SlotRefRewriteRule(int index) { + public SlotRefRewriteRule(int index, Map<String, Pair<ColumnDef, Integer>> nameToColumnDefMap) { this.index = index; - } - - public static void initializeslotRefMap(Map<String, Pair<ColumnDef, Integer>> map) { - nameToColumnDefMap = map; + this.nameToColumnDefMap = nameToColumnDefMap; } @Override 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 1ec8bd47a7d..5c83252ace0 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 @@ public class CreateTableInfo { slotRef.setType(column.getType().toCatalogDataType()); translateMap.put(slot, new SlotRefAndIdx(slotRef, i, column.getGeneratedColumnDesc().isPresent())); } - ExpressionToExpr.initializeslotRefMap(translateMap); PlanTranslatorContext planTranslatorContext = new PlanTranslatorContext(cascadesContext); List<Slot> slots = Lists.newArrayList(columnToSlotReference.values()); List<GeneratedColumnUtil.ExprAndname> exprAndnames = Lists.newArrayList(); @@ -898,7 +897,7 @@ public class CreateTableInfo { } 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 @@ public class CreateTableInfo { } private static class ExpressionToExpr extends ExpressionTranslator { - private static Map<Slot, SlotRefAndIdx> slotRefMap; + private final Map<Slot, SlotRefAndIdx> slotRefMap; private final int index; - public ExpressionToExpr(int index) { + public ExpressionToExpr(int index, Map<Slot, SlotRefAndIdx> slotRefMap) { this.index = index; - } - - public static void initializeslotRefMap(Map<Slot, SlotRefAndIdx> map) { - slotRefMap = map; + this.slotRefMap = slotRefMap; } @Override --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org