[MySQL Compatibility 2/4][Bug] Fix bug and improve compatibility with mysql protocol (#4362)

1. select database() will only return database name, without cluster name.
2. select user() will return the IP which user connected in.
This commit is contained in:
Mingyu Chen
2020-08-26 10:40:42 +08:00
committed by GitHub
parent 613c44e889
commit 763a42c9af
4 changed files with 34 additions and 11 deletions

View File

@ -18,6 +18,7 @@
package org.apache.doris.analysis;
import org.apache.doris.catalog.Type;
import org.apache.doris.cluster.ClusterNamespace;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.thrift.TExprNode;
@ -41,6 +42,10 @@ public class InformationFunction extends Expr {
strValue = other.strValue;
}
public String getStrValue() {
return strValue;
}
@Override
public Expr clone() {
return new InformationFunction(this);
@ -50,7 +55,7 @@ public class InformationFunction extends Expr {
protected void analyzeImpl(Analyzer analyzer) throws AnalysisException {
if (funcType.equalsIgnoreCase("DATABASE") || funcType.equalsIgnoreCase("SCHEMA")) {
type = Type.VARCHAR;
strValue = analyzer.getDefaultDb();
strValue = ClusterNamespace.getNameFromFullName(analyzer.getDefaultDb());
} else if (funcType.equalsIgnoreCase("USER")) {
type = Type.VARCHAR;
strValue = ConnectContext.get().getUserIdentity().toString();

View File

@ -104,6 +104,7 @@ public class MysqlProto {
context.setCurrentUserIdentity(currentUserIdentity.get(0));
context.setQualifiedUser(qualifiedUser);
context.setRemoteIP(remoteIp);
return true;
}

View File

@ -17,10 +17,12 @@
package org.apache.doris.planner;
import org.apache.doris.analysis.Analyzer;
import org.apache.doris.analysis.CreateDbStmt;
import org.apache.doris.analysis.CreateTableStmt;
import org.apache.doris.analysis.DropDbStmt;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.InformationFunction;
import org.apache.doris.analysis.LoadStmt;
import org.apache.doris.analysis.SelectStmt;
import org.apache.doris.analysis.ShowCreateDbStmt;
@ -48,8 +50,6 @@ import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.List;
import java.util.UUID;
@ -989,7 +989,6 @@ public class QueryPlanTest {
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
Assert.assertTrue(explainString.contains("INNER JOIN (PARTITIONED)"));
connectContext.getSessionVariable().setPreferJoinMethod("broadcast");
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)"));
@ -1021,4 +1020,23 @@ public class QueryPlanTest {
Assert.assertFalse(explainString.contains(denseRank));
}
}
@Test
public void testInformationFunctions() throws Exception {
connectContext.setDatabase("default_cluster:test");
Analyzer analyzer = new Analyzer(connectContext.getCatalog(), connectContext);
InformationFunction infoFunc = new InformationFunction("database");
infoFunc.analyze(analyzer);
Assert.assertEquals("test", infoFunc.getStrValue());
infoFunc = new InformationFunction("user");
infoFunc.analyze(analyzer);
Assert.assertEquals("'root'@'127.0.0.1'", infoFunc.getStrValue());
infoFunc = new InformationFunction("current_user");
infoFunc.analyze(analyzer);
Assert.assertEquals("'root'@'%'", infoFunc.getStrValue());
}
}

View File

@ -17,7 +17,6 @@
package org.apache.doris.utframe;
import com.google.common.collect.ImmutableMap;
import org.apache.doris.analysis.Analyzer;
import org.apache.doris.analysis.SqlParser;
import org.apache.doris.analysis.SqlScanner;
@ -28,7 +27,6 @@ import org.apache.doris.catalog.DiskInfo;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.Config;
import org.apache.doris.common.DdlException;
import org.apache.doris.common.Pair;
import org.apache.doris.common.util.SqlParserUtils;
import org.apache.doris.mysql.privilege.PaloAuth;
import org.apache.doris.planner.Planner;
@ -46,19 +44,18 @@ import org.apache.doris.utframe.MockedFrontend.EnvVarNotSetException;
import org.apache.doris.utframe.MockedFrontend.FeStartException;
import org.apache.doris.utframe.MockedFrontend.NotInitException;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.io.FileUtils;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.net.ServerSocket;
import java.nio.channels.SocketChannel;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -72,6 +69,7 @@ public class UtFrameUtils {
ctx.setCluster(SystemInfoService.DEFAULT_CLUSTER);
ctx.setCurrentUserIdentity(UserIdentity.ROOT);
ctx.setQualifiedUser(PaloAuth.ROOT_USER);
ctx.setRemoteIP("127.0.0.1");
ctx.setCatalog(Catalog.getCurrentCatalog());
ctx.setThreadLocalInfo();
return ctx;
@ -223,3 +221,4 @@ public class UtFrameUtils {
}
}
}