From d2d2d4c0445cae14eb8a7ecf9cb4fcbc8c00f5cd Mon Sep 17 00:00:00 2001 From: yanhuqing666 Date: Tue, 7 Mar 2017 17:35:27 +0800 Subject: [PATCH] #29 and other SET Syntax response --- .../java/io/mycat/route/RouteService.java | 6 ++--- .../route/impl/AbstractRouteStrategy.java | 4 ---- .../parser/druid/DruidParserFactory.java | 2 +- .../parser/druid/impl/DefaultDruidParser.java | 8 +++++-- .../mycat/server/handler/SelectHandler.java | 21 ++++++++++++----- .../io/mycat/server/handler/SetHandler.java | 9 +++++--- .../server/parser/ServerParseSelect.java | 21 +++++++---------- .../server/response/SelectVariables.java | 23 ++++++++----------- .../server/response/SessionIsolation.java | 19 ++++++++++++++- 9 files changed, 66 insertions(+), 47 deletions(-) diff --git a/src/main/java/io/mycat/route/RouteService.java b/src/main/java/io/mycat/route/RouteService.java index 48768fddb..aeef06d53 100644 --- a/src/main/java/io/mycat/route/RouteService.java +++ b/src/main/java/io/mycat/route/RouteService.java @@ -71,9 +71,9 @@ public class RouteService { String cacheKey = null; /** - * SELECT 类型的SQL, 检测 + * SELECT 类型的SQL, 检测,debug 模式下不缓存 */ - if (sqlType == ServerParse.SELECT) { + if (sqlType == ServerParse.SELECT && !LOGGER.isDebugEnabled()) { cacheKey = (schema == null ? "NULL_" : schema.getName()) + stmt; rrs = (RouteResultset) sqlRouteCache.get(cacheKey); if (rrs != null) { @@ -135,7 +135,7 @@ public class RouteService { charset, sc, tableId2DataNodeCache); } - if (rrs != null && sqlType == ServerParse.SELECT && rrs.isCacheAble()) { + if (rrs != null && sqlType == ServerParse.SELECT && rrs.isCacheAble()&&!LOGGER.isDebugEnabled()) { sqlRouteCache.putIfAbsent(cacheKey, rrs); } return rrs; diff --git a/src/main/java/io/mycat/route/impl/AbstractRouteStrategy.java b/src/main/java/io/mycat/route/impl/AbstractRouteStrategy.java index 6f1940828..8eb723763 100644 --- a/src/main/java/io/mycat/route/impl/AbstractRouteStrategy.java +++ b/src/main/java/io/mycat/route/impl/AbstractRouteStrategy.java @@ -12,9 +12,7 @@ import io.mycat.config.model.SchemaConfig; import io.mycat.config.model.SystemConfig; import io.mycat.route.RouteResultset; import io.mycat.route.RouteStrategy; -import io.mycat.route.util.RouterUtil; import io.mycat.server.ServerConnection; -import io.mycat.server.parser.ServerParse; import io.mycat.sqlengine.mpp.LoadData; public abstract class AbstractRouteStrategy implements RouteStrategy { @@ -52,8 +50,6 @@ public abstract class AbstractRouteStrategy implements RouteStrategy { if (schema == null) { rrs = routeNormalSqlWithAST(schema, stmt, rrs, charset, cachePool); - } else if (schema.isNoSharding() && ServerParse.SHOW != sqlType) { - rrs = RouterUtil.routeToSingleNode(rrs, schema.getDataNode()); } else { RouteResultset returnedSet = routeSystemInfo(schema, sqlType, stmt, rrs); if (returnedSet == null) { diff --git a/src/main/java/io/mycat/route/parser/druid/DruidParserFactory.java b/src/main/java/io/mycat/route/parser/druid/DruidParserFactory.java index 097407531..0cfe8ee7a 100644 --- a/src/main/java/io/mycat/route/parser/druid/DruidParserFactory.java +++ b/src/main/java/io/mycat/route/parser/druid/DruidParserFactory.java @@ -63,7 +63,7 @@ public class DruidParserFactory } else if (statement instanceof SQLDropIndexStatement) { parser = new DruidDropIndexParser(); } else { - String msg = "THE DLL is not supported :" + statement; + String msg = "THE DDL is not supported :" + statement; throw new SQLNonTransientException(msg); } } else { diff --git a/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java b/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java index 7dd86e91f..9a224fc59 100644 --- a/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java +++ b/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java @@ -94,8 +94,12 @@ public class DefaultDruidParser implements DruidParser { String key = entry.getKey(); String value = entry.getValue(); if (MycatServer.getInstance().getConfig().getSystem().isLowerCaseTableNames()) { - key = key.toLowerCase(); - value = value.toLowerCase(); + if (key != null){ + key = key.toLowerCase(); + } + if (value != null){ + value = value.toLowerCase(); + } } if (key != null && key.indexOf("`") >= 0) { key = key.replaceAll("`", ""); diff --git a/src/main/java/io/mycat/server/handler/SelectHandler.java b/src/main/java/io/mycat/server/handler/SelectHandler.java index 1b1ddf01f..16cef381f 100644 --- a/src/main/java/io/mycat/server/handler/SelectHandler.java +++ b/src/main/java/io/mycat/server/handler/SelectHandler.java @@ -27,7 +27,16 @@ import io.mycat.route.parser.util.ParseUtil; import io.mycat.server.ServerConnection; import io.mycat.server.parser.ServerParse; import io.mycat.server.parser.ServerParseSelect; -import io.mycat.server.response.*; +import io.mycat.server.response.SelectDatabase; +import io.mycat.server.response.SelectIdentity; +import io.mycat.server.response.SelectLastInsertId; +import io.mycat.server.response.SelectTxReadOnly; +import io.mycat.server.response.SelectUser; +import io.mycat.server.response.SelectVariables; +import io.mycat.server.response.SelectVersion; +import io.mycat.server.response.SelectVersionComment; +import io.mycat.server.response.SessionIncrement; +import io.mycat.server.response.SessionIsolation; /** * @author mycat @@ -95,11 +104,11 @@ public final class SelectHandler { offset = ServerParseSelect.skipAs(stmt, offset); SelectIdentity.response(c, stmt, offset, orgName); break; - case ServerParseSelect.SELECT_VAR_ALL: - SelectVariables.execute(c,stmt); - break; - case ServerParseSelect.SESSION_TX_READ_ONLY: - SelectTxReadOnly.response(c); + case ServerParseSelect.SELECT_VAR_ALL: + SelectVariables.execute(c, stmt); + break; + case ServerParseSelect.SESSION_TX_READ_ONLY: + SelectTxReadOnly.response(c); break; default: c.execute(stmt, ServerParse.SELECT); diff --git a/src/main/java/io/mycat/server/handler/SetHandler.java b/src/main/java/io/mycat/server/handler/SetHandler.java index afd7a409b..1bb5a4043 100644 --- a/src/main/java/io/mycat/server/handler/SetHandler.java +++ b/src/main/java/io/mycat/server/handler/SetHandler.java @@ -162,9 +162,12 @@ public final class SetHandler { boolean ignore = SetIgnoreUtil.isIgnoreStmt(stmt); if ( !ignore ) { StringBuilder s = new StringBuilder(); - logger.warn(s.append(c).append(stmt).append(" is not recoginized and ignored").toString()); - } - c.write(c.writeToBuffer(OkPacket.OK, c.allocate())); + String warn = stmt+ " is not recoginized and ignored"; + logger.warn(s.append(c).append(warn).toString()); + c.writeErrMessage(ErrorCode.ERR_NOT_SUPPORTED, warn); + } else { + c.write(c.writeToBuffer(OkPacket.OK, c.allocate())); + } } } } diff --git a/src/main/java/io/mycat/server/parser/ServerParseSelect.java b/src/main/java/io/mycat/server/parser/ServerParseSelect.java index fb8276a01..62e0f7c85 100644 --- a/src/main/java/io/mycat/server/parser/ServerParseSelect.java +++ b/src/main/java/io/mycat/server/parser/ServerParseSelect.java @@ -95,22 +95,17 @@ public final class ServerParseSelect { * @return */ private static int sessionVarCheck(String stmt, int offset) { - String s = stmt.substring(offset).toLowerCase(); - if (s.startsWith("session.auto_increment_increment")) { - if(s.contains("@@")) - { - return SELECT_VAR_ALL; - } + String s = stmt.substring(offset).toLowerCase(); + if (s.startsWith("session.auto_increment_increment")) { + if (s.contains("@@")) { + return SELECT_VAR_ALL; + } return SESSION_INCREMENT; - } else if (s - .startsWith("session.tx_isolation")) { + } else if (s.startsWith("session.tx_isolation")) { return SESSION_ISOLATION; - } - else if (s - .startsWith("session.tx_read_only")) { + } else if (s.startsWith("session.tx_read_only")) { return SESSION_TX_READ_ONLY; - } - else { + } else { return OTHER; } } diff --git a/src/main/java/io/mycat/server/response/SelectVariables.java b/src/main/java/io/mycat/server/response/SelectVariables.java index 864408d88..77b4eafc5 100644 --- a/src/main/java/io/mycat/server/response/SelectVariables.java +++ b/src/main/java/io/mycat/server/response/SelectVariables.java @@ -23,29 +23,24 @@ */ package io.mycat.server.response; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.common.base.Splitter; -import io.mycat.backend.BackendConnection; import io.mycat.backend.mysql.PacketUtil; import io.mycat.config.Fields; import io.mycat.net.mysql.EOFPacket; import io.mycat.net.mysql.FieldPacket; import io.mycat.net.mysql.ResultSetHeaderPacket; import io.mycat.net.mysql.RowDataPacket; -import io.mycat.server.NonBlockingSession; import io.mycat.server.ServerConnection; -import io.mycat.util.LongUtil; -import io.mycat.util.StringUtil; - -import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * @author mycat diff --git a/src/main/java/io/mycat/server/response/SessionIsolation.java b/src/main/java/io/mycat/server/response/SessionIsolation.java index df22f4dd7..185b20290 100644 --- a/src/main/java/io/mycat/server/response/SessionIsolation.java +++ b/src/main/java/io/mycat/server/response/SessionIsolation.java @@ -27,6 +27,7 @@ import java.nio.ByteBuffer; import io.mycat.backend.mysql.PacketUtil; import io.mycat.config.Fields; +import io.mycat.config.Isolations; import io.mycat.net.mysql.EOFPacket; import io.mycat.net.mysql.FieldPacket; import io.mycat.net.mysql.ResultSetHeaderPacket; @@ -61,7 +62,23 @@ public class SessionIsolation { buffer = eof.write(buffer, c,true); byte packetId = eof.packetId; RowDataPacket row = new RowDataPacket(FIELD_COUNT); - row.add(StringUtil.encode("REPEATABLE-READ",c.getCharset())); + + String value = ""; + switch (c.getTxIsolation()) { + case Isolations.READ_COMMITTED: + value = "READ-COMMITTED"; + break; + case Isolations.READ_UNCOMMITTED: + value = "READ-UNCOMMITTED"; + break; + case Isolations.REPEATED_READ: + value = "REPEATED-READ"; + break; + case Isolations.SERIALIZABLE: + value = "SERIALIZABLE"; + break; + } + row.add(StringUtil.encode(value,c.getCharset())); row.packetId = ++packetId; buffer = row.write(buffer, c,true); EOFPacket lastEof = new EOFPacket();