mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
fix parse create table bug
This commit is contained in:
@@ -728,12 +728,6 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
MySqlUnique unique = new MySqlUnique();
|
||||
|
||||
if (identifierEquals("USING")) {
|
||||
lexer.nextToken();
|
||||
unique.setIndexType(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
if (lexer.token() != Token.LPAREN) {
|
||||
SQLName name = name();
|
||||
unique.setName(name);
|
||||
@@ -750,6 +744,12 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
}
|
||||
accept(Token.RPAREN);
|
||||
|
||||
if (identifierEquals("USING")) {
|
||||
lexer.nextToken();
|
||||
unique.setIndexType(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
return unique;
|
||||
}
|
||||
|
||||
|
||||
@@ -723,11 +723,11 @@ public class WallConfig implements WallConfigMBean {
|
||||
String getHiddenColumn(String tableName);
|
||||
|
||||
/**
|
||||
* resultset返回值中如果包含hiddenColumn的回调函数
|
||||
* resultset返回值中如果包含tenantColumn的回调函数
|
||||
*
|
||||
* @param value hiddenColumn对应的值
|
||||
* @param value tenantColumn对应的值
|
||||
*/
|
||||
void resultset_hiddenColumn(Object value);
|
||||
void filterResultsetTenantColumn(Object value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -55,6 +55,7 @@ import com.alibaba.druid.util.JdbcUtils;
|
||||
import com.alibaba.druid.util.ServletPathMatcher;
|
||||
import com.alibaba.druid.util.StringUtils;
|
||||
import com.alibaba.druid.wall.WallConfig.TenantCallBack;
|
||||
import com.alibaba.druid.wall.WallConfig.TenantCallBack.StatementType;
|
||||
import com.alibaba.druid.wall.spi.DB2WallProvider;
|
||||
import com.alibaba.druid.wall.spi.MySqlWallProvider;
|
||||
import com.alibaba.druid.wall.spi.OracleWallProvider;
|
||||
@@ -1214,11 +1215,11 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean {
|
||||
boolean hasNext = chain.resultSet_next(resultSet);
|
||||
TenantCallBack callback = provider.getConfig().getTenantCallBack();
|
||||
if (callback != null && hasNext) {
|
||||
List<Integer> hiddenColumns = resultSet.getHiddenColumns();
|
||||
if (hiddenColumns != null && hiddenColumns.size() > 0) {
|
||||
for (Integer columnIndex : hiddenColumns) {
|
||||
List<Integer> tenantColumns = tenantColumnsLocal.get();
|
||||
if (tenantColumns != null && tenantColumns.size() > 0) {
|
||||
for (Integer columnIndex : tenantColumns) {
|
||||
Object value = resultSet.getResultSetRaw().getObject(columnIndex);
|
||||
callback.resultset_hiddenColumn(value);
|
||||
callback.filterResultsetTenantColumn(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1371,6 +1372,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean {
|
||||
return provider.checkValid(sql);
|
||||
}
|
||||
|
||||
private static final ThreadLocal<List<Integer>> tenantColumnsLocal = new ThreadLocal<List<Integer>>();
|
||||
|
||||
private void preprocessResultSet(ResultSetProxy resultSet) throws SQLException {
|
||||
if (resultSet == null) {
|
||||
return;
|
||||
@@ -1390,17 +1393,28 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean {
|
||||
Map<Integer, Integer> logicColumnMap = new HashMap<Integer, Integer>();
|
||||
Map<Integer, Integer> physicalColumnMap = new HashMap<Integer, Integer>();
|
||||
List<Integer> hiddenColumns = new ArrayList<Integer>();
|
||||
List<Integer> tenantColumns = new ArrayList<Integer>();
|
||||
for (int physicalColumn = 1, logicColumn = 1; physicalColumn <= metaData.getColumnCount(); physicalColumn++) {
|
||||
boolean isHidden = false;
|
||||
String tableName = metaData.getTableName(physicalColumn);
|
||||
|
||||
String hiddenColumn = null;
|
||||
String tenantColumn = null;
|
||||
if (tenantCallBack != null) {
|
||||
tenantColumn = tenantCallBack.getTenantColumn(StatementType.SELECT, tableName);
|
||||
hiddenColumn = tenantCallBack.getHiddenColumn(tableName);
|
||||
}
|
||||
if (StringUtils.isEmpty(hiddenColumn)
|
||||
&& (tableName == null || ServletPathMatcher.getInstance().matches(tenantTablePattern, tableName))) {
|
||||
hiddenColumn = provider.getConfig().getTenantColumn();
|
||||
|
||||
if (StringUtils.isEmpty(hiddenColumn) || StringUtils.isEmpty(tenantColumn)) {
|
||||
if (tableName == null || ServletPathMatcher.getInstance().matches(tenantTablePattern, tableName)) {
|
||||
if (StringUtils.isEmpty(hiddenColumn)) {
|
||||
hiddenColumn = provider.getConfig().getTenantColumn();
|
||||
}
|
||||
|
||||
if (StringUtils.isEmpty(tenantColumn)) {
|
||||
tenantColumn = provider.getConfig().getTenantColumn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!StringUtils.isEmpty(hiddenColumn)) {
|
||||
@@ -1415,6 +1429,11 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean {
|
||||
physicalColumnMap.put(physicalColumn, logicColumn);
|
||||
logicColumn++;
|
||||
}
|
||||
|
||||
if (!StringUtils.isEmpty(tenantColumn)
|
||||
&& tenantColumn.equalsIgnoreCase(metaData.getColumnName(physicalColumn))) {
|
||||
tenantColumns.add(physicalColumn);
|
||||
}
|
||||
}
|
||||
|
||||
if (hiddenColumns.size() > 0) {
|
||||
@@ -1422,5 +1441,6 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean {
|
||||
resultSet.setPhysicalColumnMap(physicalColumnMap);
|
||||
resultSet.setHiddenColumns(hiddenColumns);
|
||||
}
|
||||
tenantColumnsLocal.set(tenantColumns);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ public class TenantTestCallBack implements TenantCallBack {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resultset_hiddenColumn(Object value) {
|
||||
public void filterResultsetTenantColumn(Object value) {
|
||||
System.out.println(value);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user