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

morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 132b9d615f8 [fix](variable) modify @@auto_commit column type to BIGINT 
(#36584)
132b9d615f8 is described below

commit 132b9d615f804984a134d716112edd0a2f95c84c
Author: Mingyu Chen <morning...@163.com>
AuthorDate: Thu Jun 20 16:02:27 2024 +0800

    [fix](variable) modify @@auto_commit column type to BIGINT (#36584)
    
    bp #33887 #33282
---
 .../java/org/apache/doris/qe/SessionVariable.java  |  11 ++-
 .../main/java/org/apache/doris/qe/VariableMgr.java | 109 +++++++++++++--------
 .../java/org/apache/doris/qe/VariableMgrTest.java  |  38 +++++++
 3 files changed, 113 insertions(+), 45 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index cee326f0f99..0de84bfa16f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -554,7 +554,9 @@ public class SessionVariable implements Serializable, 
Writable {
     public String resourceGroup = "";
 
     // this is used to make mysql client happy
-    @VariableMgr.VarAttr(name = AUTO_COMMIT)
+    // autocommit is actually a boolean value, but @@autocommit is type of 
BIGINT.
+    // So we need to set convertBoolToLongMethod to make "select @@autocommit" 
happy.
+    @VariableMgr.VarAttr(name = AUTO_COMMIT, convertBoolToLongMethod = 
"convertBoolToLong")
     public boolean autoCommit = true;
 
     // this is used to make c3p0 library happy
@@ -1669,10 +1671,6 @@ public class SessionVariable implements Serializable, 
Writable {
         return enableJoinReorderBasedCost;
     }
 
-    public boolean isAutoCommit() {
-        return autoCommit;
-    }
-
     public boolean isTxReadonly() {
         return txReadonly;
     }
@@ -2470,6 +2468,9 @@ public class SessionVariable implements Serializable, 
Writable {
         }
     }
 
+    public long convertBoolToLong(Boolean val) {
+        return val ? 1 : 0;
+    }
 
     public boolean isEnableFileCache() {
         return enableFileCache;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
index 85224c6aef7..b8fd6810778 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
@@ -36,6 +36,7 @@ import 
org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.persist.GlobalVarPersistInfo;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSortedMap;
 import com.google.common.collect.Lists;
@@ -489,47 +490,61 @@ public class VariableMgr {
     }
 
     private static void fillValue(Object obj, Field field, VariableExpr desc) {
-        try {
-            switch (field.getType().getSimpleName()) {
-                case "boolean":
-                    desc.setType(Type.BOOLEAN);
-                    desc.setBoolValue(field.getBoolean(obj));
-                    break;
-                case "byte":
-                    desc.setType(Type.TINYINT);
-                    desc.setIntValue(field.getByte(obj));
-                    break;
-                case "short":
-                    desc.setType(Type.SMALLINT);
-                    desc.setIntValue(field.getShort(obj));
-                    break;
-                case "int":
-                    desc.setType(Type.INT);
-                    desc.setIntValue(field.getInt(obj));
-                    break;
-                case "long":
-                    desc.setType(Type.BIGINT);
-                    desc.setIntValue(field.getLong(obj));
-                    break;
-                case "float":
-                    desc.setType(Type.FLOAT);
-                    desc.setFloatValue(field.getFloat(obj));
-                    break;
-                case "double":
-                    desc.setType(Type.DOUBLE);
-                    desc.setFloatValue(field.getDouble(obj));
-                    break;
-                case "String":
-                    desc.setType(Type.VARCHAR);
-                    desc.setStringValue((String) field.get(obj));
-                    break;
-                default:
-                    desc.setType(Type.VARCHAR);
-                    desc.setStringValue("");
-                    break;
+        VarAttr attr = field.getAnnotation(VarAttr.class);
+        if (!Strings.isNullOrEmpty(attr.convertBoolToLongMethod())) {
+            try {
+                Preconditions.checkArgument(obj instanceof SessionVariable);
+                long val = (Long) 
SessionVariable.class.getDeclaredMethod(attr.convertBoolToLongMethod(), 
Boolean.class)
+                        .invoke(obj, field.getBoolean(obj));
+                desc.setType(Type.BIGINT);
+                desc.setIntValue(val);
+            } catch (Exception e) {
+                // should not happen
+                LOG.warn("failed to convert bool to long for var: {}", 
field.getName(), e);
+            }
+        } else {
+            try {
+                switch (field.getType().getSimpleName()) {
+                    case "boolean":
+                        desc.setType(Type.BOOLEAN);
+                        desc.setBoolValue(field.getBoolean(obj));
+                        break;
+                    case "byte":
+                        desc.setType(Type.TINYINT);
+                        desc.setIntValue(field.getByte(obj));
+                        break;
+                    case "short":
+                        desc.setType(Type.SMALLINT);
+                        desc.setIntValue(field.getShort(obj));
+                        break;
+                    case "int":
+                        desc.setType(Type.INT);
+                        desc.setIntValue(field.getInt(obj));
+                        break;
+                    case "long":
+                        desc.setType(Type.BIGINT);
+                        desc.setIntValue(field.getLong(obj));
+                        break;
+                    case "float":
+                        desc.setType(Type.FLOAT);
+                        desc.setFloatValue(field.getFloat(obj));
+                        break;
+                    case "double":
+                        desc.setType(Type.DOUBLE);
+                        desc.setFloatValue(field.getDouble(obj));
+                        break;
+                    case "String":
+                        desc.setType(Type.VARCHAR);
+                        desc.setStringValue((String) field.get(obj));
+                        break;
+                    default:
+                        desc.setType(Type.VARCHAR);
+                        desc.setStringValue("");
+                        break;
+                }
+            } catch (IllegalAccessException e) {
+                LOG.warn("Access failed.", e);
             }
-        } catch (IllegalAccessException e) {
-            LOG.warn("Access failed.", e);
         }
     }
 
@@ -577,6 +592,18 @@ public class VariableMgr {
     }
 
     private static Literal getLiteral(Object obj, Field field) {
+        VarAttr attr = field.getAnnotation(VarAttr.class);
+        if (!Strings.isNullOrEmpty(attr.convertBoolToLongMethod())) {
+            try {
+                Preconditions.checkArgument(obj instanceof SessionVariable);
+                long val = (Long) 
SessionVariable.class.getDeclaredMethod(attr.convertBoolToLongMethod(), 
Boolean.class)
+                        .invoke(obj, field.getBoolean(obj));
+                return Literal.of(Long.valueOf(val));
+            } catch (Exception e) {
+                // should not happen
+                LOG.warn("failed to convert bool to long for var: {}", 
field.getName(), e);
+            }
+        }
         try {
             switch (field.getType().getSimpleName()) {
                 case "boolean":
@@ -772,6 +799,8 @@ public class VariableMgr {
 
         // Enum options for this config item, if it has.
         String[] options() default {};
+
+        String convertBoolToLongMethod() default "";
     }
 
     private static class VarContext {
diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/VariableMgrTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/qe/VariableMgrTest.java
index d08dc94454e..b3e5f286108 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/qe/VariableMgrTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/VariableMgrTest.java
@@ -17,17 +17,23 @@
 
 package org.apache.doris.qe;
 
+import org.apache.doris.analysis.BoolLiteral;
 import org.apache.doris.analysis.CreateDbStmt;
+import org.apache.doris.analysis.IntLiteral;
 import org.apache.doris.analysis.SetStmt;
 import org.apache.doris.analysis.SetType;
 import org.apache.doris.analysis.SetVar;
 import org.apache.doris.analysis.StringLiteral;
 import org.apache.doris.analysis.VariableExpr;
 import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
+import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.utframe.UtFrameUtils;
 
 import org.apache.commons.io.FileUtils;
@@ -254,4 +260,36 @@ public class VariableMgrTest {
         SessionVariable defaultSessionVar = new SessionVariable();
         Assert.assertEquals(defaultSessionVar.enableProfile(), 
VariableMgr.newSessionVariable().enableProfile());
     }
+
+    @Test
+    public void testAutoCommitConvert() throws Exception {
+        // boolean var with ConvertBoolToLongMethod annotation
+        VariableExpr desc = new VariableExpr("autocommit");
+        SessionVariable var = new SessionVariable();
+        VariableMgr.fillValue(var, desc);
+        Assert.assertTrue(desc.getLiteralExpr() instanceof IntLiteral);
+        Assert.assertEquals(Type.BIGINT, desc.getType());
+
+        // normal boolean var
+        desc = new VariableExpr("enable_bucket_shuffle_join");
+        VariableMgr.fillValue(var, desc);
+        Assert.assertTrue(desc.getLiteralExpr() instanceof BoolLiteral);
+        Assert.assertEquals(Type.BOOLEAN, desc.getType());
+    }
+
+    // @@auto_commit's type should be BIGINT
+    @Test
+    public void testAutoCommitType() throws AnalysisException {
+        // Old planner
+        SessionVariable sv = new SessionVariable();
+        VariableExpr desc = new VariableExpr(SessionVariable.AUTO_COMMIT);
+        VariableMgr.fillValue(sv, desc);
+        Assert.assertEquals(Type.BIGINT, desc.getType());
+        // Nereids
+        sv = new SessionVariable();
+        String name = SessionVariable.AUTO_COMMIT;
+        SetType setType = SetType.SESSION;
+        Literal l = VariableMgr.getLiteral(sv, name, setType);
+        Assert.assertEquals(BigIntType.INSTANCE, l.getDataType());
+    }
 }


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

Reply via email to