diff --git a/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java b/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java index 9fa5e095a7..2bcbc9fe5e 100644 --- a/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java +++ b/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java @@ -279,7 +279,6 @@ public class ConfigFilter extends FilterAdapter { } } - @SuppressWarnings("resource") private InputStream getFileAsStream(String filePath) throws FileNotFoundException { InputStream inStream = null; File file = new File(filePath); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 461baf6788..949661d414 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -164,6 +164,26 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } } + + if (lexer.token() == Token.DEFAULT) { + lexer.nextToken(); + if (identifierEquals("CHARACTER")) { + lexer.nextToken(); + accept(Token.SET); + if (lexer.token() == Token.EQ) { + lexer.nextToken(); + } + stmt.getTableOptions().put("CHARACTER SET", lexer.stringVal()); + lexer.nextToken(); + } else if (identifierEquals("CHARSET")) { + lexer.nextToken(); + if (lexer.token() == Token.EQ) { + lexer.nextToken(); + } + stmt.getTableOptions().put("CHARACTER SET", lexer.stringVal()); + lexer.nextToken(); + } + } break; } diff --git a/src/main/java/com/alibaba/druid/wall/WallUtils.java b/src/main/java/com/alibaba/druid/wall/WallUtils.java index bce900a45e..f4f8d5e8d3 100644 --- a/src/main/java/com/alibaba/druid/wall/WallUtils.java +++ b/src/main/java/com/alibaba/druid/wall/WallUtils.java @@ -17,10 +17,20 @@ package com.alibaba.druid.wall; import com.alibaba.druid.wall.spi.MySqlWallProvider; import com.alibaba.druid.wall.spi.OracleWallProvider; +import com.alibaba.druid.wall.spi.PGWallProvider; import com.alibaba.druid.wall.spi.SQLServerWallProvider; public class WallUtils { + public static boolean isValidatePostgres(String sql) { + PGWallProvider provider = new PGWallProvider(); + return provider.checkValid(sql); + } + public static boolean isValidatePostgres(String sql, WallConfig config) { + PGWallProvider provider = new PGWallProvider(config); + return provider.checkValid(sql); + } + public static boolean isValidateMySql(String sql) { MySqlWallProvider provider = new MySqlWallProvider(); return provider.checkValid(sql); diff --git a/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt b/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt new file mode 100644 index 0000000000..829b333277 --- /dev/null +++ b/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt @@ -0,0 +1,20 @@ +current_catalog +current_database +current_query +current_schema +current_schemas +current_user +inet_client_addr +inet_client_port +inet_server_addr +inet_server_port +pg_backend_pid +pg_conf_load_time +pg_is_other_temp_schema +pg_listening_channels +pg_my_temp_schema +pg_postmaster_start_time +pg_trigger_depth +session_user +user +version \ No newline at end of file diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/PGDenyFunctionTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/PGDenyFunctionTest.java new file mode 100644 index 0000000000..c533ea5b8d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/PGDenyFunctionTest.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallUtils; + +public class PGDenyFunctionTest extends TestCase { + + public void test_false() throws Exception { + Assert.assertFalse(WallUtils.isValidatePostgres(// + "SELECT current_catalog() from t where id = ?")); // + } + + public void test_true() throws Exception { + WallConfig config = new WallConfig(); + config.setFunctionCheck(false); + Assert.assertTrue(WallUtils.isValidatePostgres(// + "SELECT current_catalog() from t where id = ?", config)); // + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest5.java new file mode 100644 index 0000000000..02d3457fbf --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest5.java @@ -0,0 +1,66 @@ +/* + * 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.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest5 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE `test` (" + // + " `id` bigint(20) NOT NULL AUTO_INCREMENT," + // + " `dspcode` char(200) DEFAULT NULL," + // + " PRIMARY KEY (`id`)," + // + " KEY `index_name` (`dspcode`)" + // + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement) statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + Assert.assertEquals("utf8", stmt.getTableOptions().get("CHARACTER SET")); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "dspcode"))); + } +}