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/04/07 22:36:13 UTC

[2/7] incubator-calcite git commit: [CALCITE-670] AvaticaPreparedStatement should support execute() and executeUpdate() (Nick Dimiduk)

[CALCITE-670] AvaticaPreparedStatement should support execute() and executeUpdate() (Nick Dimiduk)

Close apache/incubator-calcite#74


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/5f57f789
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/5f57f789
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/5f57f789

Branch: refs/heads/r1.2
Commit: 5f57f78927a38939be56325fa9b6f44693b29cc9
Parents: d4d7ab9
Author: Nick Dimiduk <nd...@gmail.com>
Authored: Mon Apr 6 15:48:54 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Apr 6 16:17:51 2015 -0700

----------------------------------------------------------------------
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   | 14 +++++--
 .../calcite/avatica/RemoteDriverTest.java       | 42 ++++++++++++++++++++
 .../avatica/AvaticaPreparedStatement.java       |  8 +++-
 3 files changed, 59 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5f57f789/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 276dd71..3b241de 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
@@ -184,6 +184,9 @@ public class JdbcMeta implements Meta {
    */
   protected static List<ColumnMetaData>
   columns(ResultSetMetaData metaData) throws SQLException {
+    if (metaData == null) {
+      return Collections.emptyList();
+    }
     final List<ColumnMetaData> columns = new ArrayList<>();
     for (int i = 1; i <= metaData.getColumnCount(); i++) {
       final Type javaType =
@@ -805,10 +808,15 @@ public class JdbcMeta implements Meta {
             preparedStatement.setObject(i + 1, o);
           }
         }
-        statementInfo.resultSet = preparedStatement.executeQuery();
+        if (preparedStatement.execute()) {
+          statementInfo.resultSet = preparedStatement.getResultSet();
+        }
+      }
+      if (statementInfo.resultSet == null) {
+        return Frame.EMPTY;
+      } else {
+        return JdbcResultSet.frame(statementInfo.resultSet, offset, fetchMaxRowCount);
       }
-      return JdbcResultSet.frame(statementInfo.resultSet, offset,
-          fetchMaxRowCount);
     } catch (SQLException e) {
       throw propagate(e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5f57f789/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 f23e2fc..1c0e7d9 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
@@ -195,6 +195,48 @@ public class RemoteDriverTest {
     connection.close();
   }
 
+  @Test public void testStatementExecuteLocal() throws Exception {
+    checkStatementExecute(ljs(), false);
+  }
+
+  @Test public void testPrepareExecuteLocal() throws Exception {
+    checkStatementExecute(ljs(), true);
+  }
+
+  private void checkStatementExecute(Connection connection, boolean prepare) throws SQLException {
+    final String sql = "select * from (\n"
+        + "  values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)";
+    final Statement statement;
+    final ResultSet resultSet;
+    final ParameterMetaData parameterMetaData;
+    if (prepare) {
+      final PreparedStatement ps = connection.prepareStatement(sql);
+      statement = ps;
+      parameterMetaData = ps.getParameterMetaData();
+      assertTrue(ps.execute());
+      resultSet = ps.getResultSet();
+    } else {
+      statement = connection.createStatement();
+      parameterMetaData = null;
+      assertTrue(statement.execute(sql));
+      resultSet = statement.getResultSet();
+    }
+    if (parameterMetaData != null) {
+      assertThat(parameterMetaData.getParameterCount(), equalTo(0));
+    }
+    final ResultSetMetaData metaData = resultSet.getMetaData();
+    assertEquals(2, metaData.getColumnCount());
+    assertEquals("C1", metaData.getColumnName(1));
+    assertEquals("C2", metaData.getColumnName(2));
+    assertTrue(resultSet.next());
+    assertTrue(resultSet.next());
+    assertTrue(resultSet.next());
+    assertFalse(resultSet.next());
+    resultSet.close();
+    statement.close();
+    connection.close();
+  }
+
   @Test public void testCreateInsertUpdateDrop() throws Exception {
     final String drop = "drop table TEST_TABLE if exists";
     final String create = "create table TEST_TABLE("

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/5f57f789/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 9324db7..f85dcc1 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
@@ -90,7 +90,8 @@ public abstract class AvaticaPreparedStatement
   }
 
   public int executeUpdate() throws SQLException {
-    throw new UnsupportedOperationException(); // TODO:
+    getConnection().executeQueryInternal(this, signature, null);
+    return updateCount;
   }
 
   public void setNull(int parameterIndex, int sqlType) throws SQLException {
@@ -186,7 +187,10 @@ public abstract class AvaticaPreparedStatement
   }
 
   public boolean execute() throws SQLException {
-    throw new UnsupportedOperationException();
+    getConnection().executeQueryInternal(this, signature, null);
+    // Result set is null for DML or DDL.
+    // Result set is closed if user cancelled the query.
+    return openResultSet != null && !openResultSet.isClosed();
   }
 
   public void addBatch() throws SQLException {