Repository: calcite-avatica Updated Branches: refs/heads/master 2501d351f -> ac26f81ee
[CALCITE-2218] Fix AvaticaResultSet#getRow() According to JDBC spec/Javadoc, ResultSet#getRow() method is 1-indexed based, but AvaticaResultSet#getRow() is 0-indexed based. Close apache/calcite-avatica#32 Project: http://git-wip-us.apache.org/repos/asf/calcite-avatica/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite-avatica/commit/ac26f81e Tree: http://git-wip-us.apache.org/repos/asf/calcite-avatica/tree/ac26f81e Diff: http://git-wip-us.apache.org/repos/asf/calcite-avatica/diff/ac26f81e Branch: refs/heads/master Commit: ac26f81ee13cf8ea04a17b7d27e4e2c52f6fbd91 Parents: 2501d35 Author: Laurent Goujon <[email protected]> Authored: Sun Mar 18 15:57:46 2018 -0700 Committer: Laurent Goujon <[email protected]> Committed: Sat Apr 28 14:20:38 2018 -0700 ---------------------------------------------------------------------- .../calcite/avatica/AvaticaResultSet.java | 13 ++-- .../calcite/avatica/AvaticaResultSetTest.java | 73 ++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/ac26f81e/core/src/main/java/org/apache/calcite/avatica/AvaticaResultSet.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/avatica/AvaticaResultSet.java b/core/src/main/java/org/apache/calcite/avatica/AvaticaResultSet.java index 21d7300..19d9317 100644 --- a/core/src/main/java/org/apache/calcite/avatica/AvaticaResultSet.java +++ b/core/src/main/java/org/apache/calcite/avatica/AvaticaResultSet.java @@ -61,6 +61,7 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { protected Cursor cursor; protected List<Cursor.Accessor> accessorList; private int row; + private boolean beforeFirst; private boolean afterLast; private int fetchDirection; private int fetchSize; @@ -174,7 +175,8 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { this.cursor = MetaImpl.createCursor(signature.cursorFactory, iterable1); this.accessorList = cursor.createAccessors(columnMetaDataList, localCalendar, this); - this.row = -1; + this.row = 0; + this.beforeFirst = true; this.afterLast = false; return this; } @@ -184,7 +186,8 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { this.cursor = cursor; this.accessorList = cursor.createAccessors(columnMetaDataList, localCalendar, this); - this.row = -1; + this.row = 0; + this.beforeFirst = true; this.afterLast = false; return this; } @@ -206,8 +209,10 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { } if (cursor.next()) { ++row; + beforeFirst = false; return true; } else { + row = 0; afterLast = true; return false; } @@ -398,7 +403,7 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { } public boolean isBeforeFirst() throws SQLException { - return row < 0; + return beforeFirst; } public boolean isAfterLast() throws SQLException { @@ -406,7 +411,7 @@ public class AvaticaResultSet extends ArrayFactoryImpl implements ResultSet { } public boolean isFirst() throws SQLException { - return row == 0; + return row == 1; } public boolean isLast() throws SQLException { http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/ac26f81e/core/src/test/java/org/apache/calcite/avatica/AvaticaResultSetTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/avatica/AvaticaResultSetTest.java b/core/src/test/java/org/apache/calcite/avatica/AvaticaResultSetTest.java new file mode 100644 index 0000000..3536747 --- /dev/null +++ b/core/src/test/java/org/apache/calcite/avatica/AvaticaResultSetTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you 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 org.apache.calcite.avatica; + +import org.junit.Test; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Test class for {@link AvaticaResultSet} + */ +public class AvaticaResultSetTest { + + /** + * A fake test driver for test. + */ + private static final class TestDriver extends UnregisteredDriver { + + @Override protected DriverVersion createDriverVersion() { + return new DriverVersion("test", "test 0.0.0", "test", "test 0.0.0", false, 0, 0, 0, 0); + } + + @Override protected String getConnectStringPrefix() { + return "jdbc:test"; + } + + @Override public Meta createMeta(AvaticaConnection connection) { + return new AvaticaResultSetConversionsTest.TestMetaImpl(connection); + } + } + + @Test public void testGetRow() throws SQLException { + Properties properties = new Properties(); + properties.setProperty("timeZone", "GMT"); + + final TestDriver driver = new TestDriver(); + try (Connection connection = driver.connect("jdbc:test", properties); + ResultSet resultSet = + connection.createStatement().executeQuery("SELECT * FROM TABLE")) { + assertEquals(0, resultSet.getRow()); + + // checking that return values of getRow() are coherent + assertTrue(resultSet.next()); + assertEquals(1, resultSet.getRow()); + // should be past last record + assertFalse(resultSet.next()); + assertEquals(0, resultSet.getRow()); + } + } +} + +// End AvaticaResultSetTest.java
