From 6dd5510b3b3f1478436e7b886e272960540d05f4 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 5 Feb 2013 18:42:36 +0800 Subject: [PATCH] bug fixed for multi-tenant --- .../druid/wall/spi/WallVisitorUtils.java | 7 ++- .../bvt/filter/wall/TenantSelectTest4.java | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/TenantSelectTest4.java diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 830baf67a6..bb29297f65 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -132,18 +132,21 @@ public class WallVisitorUtils { checkCondition(visitor, x.getWhere()); if (Boolean.TRUE == getValue(where)) { + boolean isSimpleConstExpr = false; if (where instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) where; if (binaryOpExpr.getOperator() == SQLBinaryOperator.Equality || binaryOpExpr.getOperator() == SQLBinaryOperator.NotEqual) { if (binaryOpExpr.getLeft() instanceof SQLIntegerExpr && binaryOpExpr.getRight() instanceof SQLIntegerExpr) { - return; + isSimpleConstExpr = true; } } } - addViolation(visitor, x); + if (!isSimpleConstExpr) { + addViolation(visitor, x); + } } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/TenantSelectTest4.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/TenantSelectTest4.java new file mode 100644 index 0000000000..df461be3d8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/TenantSelectTest4.java @@ -0,0 +1,57 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.wall.WallCheckResult; +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.MySqlWallProvider; + +public class TenantSelectTest4 extends TestCase { + + private String sql = "SELECT a.*,b.name " + // + "FROM vote_info a left join vote_item b on a.item_id=b.id " + // + "where 1=1 limit 1,10"; + + private WallConfig config = new WallConfig(); + + protected void setUp() throws Exception { + config.setTenantTablePattern("*"); + config.setTenantColumn("tenant"); + } + + public void testMySql() throws Exception { + WallProvider.setTenantValue(123); + MySqlWallProvider provider = new MySqlWallProvider(config); + WallCheckResult checkResult = provider.check(sql); + Assert.assertEquals(0, checkResult.getViolations().size()); + + String resultSql = SQLUtils.toSQLString(checkResult.getStatementList(), JdbcConstants.MYSQL); + Assert.assertEquals("SELECT a.*, b.name" + // + "\nFROM vote_info a" + // + "\n\tLEFT JOIN vote_item b ON b.tenant = 123" + // + "\n\t\tAND a.item_id = b.id" + // + "\nWHERE a.tenant = 123" + // + "\n\tAND 1 = 1" + // + "\nLIMIT 1, 10", resultSql); + } +}