This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch branch-1.2-lts in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push: new bd2b6d37c6 [cherry-pick](planner)pick prs to branch-1.2 (#23542) bd2b6d37c6 is described below commit bd2b6d37c61b3a89654f48a78b28932c3017ce68 Author: mch_ucchi <41606806+sohardforan...@users.noreply.github.com> AuthorDate: Mon Aug 28 14:16:03 2023 +0800 [cherry-pick](planner)pick prs to branch-1.2 (#23542) from #21754 #22770 --- .../java/org/apache/doris/analysis/FunctionCallExpr.java | 14 ++++++++++++++ .../main/java/org/apache/doris/analysis/SelectStmt.java | 3 ++- .../java/org/apache/doris/datasource/InternalCatalog.java | 5 +++-- .../java/org/apache/doris/analysis/InsertStmtTest.java | 10 ++++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 07785f47ac..10b1f9e46d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -1583,6 +1583,20 @@ public class FunctionCallExpr extends Expr { this.type = PRECISION_INFER_RULE.getOrDefault(fnName.getFunction(), DEFAULT_PRECISION_INFER_RULE) .apply(children, this.type); } + + // cast(xx as char(N)/varchar(N)) will be handled as substr(cast(xx as char, varchar), 1, N), + // but type is varchar(*), we change it to varchar(N); + if (fn.getFunctionName().getFunction().equals("substr") + && children.size() == 3 + && children.get(1) instanceof IntLiteral + && children.get(2) instanceof IntLiteral) { + long len = ((IntLiteral) children.get(2)).getValue(); + if (type.isWildcardChar()) { + this.type = ScalarType.createCharType(((int) (len))); + } else if (type.isWildcardVarchar()) { + this.type = ScalarType.createVarchar(((int) (len))); + } + } // rewrite return type if is nested type function analyzeNestedFunction(); for (OrderByElement o : orderByElements) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 22b9c0a82d..16bb1ecf2f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -76,6 +76,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(); // /////////////////////////////////////// @@ -504,7 +505,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(expr); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java index ca24af08eb..aa8f355f77 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java @@ -1220,8 +1220,9 @@ public class InternalCatalog implements CatalogIf<Database> { Expr resultExpr = resultExprs.get(i); Type resultType = resultExpr.getType(); if (resultExpr instanceof FunctionCallExpr - && resultExpr.getType().getPrimitiveType().equals(PrimitiveType.VARCHAR)) { - resultType = ScalarType.createVarchar(65533); + && resultExpr.getType().getPrimitiveType().equals(PrimitiveType.VARCHAR) + && resultExpr.getType().getLength() == -1) { + resultType = ScalarType.createVarchar(ScalarType.MAX_VARCHAR_LENGTH); } if (resultType.isStringType() && (keysDesc == null || !keysDesc.containsCol(name))) { // Use String for varchar/char/string type, diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/InsertStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/InsertStmtTest.java index 72c9e67d8a..8f4688f230 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/InsertStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/InsertStmtTest.java @@ -157,8 +157,9 @@ public class InsertStmtTest { ConnectContext ctx = UtFrameUtils.createDefaultCtx(); String sql = "values(1,'a',2,'b')"; - SqlScanner input = new SqlScanner(new StringReader(sql), ctx.getSessionVariable().getSqlMode()); - SqlParser parser = new SqlParser(input); + org.apache.doris.analysis.SqlScanner input = new org.apache.doris.analysis.SqlScanner( + new StringReader(sql), ctx.getSessionVariable().getSqlMode()); + org.apache.doris.analysis.SqlParser parser = new org.apache.doris.analysis.SqlParser(input); Analyzer analyzer = new Analyzer(ctx.getEnv(), ctx); StatementBase statementBase = null; try { @@ -221,8 +222,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), ctx.getSessionVariable().getSqlMode()); - SqlParser parser = new SqlParser(input); + org.apache.doris.analysis.SqlScanner input = new org.apache.doris.analysis.SqlScanner( + new StringReader(sql), ctx.getSessionVariable().getSqlMode()); + org.apache.doris.analysis.SqlParser parser = new org.apache.doris.analysis.SqlParser(input); Analyzer analyzer = new Analyzer(ctx.getEnv(), ctx); StatementBase statementBase = null; try { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org