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>. */