Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,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
Expand Down Expand Up @@ -2026,10 +2028,6 @@ public boolean isEnableJoinReorderBasedCost() {
return enableJoinReorderBasedCost;
}

public boolean isAutoCommit() {
return autoCommit;
}

public boolean enableMultiClusterSyncLoad() {
return cloudEnableMultiClusterSyncLoad;
}
Expand Down Expand Up @@ -2938,6 +2936,10 @@ public void checkMaxExecutionTimeMSValid(String newValue) {
}
}

public long convertBoolToLong(Boolean val) {
return val ? 1 : 0;
}

public boolean isEnableFileCache() {
return enableFileCache;
}
Expand Down
97 changes: 57 additions & 40 deletions fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
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;
Expand Down Expand Up @@ -498,47 +499,61 @@ public static void fillValue(SessionVariable var, VariableExpr desc) throws Anal
}

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);
}
}

Expand Down Expand Up @@ -790,6 +805,8 @@ public int compare(List<String> o1, List<String> o2) {

// Enum options for this config item, if it has.
String[] options() default {};

String convertBoolToLongMethod() default "";
}

private static class VarContext {
Expand Down
19 changes: 19 additions & 0 deletions fe/fe-core/src/test/java/org/apache/doris/qe/VariableMgrTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@

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.Config;
import org.apache.doris.common.DdlException;
import org.apache.doris.common.UserException;
Expand Down Expand Up @@ -254,4 +257,20 @@ public void testSetGlobalDefault() throws Exception {
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());
}
}