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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]