This is an automated email from the ASF dual-hosted git repository.

huajianlan pushed a commit to branch opt_insert_into_values
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 12d417e24294eda47f64c3fb227caa7d433b22d5
Author: 924060929 <lanhuaj...@selectdb.com>
AuthorDate: Fri Nov 22 13:59:41 2024 +0800

    opt
---
 .../glue/translator/PhysicalPlanTranslator.java    | 26 ++++++++-----
 .../apache/doris/nereids/parser/NereidsParser.java | 43 ++++++++++++++--------
 .../trees/expressions/literal/DateLiteral.java     | 30 +++++++++++++--
 3 files changed, 69 insertions(+), 30 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index bea5eec432b..1081da89413 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -206,6 +206,7 @@ import org.apache.doris.thrift.TRuntimeFilterType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -2056,17 +2057,22 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         }
         setOperationNode.setNereidsId(setOperation.getId());
 
-        setOperation.getRegularChildrenOutputs().stream()
-                .map(o -> o.stream()
-                        .map(e -> ExpressionTranslator.translate(e, context))
-                        .collect(ImmutableList.toImmutableList()))
-                .forEach(setOperationNode::addResultExprLists);
+        for (List<SlotReference> regularChildrenOutput : 
setOperation.getRegularChildrenOutputs()) {
+            Builder<Expr> translateOutputs = 
ImmutableList.builderWithExpectedSize(regularChildrenOutput.size());
+            for (SlotReference childOutput : regularChildrenOutput) {
+                
translateOutputs.add(ExpressionTranslator.translate(childOutput, context));
+            }
+            setOperationNode.addResultExprLists(translateOutputs.build());
+        }
+
         if (setOperation instanceof PhysicalUnion) {
-            ((PhysicalUnion) setOperation).getConstantExprsList().stream()
-                    .map(l -> l.stream()
-                            .map(e -> ExpressionTranslator.translate(e, 
context))
-                            .collect(ImmutableList.toImmutableList()))
-                    .forEach(setOperationNode::addConstExprList);
+            for (List<NamedExpression> unionConsts : ((PhysicalUnion) 
setOperation).getConstantExprsList()) {
+                Builder<Expr> translateConsts = 
ImmutableList.builderWithExpectedSize(unionConsts.size());
+                for (NamedExpression unionConst : unionConsts) {
+                    
translateConsts.add(ExpressionTranslator.translate(unionConst, context));
+                }
+                setOperationNode.addConstExprList(translateConsts.build());
+            }
         }
 
         for (PlanFragment childFragment : childrenFragments) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
index 34646c1d657..27397dee61e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
@@ -273,34 +273,36 @@ public class NereidsParser {
 
     private <T> T parse(String sql, @Nullable LogicalPlanBuilder 
logicalPlanBuilder,
                         Function<DorisParser, ParserRuleContext> 
parseFunction) {
-        ParserRuleContext tree = toAst(sql, parseFunction);
+        CommonTokenStream tokenStream = parseAllTokens(sql);
+        ParserRuleContext tree = toAst(tokenStream, parseFunction);
         LogicalPlanBuilder realLogicalPlanBuilder = logicalPlanBuilder == null
-                    ? new LogicalPlanBuilder(getHintMap(sql, 
DorisParser::selectHint)) : logicalPlanBuilder;
+                    ? new LogicalPlanBuilder(getHintMap(sql, tokenStream, 
DorisParser::selectHint))
+                    : logicalPlanBuilder;
         return (T) realLogicalPlanBuilder.visit(tree);
     }
 
     public LogicalPlan parseForCreateView(String sql) {
-        ParserRuleContext tree = toAst(sql, DorisParser::singleStatement);
+        CommonTokenStream tokenStream = parseAllTokens(sql);
+        ParserRuleContext tree = toAst(tokenStream, 
DorisParser::singleStatement);
         LogicalPlanBuilder realLogicalPlanBuilder = new 
LogicalPlanBuilderForCreateView(
-                getHintMap(sql, DorisParser::selectHint));
+                getHintMap(sql, tokenStream, DorisParser::selectHint));
         return (LogicalPlan) realLogicalPlanBuilder.visit(tree);
     }
 
+    /** parseForSyncMv */
     public Optional<String> parseForSyncMv(String sql) {
-        ParserRuleContext tree = toAst(sql, DorisParser::singleStatement);
+        CommonTokenStream tokenStream = parseAllTokens(sql);
+        ParserRuleContext tree = toAst(tokenStream, 
DorisParser::singleStatement);
         LogicalPlanBuilderForSyncMv logicalPlanBuilderForSyncMv = new 
LogicalPlanBuilderForSyncMv(
-                getHintMap(sql, DorisParser::selectHint));
+                getHintMap(sql, tokenStream, DorisParser::selectHint));
         logicalPlanBuilderForSyncMv.visit(tree);
         return logicalPlanBuilderForSyncMv.getQuerySql();
     }
 
     /** get hint map */
-    public static Map<Integer, ParserRuleContext> getHintMap(String sql,
+    public static Map<Integer, ParserRuleContext> getHintMap(String sql, 
CommonTokenStream hintTokenStream,
                                                              
Function<DorisParser, ParserRuleContext> parseFunction) {
         // parse hint first round
-        DorisLexer hintLexer = new DorisLexer(new 
CaseInsensitiveStream(CharStreams.fromString(sql)));
-        CommonTokenStream hintTokenStream = new CommonTokenStream(hintLexer);
-
         Map<Integer, ParserRuleContext> selectHintMap = Maps.newHashMap();
 
         Token hintToken = hintTokenStream.getTokenSource().nextToken();
@@ -318,10 +320,14 @@ public class NereidsParser {
         return selectHintMap;
     }
 
+    public static ParserRuleContext toAst(
+            String sql, Function<DorisParser, ParserRuleContext> 
parseFunction) {
+        return toAst(parseAllTokens(sql), parseFunction);
+    }
+
     /** toAst */
-    public static ParserRuleContext toAst(String sql, Function<DorisParser, 
ParserRuleContext> parseFunction) {
-        DorisLexer lexer = new DorisLexer(new 
CaseInsensitiveStream(CharStreams.fromString(sql)));
-        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
+    public static ParserRuleContext toAst(
+            CommonTokenStream tokenStream, Function<DorisParser, 
ParserRuleContext> parseFunction) {
         DorisParser parser = new DorisParser(tokenStream);
 
         parser.addParseListener(POST_PROCESSOR);
@@ -352,9 +358,7 @@ public class NereidsParser {
      * will be normalized to: select \/*+SET_VAR(key=value)*\/ * , a, b from 
table
      */
     public static String removeCommentAndTrimBlank(String sql) {
-        DorisLexer lexer = new DorisLexer(new 
CaseInsensitiveStream(CharStreams.fromString(sql)));
-        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
-        tokenStream.fill();
+        CommonTokenStream tokenStream = parseAllTokens(sql);
 
         // maybe add more space char
         StringBuilder newSql = new StringBuilder((int) (sql.length() * 1.2));
@@ -381,4 +385,11 @@ public class NereidsParser {
         }
         return newSql.toString().trim();
     }
+
+    private static CommonTokenStream parseAllTokens(String sql) {
+        DorisLexer lexer = new DorisLexer(new 
CaseInsensitiveStream(CharStreams.fromString(sql)));
+        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
+        tokenStream.fill();
+        return tokenStream;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
index 6ea1d2af725..2e2594469a0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
@@ -288,10 +288,17 @@ public class DateLiteral extends Literal {
     /** parseDateTime */
     public static Result<TemporalAccessor, AnalysisException> 
parseDateTime(String s) {
         // fast parse '2022-01-01'
-        if (s.length() == 10 && s.charAt(4) == '-' && s.charAt(7) == '-') {
-            TemporalAccessor date = fastParseDate(s);
-            if (date != null) {
-                return Result.ok(date);
+        if ((s.length() == 10 || s.length() == 19) && s.charAt(4) == '-' && 
s.charAt(7) == '-') {
+            if (s.length() == 10) {
+                TemporalAccessor date = fastParseDate(s);
+                if (date != null) {
+                    return Result.ok(date);
+                }
+            } else if (s.charAt(10) == ' ' && s.charAt(13) == ':' && 
s.charAt(16) == ':') {
+                TemporalAccessor date = fastParseDateTime(s);
+                if (date != null) {
+                    return Result.ok(date);
+                }
             }
         }
 
@@ -566,6 +573,21 @@ public class DateLiteral extends Literal {
         }
     }
 
+    private static TemporalAccessor fastParseDateTime(String date) {
+        Integer year = readNextInt(date, 0, 4);
+        Integer month = readNextInt(date, 5, 2);
+        Integer day = readNextInt(date, 8, 2);
+        Integer hour = readNextInt(date, 11, 2);
+        Integer minute = readNextInt(date, 14, 2);
+        Integer second = readNextInt(date, 17, 2);
+
+        if (year != null && month != null && day != null && hour != null && 
minute != null && second != null) {
+            return LocalDateTime.of(year, month, day, hour, minute, second);
+        } else {
+            return null;
+        }
+    }
+
     private static Integer readNextInt(String str, int offset, int readLength) 
{
         int value = 0;
         int realReadLength = 0;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to