diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java index a112239206..08a433ca35 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledPreparedStatement.java @@ -912,10 +912,10 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement protected final MethodType methodType; - private final int resultSetType; - private final int resultSetConcurrency; - private final int resultSetHoldability; - private final int autoGeneratedKeys; + public final int resultSetType; + public final int resultSetConcurrency; + public final int resultSetHoldability; + public final int autoGeneratedKeys; private final int[] columnIndexes; private final String[] columnNames; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index 7ec7c320d9..bafc94f3f4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -23,11 +23,8 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; -import com.alibaba.druid.sql.parser.EOFParserException; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLExprParser; -import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.sql.parser.*; +import com.alibaba.druid.util.JdbcConstants; public class OdpsExprParser extends SQLExprParser { @@ -43,7 +40,7 @@ public class OdpsExprParser extends SQLExprParser { }; public OdpsExprParser(Lexer lexer){ - super(lexer); + super(lexer, JdbcConstants.ODPS); this.aggregateFunctions = AGGREGATE_FUNCTIONS; } @@ -157,4 +154,9 @@ public class OdpsExprParser extends SQLExprParser { return super.equalityRest(expr); } + + @Override + public OdpsSelectParser createSelectParser() { + return new OdpsSelectParser(this); + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 7ac3fb9229..0272747295 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -415,7 +415,9 @@ public class SQLExprParser extends SQLParser { } break; case SELECT: - SQLQueryExpr queryExpr = new SQLQueryExpr(createSelectParser().select()); + SQLQueryExpr queryExpr = new SQLQueryExpr( + createSelectParser() + .select()); sqlExpr = queryExpr; break; case CAST: diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java new file mode 100644 index 0000000000..426b20bb0d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java @@ -0,0 +1,102 @@ +/* + * Copyright 1999-2101 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.odps; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.List; + +public class OdpsSelectTest17 extends TestCase { + + public void test_select() throws Exception { + String sql = "SELECT prov\n" + + " , name\n" + + " , cnt\n" + + "FROM mock_app.adl_mock_v_fct\n" + + "WHERE ds = 20160920\n" + + " AND name != 'none'\n" + + " AND prov in ( select prov from (\n" + + " SELECT prov, sum(cnt) as cnt\n" + + " FROM mock_app.adl_mock_v_fct\n" + + " WHERE ds = 20160920\n" + + " GROUP BY prov\n" + + " ORDER BY cnt DESC LIMIT 5\n" + + ") top )\n" + + "ORDER BY cnt DESC\n" + + "LIMIT 800";// + Assert.assertEquals("SELECT prov\n" + + "\t, name\n" + + "\t, cnt\n" + + "FROM mock_app.adl_mock_v_fct\n" + + "WHERE ds = 20160920\n" + + "\tAND name != 'none'\n" + + "\tAND prov IN (SELECT prov\n" + + "\t\tFROM (\n" + + "\t\t\tSELECT prov\n" + + "\t\t\t\t, SUM(cnt) AS cnt\n" + + "\t\t\tFROM mock_app.adl_mock_v_fct\n" + + "\t\t\tWHERE ds = 20160920\n" + + "\t\t\tGROUP BY prov\n" + + "\t\t\tORDER BY cnt DESC\n" + + "\t\t\tLIMIT 5\n" + + "\t\t) top)\n" + + "ORDER BY cnt DESC\n" + + "LIMIT 800", SQLUtils.formatOdps(sql)); + Assert.assertEquals("select prov\n" + + "\t, name\n" + + "\t, cnt\n" + + "from mock_app.adl_mock_v_fct\n" + + "where ds = 20160920\n" + + "\tand name != 'none'\n" + + "\tand prov in (select prov\n" + + "\t\tfrom (\n" + + "\t\t\tselect prov\n" + + "\t\t\t\t, sum(cnt) as cnt\n" + + "\t\t\tfrom mock_app.adl_mock_v_fct\n" + + "\t\t\twhere ds = 20160920\n" + + "\t\t\tgroup by prov\n" + + "\t\t\torder by cnt desc\n" + + "\t\t\tlimit 5\n" + + "\t\t) top)\n" + + "order by cnt desc\n" + + "limit 800", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS); + stmt.accept(visitor); + +// 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(4, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); + } + +}