You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/06/05 19:04:49 UTC
[5/6] incubator-calcite git commit: [CALCITE-712] Obey setMaxRows for
statement execute (Xavier Leong)
[CALCITE-712] Obey setMaxRows for statement execute (Xavier Leong)
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/e8c3cccd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/e8c3cccd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/e8c3cccd
Branch: refs/heads/master
Commit: e8c3cccded6fbeb4e4e82bc2dabdcd3babc0c986
Parents: f0471a1
Author: Xavier Leong <le...@persistent.my>
Authored: Tue May 5 17:22:38 2015 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jun 5 01:10:45 2015 -0700
----------------------------------------------------------------------
.../apache/calcite/avatica/jdbc/JdbcMeta.java | 9 ++++--
.../calcite/avatica/jdbc/JdbcResultSet.java | 8 +++++-
.../calcite/avatica/RemoteDriverTest.java | 24 +++++++++++++---
.../calcite/avatica/remote/RemoteMetaTest.java | 30 ++++++++++++++++++++
.../avatica/AvaticaPreparedStatement.java | 2 +-
.../calcite/avatica/AvaticaStatement.java | 2 +-
.../apache/calcite/jdbc/CalciteMetaImpl.java | 2 ++
.../calcite/jdbc/CalciteRemoteDriverTest.java | 12 ++++++++
8 files changed, 79 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index cbaab45..3fe1c2a 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -718,11 +718,14 @@ public class JdbcMeta implements Meta {
int maxRowCount, PrepareCallback callback) {
try {
final Connection connection = getConnection(ch.id);
- final PreparedStatement statement = connection.prepareStatement(sql);
+ final Statement statement = connection.createStatement();
final int id = System.identityHashCode(statement);
final StatementInfo info = new StatementInfo(statement);
statementCache.put(id, info); // TODO: must we retain a statement in all cases?
- boolean ret = statement.execute();
+ if (maxRowCount > 0) {
+ statement.setMaxRows(maxRowCount);
+ }
+ boolean ret = statement.execute(sql);
info.resultSet = statement.getResultSet();
assert ret || info.resultSet == null;
final List<MetaResultSet> resultSets = new ArrayList<>();
@@ -731,7 +734,7 @@ public class JdbcMeta implements Meta {
resultSets.add(
MetaResultSet.count(ch.id, id, statement.getUpdateCount()));
} else {
- resultSets.add(JdbcResultSet.create(ch.id, id, info.resultSet));
+ resultSets.add(JdbcResultSet.create(ch.id, id, info.resultSet, maxRowCount));
}
if (LOG.isTraceEnabled()) {
StatementHandle h = new StatementHandle(ch.id, id, null);
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcResultSet.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcResultSet.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcResultSet.java
index b1a67ac..3f6678f 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcResultSet.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcResultSet.java
@@ -43,10 +43,16 @@ class JdbcResultSet extends Meta.MetaResultSet {
/** Creates a result set. */
public static JdbcResultSet create(String connectionId, int statementId,
ResultSet resultSet) {
+ return create(connectionId, statementId, resultSet, -1);
+ }
+
+ /** Creates a result set with maxRowCount. */
+ public static JdbcResultSet create(String connectionId, int statementId,
+ ResultSet resultSet, int maxRowCount) {
try {
Meta.Signature sig = JdbcMeta.signature(resultSet.getMetaData());
final Calendar calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
- final Meta.Frame firstFrame = frame(resultSet, 0, -1, calendar);
+ final Meta.Frame firstFrame = frame(resultSet, 0, maxRowCount, calendar);
resultSet.close();
return new JdbcResultSet(connectionId, statementId, true, sig,
firstFrame);
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
index 79b2b9c..4dd740b 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
@@ -285,11 +285,25 @@ public class RemoteDriverTest {
checkStatementExecute(ljs(), false);
}
+ @Test public void testStatementExecuteLocalMaxRow() throws Exception {
+ checkStatementExecute(ljs(), false, 2);
+ }
+
+ @Ignore("CALCITE-719: Refactor PreparedStatement to support setMaxRows")
+ @Test public void testStatementPrepareExecuteLocalMaxRow() throws Exception {
+ checkStatementExecute(ljs(), true, 2);
+ }
+
@Test public void testPrepareExecuteLocal() throws Exception {
checkStatementExecute(ljs(), true);
}
- private void checkStatementExecute(Connection connection, boolean prepare) throws SQLException {
+ private void checkStatementExecute(Connection connection,
+ boolean prepare) throws SQLException {
+ checkStatementExecute(connection, prepare, 0);
+ }
+ private void checkStatementExecute(Connection connection,
+ boolean prepare, int maxRowCount) throws SQLException {
final String sql = "select * from (\n"
+ " values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)";
final Statement statement;
@@ -298,11 +312,13 @@ public class RemoteDriverTest {
if (prepare) {
final PreparedStatement ps = connection.prepareStatement(sql);
statement = ps;
+ ps.setMaxRows(maxRowCount);
parameterMetaData = ps.getParameterMetaData();
assertTrue(ps.execute());
resultSet = ps.getResultSet();
} else {
statement = connection.createStatement();
+ statement.setMaxRows(maxRowCount);
parameterMetaData = null;
assertTrue(statement.execute(sql));
resultSet = statement.getResultSet();
@@ -314,9 +330,9 @@ public class RemoteDriverTest {
assertEquals(2, metaData.getColumnCount());
assertEquals("C1", metaData.getColumnName(1));
assertEquals("C2", metaData.getColumnName(2));
- assertTrue(resultSet.next());
- assertTrue(resultSet.next());
- assertTrue(resultSet.next());
+ for (int i = 0; i < maxRowCount || (maxRowCount == 0 && i < 3); i++) {
+ assertTrue(resultSet.next());
+ }
assertFalse(resultSet.next());
resultSet.close();
statement.close();
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
index 890a78a..2439ac3 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/remote/RemoteMetaTest.java
@@ -17,6 +17,7 @@
package org.apache.calcite.avatica.remote;
import org.apache.calcite.avatica.AvaticaConnection;
+import org.apache.calcite.avatica.AvaticaStatement;
import org.apache.calcite.avatica.ConnectionPropertiesImpl;
import org.apache.calcite.avatica.Meta;
import org.apache.calcite.avatica.RemoteDriverTest;
@@ -31,8 +32,10 @@ import org.junit.BeforeClass;
import org.junit.Test;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
@@ -90,6 +93,14 @@ public class RemoteMetaTest {
return (Meta) f.get(conn);
}
+ private static Meta.ExecuteResult prepareAndExecuteInternal(AvaticaConnection conn,
+ final AvaticaStatement statement, String sql, int maxRowCount) throws Exception {
+ Method m = AvaticaConnection.class.getDeclaredMethod("prepareAndExecuteInternal",
+ AvaticaStatement.class, String.class, int.class);
+ m.setAccessible(true);
+ return (Meta.ExecuteResult) m.invoke(conn, statement, sql, new Integer(maxRowCount));
+ }
+
private static Connection getConnection(JdbcMeta m, String id) throws Exception {
Field f = JdbcMeta.class.getDeclaredField("connectionCache");
f.setAccessible(true);
@@ -98,6 +109,25 @@ public class RemoteMetaTest {
return connectionCache.getIfPresent(id);
}
+ @Test public void testRemoteExecuteMaxRowCount() throws Exception {
+ try (AvaticaConnection conn = (AvaticaConnection) DriverManager.getConnection(url)) {
+ final AvaticaStatement statement = conn.createStatement();
+ prepareAndExecuteInternal(conn, statement,
+ "select * from (values ('a', 1), ('b', 2))", 0);
+ ResultSet rs = statement.getResultSet();
+ int count = 0;
+ while (rs.next()) {
+ count++;
+ }
+ assertEquals("Check maxRowCount=0 and ResultSets is 0 row", count, 0);
+ assertEquals("Check result set meta is still there",
+ rs.getMetaData().getColumnCount(), 2);
+ rs.close();
+ statement.close();
+ conn.close();
+ }
+ }
+
@Test public void testRemoteConnectionProperties() throws Exception {
try (AvaticaConnection conn = (AvaticaConnection) DriverManager.getConnection(url)) {
String id = conn.id;
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
index 0410cfe..e489c07 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
@@ -48,7 +48,7 @@ import java.util.List;
public abstract class AvaticaPreparedStatement
extends AvaticaStatement
implements PreparedStatement, ParameterMetaData {
- private final Meta.Signature signature;
+ private Meta.Signature signature;
private final ResultSetMetaData resultSetMetaData;
private Calendar calendar;
protected final TypedValue[] slots;
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
index 7c6d3c2..78ec1cc 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaStatement.java
@@ -36,7 +36,7 @@ public abstract class AvaticaStatement
implements Statement {
public final AvaticaConnection connection;
/** Statement id; unique within connection. */
- public final Meta.StatementHandle handle;
+ public Meta.StatementHandle handle;
protected boolean closed;
/**
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
index 1fca967..c466819 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
@@ -539,6 +539,7 @@ public class CalciteMetaImpl extends MetaImpl {
int maxRowCount) {
final StatementHandle h = createStatement(ch);
final CalciteConnectionImpl calciteConnection = getConnection();
+
CalciteServerStatement statement = calciteConnection.server.getStatement(h);
h.signature =
calciteConnection.parseQuery(sql, statement.createPrepareContext(),
@@ -551,6 +552,7 @@ public class CalciteMetaImpl extends MetaImpl {
String sql, int maxRowCount, PrepareCallback callback) {
final CalcitePrepare.CalciteSignature<Object> signature;
final StatementHandle h = createStatement(ch);
+
try {
synchronized (callback.getMonitor()) {
callback.clear();
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e8c3cccd/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
index c8a39f6..f7aba8c 100644
--- a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
+++ b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
@@ -469,6 +469,18 @@ public class CalciteRemoteDriverTest {
assertTrue(count > 0);
}
+ @Test public void testRemoteExecuteMaxRow() throws Exception {
+ Statement statement = remoteConnection.createStatement();
+ statement.setMaxRows(2);
+ ResultSet resultSet = statement.executeQuery(
+ "select * from \"hr\".\"emps\"");
+ int count = 0;
+ while (resultSet.next()) {
+ ++count;
+ }
+ assertThat(count, equalTo(2));
+ }
+
/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-661">[CALCITE-661]
* Remote fetch in Calcite JDBC driver</a>. */