From 3df4aadf1dbbeb571a88e723309df863257f1a01 Mon Sep 17 00:00:00 2001 From: zhyee <30677017+yanyzy@users.noreply.github.com> Date: Tue, 24 Sep 2019 17:00:29 +0800 Subject: [PATCH] Fix SCTL statement execute error with comments (#3093) * Fix SCTL statement execute error with comment * Add SCTLUtils class to trim sql --- .../TextProtocolBackendHandlerFactory.java | 6 ++- .../backend/text/sctl/utils/SCTLUtils.java | 44 +++++++++++++++++++ ...TextProtocolBackendHandlerFactoryTest.java | 8 ++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/sctl/utils/SCTLUtils.java diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/TextProtocolBackendHandlerFactory.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/TextProtocolBackendHandlerFactory.java index ad2e7068b9..ae55222e38 100644 --- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/TextProtocolBackendHandlerFactory.java +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/TextProtocolBackendHandlerFactory.java @@ -38,6 +38,7 @@ import org.apache.shardingsphere.shardingproxy.backend.text.admin.UnicastBackend import org.apache.shardingsphere.shardingproxy.backend.text.admin.UseDatabaseBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.query.QueryBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.sctl.ShardingCTLBackendHandlerFactory; +import org.apache.shardingsphere.shardingproxy.backend.text.sctl.utils.SCTLUtils; import org.apache.shardingsphere.shardingproxy.backend.text.transaction.SkipBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.transaction.TransactionBackendHandler; import org.apache.shardingsphere.spi.database.DatabaseType; @@ -60,8 +61,9 @@ public final class TextProtocolBackendHandlerFactory { * @return instance of text protocol backend handler */ public static TextProtocolBackendHandler newInstance(final DatabaseType databaseType, final String sql, final BackendConnection backendConnection) { - if (sql.toUpperCase().startsWith(ShardingCTLBackendHandlerFactory.SCTL)) { - return ShardingCTLBackendHandlerFactory.newInstance(sql, backendConnection); + final String trimSql = SCTLUtils.trimComment(sql); + if (trimSql.toUpperCase().startsWith(ShardingCTLBackendHandlerFactory.SCTL)) { + return ShardingCTLBackendHandlerFactory.newInstance(trimSql, backendConnection); } SQLStatement sqlStatement = new SQLParseKernel(ParseRuleRegistry.getInstance(), databaseType, sql).parse(); if (sqlStatement instanceof TCLStatement) { diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/sctl/utils/SCTLUtils.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/sctl/utils/SCTLUtils.java new file mode 100644 index 0000000000..eeb8860eab --- /dev/null +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/text/sctl/utils/SCTLUtils.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.shardingproxy.backend.text.sctl.utils; + +public class SCTLUtils { + + private static final String COMMENT_PREFIX = "/*"; + + private static final String COMMENT_SUFFIX = "*/"; + + private static final String SQL_END = ";"; + + /** + * Trim the comment of sql. + * + * @param sql SQL to be trim + * @return the sql remove comment + */ + public static String trimComment(final String sql) { + String result = sql; + if (sql.startsWith(COMMENT_PREFIX)) { + result = result.substring(sql.indexOf(COMMENT_SUFFIX) + 2); + } + if (sql.endsWith(SQL_END)) { + result = result.substring(0, result.length() - 1); + } + return result.trim(); + } +} diff --git a/sharding-proxy/sharding-proxy-backend/src/test/java/org/apache/shardingsphere/shardingproxy/backend/TextProtocolBackendHandlerFactoryTest.java b/sharding-proxy/sharding-proxy-backend/src/test/java/org/apache/shardingsphere/shardingproxy/backend/TextProtocolBackendHandlerFactoryTest.java index d0daf973ff..58f65bc81d 100644 --- a/sharding-proxy/sharding-proxy-backend/src/test/java/org/apache/shardingsphere/shardingproxy/backend/TextProtocolBackendHandlerFactoryTest.java +++ b/sharding-proxy/sharding-proxy-backend/src/test/java/org/apache/shardingsphere/shardingproxy/backend/TextProtocolBackendHandlerFactoryTest.java @@ -30,6 +30,7 @@ import org.apache.shardingsphere.shardingproxy.backend.text.admin.UnicastBackend import org.apache.shardingsphere.shardingproxy.backend.text.admin.UseDatabaseBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.query.QueryBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.sctl.set.ShardingCTLSetBackendHandler; +import org.apache.shardingsphere.shardingproxy.backend.text.sctl.show.ShardingCTLShowBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.transaction.SkipBackendHandler; import org.apache.shardingsphere.shardingproxy.backend.text.transaction.TransactionBackendHandler; import org.apache.shardingsphere.spi.database.DatabaseType; @@ -70,6 +71,13 @@ public final class TextProtocolBackendHandlerFactoryTest { TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection); assertThat(actual, instanceOf(ShardingCTLSetBackendHandler.class)); } + + @Test + public void assertNewInstanceSCTLWithComment() { + String sql = "/*ApplicationName=DataGrip 2018.1.4*/ sctl:show cached_connections;"; + TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection); + assertThat(actual, instanceOf(ShardingCTLShowBackendHandler.class)); + } @Test public void assertNewInstanceWithBegin() { -- GitLab