未验证 提交 afb2cd5e 编写于 作者: Z Zhiyu Yang 提交者: GitHub

[TS-522]<fix>: fix JDBC-RESTful didn't change wasNull after getString (#8470)

上级 472cf28a
...@@ -19,6 +19,7 @@ import com.google.common.primitives.Longs; ...@@ -19,6 +19,7 @@ import com.google.common.primitives.Longs;
import com.google.common.primitives.Shorts; import com.google.common.primitives.Shorts;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
...@@ -256,7 +257,11 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet { ...@@ -256,7 +257,11 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
public byte[] getBytes(int columnIndex) throws SQLException { public byte[] getBytes(int columnIndex) throws SQLException {
checkAvailability(columnIndex, this.columnMetaDataList.size()); checkAvailability(columnIndex, this.columnMetaDataList.size());
if (this.getBatchFetch())
return this.blockData.getString(columnIndex).getBytes();
Object value = this.rowData.getObject(columnIndex); Object value = this.rowData.getObject(columnIndex);
this.lastWasNull = value == null;
if (value == null) if (value == null)
return null; return null;
...@@ -331,25 +336,26 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet { ...@@ -331,25 +336,26 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
return new BigDecimal(this.blockData.getLong(columnIndex - 1)); return new BigDecimal(this.blockData.getLong(columnIndex - 1));
this.lastWasNull = this.rowData.wasNull(columnIndex); this.lastWasNull = this.rowData.wasNull(columnIndex);
BigDecimal res = null; if (lastWasNull)
if (!lastWasNull) { return null;
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
switch (nativeType) { BigDecimal res;
case TSDBConstants.TSDB_DATA_TYPE_TINYINT: int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT: switch (nativeType) {
case TSDBConstants.TSDB_DATA_TYPE_INT: case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
case TSDBConstants.TSDB_DATA_TYPE_BIGINT: case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
res = new BigDecimal(Long.parseLong(this.rowData.getObject(columnIndex).toString())); case TSDBConstants.TSDB_DATA_TYPE_INT:
break; case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
case TSDBConstants.TSDB_DATA_TYPE_FLOAT: res = new BigDecimal(Long.parseLong(this.rowData.getObject(columnIndex).toString()));
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE: break;
res = BigDecimal.valueOf(Double.parseDouble(this.rowData.getObject(columnIndex).toString())); case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
break; case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP: res = BigDecimal.valueOf(Double.parseDouble(this.rowData.getObject(columnIndex).toString()));
return new BigDecimal(((Timestamp) this.rowData.getObject(columnIndex)).getTime()); break;
default: case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
res = new BigDecimal(this.rowData.getObject(columnIndex).toString()); return new BigDecimal(((Timestamp) this.rowData.getObject(columnIndex)).getTime());
} default:
res = new BigDecimal(this.rowData.getObject(columnIndex).toString());
} }
return res; return res;
} }
...@@ -465,12 +471,6 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet { ...@@ -465,12 +471,6 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
public boolean isClosed() throws SQLException { public boolean isClosed() throws SQLException {
return isClosed; return isClosed;
// if (isClosed)
// return true;
// if (jniConnector != null) {
// isClosed = jniConnector.isResultsetClosed();
// }
// return isClosed;
} }
public String getNString(int columnIndex) throws SQLException { public String getNString(int columnIndex) throws SQLException {
......
...@@ -255,11 +255,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -255,11 +255,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return null; return null;
}
wasNull = false;
if (value instanceof byte[]) if (value instanceof byte[])
return new String((byte[]) value); return new String((byte[]) value);
return value.toString(); return value.toString();
...@@ -270,11 +268,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -270,11 +268,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return false; return false;
}
wasNull = false;
if (value instanceof Boolean) if (value instanceof Boolean)
return (boolean) value; return (boolean) value;
return Boolean.parseBoolean(value.toString()); return Boolean.parseBoolean(value.toString());
...@@ -285,11 +281,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -285,11 +281,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return 0; return 0;
}
wasNull = false;
long valueAsLong = Long.parseLong(value.toString()); long valueAsLong = Long.parseLong(value.toString());
if (valueAsLong == Byte.MIN_VALUE) if (valueAsLong == Byte.MIN_VALUE)
return 0; return 0;
...@@ -309,11 +303,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -309,11 +303,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return 0; return 0;
}
wasNull = false;
long valueAsLong = Long.parseLong(value.toString()); long valueAsLong = Long.parseLong(value.toString());
if (valueAsLong == Short.MIN_VALUE) if (valueAsLong == Short.MIN_VALUE)
return 0; return 0;
...@@ -327,11 +319,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -327,11 +319,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return 0; return 0;
}
wasNull = false;
long valueAsLong = Long.parseLong(value.toString()); long valueAsLong = Long.parseLong(value.toString());
if (valueAsLong == Integer.MIN_VALUE) if (valueAsLong == Integer.MIN_VALUE)
return 0; return 0;
...@@ -345,15 +335,11 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -345,15 +335,11 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return 0; return 0;
} if (value instanceof Timestamp)
wasNull = false;
if (value instanceof Timestamp) {
return ((Timestamp) value).getTime(); return ((Timestamp) value).getTime();
}
long valueAsLong = 0; long valueAsLong = 0;
try { try {
valueAsLong = Long.parseLong(value.toString()); valueAsLong = Long.parseLong(value.toString());
...@@ -370,11 +356,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -370,11 +356,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
if (value == null) { wasNull = value == null;
wasNull = true; if (value == null)
return 0; return 0;
}
wasNull = false;
if (value instanceof Float) if (value instanceof Float)
return (float) value; return (float) value;
if (value instanceof Double) if (value instanceof Double)
...@@ -387,11 +371,10 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -387,11 +371,10 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) { if (value == null) {
wasNull = true;
return 0; return 0;
} }
wasNull = false;
if (value instanceof Double || value instanceof Float) if (value instanceof Double || value instanceof Float)
return (double) value; return (double) value;
return Double.parseDouble(value.toString()); return Double.parseDouble(value.toString());
...@@ -402,6 +385,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -402,6 +385,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) if (value == null)
return null; return null;
if (value instanceof byte[]) if (value instanceof byte[])
...@@ -428,6 +412,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -428,6 +412,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) if (value == null)
return null; return null;
if (value instanceof Timestamp) if (value instanceof Timestamp)
...@@ -440,6 +425,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -440,6 +425,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) if (value == null)
return null; return null;
if (value instanceof Timestamp) if (value instanceof Timestamp)
...@@ -457,6 +443,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -457,6 +443,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) if (value == null)
return null; return null;
if (value instanceof Timestamp) if (value instanceof Timestamp)
...@@ -473,6 +460,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -473,6 +460,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
ret = Utils.parseTimestamp(value.toString()); ret = Utils.parseTimestamp(value.toString());
} catch (Exception e) { } catch (Exception e) {
ret = null; ret = null;
wasNull = true;
} }
return ret; return ret;
} }
...@@ -488,7 +476,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -488,7 +476,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
public Object getObject(int columnIndex) throws SQLException { public Object getObject(int columnIndex) throws SQLException {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
return resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
return value;
} }
@Override @Override
...@@ -507,9 +497,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet { ...@@ -507,9 +497,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
checkAvailability(columnIndex, resultSet.get(pos).size()); checkAvailability(columnIndex, resultSet.get(pos).size());
Object value = resultSet.get(pos).get(columnIndex - 1); Object value = resultSet.get(pos).get(columnIndex - 1);
wasNull = value == null;
if (value == null) if (value == null)
return null; return null;
if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof Byte) if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof Byte)
return new BigDecimal(Long.parseLong(value.toString())); return new BigDecimal(Long.parseLong(value.toString()));
if (value instanceof Double || value instanceof Float) if (value instanceof Double || value instanceof Float)
......
...@@ -660,7 +660,6 @@ public class RestfulResultSetTest { ...@@ -660,7 +660,6 @@ public class RestfulResultSetTest {
@BeforeClass @BeforeClass
public static void beforeClass() { public static void beforeClass() {
try { try {
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata"); conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
stmt = conn.createStatement(); stmt = conn.createStatement();
stmt.execute("create database if not exists restful_test"); stmt.execute("create database if not exists restful_test");
...@@ -670,7 +669,7 @@ public class RestfulResultSetTest { ...@@ -670,7 +669,7 @@ public class RestfulResultSetTest {
stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', 1, 100, 3.1415, 3.1415926, 'abc', 10, 10, true, '涛思数据')"); stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', 1, 100, 3.1415, 3.1415926, 'abc', 10, 10, true, '涛思数据')");
rs = stmt.executeQuery("select * from restful_test.weather"); rs = stmt.executeQuery("select * from restful_test.weather");
rs.next(); rs.next();
} catch (ClassNotFoundException | SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
......
package com.taosdata.jdbc.rs;
import org.junit.*;
import java.sql.*;
public class WasNullTest {
// private static final String host = "127.0.0.1";
private static final String host = "master";
private Connection conn;
@Test
public void testGetTimestamp() {
try (Statement stmt = conn.createStatement()) {
stmt.execute("drop table if exists weather");
stmt.execute("create table if not exists weather(f1 timestamp, f2 timestamp, f3 int)");
stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', NULL, 100)");
ResultSet rs = stmt.executeQuery("select * from restful_test.weather");
ResultSetMetaData meta = rs.getMetaData();
while (rs.next()) {
for (int i = 1; i <= meta.getColumnCount(); i++) {
if (i == 2) {
Object value = rs.getTimestamp(i);
boolean wasNull = rs.wasNull();
Assert.assertNull(value);
Assert.assertTrue(wasNull);
} else {
Object value = rs.getObject(i);
boolean wasNull = rs.wasNull();
Assert.assertNotNull(value);
Assert.assertFalse(wasNull);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testGetObject() {
try (Statement stmt = conn.createStatement()) {
stmt.execute("drop table if exists weather");
stmt.execute("create table if not exists weather(f1 timestamp, f2 int, f3 bigint, f4 float, f5 double, f6 binary(64), f7 smallint, f8 tinyint, f9 bool, f10 nchar(64))");
stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', 1, 100, 3.1415, 3.1415926, NULL, 10, 10, true, '涛思数据')");
ResultSet rs = stmt.executeQuery("select * from restful_test.weather");
ResultSetMetaData meta = rs.getMetaData();
while (rs.next()) {
for (int i = 1; i <= meta.getColumnCount(); i++) {
Object value = rs.getObject(i);
boolean wasNull = rs.wasNull();
if (i == 6) {
Assert.assertNull(value);
Assert.assertTrue(wasNull);
} else {
Assert.assertNotNull(value);
Assert.assertFalse(wasNull);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Before
public void before() {
try {
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
Statement stmt = conn.createStatement();
stmt.execute("drop database if exists restful_test");
stmt.execute("create database if not exists restful_test");
} catch (SQLException e) {
e.printStackTrace();
}
}
@After
public void after() {
try {
Statement statement = conn.createStatement();
statement.execute("drop database if exists restful_test");
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册