From 50b70f37d9d9e2efb4dd4d53bd9077d0049f59c8 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 10 Aug 2012 21:26:00 +0800 Subject: [PATCH] bug fixed for postgresql parser --- .../druid/filter/logging/LogFilter.java | 18 ++++++++ .../com/alibaba/druid/mock/MockDriver.java | 2 +- .../pool/DruidPooledCallableStatement.java | 26 +++++++++-- .../ast/stmt/OracleSelectForUpdate.java | 13 ------ .../postgresql/parser/PGSelectParser.java | 44 ++++++++++--------- .../druid/bvt/bug/Bug_for_xuershan.java | 2 +- .../sql/postgresql/PGSelectForUpdateTest.java | 41 +++++++++++++++++ 7 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java diff --git a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java index c5499fda17..f48355b458 100644 --- a/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java +++ b/src/main/java/com/alibaba/druid/filter/logging/LogFilter.java @@ -392,6 +392,24 @@ public abstract class LogFilter extends FilterEventAdapter implements LogFilterM + "} update executed. effort " + updateCount + ". " + sql); } } + + @Override + public void resultSet_close(FilterChain chain, ResultSetProxy resultSet) throws SQLException { + chain.resultSet_close(resultSet); + + StringBuffer buf = new StringBuffer(); + buf.append("{conn-"); + buf.append(resultSet.getStatementProxy().getConnectionProxy().getId()); + buf.append(", "); + buf.append(stmtId(resultSet)); + buf.append(", rs-"); + buf.append(resultSet.getId()); + buf.append("} closed"); + + if (isResultSetCloseAfterLogEnabled()) { + resultSetLog(buf.toString()); + } + } @Override public boolean resultSet_next(FilterChain chain, ResultSetProxy resultSet) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/mock/MockDriver.java b/src/main/java/com/alibaba/druid/mock/MockDriver.java index c4e99d5061..4dcc6710cd 100644 --- a/src/main/java/com/alibaba/druid/mock/MockDriver.java +++ b/src/main/java/com/alibaba/druid/mock/MockDriver.java @@ -270,7 +270,7 @@ public class MockDriver implements Driver, MockDriverMBean { } } - protected ResultSet createResultSet(MockPreparedStatement stmt) { + public ResultSet createResultSet(MockPreparedStatement stmt) { MockResultSet rs = new MockResultSet(stmt); String sql = stmt.getSql(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java index 5bb1c698a3..be3068fcd9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledCallableStatement.java @@ -24,6 +24,7 @@ import java.sql.CallableStatement; import java.sql.Clob; import java.sql.NClob; import java.sql.Ref; +import java.sql.ResultSet; import java.sql.RowId; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; @@ -196,12 +197,26 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(int parameterIndex) throws SQLException { try { - return stmt.getObject(parameterIndex); + Object obj = stmt.getObject(parameterIndex); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } } + private Object wrapObject(Object obj) { + if (obj instanceof ResultSet) { + ResultSet rs = (ResultSet) obj; + + DruidPooledResultSet poolableResultSet = new DruidPooledResultSet(this, rs); + resultSetTrace.add(poolableResultSet); + + obj = poolableResultSet; + } + + return obj; + } + @Override public BigDecimal getBigDecimal(int parameterIndex) throws SQLException { try { @@ -214,7 +229,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(int parameterIndex, java.util.Map> map) throws SQLException { try { - return stmt.getObject(parameterIndex, map); + Object obj = stmt.getObject(parameterIndex, map); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } @@ -664,7 +680,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(String parameterName) throws SQLException { try { - return stmt.getObject(parameterName); + Object obj = stmt.getObject(parameterName); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } @@ -682,7 +699,8 @@ public class DruidPooledCallableStatement extends DruidPooledPreparedStatement i @Override public Object getObject(String parameterName, java.util.Map> map) throws SQLException { try { - return stmt.getObject(parameterName, map); + Object obj = stmt.getObject(parameterName, map); + return wrapObject(obj); } catch (Throwable t) { throw checkException(t); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java index 3aa749eeed..0a8477e2c3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectForUpdate.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -73,16 +72,4 @@ public class OracleSelectForUpdate extends OracleSQLObjectImpl { public List getOf() { return this.of; } - - public static class SkipLock { - } - - public static abstract class Type extends SQLObjectImpl { - - private static final long serialVersionUID = 1L; - - public Type(){ - - } - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java index ab50576731..e93db13aba 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java @@ -26,7 +26,7 @@ public class PGSelectParser extends SQLSelectParser { public PGSelectParser(String sql) throws ParserException{ this(new PGExprParser(sql)); } - + protected SQLExprParser createExprParser() { return new PGExprParser(lexer); } @@ -133,8 +133,8 @@ public class PGSelectParser extends SQLSelectParser { if (lexer.token() == Token.ROW || lexer.token() == Token.ROWS) { lexer.nextToken(); } else { - //TODO - //throw new ParserException("expect 'ROW' or 'ROWS'"); + // TODO + // throw new ParserException("expect 'ROW' or 'ROWS'"); } } @@ -175,22 +175,24 @@ public class PGSelectParser extends SQLSelectParser { if (lexer.token() == Token.UPDATE) { forClause.setOption(PGSelectQueryBlock.ForClause.Option.UPDATE); + lexer.nextToken(); } else if (lexer.token() == Token.SHARE) { forClause.setOption(PGSelectQueryBlock.ForClause.Option.SHARE); + lexer.nextToken(); } else { throw new ParserException("expect 'FIRST' or 'NEXT'"); } - accept(Token.OF); - - for (;;) { - SQLExpr expr = this.createExprParser().expr(); - forClause.getOf().add(expr); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } else { - break; + if (lexer.token() == Token.OF) { + for (;;) { + SQLExpr expr = this.createExprParser().expr(); + forClause.getOf().add(expr); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } } } @@ -208,31 +210,31 @@ public class PGSelectParser extends SQLSelectParser { protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) throws ParserException { if (lexer.token() == Token.AS && tableSource instanceof SQLExprTableSource) { String alias = this.as(); - + if (lexer.token() == Token.LPAREN) { SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; - + PGFunctionTableSource functionTableSource = new PGFunctionTableSource(exprTableSource.getExpr()); functionTableSource.setAlias(alias); - + lexer.nextToken(); parserParameters(functionTableSource.getParameters()); accept(Token.RPAREN); - + return super.parseTableSourceRest(functionTableSource); } } - + return super.parseTableSourceRest(tableSource); } - + private void parserParameters(List parameters) { for (;;) { PGParameter parameter = new PGParameter(); parameter.setName(this.exprParser.name()); parameter.setDataType(this.exprParser.parseDataType()); - + parameters.add(parameter); if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) { lexer.nextToken(); @@ -245,4 +247,4 @@ public class PGSelectParser extends SQLSelectParser { break; } } -} \ No newline at end of file +} diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java index 5e1c3adf50..d50094d89c 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_xuershan.java @@ -19,7 +19,7 @@ public class Bug_for_xuershan extends TestCase { protected void setUp() throws Exception { driver = new MockDriver() { - protected ResultSet createResultSet(MockPreparedStatement stmt) { + public ResultSet createResultSet(MockPreparedStatement stmt) { return null; } }; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java new file mode 100644 index 0000000000..94204f108e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectForUpdateTest.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; + +public class PGSelectForUpdateTest extends PGTest { + + public void test_0() throws Exception { + String sql = "select pkvalue from dbtpktable where tablename = 'taturvisit' for update"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getTables().size()); + } + +} + +// select categoryId , offerIds from cnres.function_select_get_spt_p4p_offer_list (' 1031918 , 1031919 , 1037004 ') as +// a(categoryId numeric,offerIds character varying(4000)) +// select memberId , offerIds from cnres.function_select_get_seller_hot_offer_list('\'gzyyd168\'') as a(memberId +// character varying(20),offerIds character varying(4000)) +