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