diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index df5b00b2c8..1b20713ffb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -85,6 +85,7 @@ public class OracleExprParser extends SQLExprParser { + public boolean allowStringAdditive = false; /** @@ -504,9 +505,11 @@ public class OracleExprParser extends SQLExprParser { SQLExpr trim_character = this.primary(); trim_character.setParent(methodExpr); methodExpr.putAttribute("trim_character", trim_character); - accept(Token.FROM); - SQLExpr trim_source = this.expr(); - methodExpr.addParameter(trim_source); + if (lexer.token() == Token.FROM) { + lexer.nextToken(); + SQLExpr trim_source = this.expr(); + methodExpr.addParameter(trim_source); + } accept(Token.RPAREN); return primaryRest(methodExpr); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index bf105b4d96..1cc7c7c279 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -3398,8 +3398,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(' '); } trim_character.accept(this); - print(" FROM "); - x.getParameters().get(0).accept(this); + if (x.getParameters().size() > 0) { + print(" FROM "); + x.getParameters().get(0).accept(this); + } print(")"); return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java index c2e7ec1fe7..4026999ca8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java @@ -1,96 +1,96 @@ -/* - * 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.oracle.visitor; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.List; - -import org.junit.Assert; - -import com.alibaba.druid.sql.OracleTest; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; -import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; -import com.alibaba.druid.util.Utils; -import com.alibaba.druid.util.JdbcUtils; - -public class OracleResourceTest extends OracleTest { - - public void test_0() throws Exception { - // 13 -// exec_test("bvt/parser/oracle-56.txt"); - for (int i = 0; i <= 56; ++i) { - exec_test("bvt/parser/oracle-" + i + ".txt"); - } - } - - public void exec_test(String resource) throws Exception { - System.out.println(resource); - InputStream is = null; - - is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); - Reader reader = new InputStreamReader(is, "UTF-8"); - String input = Utils.read(reader); - JdbcUtils.close(reader); - String[] items = input.split("---------------------------"); - String sql = items[0].trim(); - String expect = items[1].trim(); - - OracleStatementParser parser = new OracleStatementParser(sql); - List statementList = parser.parseStatementList(); - - // Assert.assertEquals(1, statementList.size()); - - System.out.println(sql); - - print(statementList); - - OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - - for (int i = 0, size = statementList.size(); i < size; ++i) { - SQLStatement statement = statementList.get(i); - statement.accept(visitor); - } - - System.out.println("Tables : " + visitor.getTables()); - System.out.println("fields : " + visitor.getColumns()); - - System.out.println(); - System.out.println(); - } - - void mergValidate(String sql, String expect) { - - MySqlStatementParser parser = new MySqlStatementParser(sql); - List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); - - Assert.assertEquals(1, statementList.size()); - - StringBuilder out = new StringBuilder(); - MySqlParameterizedOutputVisitor visitor = new MySqlParameterizedOutputVisitor(out); - statemen.accept(visitor); - - System.out.println(out.toString()); - - Assert.assertEquals(expect, out.toString()); - } - -} +/* + * 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.oracle.visitor; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.Utils; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleResourceTest extends OracleTest { + + public void test_0() throws Exception { + // 13 +// exec_test("bvt/parser/oracle-56.txt"); + for (int i = 0; i <= 57; ++i) { + exec_test("bvt/parser/oracle-" + i + ".txt"); + } + } + + public void exec_test(String resource) throws Exception { + System.out.println(resource); + InputStream is = null; + + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); + Reader reader = new InputStreamReader(is, "UTF-8"); + String input = Utils.read(reader); + JdbcUtils.close(reader); + String[] items = input.split("---------------------------"); + String sql = items[0].trim(); + String expect = items[1].trim(); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + + // Assert.assertEquals(1, statementList.size()); + + System.out.println(sql); + + print(statementList); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + + for (int i = 0, size = statementList.size(); i < size; ++i) { + SQLStatement statement = statementList.get(i); + statement.accept(visitor); + } + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + System.out.println(); + System.out.println(); + } + + void mergValidate(String sql, String expect) { + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + StringBuilder out = new StringBuilder(); + MySqlParameterizedOutputVisitor visitor = new MySqlParameterizedOutputVisitor(out); + statemen.accept(visitor); + + System.out.println(out.toString()); + + Assert.assertEquals(expect, out.toString()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/support/monitor/MonitorDaoJdbcImplTest.java b/src/test/java/com/alibaba/druid/bvt/support/monitor/MonitorDaoJdbcImplTest.java index 2f31a3fc59..c5f1a6c0cb 100644 --- a/src/test/java/com/alibaba/druid/bvt/support/monitor/MonitorDaoJdbcImplTest.java +++ b/src/test/java/com/alibaba/druid/bvt/support/monitor/MonitorDaoJdbcImplTest.java @@ -26,7 +26,7 @@ public class MonitorDaoJdbcImplTest extends TestCase { protected void setUp() throws Exception { dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:h2:mem:test"); - dataSource.setUrl("jdbc:mysql://localhost:3306/druid-monitor"); + //dataSource.setUrl("jdbc:mysql://localhost:3306/druid-monitor"); dataSource.setUsername("druid"); dataSource.setPassword("druid"); dataSource.setInitialSize(1); diff --git a/src/test/resources/bvt/parser/oracle-57.txt b/src/test/resources/bvt/parser/oracle-57.txt new file mode 100644 index 0000000000..14a6e82e2f --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-57.txt @@ -0,0 +1,6 @@ +select pro.product_num||''||trim(tochar(pro.primitive_product_amount,'999999999999999999999999999990.99'))||''||trim(tochar(pro.primitive_fare_amount,'999999999999999999999999999990.99')) as changefields + +from mt_product_order pro +where pro.mt_product_order_id in ( ? ) +order by pro.id asc +---------------------------