From 763a42c9af83650daf22b3abc113db5dcec9203f Mon Sep 17 00:00:00 2001 From: Mingyu Chen Date: Wed, 26 Aug 2020 10:40:42 +0800 Subject: [PATCH] [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. --- .../doris/analysis/InformationFunction.java | 7 +++++- .../org/apache/doris/mysql/MysqlProto.java | 1 + .../apache/doris/planner/QueryPlanTest.java | 24 ++++++++++++++++--- .../apache/doris/utframe/UtFrameUtils.java | 13 +++++----- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java index 0550abe6e0..d1f2fc7762 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java @@ -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(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java index 11b67d63ad..18401cc2e8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java @@ -104,6 +104,7 @@ public class MysqlProto { context.setCurrentUserIdentity(currentUserIdentity.get(0)); context.setQualifiedUser(qualifiedUser); + context.setRemoteIP(remoteIp); return true; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index d74ba6c7a7..7572bef88b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -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()); + } } + + diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java index c68adff3e4..acee940500 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java @@ -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 { } } } +