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

Reply via email to