[td-225] merge develop.
This commit is contained in:
parent
74bc74d608
commit
1a8164084a
|
@ -8,10 +8,8 @@ IF (TD_MVN_INSTALLED)
|
|||
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
||||
POST_BUILD
|
||||
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.29.jar ${LIBRARY_OUTPUT_PATH}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.32-dist.jar ${LIBRARY_OUTPUT_PATH}
|
||||
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||
COMMENT "build jdbc driver")
|
||||
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
||||
ENDIF ()
|
||||
|
||||
|
||||
ENDIF ()
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>2.0.29</version>
|
||||
<version>2.0.32</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>JDBCDriver</name>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>2.0.29</version>
|
||||
<version>2.0.32</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>JDBCDriver</name>
|
||||
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
||||
|
@ -47,7 +47,7 @@
|
|||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>4.5.8</version>
|
||||
<version>4.5.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
|
@ -113,16 +113,16 @@
|
|||
<include>**/*Test.java</include>
|
||||
</includes>
|
||||
<excludes>
|
||||
<exclude>**/TSDBJNIConnectorTest.java</exclude>
|
||||
<exclude>**/UnsignedNumberJniTest.java</exclude>
|
||||
<exclude>**/DatetimeBefore1970Test.java</exclude>
|
||||
<exclude>**/AppMemoryLeakTest.java</exclude>
|
||||
<exclude>**/AuthenticationTest.java</exclude>
|
||||
<exclude>**/TaosInfoMonitorTest.java</exclude>
|
||||
<exclude>**/ConnectMultiTaosdByRestfulWithDifferentTokenTest.java</exclude>
|
||||
<exclude>**/DatetimeBefore1970Test.java</exclude>
|
||||
<exclude>**/FailOverTest.java</exclude>
|
||||
<exclude>**/InvalidResultSetPointerTest.java</exclude>
|
||||
<exclude>**/RestfulConnectionTest.java</exclude>
|
||||
<exclude>**/TD4144Test.java</exclude>
|
||||
<exclude>**/TSDBJNIConnectorTest.java</exclude>
|
||||
<exclude>**/TaosInfoMonitorTest.java</exclude>
|
||||
<exclude>**/UnsignedNumberJniTest.java</exclude>
|
||||
</excludes>
|
||||
<testFailureIgnore>true</testFailureIgnore>
|
||||
</configuration>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.taosdata.jdbc;
|
||||
|
||||
import com.taosdata.jdbc.enums.TimestampFormat;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Map;
|
||||
|
@ -18,7 +20,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
for (String propName : propNames) {
|
||||
clientInfoProps.setProperty(propName, properties.getProperty(propName));
|
||||
}
|
||||
String timestampFormat = properties.getProperty(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT, "STRING");
|
||||
String timestampFormat = properties.getProperty(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT, String.valueOf(TimestampFormat.STRING));
|
||||
clientInfoProps.setProperty(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT, timestampFormat);
|
||||
}
|
||||
|
||||
|
@ -304,9 +306,6 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
|
||||
@Override
|
||||
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
|
||||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||
|
||||
switch (resultSetHoldability) {
|
||||
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
||||
break;
|
||||
|
@ -320,11 +319,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
}
|
||||
|
||||
@Override
|
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
|
||||
throws SQLException {
|
||||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||
|
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
|
||||
switch (resultSetHoldability) {
|
||||
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
||||
break;
|
||||
|
@ -423,7 +418,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
status = resultSet.getInt("server_status()");
|
||||
resultSet.close();
|
||||
}
|
||||
return status == 1 ? true : false;
|
||||
return status == 1;
|
||||
});
|
||||
|
||||
boolean status = false;
|
||||
|
@ -432,9 +427,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
status = future.get();
|
||||
else
|
||||
status = future.get(timeout, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ExecutionException e) {
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
} catch (TimeoutException e) {
|
||||
future.cancel(true);
|
||||
|
@ -450,8 +443,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
if (isClosed)
|
||||
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||
|
||||
if (clientInfoProps != null)
|
||||
clientInfoProps.setProperty(name, value);
|
||||
clientInfoProps.setProperty(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -459,8 +451,8 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
if (isClosed)
|
||||
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||
|
||||
for (Enumeration<Object> enumer = properties.keys(); enumer.hasMoreElements(); ) {
|
||||
String name = (String) enumer.nextElement();
|
||||
for (Enumeration<Object> enumeration = properties.keys(); enumeration.hasMoreElements(); ) {
|
||||
String name = (String) enumeration.nextElement();
|
||||
clientInfoProps.put(name, properties.getProperty(name));
|
||||
}
|
||||
}
|
||||
|
@ -516,7 +508,6 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
public void abort(Executor executor) throws SQLException {
|
||||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
@ -527,14 +518,13 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
|||
if (milliseconds < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNetworkTimeout() throws SQLException {
|
||||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -58,7 +58,7 @@ public abstract class AbstractDriver implements Driver {
|
|||
value = parameterValuePair.substring(indexOfEqual + 1);
|
||||
}
|
||||
}
|
||||
if ((value != null && value.length() > 0) && (parameter != null && parameter.length() > 0)) {
|
||||
if (value != null && value.length() > 0 && parameter.length() > 0) {
|
||||
urlProps.setProperty(parameter, value);
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ public abstract class AbstractDriver implements Driver {
|
|||
url = url.substring(0, indexOfColon);
|
||||
}
|
||||
// parse host
|
||||
if (url != null && url.length() > 0 && url.trim().length() > 0) {
|
||||
if (url.length() > 0 && url.trim().length() > 0) {
|
||||
urlProps.setProperty(TSDBDriver.PROPERTY_KEY_HOST, url);
|
||||
}
|
||||
return urlProps;
|
||||
|
|
|
@ -49,6 +49,22 @@ public abstract class AbstractParameterMetaData extends WrapperImpl implements P
|
|||
if (param < 1 && param >= parameters.length)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_PARAMETER_INDEX_OUT_RANGE);
|
||||
|
||||
if (parameters[param - 1] instanceof Boolean)
|
||||
return TSDBConstants.BOOLEAN_PRECISION;
|
||||
if (parameters[param - 1] instanceof Byte)
|
||||
return TSDBConstants.TINYINT_PRECISION;
|
||||
if (parameters[param - 1] instanceof Short)
|
||||
return TSDBConstants.SMALLINT_PRECISION;
|
||||
if (parameters[param - 1] instanceof Integer)
|
||||
return TSDBConstants.INT_PRECISION;
|
||||
if (parameters[param - 1] instanceof Long)
|
||||
return TSDBConstants.BIGINT_PRECISION;
|
||||
if (parameters[param - 1] instanceof Timestamp)
|
||||
return TSDBConstants.TIMESTAMP_MS_PRECISION;
|
||||
if (parameters[param - 1] instanceof Float)
|
||||
return TSDBConstants.FLOAT_PRECISION;
|
||||
if (parameters[param - 1] instanceof Double)
|
||||
return TSDBConstants.DOUBLE_PRECISION;
|
||||
if (parameters[param - 1] instanceof String)
|
||||
return ((String) parameters[param - 1]).length();
|
||||
if (parameters[param - 1] instanceof byte[])
|
||||
|
@ -60,6 +76,11 @@ public abstract class AbstractParameterMetaData extends WrapperImpl implements P
|
|||
public int getScale(int param) throws SQLException {
|
||||
if (param < 1 && param >= parameters.length)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_PARAMETER_INDEX_OUT_RANGE);
|
||||
|
||||
if (parameters[param - 1] instanceof Float)
|
||||
return TSDBConstants.FLOAT_SCALE;
|
||||
if (parameters[param - 1] instanceof Double)
|
||||
return TSDBConstants.DOUBLE_SCALE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -66,10 +66,16 @@ public abstract class AbstractResultSet extends WrapperImpl implements ResultSet
|
|||
public abstract byte[] getBytes(int columnIndex) throws SQLException;
|
||||
|
||||
@Override
|
||||
public abstract Date getDate(int columnIndex) throws SQLException;
|
||||
public Date getDate(int columnIndex) throws SQLException {
|
||||
Timestamp timestamp = getTimestamp(columnIndex);
|
||||
return timestamp == null ? null : new Date(timestamp.getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract Time getTime(int columnIndex) throws SQLException;
|
||||
public Time getTime(int columnIndex) throws SQLException {
|
||||
Timestamp timestamp = getTimestamp(columnIndex);
|
||||
return timestamp == null ? null : new Time(timestamp.getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract Timestamp getTimestamp(int columnIndex) throws SQLException;
|
||||
|
|
|
@ -9,8 +9,6 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
|||
protected List<String> batchedArgs;
|
||||
private int fetchSize;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public abstract ResultSet executeQuery(String sql) throws SQLException;
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -23,7 +23,7 @@ import java.util.Calendar;
|
|||
import java.util.Map;
|
||||
|
||||
/*
|
||||
* TDengine only supports a subset of the standard SQL, thus this implemetation of the
|
||||
* TDengine only supports a subset of the standard SQL, thus this implementation of the
|
||||
* standard JDBC API contains more or less some adjustments customized for certain
|
||||
* compatibility needs.
|
||||
*/
|
||||
|
|
|
@ -20,7 +20,7 @@ import java.util.Properties;
|
|||
public class TSDBConnection extends AbstractConnection {
|
||||
|
||||
private TSDBJNIConnector connector;
|
||||
private TSDBDatabaseMetaData databaseMetaData;
|
||||
private final TSDBDatabaseMetaData databaseMetaData;
|
||||
private boolean batchFetch;
|
||||
|
||||
public Boolean getBatchFetch() {
|
||||
|
|
|
@ -41,22 +41,66 @@ public abstract class TSDBConstants {
|
|||
public static final int TSDB_DATA_TYPE_BINARY = 8;
|
||||
public static final int TSDB_DATA_TYPE_TIMESTAMP = 9;
|
||||
public static final int TSDB_DATA_TYPE_NCHAR = 10;
|
||||
/*
|
||||
系统增加新的无符号数据类型,分别是:
|
||||
unsigned tinyint, 数值范围:0-254, NULL 为255
|
||||
unsigned smallint,数值范围: 0-65534, NULL 为65535
|
||||
unsigned int,数值范围:0-4294967294,NULL 为4294967295u
|
||||
unsigned bigint,数值范围:0-18446744073709551614u,NULL 为18446744073709551615u。
|
||||
example:
|
||||
create table tb(ts timestamp, a tinyint unsigned, b smallint unsigned, c int unsigned, d bigint unsigned);
|
||||
*/
|
||||
/**
|
||||
* 系统增加新的无符号数据类型,分别是:
|
||||
* unsigned tinyint, 数值范围:0-254, NULL 为255
|
||||
* unsigned smallint,数值范围: 0-65534, NULL 为65535
|
||||
* unsigned int,数值范围:0-4294967294,NULL 为4294967295u
|
||||
* unsigned bigint,数值范围:0-18446744073709551614u,NULL 为18446744073709551615u。
|
||||
* example:
|
||||
* create table tb(ts timestamp, a tinyint unsigned, b smallint unsigned, c int unsigned, d bigint unsigned);
|
||||
*/
|
||||
public static final int TSDB_DATA_TYPE_UTINYINT = 11; //unsigned tinyint
|
||||
public static final int TSDB_DATA_TYPE_USMALLINT = 12; //unsigned smallint
|
||||
public static final int TSDB_DATA_TYPE_UINT = 13; //unsigned int
|
||||
public static final int TSDB_DATA_TYPE_UBIGINT = 14; //unsigned bigint
|
||||
|
||||
// nchar column max length
|
||||
public static final int maxFieldSize = 16 * 1024;
|
||||
|
||||
// precision for data types, this is used for metadata
|
||||
public static final int BOOLEAN_PRECISION = 1;
|
||||
public static final int TINYINT_PRECISION = 4;
|
||||
public static final int SMALLINT_PRECISION = 6;
|
||||
public static final int INT_PRECISION = 11;
|
||||
public static final int BIGINT_PRECISION = 20;
|
||||
public static final int FLOAT_PRECISION = 12;
|
||||
public static final int DOUBLE_PRECISION = 22;
|
||||
public static final int TIMESTAMP_MS_PRECISION = 23;
|
||||
public static final int TIMESTAMP_US_PRECISION = 26;
|
||||
// scale for data types, this is used for metadata
|
||||
public static final int FLOAT_SCALE = 31;
|
||||
public static final int DOUBLE_SCALE = 31;
|
||||
|
||||
public static final String DEFAULT_PRECISION = "ms";
|
||||
|
||||
public static int typeName2JdbcType(String type) {
|
||||
switch (type.toUpperCase()) {
|
||||
case "TIMESTAMP":
|
||||
return Types.TIMESTAMP;
|
||||
case "INT":
|
||||
return Types.INTEGER;
|
||||
case "BIGINT":
|
||||
return Types.BIGINT;
|
||||
case "FLOAT":
|
||||
return Types.FLOAT;
|
||||
case "DOUBLE":
|
||||
return Types.DOUBLE;
|
||||
case "BINARY":
|
||||
return Types.BINARY;
|
||||
case "SMALLINT":
|
||||
return Types.SMALLINT;
|
||||
case "TINYINT":
|
||||
return Types.TINYINT;
|
||||
case "BOOL":
|
||||
return Types.BOOLEAN;
|
||||
case "NCHAR":
|
||||
return Types.NCHAR;
|
||||
default:
|
||||
return Types.NULL;
|
||||
}
|
||||
}
|
||||
|
||||
public static int taosType2JdbcType(int taosType) throws SQLException {
|
||||
switch (taosType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
|
@ -88,7 +132,7 @@ public abstract class TSDBConstants {
|
|||
}
|
||||
|
||||
public static String taosType2JdbcTypeName(int taosType) throws SQLException {
|
||||
switch (taosType){
|
||||
switch (taosType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return "BOOL";
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT:
|
||||
|
@ -119,7 +163,7 @@ public abstract class TSDBConstants {
|
|||
}
|
||||
|
||||
public static int jdbcType2TaosType(int jdbcType) throws SQLException {
|
||||
switch (jdbcType){
|
||||
switch (jdbcType) {
|
||||
case Types.BOOLEAN:
|
||||
return TSDBConstants.TSDB_DATA_TYPE_BOOL;
|
||||
case Types.TINYINT:
|
||||
|
@ -145,7 +189,7 @@ public abstract class TSDBConstants {
|
|||
}
|
||||
|
||||
public static String jdbcType2TaosTypeName(int jdbcType) throws SQLException {
|
||||
switch (jdbcType){
|
||||
switch (jdbcType) {
|
||||
case Types.BOOLEAN:
|
||||
return "BOOL";
|
||||
case Types.TINYINT:
|
||||
|
|
|
@ -20,8 +20,8 @@ import java.sql.SQLException;
|
|||
|
||||
public class TSDBDatabaseMetaData extends AbstractDatabaseMetaData {
|
||||
|
||||
private String url;
|
||||
private String userName;
|
||||
private final String url;
|
||||
private final String userName;
|
||||
private Connection conn;
|
||||
|
||||
public TSDBDatabaseMetaData(String url, String userName) {
|
||||
|
|
|
@ -176,7 +176,7 @@ public class TSDBDriver extends AbstractDriver {
|
|||
int beginningOfSlashes = url.indexOf("//");
|
||||
int index = url.indexOf("?");
|
||||
if (index != -1) {
|
||||
String paramString = url.substring(index + 1, url.length());
|
||||
String paramString = url.substring(index + 1);
|
||||
url = url.substring(0, index);
|
||||
StringTokenizer queryParams = new StringTokenizer(paramString, "&");
|
||||
while (queryParams.hasMoreElements()) {
|
||||
|
@ -213,7 +213,7 @@ public class TSDBDriver extends AbstractDriver {
|
|||
url = url.substring(0, indexOfColon);
|
||||
}
|
||||
|
||||
if (url != null && url.length() > 0 && url.trim().length() > 0) {
|
||||
if (url.length() > 0 && url.trim().length() > 0) {
|
||||
urlProps.setProperty(TSDBDriver.PROPERTY_KEY_HOST, url);
|
||||
}
|
||||
|
||||
|
@ -233,7 +233,7 @@ public class TSDBDriver extends AbstractDriver {
|
|||
return false;
|
||||
}
|
||||
|
||||
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
|
||||
public Logger getParentLogger() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
|
||||
public class TSDBError {
|
||||
private static Map<Integer, String> TSDBErrorMap = new HashMap<>();
|
||||
private static final Map<Integer, String> TSDBErrorMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED, "connection already closed");
|
||||
|
@ -32,10 +32,10 @@ public class TSDBError {
|
|||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_INVALID_SQL, "invalid sql");
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE, "numeric value out of range");
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE, "unknown taos type in tdengine");
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN_TIMESTAMP_PERCISION, "unknown timestamp precision");
|
||||
|
||||
/**************************************************/
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN, "unknown error");
|
||||
/**************************************************/
|
||||
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SUBSCRIBE_FAILED, "failed to create subscription");
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding");
|
||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_TDENGINE_ERROR, "internal error of database");
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.taosdata.jdbc;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class TSDBErrorNumbers {
|
||||
|
||||
|
@ -25,6 +26,7 @@ public class TSDBErrorNumbers {
|
|||
public static final int ERROR_INVALID_SQL = 0x2313; // invalid sql
|
||||
public static final int ERROR_NUMERIC_VALUE_OUT_OF_RANGE = 0x2314; // numeric value out of range
|
||||
public static final int ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE = 0x2315; //unknown taos type in tdengine
|
||||
public static final int ERROR_UNKNOWN_TIMESTAMP_PERCISION = 0x2316; // unknown timestamp precision
|
||||
|
||||
public static final int ERROR_UNKNOWN = 0x2350; //unknown error
|
||||
|
||||
|
@ -38,10 +40,9 @@ public class TSDBErrorNumbers {
|
|||
public static final int ERROR_JNI_FETCH_END = 0x2358; // fetch to the end of resultSet
|
||||
public static final int ERROR_JNI_OUT_OF_MEMORY = 0x2359; // JNI alloc memory failed
|
||||
|
||||
private static final HashSet<Integer> errorNumbers;
|
||||
private static final Set<Integer> errorNumbers = new HashSet();
|
||||
|
||||
static {
|
||||
errorNumbers = new HashSet();
|
||||
errorNumbers.add(ERROR_CONNECTION_CLOSED);
|
||||
errorNumbers.add(ERROR_UNSUPPORTED_METHOD);
|
||||
errorNumbers.add(ERROR_INVALID_VARIABLE);
|
||||
|
@ -62,8 +63,8 @@ public class TSDBErrorNumbers {
|
|||
errorNumbers.add(ERROR_INVALID_SQL);
|
||||
errorNumbers.add(ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
errorNumbers.add(ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE);
|
||||
errorNumbers.add(ERROR_UNKNOWN_TIMESTAMP_PERCISION);
|
||||
|
||||
/*****************************************************/
|
||||
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
||||
errorNumbers.add(ERROR_UNSUPPORTED_ENCODING);
|
||||
errorNumbers.add(ERROR_JNI_TDENGINE_ERROR);
|
||||
|
|
|
@ -16,27 +16,22 @@
|
|||
*/
|
||||
package com.taosdata.jdbc;
|
||||
|
||||
import com.taosdata.jdbc.utils.TaosInfo;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.SQLWarning;
|
||||
import java.util.List;
|
||||
|
||||
import com.taosdata.jdbc.utils.TaosInfo;
|
||||
|
||||
/**
|
||||
* JNI connector
|
||||
*/
|
||||
public class TSDBJNIConnector {
|
||||
private static volatile Boolean isInitialized = false;
|
||||
|
||||
private TaosInfo taosInfo = TaosInfo.getInstance();
|
||||
|
||||
// Connection pointer used in C
|
||||
private long taos = TSDBConstants.JNI_NULL_POINTER;
|
||||
|
||||
// result set status in current connection
|
||||
private boolean isResultsetClosed;
|
||||
|
||||
private final TaosInfo taosInfo = TaosInfo.getInstance();
|
||||
private long taos = TSDBConstants.JNI_NULL_POINTER; // Connection pointer used in C
|
||||
private boolean isResultsetClosed; // result set status in current connection
|
||||
private int affectedRows = -1;
|
||||
|
||||
static {
|
||||
|
@ -96,11 +91,9 @@ public class TSDBJNIConnector {
|
|||
|
||||
/**
|
||||
* Execute DML/DDL operation
|
||||
*
|
||||
* @throws SQLException
|
||||
*/
|
||||
public long executeQuery(String sql) throws SQLException {
|
||||
Long pSql = 0l;
|
||||
long pSql = 0L;
|
||||
try {
|
||||
pSql = this.executeQueryImp(sql.getBytes(TaosGlobalConfig.getCharset()), this.taos);
|
||||
taosInfo.stmt_count_increment();
|
||||
|
@ -161,7 +154,7 @@ public class TSDBJNIConnector {
|
|||
private native long getResultSetImp(long connection, long pSql);
|
||||
|
||||
public boolean isUpdateQuery(long pSql) {
|
||||
return isUpdateQueryImp(this.taos, pSql) == 1 ? true : false;
|
||||
return isUpdateQueryImp(this.taos, pSql) == 1;
|
||||
}
|
||||
|
||||
private native long isUpdateQueryImp(long connection, long pSql);
|
||||
|
@ -194,7 +187,9 @@ public class TSDBJNIConnector {
|
|||
* Get schema metadata
|
||||
*/
|
||||
public int getSchemaMetaData(long resultSet, List<ColumnMetaData> columnMetaData) {
|
||||
return this.getSchemaMetaDataImp(this.taos, resultSet, columnMetaData);
|
||||
int ret = this.getSchemaMetaDataImp(this.taos, resultSet, columnMetaData);
|
||||
columnMetaData.forEach(column -> column.setColIndex(column.getColIndex() + 1));
|
||||
return ret;
|
||||
}
|
||||
|
||||
private native int getSchemaMetaDataImp(long connection, long resultSet, List<ColumnMetaData> columnMetaData);
|
||||
|
@ -215,13 +210,22 @@ public class TSDBJNIConnector {
|
|||
private native int fetchBlockImp(long connection, long resultSet, TSDBResultSetBlockData blockData);
|
||||
|
||||
/**
|
||||
* Execute close operation from C to release connection pointer by JNI
|
||||
* Get Result Time Precision.
|
||||
*
|
||||
* @throws SQLException
|
||||
* @return 0: ms, 1: us, 2: ns
|
||||
*/
|
||||
public int getResultTimePrecision(long sqlObj) {
|
||||
return this.getResultTimePrecisionImp(this.taos, sqlObj);
|
||||
}
|
||||
|
||||
private native int getResultTimePrecisionImp(long connection, long result);
|
||||
|
||||
/**
|
||||
* Execute close operation from C to release connection pointer by JNI
|
||||
*/
|
||||
public void closeConnection() throws SQLException {
|
||||
int code = this.closeConnectionImp(this.taos);
|
||||
|
||||
|
||||
if (code < 0) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL);
|
||||
} else if (code == 0) {
|
||||
|
@ -229,7 +233,7 @@ public class TSDBJNIConnector {
|
|||
} else {
|
||||
throw new SQLException("Undefined error code returned by TDengine when closing a connection");
|
||||
}
|
||||
|
||||
|
||||
// invoke closeConnectionImpl only here
|
||||
taosInfo.connect_close_increment();
|
||||
}
|
||||
|
@ -256,8 +260,6 @@ public class TSDBJNIConnector {
|
|||
|
||||
/**
|
||||
* Unsubscribe, close a subscription
|
||||
*
|
||||
* @param subscription
|
||||
*/
|
||||
void unsubscribe(long subscription, boolean isKeep) {
|
||||
unsubscribeImp(subscription, isKeep);
|
||||
|
@ -270,71 +272,80 @@ public class TSDBJNIConnector {
|
|||
*/
|
||||
public boolean validateCreateTableSql(String sql) {
|
||||
int res = validateCreateTableSqlImp(taos, sql.getBytes());
|
||||
return res != 0 ? false : true;
|
||||
return res == 0;
|
||||
}
|
||||
|
||||
private native int validateCreateTableSqlImp(long connection, byte[] sqlBytes);
|
||||
|
||||
public long prepareStmt(String sql) throws SQLException {
|
||||
Long stmt = prepareStmtImp(sql.getBytes(), this.taos);
|
||||
if (stmt == TSDBConstants.JNI_TDENGINE_ERROR) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_SQL);
|
||||
} else if (stmt == TSDBConstants.JNI_CONNECTION_NULL) {
|
||||
|
||||
public long prepareStmt(String sql) throws SQLException {
|
||||
long stmt;
|
||||
try {
|
||||
stmt = prepareStmtImp(sql.getBytes(), this.taos);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING);
|
||||
}
|
||||
|
||||
if (stmt == TSDBConstants.JNI_CONNECTION_NULL) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL);
|
||||
} else if (stmt == TSDBConstants.JNI_SQL_NULL) {
|
||||
}
|
||||
|
||||
if (stmt == TSDBConstants.JNI_SQL_NULL) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_SQL_NULL);
|
||||
} else if (stmt == TSDBConstants.JNI_OUT_OF_MEMORY) {
|
||||
}
|
||||
|
||||
if (stmt == TSDBConstants.JNI_OUT_OF_MEMORY) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
return stmt;
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
|
||||
private native long prepareStmtImp(byte[] sql, long con);
|
||||
|
||||
|
||||
public void setBindTableName(long stmt, String tableName) throws SQLException {
|
||||
int code = setBindTableNameImp(stmt, tableName, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
int code = setBindTableNameImp(stmt, tableName, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to set table name");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private native int setBindTableNameImp(long stmt, String name, long conn);
|
||||
|
||||
|
||||
public void setBindTableNameAndTags(long stmt, String tableName, int numOfTags, ByteBuffer tags, ByteBuffer typeList, ByteBuffer lengthList, ByteBuffer nullList) throws SQLException {
|
||||
int code = setTableNameTagsImp(stmt, tableName, numOfTags, tags.array(), typeList.array(), lengthList.array(),
|
||||
nullList.array(), this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to bind table name and corresponding tags");
|
||||
}
|
||||
int code = setTableNameTagsImp(stmt, tableName, numOfTags, tags.array(), typeList.array(), lengthList.array(),
|
||||
nullList.array(), this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to bind table name and corresponding tags");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private native int setTableNameTagsImp(long stmt, String name, int numOfTags, byte[] tags, byte[] typeList, byte[] lengthList, byte[] nullList, long conn);
|
||||
|
||||
public void bindColumnDataArray(long stmt, ByteBuffer colDataList, ByteBuffer lengthList, ByteBuffer isNullList, int type, int bytes, int numOfRows,int columnIndex) throws SQLException {
|
||||
int code = bindColDataImp(stmt, colDataList.array(), lengthList.array(), isNullList.array(), type, bytes, numOfRows, columnIndex, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
|
||||
public void bindColumnDataArray(long stmt, ByteBuffer colDataList, ByteBuffer lengthList, ByteBuffer isNullList, int type, int bytes, int numOfRows, int columnIndex) throws SQLException {
|
||||
int code = bindColDataImp(stmt, colDataList.array(), lengthList.array(), isNullList.array(), type, bytes, numOfRows, columnIndex, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to bind column data");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private native int bindColDataImp(long stmt, byte[] colDataList, byte[] lengthList, byte[] isNullList, int type, int bytes, int numOfRows, int columnIndex, long conn);
|
||||
|
||||
|
||||
public void executeBatch(long stmt) throws SQLException {
|
||||
int code = executeBatchImp(stmt, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
int code = executeBatchImp(stmt, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to execute batch bind");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private native int executeBatchImp(long stmt, long con);
|
||||
|
||||
|
||||
public void closeBatch(long stmt) throws SQLException {
|
||||
int code = closeStmt(stmt, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
int code = closeStmt(stmt, this.taos);
|
||||
if (code != TSDBConstants.JNI_SUCCESS) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "failed to close batch bind");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private native int closeStmt(long stmt, long con);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -133,9 +133,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getString(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = this.rowData.getString(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getString(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -147,9 +148,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getBoolean(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = this.rowData.getBoolean(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getBoolean(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -161,9 +163,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return (byte) this.blockData.getInt(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = (byte) this.rowData.getInt(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = (byte) this.rowData.getInt(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -175,9 +178,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return (short) this.blockData.getInt(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = (short) this.rowData.getInt(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = (short) this.rowData.getInt(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -189,9 +193,11 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getInt(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = this.rowData.getInt(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getInt(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -203,13 +209,15 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getLong(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
Object value = this.rowData.get(columnIndex - 1);
|
||||
if (value instanceof Timestamp)
|
||||
Object value = this.rowData.getObject(columnIndex);
|
||||
if (value instanceof Timestamp) {
|
||||
res = ((Timestamp) value).getTime();
|
||||
else
|
||||
res = this.rowData.getLong(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
} else {
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getLong(columnIndex, nativeType);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -221,9 +229,11 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return (float) this.blockData.getDouble(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
if (!lastWasNull)
|
||||
res = this.rowData.getFloat(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getFloat(columnIndex, nativeType);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -235,9 +245,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getDouble(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = this.rowData.getDouble(columnIndex - 1, this.columnMetaDataList.get(columnIndex - 1).getColType());
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getDouble(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -245,34 +256,27 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
public byte[] getBytes(int columnIndex) throws SQLException {
|
||||
checkAvailability(columnIndex, this.columnMetaDataList.size());
|
||||
|
||||
Object value = this.rowData.get(columnIndex - 1);
|
||||
Object value = this.rowData.getObject(columnIndex);
|
||||
if (value == null)
|
||||
return null;
|
||||
|
||||
int colType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
switch (colType) {
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
return Longs.toByteArray((Long) value);
|
||||
return Longs.toByteArray((long) value);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||
return Ints.toByteArray((int) value);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||
return Shorts.toByteArray((Short) value);
|
||||
return Shorts.toByteArray((short) value);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||
return new byte[]{(byte) value};
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
return (byte[]) value;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
default:
|
||||
return value.toString().getBytes();
|
||||
}
|
||||
return value.toString().getBytes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getDate(int columnIndex) throws SQLException {
|
||||
Timestamp timestamp = getTimestamp(columnIndex);
|
||||
return timestamp == null ? null : new Date(timestamp.getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Time getTime(int columnIndex) throws SQLException {
|
||||
Timestamp timestamp = getTimestamp(columnIndex);
|
||||
return timestamp == null ? null : new Time(timestamp.getTime());
|
||||
}
|
||||
|
||||
public Timestamp getTimestamp(int columnIndex) throws SQLException {
|
||||
|
@ -282,9 +286,10 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.getTimestamp(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
res = this.rowData.getTimestamp(columnIndex - 1);
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
res = this.rowData.getTimestamp(columnIndex, nativeType);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -304,13 +309,9 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return this.blockData.get(columnIndex - 1);
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
if (!lastWasNull) {
|
||||
int colType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
if (colType == TSDBConstants.TSDB_DATA_TYPE_BINARY)
|
||||
res = ((String) this.rowData.get(columnIndex - 1)).getBytes();
|
||||
else
|
||||
res = this.rowData.get(columnIndex - 1);
|
||||
res = this.rowData.getObject(columnIndex);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -318,7 +319,7 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
public int findColumn(String columnLabel) throws SQLException {
|
||||
for (ColumnMetaData colMetaData : this.columnMetaDataList) {
|
||||
if (colMetaData.getColName() != null && colMetaData.getColName().equalsIgnoreCase(columnLabel)) {
|
||||
return colMetaData.getColIndex() + 1;
|
||||
return colMetaData.getColIndex();
|
||||
}
|
||||
}
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||
|
@ -329,25 +330,25 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (this.getBatchFetch())
|
||||
return new BigDecimal(this.blockData.getLong(columnIndex - 1));
|
||||
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex - 1);
|
||||
this.lastWasNull = this.rowData.wasNull(columnIndex);
|
||||
BigDecimal res = null;
|
||||
if (!lastWasNull) {
|
||||
int colType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
switch (colType) {
|
||||
int nativeType = this.columnMetaDataList.get(columnIndex - 1).getColType();
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
res = new BigDecimal(Long.valueOf(this.rowData.get(columnIndex - 1).toString()));
|
||||
res = new BigDecimal(Long.parseLong(this.rowData.getObject(columnIndex).toString()));
|
||||
break;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
res = new BigDecimal(Double.valueOf(this.rowData.get(columnIndex - 1).toString()));
|
||||
res = BigDecimal.valueOf(Double.parseDouble(this.rowData.getObject(columnIndex).toString()));
|
||||
break;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
return new BigDecimal(((Timestamp) this.rowData.get(columnIndex - 1)).getTime());
|
||||
return new BigDecimal(((Timestamp) this.rowData.getObject(columnIndex)).getTime());
|
||||
default:
|
||||
res = new BigDecimal(this.rowData.get(columnIndex - 1).toString());
|
||||
res = new BigDecimal(this.rowData.getObject(columnIndex).toString());
|
||||
}
|
||||
}
|
||||
return res;
|
||||
|
|
|
@ -36,23 +36,20 @@ public class TSDBResultSetBlockData {
|
|||
private int rowIndex = 0;
|
||||
|
||||
private List<ColumnMetaData> columnMetaDataList;
|
||||
private ArrayList<Object> colData = null;
|
||||
private ArrayList<Object> colData;
|
||||
|
||||
public TSDBResultSetBlockData(List<ColumnMetaData> colMeta, int numOfCols) {
|
||||
this.columnMetaDataList = colMeta;
|
||||
this.colData = new ArrayList<Object>(numOfCols);
|
||||
this.colData = new ArrayList<>(numOfCols);
|
||||
}
|
||||
|
||||
public TSDBResultSetBlockData() {
|
||||
this.colData = new ArrayList<Object>();
|
||||
this.colData = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
int size = this.colData.size();
|
||||
if (this.colData != null) {
|
||||
this.colData.clear();
|
||||
}
|
||||
|
||||
this.colData.clear();
|
||||
setNumOfCols(size);
|
||||
}
|
||||
|
||||
|
@ -69,7 +66,7 @@ public class TSDBResultSetBlockData {
|
|||
}
|
||||
|
||||
public void setNumOfCols(int numOfCols) {
|
||||
this.colData = new ArrayList<Object>(numOfCols);
|
||||
this.colData = new ArrayList<>(numOfCols);
|
||||
this.colData.addAll(Collections.nCopies(numOfCols, null));
|
||||
}
|
||||
|
||||
|
@ -166,15 +163,10 @@ public class TSDBResultSetBlockData {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The original type may not be a string type, but will be converted to by
|
||||
* calling this method
|
||||
*
|
||||
* @param col column index
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public String getString(int col) throws SQLException {
|
||||
Object obj = get(col);
|
||||
|
@ -387,7 +379,7 @@ public class TSDBResultSetBlockData {
|
|||
return null;
|
||||
}
|
||||
|
||||
return (long) val;
|
||||
return val;
|
||||
}
|
||||
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT: {
|
||||
|
|
|
@ -41,10 +41,7 @@ public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaD
|
|||
}
|
||||
|
||||
public boolean isSearchable(int column) throws SQLException {
|
||||
if (column == 1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return column == 1;
|
||||
}
|
||||
|
||||
public boolean isCurrency(int column) throws SQLException {
|
||||
|
@ -113,6 +110,7 @@ public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaD
|
|||
|
||||
ColumnMetaData columnMetaData = this.colMetaDataList.get(column - 1);
|
||||
switch (columnMetaData.getColType()) {
|
||||
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return 5;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
|
|
|
@ -14,19 +14,22 @@
|
|||
*****************************************************************************/
|
||||
package com.taosdata.jdbc;
|
||||
|
||||
import com.taosdata.jdbc.utils.NullType;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
public class TSDBResultSetRowData {
|
||||
|
||||
private ArrayList<Object> data;
|
||||
private int colSize = 0;
|
||||
private final int colSize;
|
||||
|
||||
public TSDBResultSetRowData(int colSize) {
|
||||
this.setColSize(colSize);
|
||||
this.colSize = colSize;
|
||||
this.clear();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
|
@ -41,129 +44,191 @@ public class TSDBResultSetRowData {
|
|||
}
|
||||
|
||||
public boolean wasNull(int col) {
|
||||
return data.get(col) == null;
|
||||
return data.get(col - 1) == null;
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setBooleanValue(int col, boolean value) {
|
||||
setBoolean(col - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setBoolean(int col, boolean value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
public boolean getBoolean(int col, int srcType) throws SQLException {
|
||||
Object obj = data.get(col);
|
||||
public boolean getBoolean(int col, int nativeType) throws SQLException {
|
||||
Object obj = data.get(col - 1);
|
||||
|
||||
switch (srcType) {
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return (Boolean) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return ((Float) obj) == 1.0 ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return ((Double) obj) == 1.0 ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||
return ((Byte) obj) == 1 ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||
return ((Short) obj) == 1 ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||
return ((Integer) obj) == 1 ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
return ((Long) obj) == 1L ? Boolean.TRUE : Boolean.FALSE;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR: {
|
||||
return obj.toString().contains("1");
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setByteValue(int colIndex, byte value) {
|
||||
setByte(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setByte(int col, byte value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setShortValue(int colIndex, short value) {
|
||||
setShort(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setShort(int col, short value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setIntValue(int colIndex, int value) {
|
||||
setInt(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setInt(int col, int value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public int getInt(int col, int srcType) throws SQLException {
|
||||
Object obj = data.get(col);
|
||||
public int getInt(int col, int nativeType) throws SQLException {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null)
|
||||
return NullType.getIntNull();
|
||||
|
||||
switch (srcType) {
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return Boolean.TRUE.equals(obj) ? 1 : 0;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return ((Float) obj).intValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return ((Double) obj).intValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||
return (Byte) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||
return (Short) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||
return (Integer) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
return ((Long) obj).intValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
return Integer.parseInt((String) obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT: {
|
||||
Byte value = (byte) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_USMALLINT: {
|
||||
short value = (short) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UINT: {
|
||||
int value = (int) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UBIGINT: {
|
||||
long value = (long) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return Long.valueOf(value).intValue();
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT:
|
||||
return parseUnsignedTinyIntToInt(obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_USMALLINT:
|
||||
return parseUnsignedSmallIntToInt(obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UINT:
|
||||
return parseUnsignedIntegerToInt(obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UBIGINT:
|
||||
return parseUnsignedBigIntToInt(obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return ((Float) obj).intValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return ((Double) obj).intValue();
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private byte parseUnsignedTinyIntToInt(Object obj) throws SQLException {
|
||||
byte value = (byte) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
|
||||
private short parseUnsignedSmallIntToInt(Object obj) throws SQLException {
|
||||
short value = (short) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
|
||||
private int parseUnsignedIntegerToInt(Object obj) throws SQLException {
|
||||
int value = (int) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
|
||||
private int parseUnsignedBigIntToInt(Object obj) throws SQLException {
|
||||
long value = (long) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return Long.valueOf(value).intValue();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setLongValue(int colIndex, long value) {
|
||||
setLong(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setLong(int col, long value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
public long getLong(int col, int srcType) throws SQLException {
|
||||
Object obj = data.get(col);
|
||||
public long getLong(int col, int nativeType) throws SQLException {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null) {
|
||||
return NullType.getBigIntNull();
|
||||
}
|
||||
|
||||
switch (srcType) {
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return Boolean.TRUE.equals(obj) ? 1 : 0;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return ((Float) obj).longValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return ((Double) obj).longValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||
return (Byte) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||
return (Short) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||
return (Integer) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
return (Long) obj;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
return Long.parseLong((String) obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT: {
|
||||
Byte value = (byte) obj;
|
||||
byte value = (byte) obj;
|
||||
if (value < 0)
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
|
@ -186,19 +251,35 @@ public class TSDBResultSetRowData {
|
|||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_NUMERIC_VALUE_OUT_OF_RANGE);
|
||||
return value;
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
return ((Float) obj).longValue();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return ((Double) obj).longValue();
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setFloatValue(int colIndex, float value) {
|
||||
setFloat(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setFloat(int col, float value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
public float getFloat(int col, int srcType) {
|
||||
Object obj = data.get(col);
|
||||
public float getFloat(int col, int nativeType) {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null)
|
||||
return NullType.getFloatNull();
|
||||
|
||||
switch (srcType) {
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return Boolean.TRUE.equals(obj) ? 1 : 0;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
|
@ -214,19 +295,31 @@ public class TSDBResultSetRowData {
|
|||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
return (Long) obj;
|
||||
default:
|
||||
return NullType.getFloatNull();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setDoubleValue(int colIndex, double value) {
|
||||
setDouble(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setDouble(int col, double value) {
|
||||
data.set(col, value);
|
||||
}
|
||||
|
||||
public double getDouble(int col, int srcType) {
|
||||
Object obj = data.get(col);
|
||||
public double getDouble(int col, int nativeType) {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null)
|
||||
return NullType.getDoubleNull();
|
||||
|
||||
switch (srcType) {
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||
return Boolean.TRUE.equals(obj) ? 1 : 0;
|
||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||
|
@ -242,16 +335,46 @@ public class TSDBResultSetRowData {
|
|||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||
return (Long) obj;
|
||||
default:
|
||||
return NullType.getDoubleNull();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setStringValue(int colIndex, String value) {
|
||||
data.set(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setString(int col, String value) {
|
||||
data.set(col, value);
|
||||
// TODO:
|
||||
// !!!NOTE!!!
|
||||
// this is very confusing problem which related to JNI-method implementation,
|
||||
// the JNI method return a String(encoded in UTF) for BINARY value, which means the JNI method will invoke
|
||||
// this setString(int, String) to handle BINARY value, we need to build a byte[] with default charsetEncoding
|
||||
data.set(col, value == null ? null : value.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setByteArrayValue(int colIndex, byte[] value) {
|
||||
setByteArray(colIndex - 1, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*/
|
||||
public void setByteArray(int col, byte[] value) {
|
||||
// TODO:
|
||||
// !!!NOTE!!!
|
||||
// this is very confusing problem which related to JNI-method implementation,
|
||||
// the JNI method return a byte[] for NCHAR value, which means the JNI method will invoke
|
||||
// this setByteArr(int, byte[]) to handle NCHAR value, we need to build a String with charsetEncoding by TaosGlobalConfig
|
||||
try {
|
||||
data.set(col, new String(value, TaosGlobalConfig.getCharset()));
|
||||
} catch (Exception e) {
|
||||
|
@ -259,85 +382,99 @@ public class TSDBResultSetRowData {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The original type may not be a string type, but will be converted to by calling this method
|
||||
*
|
||||
* @param col column index
|
||||
* @return
|
||||
*/
|
||||
public String getString(int col, int srcType) {
|
||||
switch (srcType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
return (String) data.get(col);
|
||||
public String getString(int col, int nativeType) {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
switch (nativeType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT: {
|
||||
Byte value = new Byte(String.valueOf(data.get(col)));
|
||||
byte value = new Byte(String.valueOf(obj));
|
||||
if (value >= 0)
|
||||
return value.toString();
|
||||
return Byte.toString(value);
|
||||
return Integer.toString(value & 0xff);
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_USMALLINT: {
|
||||
Short value = new Short(String.valueOf(data.get(col)));
|
||||
short value = new Short(String.valueOf(obj));
|
||||
if (value >= 0)
|
||||
return value.toString();
|
||||
return Short.toString(value);
|
||||
return Integer.toString(value & 0xffff);
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UINT: {
|
||||
Integer value = new Integer(String.valueOf(data.get(col)));
|
||||
int value = new Integer(String.valueOf(obj));
|
||||
if (value >= 0)
|
||||
return value.toString();
|
||||
return Long.toString(value & 0xffffffffl);
|
||||
return Integer.toString(value);
|
||||
return Long.toString(value & 0xffffffffL);
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_UBIGINT: {
|
||||
Long value = new Long(String.valueOf(data.get(col)));
|
||||
long value = new Long(String.valueOf(obj));
|
||||
if (value >= 0)
|
||||
return value.toString();
|
||||
return Long.toString(value);
|
||||
long lowValue = value & 0x7fffffffffffffffL;
|
||||
return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1)).toString();
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
return new String((byte[]) obj);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
return (String) obj;
|
||||
default:
|
||||
return String.valueOf(data.get(col));
|
||||
return String.valueOf(obj);
|
||||
}
|
||||
}
|
||||
|
||||
public void setTimestamp(int col, long ts) {
|
||||
//TODO: this implementation contains logical error
|
||||
// when precision is us the (long ts) is 16 digital number
|
||||
// when precision is ms, the (long ts) is 13 digital number
|
||||
// we need a JNI function like this:
|
||||
// public void setTimestamp(int col, long epochSecond, long nanoAdjustment)
|
||||
if (ts < 1_0000_0000_0000_0L) {
|
||||
data.set(col, new Timestamp(ts));
|
||||
} else {
|
||||
long epochSec = ts / 1000_000l;
|
||||
long nanoAdjustment = ts % 1000_000l * 1000l;
|
||||
Timestamp timestamp = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
data.set(col, timestamp);
|
||||
/**
|
||||
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
|
||||
*/
|
||||
public void setTimestampValue(int colIndex, long value) {
|
||||
setTimestamp(colIndex - 1, value, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||
*
|
||||
* @param precision 0 : ms, 1 : us, 2 : ns
|
||||
*/
|
||||
public void setTimestamp(int col, long ts, int precision) {
|
||||
long milliseconds;
|
||||
int fracNanoseconds;
|
||||
switch (precision) {
|
||||
case 0: {
|
||||
milliseconds = ts;
|
||||
fracNanoseconds = (int) (ts * 1_000_000 % 1_000_000_000);
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
milliseconds = ts / 1_000;
|
||||
fracNanoseconds = (int) (ts * 1_000 % 1_000_000_000);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
milliseconds = ts / 1_000_000;
|
||||
fracNanoseconds = (int) (ts % 1_000_000_000);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new IllegalArgumentException("precision is not valid. precision: " + precision);
|
||||
}
|
||||
}
|
||||
|
||||
Timestamp tsObj = new Timestamp(milliseconds);
|
||||
tsObj.setNanos(fracNanoseconds);
|
||||
data.set(col, tsObj);
|
||||
}
|
||||
|
||||
public Timestamp getTimestamp(int col) {
|
||||
return (Timestamp) data.get(col);
|
||||
public Timestamp getTimestamp(int col, int nativeType) {
|
||||
Object obj = data.get(col - 1);
|
||||
if (obj == null)
|
||||
return null;
|
||||
if (nativeType == TSDBConstants.TSDB_DATA_TYPE_BIGINT) {
|
||||
return new Timestamp((Long) obj);
|
||||
}
|
||||
return (Timestamp) obj;
|
||||
}
|
||||
|
||||
public Object get(int col) {
|
||||
return data.get(col);
|
||||
public Object getObject(int col) {
|
||||
return data.get(col - 1);
|
||||
}
|
||||
|
||||
public int getColSize() {
|
||||
return colSize;
|
||||
}
|
||||
|
||||
private void setColSize(int colSize) {
|
||||
this.colSize = colSize;
|
||||
this.clear();
|
||||
}
|
||||
|
||||
public ArrayList<Object> getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(ArrayList<Object> data) {
|
||||
this.data = (ArrayList<Object>) data.clone();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,14 +32,15 @@ public class TSDBStatement extends AbstractStatement {
|
|||
}
|
||||
|
||||
public ResultSet executeQuery(String sql) throws SQLException {
|
||||
// check if closed
|
||||
if (isClosed()) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||
}
|
||||
|
||||
//TODO: 如果在executeQuery方法中执行insert语句,那么先执行了SQL,再通过pSql来检查是否为一个insert语句,但这个insert SQL已经执行成功了
|
||||
|
||||
// execute query
|
||||
//TODO:
|
||||
// this is an unreasonable implementation, if the paratemer is a insert statement,
|
||||
// the JNI connector will execute the sql at first and return a pointer: pSql,
|
||||
// we use this pSql and invoke the isUpdateQuery(long pSql) method to decide .
|
||||
// but the insert sql is already executed in database.
|
||||
//execute query
|
||||
long pSql = this.connection.getConnector().executeQuery(sql);
|
||||
// if pSql is create/insert/update/delete/alter SQL
|
||||
if (this.connection.getConnector().isUpdateQuery(pSql)) {
|
||||
|
|
|
@ -47,9 +47,6 @@ public class TSDBSubscribe {
|
|||
|
||||
/**
|
||||
* close subscription
|
||||
*
|
||||
* @param keepProgress
|
||||
* @throws SQLException
|
||||
*/
|
||||
public void close(boolean keepProgress) throws SQLException {
|
||||
if (this.connecter.isClosed())
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package com.taosdata.jdbc.enums;
|
||||
|
||||
public enum TimestampFormat {
|
||||
STRING,
|
||||
TIMESTAMP,
|
||||
UTC
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.taosdata.jdbc.enums;
|
||||
|
||||
public enum TimestampPrecision {
|
||||
MS,
|
||||
US,
|
||||
NS,
|
||||
UNKNOWN
|
||||
}
|
|
@ -16,17 +16,19 @@ public class RestfulConnection extends AbstractConnection {
|
|||
private final String host;
|
||||
private final int port;
|
||||
private final String url;
|
||||
private volatile String database;
|
||||
private final String database;
|
||||
private final String token;
|
||||
/******************************************************/
|
||||
private boolean isClosed;
|
||||
private final DatabaseMetaData metadata;
|
||||
|
||||
public RestfulConnection(String host, String port, Properties props, String database, String url) {
|
||||
public RestfulConnection(String host, String port, Properties props, String database, String url, String token) {
|
||||
super(props);
|
||||
this.host = host;
|
||||
this.port = Integer.parseInt(port);
|
||||
this.database = database;
|
||||
this.url = url;
|
||||
this.token = token;
|
||||
this.metadata = new RestfulDatabaseMetaData(url, props.getProperty(TSDBDriver.PROPERTY_KEY_USER), this);
|
||||
}
|
||||
|
||||
|
@ -66,6 +68,7 @@ public class RestfulConnection extends AbstractConnection {
|
|||
return this.metadata;
|
||||
}
|
||||
|
||||
// getters
|
||||
public String getHost() {
|
||||
return host;
|
||||
}
|
||||
|
@ -81,4 +84,8 @@ public class RestfulConnection extends AbstractConnection {
|
|||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
}
|
|
@ -38,15 +38,11 @@ public class RestfulDriver extends AbstractDriver {
|
|||
String port = props.getProperty(TSDBDriver.PROPERTY_KEY_PORT, "6041");
|
||||
String database = props.containsKey(TSDBDriver.PROPERTY_KEY_DBNAME) ? props.getProperty(TSDBDriver.PROPERTY_KEY_DBNAME) : null;
|
||||
|
||||
String loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":"
|
||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/"
|
||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_USER) + "/"
|
||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD) + "";
|
||||
String loginUrl = "http://" + host + ":" + port + "/rest/login/" + props.getProperty(TSDBDriver.PROPERTY_KEY_USER) + "/" + props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD) + "";
|
||||
try {
|
||||
String user = URLEncoder.encode(props.getProperty(TSDBDriver.PROPERTY_KEY_USER), "UTF-8");
|
||||
String password = URLEncoder.encode(props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD), "UTF-8");
|
||||
loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":"
|
||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/" + user + "/" + password + "";
|
||||
loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":" + props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/" + user + "/" + password + "";
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -55,12 +51,12 @@ public class RestfulDriver extends AbstractDriver {
|
|||
JSONObject jsonResult = JSON.parseObject(result);
|
||||
String status = jsonResult.getString("status");
|
||||
String token = jsonResult.getString("desc");
|
||||
HttpClientPoolUtil.token = token;
|
||||
|
||||
if (!status.equals("succ")) {
|
||||
throw new SQLException(jsonResult.getString("desc"));
|
||||
}
|
||||
|
||||
RestfulConnection conn = new RestfulConnection(host, port, props, database, url);
|
||||
RestfulConnection conn = new RestfulConnection(host, port, props, database, url, token);
|
||||
if (database != null && !database.trim().replaceAll("\\s", "").isEmpty()) {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("use " + database);
|
||||
|
|
|
@ -13,7 +13,7 @@ import java.util.Calendar;
|
|||
|
||||
public class RestfulPreparedStatement extends RestfulStatement implements PreparedStatement {
|
||||
|
||||
private ParameterMetaData parameterMetaData;
|
||||
private final ParameterMetaData parameterMetaData;
|
||||
private final String rawSql;
|
||||
private Object[] parameters;
|
||||
private boolean isPrepared;
|
||||
|
@ -44,7 +44,7 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
|
|||
if (!isPrepared)
|
||||
return executeQuery(this.rawSql);
|
||||
|
||||
final String sql = getNativeSql(this.rawSql);
|
||||
final String sql = Utils.getNativeSql(this.rawSql, this.parameters);
|
||||
return executeQuery(sql);
|
||||
}
|
||||
|
||||
|
@ -55,20 +55,10 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
|
|||
if (!isPrepared)
|
||||
return executeUpdate(this.rawSql);
|
||||
|
||||
final String sql = getNativeSql(this.rawSql);
|
||||
final String sql = Utils.getNativeSql(rawSql, this.parameters);
|
||||
return executeUpdate(sql);
|
||||
}
|
||||
|
||||
/****
|
||||
* 将rawSql转换成一条可执行的sql语句,使用属性parameters中的变脸进行替换
|
||||
* 对于insert into ?.? (?,?,?) using ?.? (?,?,?) tags(?, ?, ?) values(?, ?, ?)
|
||||
* @param rawSql,可能是insert、select或其他,使用?做占位符
|
||||
* @return
|
||||
*/
|
||||
private String getNativeSql(String rawSql) {
|
||||
return Utils.getNativeSql(rawSql, this.parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNull(int parameterIndex, int sqlType) throws SQLException {
|
||||
if (isClosed())
|
||||
|
@ -224,16 +214,13 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
|
|||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||
if (!isPrepared)
|
||||
return execute(this.rawSql);
|
||||
final String sql = getNativeSql(rawSql);
|
||||
final String sql = Utils.getNativeSql(rawSql, this.parameters);
|
||||
return execute(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBatch() throws SQLException {
|
||||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||
|
||||
final String sql = getNativeSql(this.rawSql);
|
||||
final String sql = Utils.getNativeSql(rawSql, this.parameters);
|
||||
addBatch(sql);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@ import com.google.common.primitives.Ints;
|
|||
import com.google.common.primitives.Longs;
|
||||
import com.google.common.primitives.Shorts;
|
||||
import com.taosdata.jdbc.*;
|
||||
import com.taosdata.jdbc.enums.TimestampPrecision;
|
||||
import com.taosdata.jdbc.enums.TimestampFormat;
|
||||
import com.taosdata.jdbc.utils.Utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
@ -15,19 +17,20 @@ import java.time.ZoneOffset;
|
|||
import java.time.format.DateTimeParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||
private volatile boolean isClosed;
|
||||
private int pos = -1;
|
||||
|
||||
private final String database;
|
||||
private final Statement statement;
|
||||
// data
|
||||
private final ArrayList<ArrayList<Object>> resultSet = new ArrayList<>();
|
||||
private final List<List<Object>> resultSet = new ArrayList<>();
|
||||
// meta
|
||||
private ArrayList<String> columnNames = new ArrayList<>();
|
||||
private ArrayList<Field> columns = new ArrayList<>();
|
||||
private RestfulResultSetMetaData metaData;
|
||||
private final List<String> columnNames = new ArrayList<>();
|
||||
private final List<Field> columns = new ArrayList<>();
|
||||
private final RestfulResultSetMetaData metaData;
|
||||
|
||||
private volatile boolean isClosed;
|
||||
private int pos = -1;
|
||||
|
||||
/**
|
||||
* 由一个result的Json构造结果集,对应执行show databases, show tables等这些语句,返回结果集,但无法获取结果集对应的meta,统一当成String处理
|
||||
|
@ -35,34 +38,30 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
||||
***/
|
||||
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) throws SQLException {
|
||||
this.database = database;
|
||||
this.statement = statement;
|
||||
|
||||
// get head
|
||||
JSONArray head = resultJson.getJSONArray("head");
|
||||
// get column metadata
|
||||
JSONArray columnMeta = resultJson.getJSONArray("column_meta");
|
||||
// get row data
|
||||
JSONArray data = resultJson.getJSONArray("data");
|
||||
if (data == null || data.isEmpty()) {
|
||||
columnNames.clear();
|
||||
columns.clear();
|
||||
this.resultSet.clear();
|
||||
return;
|
||||
}
|
||||
// get head
|
||||
JSONArray head = resultJson.getJSONArray("head");
|
||||
// get rows
|
||||
Integer rows = resultJson.getInteger("rows");
|
||||
|
||||
// parse column_meta
|
||||
if (columnMeta != null) {
|
||||
parseColumnMeta_new(columnMeta);
|
||||
} else {
|
||||
parseColumnMeta_old(head, data, rows);
|
||||
}
|
||||
this.metaData = new RestfulResultSetMetaData(this.database, columns, this);
|
||||
this.metaData = new RestfulResultSetMetaData(database, columns, this);
|
||||
|
||||
if (data == null || data.isEmpty())
|
||||
return;
|
||||
// parse row data
|
||||
resultSet.clear();
|
||||
for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
|
||||
ArrayList row = new ArrayList();
|
||||
List<Object> row = new ArrayList();
|
||||
JSONArray jsonRow = data.getJSONArray(rowIndex);
|
||||
for (int colIndex = 0; colIndex < this.metaData.getColumnCount(); colIndex++) {
|
||||
row.add(parseColumnData(jsonRow, colIndex, columns.get(colIndex).taos_type));
|
||||
|
@ -131,7 +130,6 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
private Object parseColumnData(JSONArray row, int colIndex, int taosType) throws SQLException {
|
||||
switch (taosType) {
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NULL:
|
||||
|
@ -150,44 +148,8 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
return row.getFloat(colIndex);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||
return row.getDouble(colIndex);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP: {
|
||||
if (row.get(colIndex) == null)
|
||||
return null;
|
||||
String timestampFormat = this.statement.getConnection().getClientInfo(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT);
|
||||
if ("TIMESTAMP".equalsIgnoreCase(timestampFormat)) {
|
||||
Long value = row.getLong(colIndex);
|
||||
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
|
||||
if (value < 1_0000_0000_0000_0L)
|
||||
return new Timestamp(value);
|
||||
long epochSec = value / 1000_000l;
|
||||
long nanoAdjustment = value % 1000_000l * 1000l;
|
||||
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
}
|
||||
if ("UTC".equalsIgnoreCase(timestampFormat)) {
|
||||
String value = row.getString(colIndex);
|
||||
long epochSec = Timestamp.valueOf(value.substring(0, 19).replace("T", " ")).getTime() / 1000;
|
||||
int fractionalSec = Integer.parseInt(value.substring(20, value.length() - 5));
|
||||
long nanoAdjustment = 0;
|
||||
if (value.length() > 28) {
|
||||
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSS+0x00
|
||||
nanoAdjustment = fractionalSec * 1000l;
|
||||
} else {
|
||||
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSS+0x00
|
||||
nanoAdjustment = fractionalSec * 1000_000l;
|
||||
}
|
||||
ZoneOffset zoneOffset = ZoneOffset.of(value.substring(value.length() - 5));
|
||||
Instant instant = Instant.ofEpochSecond(epochSec, nanoAdjustment).atOffset(zoneOffset).toInstant();
|
||||
return Timestamp.from(instant);
|
||||
}
|
||||
String value = row.getString(colIndex);
|
||||
if (value.length() <= 23) // ms timestamp: yyyy-MM-dd HH:mm:ss.SSS
|
||||
return row.getTimestamp(colIndex);
|
||||
// us timestamp: yyyy-MM-dd HH:mm:ss.SSSSSS
|
||||
long epochSec = Timestamp.valueOf(value.substring(0, 19)).getTime() / 1000;
|
||||
long nanoAdjustment = Integer.parseInt(value.substring(20)) * 1000l;
|
||||
Timestamp timestamp = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
return timestamp;
|
||||
}
|
||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||
return parseTimestampColumnData(row, colIndex);
|
||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||
return row.getString(colIndex) == null ? null : row.getString(colIndex).getBytes();
|
||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||
|
@ -197,7 +159,66 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
}
|
||||
}
|
||||
|
||||
public class Field {
|
||||
private Timestamp parseTimestampColumnData(JSONArray row, int colIndex) throws SQLException {
|
||||
if (row.get(colIndex) == null)
|
||||
return null;
|
||||
String tsFormatUpperCase = this.statement.getConnection().getClientInfo(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT).toUpperCase();
|
||||
TimestampFormat timestampFormat = TimestampFormat.valueOf(tsFormatUpperCase);
|
||||
switch (timestampFormat) {
|
||||
case TIMESTAMP: {
|
||||
Long value = row.getLong(colIndex);
|
||||
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
|
||||
if (value < 1_0000_0000_0000_0L)
|
||||
return new Timestamp(value);
|
||||
long epochSec = value / 1000_000L;
|
||||
long nanoAdjustment = value % 1000_000L * 1000L;
|
||||
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
}
|
||||
case UTC: {
|
||||
String value = row.getString(colIndex);
|
||||
long epochSec = Timestamp.valueOf(value.substring(0, 19).replace("T", " ")).getTime() / 1000;
|
||||
int fractionalSec = Integer.parseInt(value.substring(20, value.length() - 5));
|
||||
long nanoAdjustment;
|
||||
if (value.length() > 31) {
|
||||
// ns timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSSSSS+0x00
|
||||
nanoAdjustment = fractionalSec;
|
||||
} else if (value.length() > 28) {
|
||||
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSS+0x00
|
||||
nanoAdjustment = fractionalSec * 1000L;
|
||||
} else {
|
||||
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSS+0x00
|
||||
nanoAdjustment = fractionalSec * 1000_000L;
|
||||
}
|
||||
ZoneOffset zoneOffset = ZoneOffset.of(value.substring(value.length() - 5));
|
||||
Instant instant = Instant.ofEpochSecond(epochSec, nanoAdjustment).atOffset(zoneOffset).toInstant();
|
||||
return Timestamp.from(instant);
|
||||
}
|
||||
case STRING:
|
||||
default: {
|
||||
String value = row.getString(colIndex);
|
||||
TimestampPrecision precision = Utils.guessTimestampPrecision(value);
|
||||
if (precision == TimestampPrecision.MS) {
|
||||
// ms timestamp: yyyy-MM-dd HH:mm:ss.SSS
|
||||
return row.getTimestamp(colIndex);
|
||||
}
|
||||
if (precision == TimestampPrecision.US) {
|
||||
// us timestamp: yyyy-MM-dd HH:mm:ss.SSSSSS
|
||||
long epochSec = Timestamp.valueOf(value.substring(0, 19)).getTime() / 1000;
|
||||
long nanoAdjustment = Integer.parseInt(value.substring(20)) * 1000L;
|
||||
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
}
|
||||
if (precision == TimestampPrecision.NS) {
|
||||
// ms timestamp: yyyy-MM-dd HH:mm:ss.SSSSSSSSS
|
||||
long epochSec = Timestamp.valueOf(value.substring(0, 19)).getTime() / 1000;
|
||||
long nanoAdjustment = Integer.parseInt(value.substring(20));
|
||||
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
}
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_TIMESTAMP_PERCISION);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Field {
|
||||
String name;
|
||||
int type;
|
||||
int length;
|
||||
|
@ -211,6 +232,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
this.note = note;
|
||||
this.taos_type = taos_type;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -218,10 +240,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||
pos++;
|
||||
if (pos <= resultSet.size() - 1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return pos <= resultSet.size() - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -231,13 +250,6 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public boolean wasNull() throws SQLException {
|
||||
// if (isClosed())
|
||||
// throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||
// return resultSet.isEmpty();
|
||||
// }
|
||||
|
||||
@Override
|
||||
public String getString(int columnIndex) throws SQLException {
|
||||
checkAvailability(columnIndex, resultSet.get(pos).size());
|
||||
|
@ -262,7 +274,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
wasNull = false;
|
||||
if (value instanceof Boolean)
|
||||
return (boolean) value;
|
||||
return Boolean.valueOf(value.toString());
|
||||
return Boolean.parseBoolean(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -334,6 +346,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
wasNull = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
wasNull = false;
|
||||
if (value instanceof Timestamp) {
|
||||
return ((Timestamp) value).getTime();
|
||||
|
@ -416,9 +429,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
return null;
|
||||
if (value instanceof Timestamp)
|
||||
return new Date(((Timestamp) value).getTime());
|
||||
Date date = null;
|
||||
date = Utils.parseDate(value.toString());
|
||||
return date;
|
||||
return Utils.parseDate(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -433,8 +444,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
Time time = null;
|
||||
try {
|
||||
time = Utils.parseTime(value.toString());
|
||||
} catch (DateTimeParseException e) {
|
||||
time = null;
|
||||
} catch (DateTimeParseException ignored) {
|
||||
}
|
||||
return time;
|
||||
}
|
||||
|
@ -498,9 +508,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
return null;
|
||||
|
||||
if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof Byte)
|
||||
return new BigDecimal(Long.valueOf(value.toString()));
|
||||
return new BigDecimal(Long.parseLong(value.toString()));
|
||||
if (value instanceof Double || value instanceof Float)
|
||||
return new BigDecimal(Double.valueOf(value.toString()));
|
||||
return BigDecimal.valueOf(Double.parseDouble(value.toString()));
|
||||
if (value instanceof Timestamp)
|
||||
return new BigDecimal(((Timestamp) value).getTime());
|
||||
BigDecimal ret;
|
||||
|
@ -610,36 +620,6 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
if (isClosed())
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||
|
||||
// if (this.resultSet.size() == 0)
|
||||
// return false;
|
||||
//
|
||||
// if (row == 0) {
|
||||
// beforeFirst();
|
||||
// return false;
|
||||
// } else if (row == 1) {
|
||||
// return first();
|
||||
// } else if (row == -1) {
|
||||
// return last();
|
||||
// } else if (row > this.resultSet.size()) {
|
||||
// afterLast();
|
||||
// return false;
|
||||
// } else {
|
||||
// if (row < 0) {
|
||||
// // adjust to reflect after end of result set
|
||||
// int newRowPosition = this.resultSet.size() + row + 1;
|
||||
// if (newRowPosition <= 0) {
|
||||
// beforeFirst();
|
||||
// return false;
|
||||
// } else {
|
||||
// return absolute(newRowPosition);
|
||||
// }
|
||||
// } else {
|
||||
// row--; // adjust for index difference
|
||||
// this.pos = row;
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||
}
|
||||
|
||||
|
@ -683,5 +663,4 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
|||
return isClosed;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -7,21 +7,20 @@ import java.sql.ResultSetMetaData;
|
|||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMetaData {
|
||||
|
||||
private final String database;
|
||||
private ArrayList<RestfulResultSet.Field> fields;
|
||||
private final RestfulResultSet resultSet;
|
||||
private final List<RestfulResultSet.Field> fields;
|
||||
|
||||
public RestfulResultSetMetaData(String database, ArrayList<RestfulResultSet.Field> fields, RestfulResultSet resultSet) {
|
||||
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields, RestfulResultSet resultSet) {
|
||||
this.database = database;
|
||||
this.fields = fields;
|
||||
this.resultSet = resultSet;
|
||||
this.fields = fields == null ? Collections.emptyList() : fields;
|
||||
}
|
||||
|
||||
public ArrayList<RestfulResultSet.Field> getFields() {
|
||||
public List<RestfulResultSet.Field> getFields() {
|
||||
return fields;
|
||||
}
|
||||
|
||||
|
@ -139,8 +138,8 @@ public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMe
|
|||
|
||||
@Override
|
||||
public String getColumnTypeName(int column) throws SQLException {
|
||||
int taos_type = fields.get(column - 1).taos_type;
|
||||
return TSDBConstants.taosType2JdbcTypeName(taos_type);
|
||||
int taosType = fields.get(column - 1).taos_type;
|
||||
return TSDBConstants.taosType2JdbcTypeName(taosType);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -35,10 +35,6 @@ public class RestfulStatement extends AbstractStatement {
|
|||
if (!SqlSyntaxValidator.isValidForExecuteQuery(sql))
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_QUERY, "not a valid sql for executeQuery: " + sql);
|
||||
|
||||
if (SqlSyntaxValidator.isDatabaseUnspecifiedQuery(sql)) {
|
||||
return executeOneQuery(sql);
|
||||
}
|
||||
|
||||
return executeOneQuery(sql);
|
||||
}
|
||||
|
||||
|
@ -50,9 +46,6 @@ public class RestfulStatement extends AbstractStatement {
|
|||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_UPDATE, "not a valid sql for executeUpdate: " + sql);
|
||||
|
||||
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||
if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
|
||||
return executeOneUpdate(url, sql);
|
||||
}
|
||||
|
||||
return executeOneUpdate(url, sql);
|
||||
}
|
||||
|
@ -83,7 +76,7 @@ public class RestfulStatement extends AbstractStatement {
|
|||
}
|
||||
|
||||
if (SqlSyntaxValidator.isUseSql(sql)) {
|
||||
HttpClientPoolUtil.execute(url, sql);
|
||||
HttpClientPoolUtil.execute(url, sql, this.conn.getToken());
|
||||
this.database = sql.trim().replace("use", "").trim();
|
||||
this.conn.setCatalog(this.database);
|
||||
result = false;
|
||||
|
@ -116,7 +109,7 @@ public class RestfulStatement extends AbstractStatement {
|
|||
if ("UTC".equalsIgnoreCase(timestampFormat))
|
||||
url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sqlutc";
|
||||
|
||||
String result = HttpClientPoolUtil.execute(url, sql);
|
||||
String result = HttpClientPoolUtil.execute(url, sql, this.conn.getToken());
|
||||
JSONObject resultJson = JSON.parseObject(result);
|
||||
if (resultJson.getString("status").equals("error")) {
|
||||
throw TSDBError.createSQLException(resultJson.getInteger("code"), resultJson.getString("desc"));
|
||||
|
@ -130,7 +123,7 @@ public class RestfulStatement extends AbstractStatement {
|
|||
if (!SqlSyntaxValidator.isValidForExecuteUpdate(sql))
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_UPDATE, "not a valid sql for executeUpdate: " + sql);
|
||||
|
||||
String result = HttpClientPoolUtil.execute(url, sql);
|
||||
String result = HttpClientPoolUtil.execute(url, sql, this.conn.getToken());
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.getString("status").equals("error")) {
|
||||
throw TSDBError.createSQLException(jsonObject.getInteger("code"), jsonObject.getString("desc"));
|
||||
|
|
|
@ -16,43 +16,31 @@ import org.apache.http.protocol.HTTP;
|
|||
import org.apache.http.protocol.HttpContext;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
|
||||
public class HttpClientPoolUtil {
|
||||
public static PoolingHttpClientConnectionManager cm = null;
|
||||
public static CloseableHttpClient httpClient = null;
|
||||
public static String token = "cm9vdDp0YW9zZGF0YQ==";
|
||||
/**
|
||||
* 默认content 类型
|
||||
*/
|
||||
private static final String DEFAULT_CONTENT_TYPE = "application/json";
|
||||
/**
|
||||
* 默认请求超时时间30s
|
||||
*/
|
||||
private static final int DEFAULT_TIME_OUT = 15000;
|
||||
private static final int count = 32;
|
||||
private static final int totalCount = 1000;
|
||||
private static final int Http_Default_Keep_Time = 15000;
|
||||
|
||||
/**
|
||||
* 初始化连接池
|
||||
*/
|
||||
private static final String DEFAULT_CONTENT_TYPE = "application/json";
|
||||
private static final int DEFAULT_TIME_OUT = 15000;
|
||||
private static final int DEFAULT_MAX_PER_ROUTE = 32;
|
||||
private static final int DEFAULT_MAX_TOTAL = 1000;
|
||||
private static final int DEFAULT_HTTP_KEEP_TIME = 15000;
|
||||
|
||||
private static CloseableHttpClient httpClient;
|
||||
|
||||
private static synchronized void initPools() {
|
||||
if (httpClient == null) {
|
||||
cm = new PoolingHttpClientConnectionManager();
|
||||
cm.setDefaultMaxPerRoute(count);
|
||||
cm.setMaxTotal(totalCount);
|
||||
httpClient = HttpClients.custom().setKeepAliveStrategy(defaultStrategy).setConnectionManager(cm).build();
|
||||
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
|
||||
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
|
||||
connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL);
|
||||
httpClient = HttpClients.custom().setKeepAliveStrategy(DEFAULT_KEEP_ALIVE_STRATEGY).setConnectionManager(connectionManager).build();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Http connection keepAlive 设置
|
||||
*/
|
||||
private static ConnectionKeepAliveStrategy defaultStrategy = (response, context) -> {
|
||||
private static final ConnectionKeepAliveStrategy DEFAULT_KEEP_ALIVE_STRATEGY = (response, context) -> {
|
||||
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
|
||||
int keepTime = Http_Default_Keep_Time * 1000;
|
||||
int keepTime = DEFAULT_HTTP_KEEP_TIME * 1000;
|
||||
while (it.hasNext()) {
|
||||
HeaderElement headerElement = it.nextElement();
|
||||
String param = headerElement.getName();
|
||||
|
@ -76,7 +64,7 @@ public class HttpClientPoolUtil {
|
|||
* @param data 请求数据
|
||||
* @return responseBody
|
||||
*/
|
||||
public static String execute(String uri, String data) {
|
||||
public static String execute(String uri, String data, String token) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
HttpEntity httpEntity = null;
|
||||
HttpEntityEnclosingRequestBase method = null;
|
||||
|
@ -90,7 +78,7 @@ public class HttpClientPoolUtil {
|
|||
method.setHeader("Connection", "keep-alive");
|
||||
method.setHeader("Authorization", "Taosd " + token);
|
||||
|
||||
method.setEntity(new StringEntity(data, Charset.forName("UTF-8")));
|
||||
method.setEntity(new StringEntity(data, StandardCharsets.UTF_8));
|
||||
HttpContext context = HttpClientContext.create();
|
||||
CloseableHttpResponse httpResponse = httpClient.execute(method, context);
|
||||
httpEntity = httpResponse.getEntity();
|
||||
|
@ -175,28 +163,18 @@ public class HttpClientPoolUtil {
|
|||
httpEntity = httpResponse.getEntity();
|
||||
if (httpEntity != null) {
|
||||
responseBody = EntityUtils.toString(httpEntity, "UTF-8");
|
||||
// logger.info("请求URL: " + uri + "+ 返回状态码:" + httpResponse.getStatusLine().getStatusCode());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (method != null) {
|
||||
method.abort();
|
||||
}
|
||||
e.printStackTrace();
|
||||
// logger.error("execute get request exception, url:" + uri + ", exception:" + e.toString() + ",cost time(ms):"
|
||||
// + (System.currentTimeMillis() - startTime));
|
||||
System.out.println("log:调用 HttpClientPoolUtil execute get request exception, url:" + uri + ", exception:" + e.toString() + ",cost time(ms):"
|
||||
+ (System.currentTimeMillis() - startTime));
|
||||
} finally {
|
||||
if (httpEntity != null) {
|
||||
try {
|
||||
EntityUtils.consumeQuietly(httpEntity);
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// logger.error("close response exception, url:" + uri + ", exception:" + e.toString()
|
||||
// + ",cost time(ms):" + (System.currentTimeMillis() - startTime));
|
||||
new Exception("close response exception, url:" + uri + ", exception:" + e.toString()
|
||||
+ ",cost time(ms):" + (System.currentTimeMillis() - startTime))
|
||||
.printStackTrace();
|
||||
new Exception("close response exception, url:" + uri + ", exception:" + e.toString() + ",cost time(ms):" + (System.currentTimeMillis() - startTime)).printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,10 +14,6 @@
|
|||
*****************************************************************************/
|
||||
package com.taosdata.jdbc.utils;
|
||||
|
||||
import com.taosdata.jdbc.TSDBConnection;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
public class SqlSyntaxValidator {
|
||||
|
||||
private static final String[] SQL = {"select", "insert", "import", "create", "use", "alter", "drop", "set", "show", "describe"};
|
||||
|
@ -26,12 +22,6 @@ public class SqlSyntaxValidator {
|
|||
|
||||
private static final String[] databaseUnspecifiedShow = {"databases", "dnodes", "mnodes", "variables"};
|
||||
|
||||
private TSDBConnection tsdbConnection;
|
||||
|
||||
public SqlSyntaxValidator(Connection connection) {
|
||||
this.tsdbConnection = (TSDBConnection) connection;
|
||||
}
|
||||
|
||||
public static boolean isValidForExecuteUpdate(String sql) {
|
||||
for (String prefix : updateSQL) {
|
||||
if (sql.trim().toLowerCase().startsWith(prefix))
|
||||
|
|
|
@ -3,14 +3,14 @@ package com.taosdata.jdbc.utils;
|
|||
import com.google.common.collect.Range;
|
||||
import com.google.common.collect.RangeSet;
|
||||
import com.google.common.collect.TreeRangeSet;
|
||||
import com.taosdata.jdbc.enums.TimestampPrecision;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.sql.Date;
|
||||
import java.sql.Time;
|
||||
import java.sql.Timestamp;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeFormatterBuilder;
|
||||
import java.time.format.DateTimeParseException;
|
||||
|
@ -25,39 +25,52 @@ public class Utils {
|
|||
|
||||
private static Pattern ptn = Pattern.compile(".*?'");
|
||||
|
||||
private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
|
||||
.appendPattern("yyyy-MM-dd HH:mm:ss.SSS").toFormatter();
|
||||
private static final DateTimeFormatter formatter2 = new DateTimeFormatterBuilder()
|
||||
.appendPattern("yyyy-MM-dd HH:mm:ss.SSSSSS").toFormatter();
|
||||
private static final DateTimeFormatter milliSecFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss.SSS").toFormatter();
|
||||
private static final DateTimeFormatter microSecFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss.SSSSSS").toFormatter();
|
||||
private static final DateTimeFormatter nanoSecFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS").toFormatter();
|
||||
|
||||
public static Time parseTime(String timestampStr) throws DateTimeParseException {
|
||||
LocalTime time;
|
||||
try {
|
||||
time = LocalTime.parse(timestampStr, formatter);
|
||||
} catch (DateTimeParseException e) {
|
||||
time = LocalTime.parse(timestampStr, formatter2);
|
||||
}
|
||||
return Time.valueOf(time);
|
||||
LocalDateTime dateTime = parseLocalDateTime(timestampStr);
|
||||
return dateTime != null ? Time.valueOf(dateTime.toLocalTime()) : null;
|
||||
}
|
||||
|
||||
public static Date parseDate(String timestampStr) throws DateTimeParseException {
|
||||
LocalDate date;
|
||||
try {
|
||||
date = LocalDate.parse(timestampStr, formatter);
|
||||
} catch (DateTimeParseException e) {
|
||||
date = LocalDate.parse(timestampStr, formatter2);
|
||||
}
|
||||
return Date.valueOf(date);
|
||||
public static Date parseDate(String timestampStr) {
|
||||
LocalDateTime dateTime = parseLocalDateTime(timestampStr);
|
||||
return dateTime != null ? Date.valueOf(String.valueOf(dateTime)) : null;
|
||||
}
|
||||
|
||||
public static Timestamp parseTimestamp(String timeStampStr) {
|
||||
LocalDateTime dateTime;
|
||||
LocalDateTime dateTime = parseLocalDateTime(timeStampStr);
|
||||
return dateTime != null ? Timestamp.valueOf(dateTime) : null;
|
||||
}
|
||||
|
||||
private static LocalDateTime parseLocalDateTime(String timeStampStr) {
|
||||
try {
|
||||
dateTime = LocalDateTime.parse(timeStampStr, formatter);
|
||||
return parseMilliSecTimestamp(timeStampStr);
|
||||
} catch (DateTimeParseException e) {
|
||||
dateTime = LocalDateTime.parse(timeStampStr, formatter2);
|
||||
try {
|
||||
return parseMicroSecTimestamp(timeStampStr);
|
||||
} catch (DateTimeParseException ee) {
|
||||
try {
|
||||
return parseNanoSecTimestamp(timeStampStr);
|
||||
} catch (DateTimeParseException eee) {
|
||||
eee.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return Timestamp.valueOf(dateTime);
|
||||
return null;
|
||||
}
|
||||
|
||||
private static LocalDateTime parseMilliSecTimestamp(String timeStampStr) throws DateTimeParseException {
|
||||
return LocalDateTime.parse(timeStampStr, milliSecFormatter);
|
||||
}
|
||||
|
||||
private static LocalDateTime parseMicroSecTimestamp(String timeStampStr) throws DateTimeParseException {
|
||||
return LocalDateTime.parse(timeStampStr, microSecFormatter);
|
||||
}
|
||||
|
||||
private static LocalDateTime parseNanoSecTimestamp(String timeStampStr) throws DateTimeParseException {
|
||||
return LocalDateTime.parse(timeStampStr, nanoSecFormatter);
|
||||
}
|
||||
|
||||
public static String escapeSingleQuota(String origin) {
|
||||
|
@ -93,18 +106,11 @@ public class Utils {
|
|||
}
|
||||
|
||||
public static String getNativeSql(String rawSql, Object[] parameters) {
|
||||
if (parameters == null || !rawSql.contains("?"))
|
||||
return rawSql;
|
||||
// toLowerCase
|
||||
String preparedSql = rawSql.trim().toLowerCase();
|
||||
|
||||
String[] clause = new String[0];
|
||||
if (SqlSyntaxValidator.isInsertSql(preparedSql)) {
|
||||
// insert or import
|
||||
clause = new String[]{"values\\s*\\(.*?\\)", "tags\\s*\\(.*?\\)"};
|
||||
}
|
||||
if (SqlSyntaxValidator.isSelectSql(preparedSql)) {
|
||||
// select
|
||||
clause = new String[]{"where\\s*.*"};
|
||||
}
|
||||
String[] clause = new String[]{"values\\s*\\(.*?\\)", "tags\\s*\\(.*?\\)", "where\\s*.*"};
|
||||
Map<Integer, Integer> placeholderPositions = new HashMap<>();
|
||||
RangeSet<Integer> clauseRangeSet = TreeRangeSet.create();
|
||||
findPlaceholderPosition(preparedSql, placeholderPositions);
|
||||
|
@ -155,7 +161,7 @@ public class Utils {
|
|||
String paraStr;
|
||||
if (para != null) {
|
||||
if (para instanceof byte[]) {
|
||||
paraStr = new String((byte[]) para, Charset.forName("UTF-8"));
|
||||
paraStr = new String((byte[]) para, StandardCharsets.UTF_8);
|
||||
} else {
|
||||
paraStr = para.toString();
|
||||
}
|
||||
|
@ -176,13 +182,47 @@ public class Utils {
|
|||
}).collect(Collectors.joining());
|
||||
}
|
||||
|
||||
|
||||
public static String formatTimestamp(Timestamp timestamp) {
|
||||
int nanos = timestamp.getNanos();
|
||||
if (nanos % 1000000l != 0)
|
||||
return timestamp.toLocalDateTime().format(formatter2);
|
||||
return timestamp.toLocalDateTime().format(formatter);
|
||||
return timestamp.toLocalDateTime().format(microSecFormatter);
|
||||
return timestamp.toLocalDateTime().format(milliSecFormatter);
|
||||
}
|
||||
|
||||
public static TimestampPrecision guessTimestampPrecision(String value) {
|
||||
if (isMilliSecFormat(value))
|
||||
return TimestampPrecision.MS;
|
||||
if (isMicroSecFormat(value))
|
||||
return TimestampPrecision.US;
|
||||
if (isNanoSecFormat(value))
|
||||
return TimestampPrecision.NS;
|
||||
return TimestampPrecision.UNKNOWN;
|
||||
}
|
||||
|
||||
private static boolean isMilliSecFormat(String timestampStr) {
|
||||
try {
|
||||
milliSecFormatter.parse(timestampStr);
|
||||
} catch (DateTimeParseException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isMicroSecFormat(String timestampStr) {
|
||||
try {
|
||||
microSecFormatter.parse(timestampStr);
|
||||
} catch (DateTimeParseException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isNanoSecFormat(String timestampStr) {
|
||||
try {
|
||||
nanoSecFormatter.parse(timestampStr);
|
||||
} catch (DateTimeParseException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,108 +0,0 @@
|
|||
package com.taosdata.jdbc;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class StatementTest {
|
||||
static Connection connection = null;
|
||||
static Statement statement = null;
|
||||
static String dbName = "test";
|
||||
static String tName = "t0";
|
||||
static String host = "localhost";
|
||||
|
||||
@BeforeClass
|
||||
public static void createConnection() throws SQLException {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/?user=root&password=taosdata", properties);
|
||||
statement = connection.createStatement();
|
||||
statement.executeUpdate("drop database if exists " + dbName);
|
||||
|
||||
} catch (ClassNotFoundException e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase() {
|
||||
try {
|
||||
ResultSet rs = statement.executeQuery("show databases");
|
||||
ResultSetMetaData metaData = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||
System.out.print(metaData.getColumnLabel(i) + ":" + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createTableAndQuery() throws SQLException {
|
||||
long ts = System.currentTimeMillis();
|
||||
|
||||
statement.executeUpdate("create database if not exists " + dbName);
|
||||
statement.executeUpdate("create table if not exists " + dbName + "." + tName + "(ts timestamp, k1 int)");
|
||||
statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", 1)");
|
||||
statement.execute("select * from " + dbName + "." + tName);
|
||||
ResultSet resultSet = statement.getResultSet();
|
||||
Assert.assertNotNull(resultSet);
|
||||
|
||||
boolean isClosed = statement.isClosed();
|
||||
Assert.assertEquals(false, isClosed);
|
||||
}
|
||||
|
||||
@Test(expected = SQLException.class)
|
||||
public void testUnsupport() throws SQLException {
|
||||
Assert.assertNotNull(statement.unwrap(TSDBStatement.class));
|
||||
Assert.assertTrue(statement.isWrapperFor(TSDBStatement.class));
|
||||
|
||||
statement.getMaxFieldSize();
|
||||
statement.setMaxFieldSize(0);
|
||||
statement.setEscapeProcessing(true);
|
||||
statement.cancel();
|
||||
statement.getWarnings();
|
||||
statement.clearWarnings();
|
||||
statement.setCursorName(null);
|
||||
statement.getMoreResults();
|
||||
statement.setFetchDirection(0);
|
||||
statement.getFetchDirection();
|
||||
statement.getResultSetConcurrency();
|
||||
statement.getResultSetType();
|
||||
statement.getConnection();
|
||||
statement.getMoreResults();
|
||||
statement.getGeneratedKeys();
|
||||
statement.executeUpdate(null, 0);
|
||||
statement.executeUpdate(null, new int[]{0});
|
||||
statement.executeUpdate(null, new String[]{"str1", "str2"});
|
||||
statement.getResultSetHoldability();
|
||||
statement.setPoolable(true);
|
||||
statement.isPoolable();
|
||||
statement.closeOnCompletion();
|
||||
statement.isCloseOnCompletion();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void close() {
|
||||
try {
|
||||
statement.execute("drop database if exists " + dbName);
|
||||
if (statement != null)
|
||||
statement.close();
|
||||
if (connection != null)
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -32,20 +32,34 @@ public class TSDBConnectionTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void subscribe() {
|
||||
public void runSubscribe() {
|
||||
try {
|
||||
// given
|
||||
TSDBConnection unwrap = conn.unwrap(TSDBConnection.class);
|
||||
TSDBSubscribe subscribe = unwrap.subscribe("topic1", "select * from log.log", false);
|
||||
// when
|
||||
TSDBResultSet rs = subscribe.consume();
|
||||
ResultSetMetaData metaData = rs.getMetaData();
|
||||
for (int count = 0; count < 10 && rs.next(); count++) {
|
||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||
String value = rs.getString(i);
|
||||
System.out.print(metaData.getColumnLabel(i) + ":" + value + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
Assert.assertEquals(4, metaData.getColumnCount());
|
||||
Assert.assertEquals("ts", metaData.getColumnLabel(1));
|
||||
Assert.assertEquals("level", metaData.getColumnLabel(2));
|
||||
Assert.assertEquals("content", metaData.getColumnLabel(3));
|
||||
Assert.assertEquals("ipaddr", metaData.getColumnLabel(4));
|
||||
rs.next();
|
||||
// row 1
|
||||
{
|
||||
Assert.assertNotNull(rs.getTimestamp(1));
|
||||
Assert.assertNotNull(rs.getTimestamp("ts"));
|
||||
Assert.assertNotNull(rs.getByte(2));
|
||||
Assert.assertNotNull(rs.getByte("level"));
|
||||
Assert.assertNotNull(rs.getString(3));
|
||||
Assert.assertNotNull(rs.getString("content"));
|
||||
Assert.assertNotNull(rs.getString(4));
|
||||
Assert.assertNotNull(rs.getString("ipaddr"));
|
||||
}
|
||||
subscribe.close(false);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -366,14 +380,15 @@ public class TSDBConnectionTest {
|
|||
conn.abort(null);
|
||||
}
|
||||
|
||||
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||
@Test
|
||||
public void setNetworkTimeout() throws SQLException {
|
||||
conn.setNetworkTimeout(null, 1000);
|
||||
}
|
||||
|
||||
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||
@Test
|
||||
public void getNetworkTimeout() throws SQLException {
|
||||
conn.getNetworkTimeout();
|
||||
int networkTimeout = conn.getNetworkTimeout();
|
||||
Assert.assertEquals(0, networkTimeout);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -7,9 +7,11 @@ import java.util.Properties;
|
|||
|
||||
public class TSDBDatabaseMetaDataTest {
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
private static Connection connection;
|
||||
private static TSDBDatabaseMetaData metaData;
|
||||
|
||||
|
||||
@Test
|
||||
public void unwrap() throws SQLException {
|
||||
TSDBDatabaseMetaData unwrap = metaData.unwrap(TSDBDatabaseMetaData.class);
|
||||
|
@ -33,7 +35,7 @@ public class TSDBDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getURL() throws SQLException {
|
||||
Assert.assertEquals("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata", metaData.getURL());
|
||||
Assert.assertEquals(url, metaData.getURL());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -627,17 +629,32 @@ public class TSDBDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getTables() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
ResultSet tables = metaData.getTables("log", "", null, null);
|
||||
ResultSetMetaData metaData = tables.getMetaData();
|
||||
while (tables.next()) {
|
||||
System.out.print(metaData.getColumnLabel(1) + ":" + tables.getString(1) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(3) + ":" + tables.getString(3) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(4) + ":" + tables.getString(4) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(5) + ":" + tables.getString(5) + "\n");
|
||||
ResultSet rs = metaData.getTables("log", "", null, null);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
Assert.assertNotNull(rs);
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_SCHEM
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertNotNull(rs.getString(3));
|
||||
Assert.assertNotNull(rs.getString("TABLE_NAME"));
|
||||
// TABLE_TYPE
|
||||
Assert.assertEquals("TABLE_TYPE", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("TABLE", rs.getString(4));
|
||||
Assert.assertEquals("TABLE", rs.getString("TABLE_TYPE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(5));
|
||||
Assert.assertEquals("", rs.getString(5));
|
||||
Assert.assertEquals("", rs.getString("REMARKS"));
|
||||
}
|
||||
System.out.println();
|
||||
Assert.assertNotNull(tables);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -647,46 +664,130 @@ public class TSDBDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getCatalogs() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet catalogs = metaData.getCatalogs();
|
||||
ResultSetMetaData meta = catalogs.getMetaData();
|
||||
while (catalogs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + catalogs.getString(i));
|
||||
}
|
||||
System.out.println();
|
||||
ResultSet rs = metaData.getCatalogs();
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertNotNull(rs.getString(1));
|
||||
Assert.assertNotNull(rs.getString("TABLE_CAT"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTableTypes() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet tableTypes = metaData.getTableTypes();
|
||||
while (tableTypes.next()) {
|
||||
System.out.println(tableTypes.getString("TABLE_TYPE"));
|
||||
tableTypes.next();
|
||||
// tableTypes: table
|
||||
{
|
||||
Assert.assertEquals("TABLE", tableTypes.getString(1));
|
||||
Assert.assertEquals("TABLE", tableTypes.getString("TABLE_TYPE"));
|
||||
}
|
||||
tableTypes.next();
|
||||
// tableTypes: stable
|
||||
{
|
||||
Assert.assertEquals("STABLE", tableTypes.getString(1));
|
||||
Assert.assertEquals("STABLE", tableTypes.getString("TABLE_TYPE"));
|
||||
}
|
||||
Assert.assertNotNull(metaData.getTableTypes());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getColumns() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
// when
|
||||
ResultSet columns = metaData.getColumns("log", "", "dn", "");
|
||||
// then
|
||||
ResultSetMetaData meta = columns.getMetaData();
|
||||
while (columns.next()) {
|
||||
System.out.print(meta.getColumnLabel(1) + ": " + columns.getString(1) + "\t");
|
||||
System.out.print(meta.getColumnLabel(3) + ": " + columns.getString(3) + "\t");
|
||||
System.out.print(meta.getColumnLabel(4) + ": " + columns.getString(4) + "\t");
|
||||
System.out.print(meta.getColumnLabel(5) + ": " + columns.getString(5) + "\t");
|
||||
System.out.print(meta.getColumnLabel(6) + ": " + columns.getString(6) + "\t");
|
||||
System.out.print(meta.getColumnLabel(7) + ": " + columns.getString(7) + "\t");
|
||||
System.out.print(meta.getColumnLabel(9) + ": " + columns.getString(9) + "\t");
|
||||
System.out.print(meta.getColumnLabel(10) + ": " + columns.getString(10) + "\t");
|
||||
System.out.print(meta.getColumnLabel(11) + ": " + columns.getString(11) + "\n");
|
||||
System.out.print(meta.getColumnLabel(12) + ": " + columns.getString(12) + "\n");
|
||||
columns.next();
|
||||
// column: 1
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", columns.getString(1));
|
||||
Assert.assertEquals("log", columns.getString("TABLE_CAT"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn", columns.getString(3));
|
||||
Assert.assertEquals("dn", columns.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("ts", columns.getString(4));
|
||||
Assert.assertEquals("ts", columns.getString("COLUMN_NAME"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("DATA_TYPE", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(Types.TIMESTAMP, columns.getInt(5));
|
||||
Assert.assertEquals(Types.TIMESTAMP, columns.getInt("DATA_TYPE"));
|
||||
// TYPE_NAME
|
||||
Assert.assertEquals("TYPE_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("TIMESTAMP", columns.getString(6));
|
||||
Assert.assertEquals("TIMESTAMP", columns.getString("TYPE_NAME"));
|
||||
// COLUMN_SIZE
|
||||
Assert.assertEquals("COLUMN_SIZE", meta.getColumnLabel(7));
|
||||
Assert.assertEquals(26, columns.getInt(7));
|
||||
Assert.assertEquals(26, columns.getInt("COLUMN_SIZE"));
|
||||
// DECIMAL_DIGITS
|
||||
Assert.assertEquals("DECIMAL_DIGITS", meta.getColumnLabel(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt("DECIMAL_DIGITS"));
|
||||
Assert.assertEquals(null, columns.getString(9));
|
||||
Assert.assertEquals(null, columns.getString("DECIMAL_DIGITS"));
|
||||
// NUM_PREC_RADIX
|
||||
Assert.assertEquals("NUM_PREC_RADIX", meta.getColumnLabel(10));
|
||||
Assert.assertEquals(10, columns.getInt(10));
|
||||
Assert.assertEquals(10, columns.getInt("NUM_PREC_RADIX"));
|
||||
// NULLABLE
|
||||
Assert.assertEquals("NULLABLE", meta.getColumnLabel(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNoNulls, columns.getInt(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNoNulls, columns.getInt("NULLABLE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(12));
|
||||
Assert.assertEquals(null, columns.getString(12));
|
||||
Assert.assertEquals(null, columns.getString("REMARKS"));
|
||||
}
|
||||
columns.next();
|
||||
// column: 2
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", columns.getString(1));
|
||||
Assert.assertEquals("log", columns.getString("TABLE_CAT"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn", columns.getString(3));
|
||||
Assert.assertEquals("dn", columns.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("cpu_taosd", columns.getString(4));
|
||||
Assert.assertEquals("cpu_taosd", columns.getString("COLUMN_NAME"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("DATA_TYPE", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(Types.FLOAT, columns.getInt(5));
|
||||
Assert.assertEquals(Types.FLOAT, columns.getInt("DATA_TYPE"));
|
||||
// TYPE_NAME
|
||||
Assert.assertEquals("TYPE_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("FLOAT", columns.getString(6));
|
||||
Assert.assertEquals("FLOAT", columns.getString("TYPE_NAME"));
|
||||
// COLUMN_SIZE
|
||||
Assert.assertEquals("COLUMN_SIZE", meta.getColumnLabel(7));
|
||||
Assert.assertEquals(12, columns.getInt(7));
|
||||
Assert.assertEquals(12, columns.getInt("COLUMN_SIZE"));
|
||||
// DECIMAL_DIGITS
|
||||
Assert.assertEquals("DECIMAL_DIGITS", meta.getColumnLabel(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt("DECIMAL_DIGITS"));
|
||||
Assert.assertEquals(null, columns.getString(9));
|
||||
Assert.assertEquals(null, columns.getString("DECIMAL_DIGITS"));
|
||||
// NUM_PREC_RADIX
|
||||
Assert.assertEquals("NUM_PREC_RADIX", meta.getColumnLabel(10));
|
||||
Assert.assertEquals(10, columns.getInt(10));
|
||||
Assert.assertEquals(10, columns.getInt("NUM_PREC_RADIX"));
|
||||
// NULLABLE
|
||||
Assert.assertEquals("NULLABLE", meta.getColumnLabel(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNullable, columns.getInt(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNullable, columns.getInt("NULLABLE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(12));
|
||||
Assert.assertEquals(null, columns.getString(12));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -712,17 +813,35 @@ public class TSDBDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getPrimaryKeys() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet rs = metaData.getPrimaryKeys("log", "", "dn1");
|
||||
while (rs.next()) {
|
||||
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
|
||||
System.out.println("COLUMN_NAME: " + rs.getString("COLUMN_NAME"));
|
||||
System.out.println("KEY_SEQ: " + rs.getString("KEY_SEQ"));
|
||||
System.out.println("PK_NAME: " + rs.getString("PK_NAME"));
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_SCHEM
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn1", rs.getString(3));
|
||||
Assert.assertEquals("dn1", rs.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("ts", rs.getString(4));
|
||||
Assert.assertEquals("ts", rs.getString("COLUMN_NAME"));
|
||||
// KEY_SEQ
|
||||
Assert.assertEquals("KEY_SEQ", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(1, rs.getShort(5));
|
||||
Assert.assertEquals(1, rs.getShort("KEY_SEQ"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("PK_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("ts", rs.getString(6));
|
||||
Assert.assertEquals("ts", rs.getString("PK_NAME"));
|
||||
}
|
||||
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -847,14 +966,27 @@ public class TSDBDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getSuperTables() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet rs = metaData.getSuperTables("log", "", "dn1");
|
||||
while (rs.next()) {
|
||||
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
|
||||
System.out.println("SUPERTABLE_NAME: " + rs.getString("SUPERTABLE_NAME"));
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn1", rs.getString(3));
|
||||
Assert.assertEquals("dn1", rs.getString("TABLE_NAME"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("SUPERTABLE_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("dn", rs.getString(4));
|
||||
Assert.assertEquals("dn", rs.getString("SUPERTABLE_NAME"));
|
||||
}
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -951,15 +1083,12 @@ public class TSDBDatabaseMetaDataTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata", properties);
|
||||
connection = DriverManager.getConnection(url, properties);
|
||||
metaData = connection.getMetaData().unwrap(TSDBDatabaseMetaData.class);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
package com.taosdata.jdbc;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.sql.SQLWarning;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.RuntimeMXBean;
|
||||
import java.lang.management.ThreadMXBean;
|
||||
|
||||
public class TSDBJNIConnectorTest {
|
||||
|
||||
private static TSDBResultSetRowData rowData;
|
||||
|
@ -14,17 +19,68 @@ public class TSDBJNIConnectorTest {
|
|||
@Test
|
||||
public void test() {
|
||||
try {
|
||||
|
||||
try {
|
||||
//change sleepSeconds when debugging with attach to process to find PID
|
||||
int sleepSeconds = -1;
|
||||
if (sleepSeconds>0) {
|
||||
RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
|
||||
String jvmName = runtimeBean.getName();
|
||||
long pid = Long.valueOf(jvmName.split("@")[0]);
|
||||
System.out.println("JVM PID = " + pid);
|
||||
|
||||
Thread.sleep(sleepSeconds*1000);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// init
|
||||
TSDBJNIConnector.init("/etc/taos/taos.cfg", null, null, null);
|
||||
TSDBJNIConnector.init("/etc/taos", null, null, null);
|
||||
|
||||
// connect
|
||||
TSDBJNIConnector connector = new TSDBJNIConnector();
|
||||
connector.connect("127.0.0.1", 6030, "unsign_jni", "root", "taosdata");
|
||||
connector.connect("127.0.0.1", 6030, null, "root", "taosdata");
|
||||
|
||||
// setup
|
||||
String setupSqlStrs[] = {"create database if not exists d precision \"us\"",
|
||||
"create table if not exists d.t(ts timestamp, f int)",
|
||||
"create database if not exists d2",
|
||||
"create table if not exists d2.t2(ts timestamp, f int)",
|
||||
"insert into d.t values(now+100s, 100)",
|
||||
"insert into d2.t2 values(now+200s, 200)"
|
||||
};
|
||||
for (String setupSqlStr : setupSqlStrs) {
|
||||
long setupSql = connector.executeQuery(setupSqlStr);
|
||||
|
||||
assertEquals(0, connector.getResultTimePrecision(setupSql));
|
||||
if (connector.isUpdateQuery(setupSql)) {
|
||||
connector.freeResultSet(setupSql);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
long sqlObj1 = connector.executeQuery("select * from d2.t2");
|
||||
assertEquals(0, connector.getResultTimePrecision(sqlObj1));
|
||||
List<ColumnMetaData> columnMetaDataList = new ArrayList<>();
|
||||
int code = connector.getSchemaMetaData(sqlObj1, columnMetaDataList);
|
||||
rowData = new TSDBResultSetRowData(columnMetaDataList.size());
|
||||
assertTrue(next(connector, sqlObj1));
|
||||
assertEquals(0, connector.getResultTimePrecision(sqlObj1));
|
||||
connector.freeResultSet(sqlObj1);
|
||||
}
|
||||
|
||||
// executeQuery
|
||||
long pSql = connector.executeQuery("select * from unsign_jni.us_table");
|
||||
long pSql = connector.executeQuery("select * from d.t");
|
||||
|
||||
if (connector.isUpdateQuery(pSql)) {
|
||||
connector.freeResultSet(pSql);
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_WITH_EXECUTEQUERY);
|
||||
}
|
||||
|
||||
assertEquals(1, connector.getResultTimePrecision(pSql));
|
||||
|
||||
// get schema
|
||||
List<ColumnMetaData> columnMetaDataList = new ArrayList<>();
|
||||
int code = connector.getSchemaMetaData(pSql, columnMetaDataList);
|
||||
|
@ -37,6 +93,8 @@ public class TSDBJNIConnectorTest {
|
|||
if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
|
||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_NUM_OF_FIELDS_0);
|
||||
}
|
||||
|
||||
assertEquals(1, connector.getResultTimePrecision(pSql));
|
||||
int columnSize = columnMetaDataList.size();
|
||||
// print metadata
|
||||
for (int i = 0; i < columnSize; i++) {
|
||||
|
@ -45,8 +103,7 @@ public class TSDBJNIConnectorTest {
|
|||
rowData = new TSDBResultSetRowData(columnSize);
|
||||
// iterate resultSet
|
||||
for (int i = 0; next(connector, pSql); i++) {
|
||||
System.out.println("col[" + i + "] size: " + rowData.getColSize());
|
||||
rowData.getData().stream().forEach(col -> System.out.print(col + "\t"));
|
||||
assertEquals(1, connector.getResultTimePrecision(pSql));
|
||||
System.out.println();
|
||||
}
|
||||
// close resultSet
|
||||
|
@ -86,4 +143,4 @@ public class TSDBJNIConnectorTest {
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,16 +54,17 @@ public class TSDBParameterMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getPrecision() throws SQLException {
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(1));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(2));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(3));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(4));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(5));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(6));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(7));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(8));
|
||||
Assert.assertEquals(5, parameterMetaData_insert.getPrecision(9));
|
||||
Assert.assertEquals(5, parameterMetaData_insert.getPrecision(10));
|
||||
//create table weather(ts timestamp, f1 int, f2 bigint, f3 float, f4 double, f5 smallint, f6 tinyint, f7 bool, f8 binary(64), f9 nchar(64))
|
||||
Assert.assertEquals(TSDBConstants.TIMESTAMP_MS_PRECISION, parameterMetaData_insert.getPrecision(1));
|
||||
Assert.assertEquals(TSDBConstants.INT_PRECISION, parameterMetaData_insert.getPrecision(2));
|
||||
Assert.assertEquals(TSDBConstants.BIGINT_PRECISION, parameterMetaData_insert.getPrecision(3));
|
||||
Assert.assertEquals(TSDBConstants.FLOAT_PRECISION, parameterMetaData_insert.getPrecision(4));
|
||||
Assert.assertEquals(TSDBConstants.DOUBLE_PRECISION, parameterMetaData_insert.getPrecision(5));
|
||||
Assert.assertEquals(TSDBConstants.SMALLINT_PRECISION, parameterMetaData_insert.getPrecision(6));
|
||||
Assert.assertEquals(TSDBConstants.TINYINT_PRECISION, parameterMetaData_insert.getPrecision(7));
|
||||
Assert.assertEquals(TSDBConstants.BOOLEAN_PRECISION, parameterMetaData_insert.getPrecision(8));
|
||||
Assert.assertEquals("hello".getBytes().length, parameterMetaData_insert.getPrecision(9));
|
||||
Assert.assertEquals("涛思数据".length(), parameterMetaData_insert.getPrecision(10));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -71,8 +72,8 @@ public class TSDBParameterMetaDataTest {
|
|||
Assert.assertEquals(0, parameterMetaData_insert.getScale(1));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(2));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(3));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(4));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(5));
|
||||
Assert.assertEquals(31, parameterMetaData_insert.getScale(4));
|
||||
Assert.assertEquals(31, parameterMetaData_insert.getScale(5));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(6));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(7));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(8));
|
||||
|
@ -124,10 +125,16 @@ public class TSDBParameterMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getParameterMode() throws SQLException {
|
||||
for (int i = 1; i <= parameterMetaData_insert.getParameterCount(); i++) {
|
||||
int parameterMode = parameterMetaData_insert.getParameterMode(i);
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMode);
|
||||
}
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(1));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(2));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(3));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(4));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(5));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(6));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(7));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(8));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(9));
|
||||
Assert.assertEquals(ParameterMetaData.parameterModeUnknown, parameterMetaData_insert.getParameterMode(10));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -144,7 +151,6 @@ public class TSDBParameterMetaDataTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("drop database if exists test_pstmt");
|
||||
|
@ -164,7 +170,7 @@ public class TSDBParameterMetaDataTest {
|
|||
pstmt_insert.setObject(7, Byte.MAX_VALUE);
|
||||
pstmt_insert.setObject(8, true);
|
||||
pstmt_insert.setObject(9, "hello".getBytes());
|
||||
pstmt_insert.setObject(10, "Hello");
|
||||
pstmt_insert.setObject(10, "涛思数据");
|
||||
parameterMetaData_insert = pstmt_insert.getParameterMetaData();
|
||||
|
||||
pstmt_select = conn.prepareStatement(sql_select);
|
||||
|
@ -173,7 +179,7 @@ public class TSDBParameterMetaDataTest {
|
|||
pstmt_select.setInt(3, 0);
|
||||
parameterMetaData_select = pstmt_select.getParameterMetaData();
|
||||
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,6 +14,7 @@ import java.math.BigDecimal;
|
|||
import java.sql.*;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class TSDBResultSetTest {
|
||||
|
||||
|
@ -133,7 +134,7 @@ public class TSDBResultSetTest {
|
|||
Assert.assertEquals(3.1415926, Double.valueOf(new String(f5)), 0.000000f);
|
||||
|
||||
byte[] f6 = rs.getBytes("f6");
|
||||
Assert.assertEquals("abc", new String(f6));
|
||||
Assert.assertTrue(Arrays.equals("abc".getBytes(), f6));
|
||||
|
||||
byte[] f7 = rs.getBytes("f7");
|
||||
Assert.assertEquals((short) 10, Shorts.fromByteArray(f7));
|
||||
|
@ -646,7 +647,6 @@ public class TSDBResultSetTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||
stmt = conn.createStatement();
|
||||
stmt.execute("create database if not exists restful_test");
|
||||
|
@ -656,10 +656,9 @@ public class TSDBResultSetTest {
|
|||
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.next();
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
|
|
|
@ -14,24 +14,6 @@ public class TSDBStatementTest {
|
|||
private static Connection conn;
|
||||
private static Statement stmt;
|
||||
|
||||
@Test
|
||||
public void executeQuery() {
|
||||
try {
|
||||
ResultSet rs = stmt.executeQuery("show databases");
|
||||
Assert.assertNotNull(rs);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
rs.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void executeUpdate() {
|
||||
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||
|
@ -173,10 +155,6 @@ public class TSDBStatementTest {
|
|||
Assert.assertEquals(3, meta.getColumnCount());
|
||||
int count = 0;
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
count++;
|
||||
}
|
||||
Assert.assertEquals(1, count);
|
||||
|
@ -387,15 +365,12 @@ public class TSDBStatementTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata", properties);
|
||||
stmt = conn.createStatement();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
@ -12,21 +13,19 @@ public class AppMemoryLeakTest {
|
|||
@Test(expected = SQLException.class)
|
||||
public void testCreateTooManyConnection() throws ClassNotFoundException, SQLException {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
int conCnt = 0;
|
||||
while (true) {
|
||||
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||
System.out.println(conCnt++ + " : " + conn);
|
||||
Assert.assertNotNull(conn);
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = Exception.class)
|
||||
public void testCreateTooManyStatement() throws ClassNotFoundException, SQLException {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
int stmtCnt = 0;
|
||||
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||
while (true) {
|
||||
Statement stmt = conn.createStatement();
|
||||
System.out.println(++stmtCnt + " : " + stmt);
|
||||
Assert.assertNotNull(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.taosdata.jdbc.rs;
|
||||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
|
@ -0,0 +1,58 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
|
||||
import com.taosdata.jdbc.TSDBDriver;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import java.io.IOException;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class BadLocaleSettingTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbName = "bad_locale_test";
|
||||
private static Connection conn;
|
||||
|
||||
@Test
|
||||
public void canSetLocale() {
|
||||
try {
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
|
||||
String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
conn = DriverManager.getConnection(url, properties);
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbName);
|
||||
stmt.execute("create database if not exists " + dbName);
|
||||
stmt.execute("use " + dbName);
|
||||
stmt.execute("drop table if exists weather");
|
||||
stmt.execute("create table weather(ts timestamp, temperature float, humidity int)");
|
||||
stmt.executeUpdate("insert into weather values(1624071506435, 12.3, 4)");
|
||||
stmt.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
System.setProperty("sun.jnu.encoding", "ANSI_X3.4-1968");
|
||||
System.setProperty("file.encoding", "ANSI_X3.4-1968");
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterClass() {
|
||||
try {
|
||||
if (conn != null)
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,9 +28,7 @@ public class BatchInsertTest {
|
|||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
|
@ -44,7 +42,7 @@ public class BatchInsertTest {
|
|||
String createTableSql = "create table " + stbName + "(ts timestamp, f1 int, f2 int, f3 int) tags(areaid int, loc binary(20))";
|
||||
statement.executeUpdate(createTableSql);
|
||||
// create tables
|
||||
for(int i = 0; i < numOfTables; i++) {
|
||||
for (int i = 0; i < numOfTables; i++) {
|
||||
String loc = i % 2 == 0 ? "beijing" : "shanghai";
|
||||
String createSubTalbesSql = "create table " + tablePrefix + i + " using " + stbName + " tags(" + i + ", '" + loc + "')";
|
||||
statement.executeUpdate(createSubTalbesSql);
|
||||
|
@ -62,7 +60,6 @@ public class BatchInsertTest {
|
|||
final int index = i;
|
||||
executorService.execute(() -> {
|
||||
try {
|
||||
long startTime = System.currentTimeMillis();
|
||||
Statement statement = connection.createStatement(); // get statement
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
|
||||
|
@ -75,8 +72,6 @@ public class BatchInsertTest {
|
|||
}
|
||||
statement.addBatch(sb.toString());
|
||||
statement.executeBatch();
|
||||
long endTime = System.currentTimeMillis();
|
||||
System.out.println("Thread " + index + " takes " + (endTime - startTime) + " microseconds");
|
||||
connection.commit();
|
||||
statement.close();
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import com.taosdata.jdbc.TSDBDriver;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class ConnectMultiTaosdByRestfulWithDifferentTokenTest {
|
||||
|
||||
private static String host1 = "192.168.17.156";
|
||||
private static String user1 = "root";
|
||||
private static String password1 = "tqueue";
|
||||
private Connection conn1;
|
||||
private static String host2 = "192.168.17.82";
|
||||
private static String user2 = "root";
|
||||
private static String password2 = "taosdata";
|
||||
private Connection conn2;
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
//when
|
||||
executeSelectStatus(conn1);
|
||||
executeSelectStatus(conn2);
|
||||
executeSelectStatus(conn1);
|
||||
}
|
||||
|
||||
private void executeSelectStatus(Connection connection) {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select server_status()");
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
|
||||
String url1 = "jdbc:TAOS-RS://" + host1 + ":6041/?user=" + user1 + "&password=" + password1;
|
||||
String url2 = "jdbc:TAOS-RS://" + host2 + ":6041/?user=" + user2 + "&password=" + password2;
|
||||
try {
|
||||
conn1 = DriverManager.getConnection(url1, properties);
|
||||
conn2 = DriverManager.getConnection(url2, properties);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,64 +1,76 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import com.taosdata.jdbc.utils.TimestampUtil;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.junit.*;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class DatetimeBefore1970Test {
|
||||
|
||||
private static Connection conn;
|
||||
private static final String host = "127.0.0.1";
|
||||
private Connection conn;
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
// given
|
||||
stmt.executeUpdate("insert into weather(ts) values('1969-12-31 23:59:59.999')");
|
||||
stmt.executeUpdate("insert into weather(ts) values('1970-01-01 00:00:00.000')");
|
||||
stmt.executeUpdate("insert into weather(ts) values('1970-01-01 08:00:00.000')");
|
||||
stmt.executeUpdate("insert into weather(ts) values('1970-01-01 07:59:59.999')");
|
||||
ResultSet rs = stmt.executeQuery("select * from weather order by ts asc");
|
||||
ResultSetMetaData metaData = rs.getMetaData();
|
||||
Assert.assertEquals(2, metaData.getColumnCount());
|
||||
|
||||
// when
|
||||
rs.next();
|
||||
// then
|
||||
Timestamp ts = rs.getTimestamp("ts");
|
||||
Assert.assertEquals("1969-12-31 23:59:59.999", TimestampUtil.longToDatetime(ts.getTime()));
|
||||
|
||||
// when
|
||||
rs.next();
|
||||
// then
|
||||
ts = rs.getTimestamp("ts");
|
||||
Assert.assertEquals("1970-01-01 00:00:00.000", TimestampUtil.longToDatetime(ts.getTime()));
|
||||
|
||||
// when
|
||||
rs.next();
|
||||
// then
|
||||
ts = rs.getTimestamp("ts");
|
||||
Assert.assertEquals("1970-01-01 08:00:00.000", TimestampUtil.longToDatetime(ts.getTime()));
|
||||
|
||||
// when
|
||||
rs.next();
|
||||
// then
|
||||
ts = rs.getTimestamp("ts");
|
||||
Assert.assertEquals("1970-01-01 07:59:59.999", TimestampUtil.longToDatetime(ts.getTime()));
|
||||
|
||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||
while (rs.next()) {
|
||||
Timestamp ts = rs.getTimestamp("ts");
|
||||
System.out.println("long: " + ts.getTime() + ", string: " + TimestampUtil.longToDatetime(ts.getTime()));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("timestamp: " + Long.MAX_VALUE + ", string: " + TimestampUtil.longToDatetime(Long.MAX_VALUE));
|
||||
System.out.println("timestamp: " + Long.MIN_VALUE + ", string: " + TimestampUtil.longToDatetime(Long.MIN_VALUE));
|
||||
System.out.println("timestamp: " + 0 + ", string: " + TimestampUtil.longToDatetime(0));
|
||||
System.out.println("timestamp: " + -1 + ", string: " + TimestampUtil.longToDatetime(-1));
|
||||
String datetime = "1970-01-01 00:00:00.000";
|
||||
System.out.println("timestamp: " + TimestampUtil.datetimeToLong(datetime) + ", string: " + datetime);
|
||||
datetime = "1969-12-31 23:59:59.999";
|
||||
System.out.println("timestamp: " + TimestampUtil.datetimeToLong(datetime) + ", string: " + datetime);
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://127.0.0.1:6030/?user=root&password=taosdata");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists test_timestamp");
|
||||
stmt.execute("create database if not exists test_timestamp keep 36500");
|
||||
stmt.execute("use test_timestamp");
|
||||
stmt.execute("create table weather(ts timestamp,f1 float)");
|
||||
stmt.close();
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterClass() {
|
||||
@After
|
||||
public void after() {
|
||||
try {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists test_timestamp");
|
||||
if (conn != null)
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
|
|
|
@ -7,56 +7,64 @@ import org.junit.*;
|
|||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TD4174Test {
|
||||
private Connection conn;
|
||||
public class DoubleQuoteInSqlTest {
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "td4174";
|
||||
|
||||
private Connection conn;
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
// given
|
||||
long ts = System.currentTimeMillis();
|
||||
try (PreparedStatement pstmt = conn.prepareStatement("insert into weather values(" + ts + ", ?)")) {
|
||||
JSONObject value = new JSONObject();
|
||||
value.put("name", "John Smith");
|
||||
value.put("age", 20);
|
||||
Assert.assertEquals("{\"name\":\"John Smith\",\"age\":20}",value.toJSONString());
|
||||
pstmt.setString(1, value.toJSONString());
|
||||
|
||||
int ret = pstmt.executeUpdate();
|
||||
Assert.assertEquals(1, ret);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
JSONObject value = new JSONObject();
|
||||
value.put("name", "John Smith");
|
||||
value.put("age", 20);
|
||||
System.out.println(value.toJSONString());
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
try (PreparedStatement pstmt = conn.prepareStatement("insert into weather values(" + ts + ", ?)")) {
|
||||
pstmt.setString(1, value.toJSONString());
|
||||
ret = pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals("{\"name\":\"John Smith\",\"age\":20}", value.toJSONString());
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() throws SQLException {
|
||||
public void before() {
|
||||
String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
|
||||
conn = DriverManager.getConnection(url, properties);
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("drop database if exists td4174");
|
||||
stmt.execute("create database if not exists td4174");
|
||||
stmt.execute("use td4174");
|
||||
try {
|
||||
conn = DriverManager.getConnection(url, properties);
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname);
|
||||
stmt.execute("use " + dbname);
|
||||
stmt.execute("create table weather(ts timestamp, text binary(64))");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() throws SQLException {
|
||||
if (conn != null)
|
||||
public void after() {
|
||||
try {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.close();
|
||||
conn.close();
|
||||
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -20,7 +20,6 @@ public class ImportTest {
|
|||
@BeforeClass
|
||||
public static void before() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
|
@ -33,8 +32,6 @@ public class ImportTest {
|
|||
stmt.close();
|
||||
|
||||
ts = System.currentTimeMillis();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -47,7 +44,6 @@ public class ImportTest {
|
|||
for (int i = 0; i < 50; i++) {
|
||||
ts++;
|
||||
int row = stmt.executeUpdate("import into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")");
|
||||
System.out.println("import into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")\t" + row);
|
||||
assertEquals(1, row);
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +80,6 @@ public class ImportTest {
|
|||
long t = (++ts) + a;
|
||||
sqlBuilder.append("(").append(t).append(",").append((100 + i)).append(",").append(i).append(") ");
|
||||
}
|
||||
System.out.println(sqlBuilder.toString());
|
||||
int rows = stmt.executeUpdate(sqlBuilder.toString());
|
||||
assertEquals(50, rows);
|
||||
} catch (SQLException e) {
|
||||
|
|
|
@ -10,7 +10,7 @@ import org.junit.Test;
|
|||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TwoTypeTimestampPercisionInJniTest {
|
||||
public class MicroSecondPrecisionJNITest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String ms_timestamp_db = "ms_precision_test";
|
||||
|
@ -41,7 +41,6 @@ public class TwoTypeTimestampPercisionInJniTest {
|
|||
rs.next();
|
||||
|
||||
Timestamp timestamp = rs.getTimestamp(1);
|
||||
System.out.println(timestamp);
|
||||
long ts = timestamp.getTime();
|
||||
Assert.assertEquals(timestamp1, ts);
|
||||
int nanos = timestamp.getNanos();
|
|
@ -10,10 +10,9 @@ import org.junit.Test;
|
|||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TwoTypeTimestampPercisionInRestfulTest {
|
||||
public class MicroSecondPrecisionRestfulTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
|
||||
private static final String ms_timestamp_db = "ms_precision_test";
|
||||
private static final String us_timestamp_db = "us_precision_test";
|
||||
private static final long timestamp1 = System.currentTimeMillis();
|
|
@ -7,7 +7,7 @@ import org.junit.Test;
|
|||
import java.sql.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class MultiThreadsWithSameStatmentTest {
|
||||
public class MultiThreadsWithSameStatementTest {
|
||||
|
||||
|
||||
private class Service {
|
||||
|
@ -16,12 +16,11 @@ public class MultiThreadsWithSameStatmentTest {
|
|||
|
||||
public Service() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||
stmt = conn.createStatement();
|
||||
stmt.execute("create database if not exists jdbctest");
|
||||
stmt.executeUpdate("create table if not exists jdbctest.weather (ts timestamp, f1 int)");
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -48,10 +47,6 @@ public class MultiThreadsWithSameStatmentTest {
|
|||
ResultSet resultSet = service.stmt.executeQuery("select * from jdbctest.weather");
|
||||
while (resultSet.next()) {
|
||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||
System.out.print(metaData.getColumnLabel(i) + ": " + resultSet.getString(i));
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
resultSet.close();
|
||||
service.release();
|
|
@ -0,0 +1,182 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.time.Instant;
|
||||
import java.util.Random;
|
||||
|
||||
public class NanoSecondTimestampJNITest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "nano_sec_test";
|
||||
private static final Random random = new Random(System.currentTimeMillis());
|
||||
private static Connection conn;
|
||||
|
||||
@Test
|
||||
public void insertUsingLongValue() {
|
||||
// given
|
||||
long ms = System.currentTimeMillis();
|
||||
long ns = ms * 1000_000 + random.nextInt(1000_000);
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ret = stmt.executeUpdate("insert into weather(ts, temperature, humidity) values(" + ns + ", 12.3, 4)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertUsingStringValue() {
|
||||
// given
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ret = stmt.executeUpdate("insert into weather(ts, temperature, humidity) values('2021-01-01 12:00:00.123456789', 12.3, 4)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertUsingTimestampValue() {
|
||||
// given
|
||||
long epochSec = System.currentTimeMillis() / 1000;
|
||||
long nanoAdjustment = random.nextInt(1000_000_000);
|
||||
Timestamp ts = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
String sql = "insert into weather(ts, temperature, humidity) values( ?, ?, ?)";
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
pstmt.setTimestamp(1, ts);
|
||||
pstmt.setFloat(2, 12.34f);
|
||||
pstmt.setInt(3, 55);
|
||||
ret = pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingLongValue() throws SQLException {
|
||||
// given
|
||||
long ms = System.currentTimeMillis();
|
||||
long ns = ms * 1000_000L + random.nextInt(1000_000);
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into weather(ts, temperature, humidity) values(" + ns + ", 12.3, 4)");
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
long actual = rs.getLong(1);
|
||||
Assert.assertEquals(ms, actual);
|
||||
actual = rs.getLong("ts");
|
||||
Assert.assertEquals(ms, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingStringValue() throws SQLException {
|
||||
// given
|
||||
String timestampStr = "2021-01-01 12:00:00.123456789";
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into weather(ts, temperature, humidity) values('" + timestampStr + "', 12.3, 4)");
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
String actual = rs.getString(1);
|
||||
Assert.assertEquals(timestampStr, actual);
|
||||
actual = rs.getString("ts");
|
||||
Assert.assertEquals(timestampStr, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingTimestampValue() throws SQLException {
|
||||
// given
|
||||
long timeMillis = System.currentTimeMillis();
|
||||
long epochSec = timeMillis / 1000;
|
||||
long nanoAdjustment = (timeMillis % 1000) * 1000_000L + random.nextInt(1000_000);
|
||||
Timestamp ts = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
|
||||
// insert one row
|
||||
String sql = "insert into weather(ts, temperature, humidity) values( ?, ?, ?)";
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
pstmt.setTimestamp(1, ts);
|
||||
pstmt.setFloat(2, 12.34f);
|
||||
pstmt.setInt(3, 55);
|
||||
pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Timestamp actual = rs.getTimestamp(1);
|
||||
Assert.assertEquals(ts, actual);
|
||||
actual = rs.getTimestamp("ts");
|
||||
Assert.assertEquals(ts, actual);
|
||||
Assert.assertEquals(timeMillis, actual.getTime());
|
||||
Assert.assertEquals(nanoAdjustment, actual.getNanos());
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("drop table if exists weather");
|
||||
stmt.execute("create table weather(ts timestamp, temperature float, humidity int)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
final String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
try {
|
||||
conn = DriverManager.getConnection(url);
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname + " precision 'ns'");
|
||||
stmt.execute("use " + dbname);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,182 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.time.Instant;
|
||||
import java.util.Random;
|
||||
|
||||
public class NanoSecondTimestampRestfulTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "nano_sec_test";
|
||||
private static final Random random = new Random(System.currentTimeMillis());
|
||||
private static Connection conn;
|
||||
|
||||
@Test
|
||||
public void insertUsingLongValue() {
|
||||
// given
|
||||
long ms = System.currentTimeMillis();
|
||||
long ns = ms * 1000_000 + random.nextInt(1000_000);
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ret = stmt.executeUpdate("insert into weather(ts, temperature, humidity) values(" + ns + ", 12.3, 4)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertUsingStringValue() {
|
||||
// given
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ret = stmt.executeUpdate("insert into weather(ts, temperature, humidity) values('2021-01-01 12:00:00.123456789', 12.3, 4)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertUsingTimestampValue() {
|
||||
// given
|
||||
long epochSec = System.currentTimeMillis() / 1000;
|
||||
long nanoAdjustment = random.nextInt(1000_000_000);
|
||||
Timestamp ts = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
|
||||
// when
|
||||
int ret = 0;
|
||||
String sql = "insert into weather(ts, temperature, humidity) values( ?, ?, ?)";
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
pstmt.setTimestamp(1, ts);
|
||||
pstmt.setFloat(2, 12.34f);
|
||||
pstmt.setInt(3, 55);
|
||||
ret = pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(1, ret);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingLongValue() throws SQLException {
|
||||
// given
|
||||
long ms = System.currentTimeMillis();
|
||||
long ns = ms * 1000_000L + random.nextInt(1000_000);
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into weather(ts, temperature, humidity) values(" + ns + ", 12.3, 4)");
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
long actual = rs.getLong(1);
|
||||
Assert.assertEquals(ms, actual);
|
||||
actual = rs.getLong("ts");
|
||||
Assert.assertEquals(ms, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingStringValue() throws SQLException {
|
||||
// given
|
||||
String timestampStr = "2021-01-01 12:00:00.123456789";
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into weather(ts, temperature, humidity) values('" + timestampStr + "', 12.3, 4)");
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
String actual = rs.getString(1);
|
||||
Assert.assertEquals(timestampStr, actual);
|
||||
actual = rs.getString("ts");
|
||||
Assert.assertEquals(timestampStr, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectUsingTimestampValue() throws SQLException {
|
||||
// given
|
||||
long timeMillis = System.currentTimeMillis();
|
||||
long epochSec = timeMillis / 1000;
|
||||
long nanoAdjustment = (timeMillis % 1000) * 1000_000L + random.nextInt(1000_000);
|
||||
Timestamp ts = Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||
|
||||
// insert one row
|
||||
String sql = "insert into weather(ts, temperature, humidity) values( ?, ?, ?)";
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
pstmt.setTimestamp(1, ts);
|
||||
pstmt.setFloat(2, 12.34f);
|
||||
pstmt.setInt(3, 55);
|
||||
pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// when
|
||||
ResultSet rs = null;
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
rs = stmt.executeQuery("select * from weather");
|
||||
rs.next();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Timestamp actual = rs.getTimestamp(1);
|
||||
Assert.assertEquals(ts, actual);
|
||||
actual = rs.getTimestamp("ts");
|
||||
Assert.assertEquals(ts, actual);
|
||||
Assert.assertEquals(timeMillis, actual.getTime());
|
||||
Assert.assertEquals(nanoAdjustment, actual.getNanos());
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("drop table if exists weather");
|
||||
stmt.execute("create table weather(ts timestamp, temperature float, humidity int)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
final String url = "jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata";
|
||||
try {
|
||||
conn = DriverManager.getConnection(url);
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname + " precision 'ns'");
|
||||
stmt.execute("use " + dbname);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -6,7 +6,7 @@ import org.junit.Test;
|
|||
|
||||
import java.sql.*;
|
||||
|
||||
public class NullValueInResultSetForJdbcJniTest {
|
||||
public class NullValueInResultSetJNITest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
Connection conn;
|
||||
|
@ -17,11 +17,6 @@ public class NullValueInResultSetForJdbcJniTest {
|
|||
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
Object value = rs.getObject(i);
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + value + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
|
@ -6,7 +6,7 @@ import org.junit.Test;
|
|||
|
||||
import java.sql.*;
|
||||
|
||||
public class NullValueInResultSetForJdbcRestfulTest {
|
||||
public class NullValueInResultSetRestfulTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
Connection conn;
|
||||
|
@ -19,9 +19,7 @@ public class NullValueInResultSetForJdbcRestfulTest {
|
|||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
Object value = rs.getObject(i);
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + value + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
|
@ -7,7 +7,7 @@ import org.junit.*;
|
|||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TD3841Test {
|
||||
public class NullValueInResultSetTest {
|
||||
private static final String host = "127.0.0.1";
|
||||
private static Properties properties;
|
||||
private static Connection conn_restful;
|
|
@ -0,0 +1,98 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class PreparedStatementBatchInsertJNITest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "td4668";
|
||||
|
||||
private final Random random = new Random(System.currentTimeMillis());
|
||||
private Connection conn;
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
// given
|
||||
long ts = System.currentTimeMillis();
|
||||
List<Object[]> rows = IntStream.range(0, 10).mapToObj(i -> {
|
||||
Object[] row = new Object[6];
|
||||
final String groupId = String.format("%02d", random.nextInt(100));
|
||||
// table name (d + groupId)组合
|
||||
row[0] = "d" + groupId;
|
||||
// tag
|
||||
row[1] = groupId;
|
||||
// ts
|
||||
row[2] = ts + i;
|
||||
// current 电流
|
||||
row[3] = random.nextFloat();
|
||||
// voltage 电压
|
||||
row[4] = Math.random() > 0.5 ? 220 : 380;
|
||||
// phase 相位
|
||||
row[5] = random.nextInt(10);
|
||||
return row;
|
||||
}).collect(Collectors.toList());
|
||||
final String sql = "INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)";
|
||||
|
||||
// when
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
for (Object[] row : rows) {
|
||||
for (int i = 0; i < row.length; i++) {
|
||||
pstmt.setObject(i + 1, row[i]);
|
||||
}
|
||||
pstmt.addBatch();
|
||||
}
|
||||
pstmt.executeBatch();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
// then
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select * from meters");
|
||||
int count = 0;
|
||||
while (rs.next()) {
|
||||
count++;
|
||||
}
|
||||
Assert.assertEquals(10, count);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname);
|
||||
stmt.execute("use " + dbname);
|
||||
stmt.execute("create table meters(ts timestamp, current float, voltage int, phase int) tags(groupId int)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
try {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.close();
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class PreparedStatementBatchInsertRestfulTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "td4668";
|
||||
|
||||
private final Random random = new Random(System.currentTimeMillis());
|
||||
private Connection conn;
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
// given
|
||||
long ts = System.currentTimeMillis();
|
||||
List<Object[]> rows = IntStream.range(0, 10).mapToObj(i -> {
|
||||
Object[] row = new Object[6];
|
||||
final String groupId = String.format("%02d", random.nextInt(100));
|
||||
// table name (d + groupId)组合
|
||||
row[0] = "d" + groupId;
|
||||
// tag
|
||||
row[1] = groupId;
|
||||
// ts
|
||||
row[2] = ts + i;
|
||||
// current 电流
|
||||
row[3] = random.nextFloat();
|
||||
// voltage 电压
|
||||
row[4] = Math.random() > 0.5 ? 220 : 380;
|
||||
// phase 相位
|
||||
row[5] = random.nextInt(10);
|
||||
return row;
|
||||
}).collect(Collectors.toList());
|
||||
final String sql = "INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)";
|
||||
|
||||
// when
|
||||
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||
for (Object[] row : rows) {
|
||||
for (int i = 0; i < row.length; i++) {
|
||||
pstmt.setObject(i + 1, row[i]);
|
||||
}
|
||||
pstmt.addBatch();
|
||||
}
|
||||
pstmt.executeBatch();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
// then
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select * from meters");
|
||||
int count = 0;
|
||||
while (rs.next()) {
|
||||
count++;
|
||||
}
|
||||
Assert.assertEquals(10, count);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname);
|
||||
stmt.execute("use " + dbname);
|
||||
stmt.execute("create table meters(ts timestamp, current float, voltage int, phase int) tags(groupId int)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
try {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.close();
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -21,7 +21,6 @@ public class QueryDataTest {
|
|||
@Before
|
||||
public void createDatabase() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
|
@ -36,7 +35,7 @@ public class QueryDataTest {
|
|||
String createTableSql = "create table " + stbName + "(ts timestamp, name binary(64))";
|
||||
statement.executeUpdate(createTableSql);
|
||||
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +43,6 @@ public class QueryDataTest {
|
|||
@Test
|
||||
public void testQueryBinaryData() throws SQLException {
|
||||
String insertSql = "insert into " + stbName + " values(now, 'taosdata')";
|
||||
System.out.println(insertSql);
|
||||
statement.executeUpdate(insertSql);
|
||||
|
||||
String querySql = "select * from " + stbName;
|
||||
|
@ -52,7 +50,6 @@ public class QueryDataTest {
|
|||
|
||||
while (rs.next()) {
|
||||
String name = rs.getString(2);
|
||||
System.out.println("name = " + name);
|
||||
assertEquals("taosdata", name);
|
||||
}
|
||||
rs.close();
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class ResultSetMetaShouldNotBeNullRestfulTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String dbname = "td4745";
|
||||
|
||||
private Connection connection;
|
||||
|
||||
@Test
|
||||
public void testExecuteQuery() {
|
||||
// given
|
||||
ResultSetMetaData metaData = null;
|
||||
int columnCount = -1;
|
||||
|
||||
// when
|
||||
try {
|
||||
Statement statement = connection.createStatement();
|
||||
metaData = statement.executeQuery("select * from weather").getMetaData();
|
||||
columnCount = metaData.getColumnCount();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertNotNull(metaData);
|
||||
Assert.assertEquals(2, columnCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExecute() {
|
||||
// given
|
||||
ResultSetMetaData metaData = null;
|
||||
int columnCount = -1;
|
||||
boolean execute = false;
|
||||
// when
|
||||
try {
|
||||
Statement statement = connection.createStatement();
|
||||
execute = statement.execute("select * from weather");
|
||||
metaData = statement.getResultSet().getMetaData();
|
||||
columnCount = metaData.getColumnCount();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// then
|
||||
Assert.assertEquals(true, execute);
|
||||
Assert.assertNotNull(metaData);
|
||||
Assert.assertEquals(2, columnCount);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.execute("create database if not exists " + dbname);
|
||||
stmt.execute("use " + dbname);
|
||||
stmt.execute("create table weather (ts timestamp, temperature float)");
|
||||
stmt.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
try {
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.execute("drop database if exists " + dbname);
|
||||
stmt.close();
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -19,7 +19,6 @@ public class SelectTest {
|
|||
@Before
|
||||
public void createDatabaseAndTable() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
|
@ -31,8 +30,6 @@ public class SelectTest {
|
|||
stmt.execute("create database if not exists " + dbName);
|
||||
stmt.execute("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)");
|
||||
stmt.close();
|
||||
} catch (ClassNotFoundException e) {
|
||||
return;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -47,7 +44,6 @@ public class SelectTest {
|
|||
for (int i = 0; i < 50; i++) {
|
||||
ts++;
|
||||
int row = stmt.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")");
|
||||
System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")\t" + row);
|
||||
assertEquals(1, row);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ public class StableTest {
|
|||
@BeforeClass
|
||||
public static void createDatabase() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
|
@ -34,8 +33,6 @@ public class StableTest {
|
|||
statement.execute("create database if not exists " + dbName);
|
||||
statement.execute("use " + dbName);
|
||||
statement.close();
|
||||
} catch (ClassNotFoundException e) {
|
||||
return;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -68,9 +65,6 @@ public class StableTest {
|
|||
String sql = "describe " + stbName;
|
||||
ResultSet rs = stmt.executeQuery(sql);
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
|
||||
System.out.println(i + ":" + rs.getString(i));
|
||||
}
|
||||
num++;
|
||||
}
|
||||
rs.close();
|
||||
|
@ -86,9 +80,6 @@ public class StableTest {
|
|||
try (Statement stmt = connection.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("describe t1");
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
|
||||
System.out.printf("%d: %s\n", i, rs.getString(i));
|
||||
}
|
||||
num++;
|
||||
}
|
||||
rs.close();
|
||||
|
|
|
@ -1,105 +0,0 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
import com.taosdata.jdbc.TSDBConnection;
|
||||
import com.taosdata.jdbc.TSDBDriver;
|
||||
import com.taosdata.jdbc.TSDBResultSet;
|
||||
import com.taosdata.jdbc.TSDBSubscribe;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class TD4144Test {
|
||||
|
||||
private static TSDBConnection connection;
|
||||
private static final String host = "127.0.0.1";
|
||||
|
||||
private static final String topic = "topic-meter-current-bg-10";
|
||||
private static final String sql = "select * from meters where current > 10";
|
||||
private static final String sql2 = "select * from meters where ts >= '2020-08-15 12:20:00.000'";
|
||||
|
||||
|
||||
@Test
|
||||
public void test() throws SQLException {
|
||||
TSDBSubscribe subscribe = null;
|
||||
TSDBResultSet res = null;
|
||||
boolean hasNext = false;
|
||||
|
||||
try {
|
||||
subscribe = connection.subscribe(topic, sql, false);
|
||||
int count = 0;
|
||||
while (true) {
|
||||
// 等待1秒,避免频繁调用 consume,给服务端造成压力
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
if (res == null) {
|
||||
// 消费数据
|
||||
res = subscribe.consume();
|
||||
hasNext = res.next();
|
||||
}
|
||||
|
||||
if (res == null) {
|
||||
continue;
|
||||
}
|
||||
ResultSetMetaData metaData = res.getMetaData();
|
||||
int number = 0;
|
||||
while (hasNext) {
|
||||
int columnCount = metaData.getColumnCount();
|
||||
for (int i = 1; i <= columnCount; i++) {
|
||||
System.out.print(metaData.getColumnLabel(i) + ": " + res.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
count++;
|
||||
number++;
|
||||
hasNext = res.next();
|
||||
if (!hasNext) {
|
||||
res.close();
|
||||
res = null;
|
||||
System.out.println("rows: " + count);
|
||||
}
|
||||
if (hasNext == true && number >= 10) {
|
||||
System.out.println("batch" + number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (SQLException | InterruptedException throwables) {
|
||||
throwables.printStackTrace();
|
||||
} finally {
|
||||
if (subscribe != null)
|
||||
subscribe.close(true);
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() throws SQLException {
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
connection = (DriverManager.getConnection(url, properties)).unwrap(TSDBConnection.class);
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
stmt.execute("drop database if exists power");
|
||||
stmt.execute("create database if not exists power");
|
||||
stmt.execute("use power");
|
||||
stmt.execute("create table meters(ts timestamp, current float, voltage int, phase int) tags(location binary(64), groupId int)");
|
||||
stmt.execute("create table d1001 using meters tags(\"Beijing.Chaoyang\", 2)");
|
||||
stmt.execute("create table d1002 using meters tags(\"Beijing.Haidian\", 2)");
|
||||
stmt.execute("insert into d1001 values(\"2020-08-15 12:00:00.000\", 12, 220, 1),(\"2020-08-15 12:10:00.000\", 12.3, 220, 2),(\"2020-08-15 12:20:00.000\", 12.2, 220, 1)");
|
||||
stmt.execute("insert into d1002 values(\"2020-08-15 12:00:00.000\", 9.9, 220, 1),(\"2020-08-15 12:10:00.000\", 10.3, 220, 1),(\"2020-08-15 12:20:00.000\", 11.2, 220, 1)");
|
||||
}
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterClass() throws SQLException {
|
||||
if (connection != null)
|
||||
connection.close();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,570 @@
|
|||
package com.taosdata.jdbc.cases;
|
||||
|
||||
|
||||
import com.taosdata.jdbc.TSDBDriver;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Properties;
|
||||
import java.text.Format;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
public class TimestampPrecisionInNanoInJniTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String ns_timestamp_db = "ns_precision_test";
|
||||
private static final long timestamp1 = System.currentTimeMillis();
|
||||
private static final long timestamp2 = timestamp1 * 1000_000 + 123455;
|
||||
private static final long timestamp3 = (timestamp1 + 10) * 1000_000 + 123456;
|
||||
private static final Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
private static final String date1 = format.format(new Date(timestamp1));
|
||||
private static final String date4 = format.format(new Date(timestamp1 + 10l));
|
||||
private static final String date2 = date1 + "123455";
|
||||
private static final String date3 = date4 + "123456";
|
||||
|
||||
|
||||
private static Connection conn;
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() throws SQLException {
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
|
||||
String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
|
||||
conn = DriverManager.getConnection(url, properties);
|
||||
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + ns_timestamp_db);
|
||||
stmt.execute("create database if not exists " + ns_timestamp_db + " precision 'ns'");
|
||||
stmt.execute("create table " + ns_timestamp_db + ".weather(ts timestamp, ts2 timestamp, f1 int)");
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(\"" + date3 + "\", \"" + date3 + "\", 128)");
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(" + timestamp2 + "," + timestamp2 + ", 127)");
|
||||
stmt.close();
|
||||
}
|
||||
|
||||
@After
|
||||
public void afterEach() throws SQLException {
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists " + ns_timestamp_db);
|
||||
stmt.execute("create database if not exists " + ns_timestamp_db + " precision 'ns'");
|
||||
stmt.execute("create table " + ns_timestamp_db + ".weather(ts timestamp, ts2 timestamp, f1 int)");
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(\"" + date3 + "\", \"" + date3 + "\", 128)");
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(" + timestamp2 + "," + timestamp2 + ", 127)");
|
||||
stmt.close();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterClass() {
|
||||
try {
|
||||
if (conn != null)
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void checkCount(long count, ResultSet rs) throws SQLException {
|
||||
if (count == 0) {
|
||||
Assert.fail();
|
||||
}
|
||||
rs.next();
|
||||
long test_count = rs.getLong(1);
|
||||
Assert.assertEquals(count, test_count);
|
||||
}
|
||||
|
||||
private void checkTime(long ts, ResultSet rs) throws SQLException {
|
||||
rs.next();
|
||||
int nanos = rs.getTimestamp(1).getNanos();
|
||||
Assert.assertEquals(ts % 1000_000_000l, nanos);
|
||||
long test_ts = rs.getLong(1);
|
||||
Assert.assertEquals(ts / 1000_000l, test_ts);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canInsertTimestampAndQueryByEqualToInDateTypeInBothFirstAndSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts = '" + date3 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 = '" + date3 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canImportTimestampAndQueryByEqualToInDateTypeInBothFirstAndSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("import into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(\"" + date1 + "123123\", \"" + date1 + "123123\", 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + date1 + "123123'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts = '" + date1 + "123123'");
|
||||
checkTime(timestamp1 * 1000_000l + 123123l, rs);
|
||||
rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + date1 + "123123'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 = '" + date1 + "123123'");
|
||||
checkTime(timestamp1 * 1000_000l + 123123l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canInsertTimestampAndQueryByEqualToInNumberTypeInBothFirstAndSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts = '" + timestamp2 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 = '" + timestamp2 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canImportTimestampAndQueryByEqualToInNumberTypeInBothFirstAndSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
long timestamp4 = timestamp1 * 1000_000 + 123123;
|
||||
stmt.executeUpdate("import into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(" + timestamp4 + ", " + timestamp4 + ", 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + timestamp4 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts = '" + timestamp4 + "'");
|
||||
checkTime(timestamp4, rs);
|
||||
rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + timestamp4 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 = '" + timestamp4 + "'");
|
||||
checkTime(timestamp4, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canSelectLastRowFromWeatherForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select last(ts) from " + ns_timestamp_db + ".weather");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canSelectLastRowFromWeatherForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select last(ts2) from " + ns_timestamp_db + ".weather");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canSelectFirstRowFromWeatherForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select first(ts) from " + ns_timestamp_db + ".weather");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canSelectFirstRowFromWeatherForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select first(ts2) from " + ns_timestamp_db + ".weather");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanInDateTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts > '" + date2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts > '" + date2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 > '" + date2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 > '" + date2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanInNumberTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts > '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts > '" + timestamp2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 > '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 > '" + timestamp2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanOrEqualToInDateTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts >= '" + date2 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanOrEqualToInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 >= '" + date2 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanOrEqualToInNumberTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts >= '" + timestamp2 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLargerThanOrEqualToInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 >= '" + timestamp2 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanInDateTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts < '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts < '" + date3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 < '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 < '" + date3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanInNumberTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts < '" + timestamp3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts < '" + timestamp3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 < '" + timestamp3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 < '" + timestamp3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanOrEqualToInDateTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts <= '" + date3 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanOrEqualToInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <= '" + date3 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanOrEqualToInNumberTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts <= '" + timestamp3 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryLessThanOrEqualToInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <= '" + timestamp3 + "'");
|
||||
checkCount(2l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryBetweenAndInDateTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts <= '" + date3 + "' AND ts > '" + date2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts <= '" + date3 + "' AND ts > '" + date2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryBetweenAndInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <= '" + date3 + "' AND ts2 > '" + date2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 <= '" + date3 + "' AND ts2 > '" + date2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryBetweenAndInNumberTypeForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts <= '" + timestamp3 + "' AND ts > '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts from " + ns_timestamp_db + ".weather where ts <= '" + timestamp3 + "' AND ts > '" + timestamp2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryBetweenAndInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <= '" + timestamp3 + "' AND ts2 > '" + timestamp2 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 <= '" + timestamp3 + "' AND ts2 > '" + timestamp2 + "'");
|
||||
checkTime(timestamp3, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryNotEqualToInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <> '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 <> '" + date3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryNotEqualToInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 <> '" + timestamp3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 <> '" + timestamp3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryNotEqualInDateTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 != '" + date3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 != '" + date3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canQueryNotEqualInNumberTypeForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 != '" + timestamp3 + "'");
|
||||
checkCount(1l, rs);
|
||||
rs = stmt.executeQuery("select ts2 from " + ns_timestamp_db + ".weather where ts2 != '" + timestamp3 + "'");
|
||||
checkTime(timestamp2, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canInsertTimestampWithNowAndNsOffsetInBothFirstAndSecondCol(){
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(now + 1000b, now - 1000b, 128)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather");
|
||||
checkCount(3l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canIntervalAndSlidingAcceptNsUnitForFirstCol(){
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select sum(f1) from " + ns_timestamp_db + ".weather where ts >= '" + date2 + "' and ts <= '" + date3 + "' interval(10000000b) sliding(10000000b)");
|
||||
rs.next();
|
||||
long sum = rs.getLong(2);
|
||||
Assert.assertEquals(127l, sum);
|
||||
rs.next();
|
||||
sum = rs.getLong(2);
|
||||
Assert.assertEquals(128l, sum);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canIntervalAndSlidingAcceptNsUnitForSecondCol(){
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select sum(f1) from " + ns_timestamp_db + ".weather where ts2 >= '" + date2 + "' and ts <= '" + date3 + "' interval(10000000b) sliding(10000000b)");
|
||||
rs.next();
|
||||
long sum = rs.getLong(2);
|
||||
Assert.assertEquals(127l, sum);
|
||||
rs.next();
|
||||
sum = rs.getLong(2);
|
||||
Assert.assertEquals(128l, sum);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDataOutOfRangeExceptionForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(123456789012345678, 1234567890123456789, 127)");
|
||||
} catch (SQLException e) {
|
||||
Assert.assertEquals("TDengine ERROR (8000060b): Timestamp data out of range", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDataOutOfRangeExceptionForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values(1234567890123456789, 123456789012345678, 127)");
|
||||
} catch (SQLException e) {
|
||||
Assert.assertEquals("TDengine ERROR (8000060b): Timestamp data out of range", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void willAutomaticallyFillToNsUnitWithZerosForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values('" + date1 + "', '" + date1 + "', 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + date1 + "000000'");
|
||||
checkCount(1l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void willAutomaticallyFillToNsUnitWithZerosForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values('" + date1 + "', '" + date1 + "', 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + date1 + "000000'");
|
||||
checkCount(1l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void willAutomaticallyDropDigitExceedNsDigitNumberForFirstCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values('" + date1 + "999999999', '" + date1 + "999999999', 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts = '" + date1 + "999999'");
|
||||
checkCount(1l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void willAutomaticallyDropDigitExceedNsDigitNumberForSecondCol() {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("insert into " + ns_timestamp_db + ".weather(ts, ts2, f1) values('" + date1 + "999999999', '" + date1 + "999999999', 127)");
|
||||
ResultSet rs = stmt.executeQuery("select count(*) from " + ns_timestamp_db + ".weather where ts2 = '" + date1 + "999999'");
|
||||
checkCount(1l, rs);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@ import java.sql.*;
|
|||
import java.util.Properties;
|
||||
|
||||
public class RestfulDatabaseMetaDataTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static final String url = "jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata";
|
||||
private static Connection connection;
|
||||
|
@ -632,17 +633,32 @@ public class RestfulDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getTables() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
ResultSet tables = metaData.getTables("log", "", null, null);
|
||||
ResultSetMetaData metaData = tables.getMetaData();
|
||||
while (tables.next()) {
|
||||
System.out.print(metaData.getColumnLabel(1) + ":" + tables.getString(1) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(3) + ":" + tables.getString(3) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(4) + ":" + tables.getString(4) + "\t");
|
||||
System.out.print(metaData.getColumnLabel(5) + ":" + tables.getString(5) + "\n");
|
||||
ResultSet rs = metaData.getTables("log", "", null, null);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
Assert.assertNotNull(rs);
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_SCHEM
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertNotNull(rs.getString(3));
|
||||
Assert.assertNotNull(rs.getString("TABLE_NAME"));
|
||||
// TABLE_TYPE
|
||||
Assert.assertEquals("TABLE_TYPE", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("TABLE", rs.getString(4));
|
||||
Assert.assertEquals("TABLE", rs.getString("TABLE_TYPE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(5));
|
||||
Assert.assertEquals("", rs.getString(5));
|
||||
Assert.assertEquals("", rs.getString("REMARKS"));
|
||||
}
|
||||
System.out.println();
|
||||
Assert.assertNotNull(tables);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -652,46 +668,130 @@ public class RestfulDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getCatalogs() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet catalogs = metaData.getCatalogs();
|
||||
ResultSetMetaData meta = catalogs.getMetaData();
|
||||
while (catalogs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + catalogs.getString(i));
|
||||
}
|
||||
System.out.println();
|
||||
ResultSet rs = metaData.getCatalogs();
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertNotNull(rs.getString(1));
|
||||
Assert.assertNotNull(rs.getString("TABLE_CAT"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTableTypes() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet tableTypes = metaData.getTableTypes();
|
||||
while (tableTypes.next()) {
|
||||
System.out.println(tableTypes.getString("TABLE_TYPE"));
|
||||
tableTypes.next();
|
||||
// tableTypes: table
|
||||
{
|
||||
Assert.assertEquals("TABLE", tableTypes.getString(1));
|
||||
Assert.assertEquals("TABLE", tableTypes.getString("TABLE_TYPE"));
|
||||
}
|
||||
tableTypes.next();
|
||||
// tableTypes: stable
|
||||
{
|
||||
Assert.assertEquals("STABLE", tableTypes.getString(1));
|
||||
Assert.assertEquals("STABLE", tableTypes.getString("TABLE_TYPE"));
|
||||
}
|
||||
Assert.assertNotNull(metaData.getTableTypes());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getColumns() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
// when
|
||||
ResultSet columns = metaData.getColumns("log", "", "dn", "");
|
||||
// then
|
||||
ResultSetMetaData meta = columns.getMetaData();
|
||||
while (columns.next()) {
|
||||
System.out.print(meta.getColumnLabel(1) + ": " + columns.getString(1) + "\t");
|
||||
System.out.print(meta.getColumnLabel(3) + ": " + columns.getString(3) + "\t");
|
||||
System.out.print(meta.getColumnLabel(4) + ": " + columns.getString(4) + "\t");
|
||||
System.out.print(meta.getColumnLabel(5) + ": " + columns.getString(5) + "\t");
|
||||
System.out.print(meta.getColumnLabel(6) + ": " + columns.getString(6) + "\t");
|
||||
System.out.print(meta.getColumnLabel(7) + ": " + columns.getString(7) + "\t");
|
||||
System.out.print(meta.getColumnLabel(9) + ": " + columns.getString(9) + "\t");
|
||||
System.out.print(meta.getColumnLabel(10) + ": " + columns.getString(10) + "\t");
|
||||
System.out.print(meta.getColumnLabel(11) + ": " + columns.getString(11) + "\n");
|
||||
System.out.print(meta.getColumnLabel(12) + ": " + columns.getString(12) + "\n");
|
||||
columns.next();
|
||||
// column: 1
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", columns.getString(1));
|
||||
Assert.assertEquals("log", columns.getString("TABLE_CAT"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn", columns.getString(3));
|
||||
Assert.assertEquals("dn", columns.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("ts", columns.getString(4));
|
||||
Assert.assertEquals("ts", columns.getString("COLUMN_NAME"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("DATA_TYPE", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(Types.TIMESTAMP, columns.getInt(5));
|
||||
Assert.assertEquals(Types.TIMESTAMP, columns.getInt("DATA_TYPE"));
|
||||
// TYPE_NAME
|
||||
Assert.assertEquals("TYPE_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("TIMESTAMP", columns.getString(6));
|
||||
Assert.assertEquals("TIMESTAMP", columns.getString("TYPE_NAME"));
|
||||
// COLUMN_SIZE
|
||||
Assert.assertEquals("COLUMN_SIZE", meta.getColumnLabel(7));
|
||||
Assert.assertEquals(26, columns.getInt(7));
|
||||
Assert.assertEquals(26, columns.getInt("COLUMN_SIZE"));
|
||||
// DECIMAL_DIGITS
|
||||
Assert.assertEquals("DECIMAL_DIGITS", meta.getColumnLabel(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt("DECIMAL_DIGITS"));
|
||||
Assert.assertEquals(null, columns.getString(9));
|
||||
Assert.assertEquals(null, columns.getString("DECIMAL_DIGITS"));
|
||||
// NUM_PREC_RADIX
|
||||
Assert.assertEquals("NUM_PREC_RADIX", meta.getColumnLabel(10));
|
||||
Assert.assertEquals(10, columns.getInt(10));
|
||||
Assert.assertEquals(10, columns.getInt("NUM_PREC_RADIX"));
|
||||
// NULLABLE
|
||||
Assert.assertEquals("NULLABLE", meta.getColumnLabel(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNoNulls, columns.getInt(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNoNulls, columns.getInt("NULLABLE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(12));
|
||||
Assert.assertEquals(null, columns.getString(12));
|
||||
Assert.assertEquals(null, columns.getString("REMARKS"));
|
||||
}
|
||||
columns.next();
|
||||
// column: 2
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", columns.getString(1));
|
||||
Assert.assertEquals("log", columns.getString("TABLE_CAT"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn", columns.getString(3));
|
||||
Assert.assertEquals("dn", columns.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("cpu_taosd", columns.getString(4));
|
||||
Assert.assertEquals("cpu_taosd", columns.getString("COLUMN_NAME"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("DATA_TYPE", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(Types.FLOAT, columns.getInt(5));
|
||||
Assert.assertEquals(Types.FLOAT, columns.getInt("DATA_TYPE"));
|
||||
// TYPE_NAME
|
||||
Assert.assertEquals("TYPE_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("FLOAT", columns.getString(6));
|
||||
Assert.assertEquals("FLOAT", columns.getString("TYPE_NAME"));
|
||||
// COLUMN_SIZE
|
||||
Assert.assertEquals("COLUMN_SIZE", meta.getColumnLabel(7));
|
||||
Assert.assertEquals(12, columns.getInt(7));
|
||||
Assert.assertEquals(12, columns.getInt("COLUMN_SIZE"));
|
||||
// DECIMAL_DIGITS
|
||||
Assert.assertEquals("DECIMAL_DIGITS", meta.getColumnLabel(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt(9));
|
||||
Assert.assertEquals(Integer.MIN_VALUE, columns.getInt("DECIMAL_DIGITS"));
|
||||
Assert.assertEquals(null, columns.getString(9));
|
||||
Assert.assertEquals(null, columns.getString("DECIMAL_DIGITS"));
|
||||
// NUM_PREC_RADIX
|
||||
Assert.assertEquals("NUM_PREC_RADIX", meta.getColumnLabel(10));
|
||||
Assert.assertEquals(10, columns.getInt(10));
|
||||
Assert.assertEquals(10, columns.getInt("NUM_PREC_RADIX"));
|
||||
// NULLABLE
|
||||
Assert.assertEquals("NULLABLE", meta.getColumnLabel(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNullable, columns.getInt(11));
|
||||
Assert.assertEquals(DatabaseMetaData.columnNullable, columns.getInt("NULLABLE"));
|
||||
// REMARKS
|
||||
Assert.assertEquals("REMARKS", meta.getColumnLabel(12));
|
||||
Assert.assertEquals(null, columns.getString(12));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -717,17 +817,35 @@ public class RestfulDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getPrimaryKeys() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet rs = metaData.getPrimaryKeys("log", "", "dn1");
|
||||
while (rs.next()) {
|
||||
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
|
||||
System.out.println("COLUMN_NAME: " + rs.getString("COLUMN_NAME"));
|
||||
System.out.println("KEY_SEQ: " + rs.getString("KEY_SEQ"));
|
||||
System.out.println("PK_NAME: " + rs.getString("PK_NAME"));
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_SCHEM
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_NAME
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn1", rs.getString(3));
|
||||
Assert.assertEquals("dn1", rs.getString("TABLE_NAME"));
|
||||
// COLUMN_NAME
|
||||
Assert.assertEquals("COLUMN_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("ts", rs.getString(4));
|
||||
Assert.assertEquals("ts", rs.getString("COLUMN_NAME"));
|
||||
// KEY_SEQ
|
||||
Assert.assertEquals("KEY_SEQ", meta.getColumnLabel(5));
|
||||
Assert.assertEquals(1, rs.getShort(5));
|
||||
Assert.assertEquals(1, rs.getShort("KEY_SEQ"));
|
||||
// DATA_TYPE
|
||||
Assert.assertEquals("PK_NAME", meta.getColumnLabel(6));
|
||||
Assert.assertEquals("ts", rs.getString(6));
|
||||
Assert.assertEquals("ts", rs.getString("PK_NAME"));
|
||||
}
|
||||
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -852,14 +970,27 @@ public class RestfulDatabaseMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getSuperTables() throws SQLException {
|
||||
System.out.println("****************************************************");
|
||||
|
||||
ResultSet rs = metaData.getSuperTables("log", "", "dn1");
|
||||
while (rs.next()) {
|
||||
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
|
||||
System.out.println("SUPERTABLE_NAME: " + rs.getString("SUPERTABLE_NAME"));
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
rs.next();
|
||||
{
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_CAT", meta.getColumnLabel(1));
|
||||
Assert.assertEquals("log", rs.getString(1));
|
||||
Assert.assertEquals("log", rs.getString("TABLE_CAT"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_SCHEM", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(null, rs.getString(2));
|
||||
Assert.assertEquals(null, rs.getString("TABLE_SCHEM"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("TABLE_NAME", meta.getColumnLabel(3));
|
||||
Assert.assertEquals("dn1", rs.getString(3));
|
||||
Assert.assertEquals("dn1", rs.getString("TABLE_NAME"));
|
||||
// TABLE_CAT
|
||||
Assert.assertEquals("SUPERTABLE_NAME", meta.getColumnLabel(4));
|
||||
Assert.assertEquals("dn", rs.getString(4));
|
||||
Assert.assertEquals("dn", rs.getString("SUPERTABLE_NAME"));
|
||||
}
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -8,11 +8,6 @@ import java.sql.*;
|
|||
public class RestfulDriverTest {
|
||||
private static final String host = "127.0.0.1";
|
||||
|
||||
@Test
|
||||
public void connect() {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void acceptsURL() throws SQLException {
|
||||
Driver driver = new RestfulDriver();
|
||||
|
@ -27,9 +22,7 @@ public class RestfulDriverTest {
|
|||
Driver driver = new RestfulDriver();
|
||||
final String url = "";
|
||||
DriverPropertyInfo[] propertyInfo = driver.getPropertyInfo(url, null);
|
||||
for (DriverPropertyInfo prop : propertyInfo) {
|
||||
System.out.println(prop);
|
||||
}
|
||||
Assert.assertNotNull(propertyInfo);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -10,132 +10,151 @@ import java.util.Random;
|
|||
public class RestfulJDBCTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static Connection connection;
|
||||
private Random random = new Random(System.currentTimeMillis());
|
||||
private final Random random = new Random(System.currentTimeMillis());
|
||||
private Connection connection;
|
||||
|
||||
/**
|
||||
* select * from log.log
|
||||
**/
|
||||
@Test
|
||||
public void testCase001() {
|
||||
try {
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet resultSet = statement.executeQuery("select * from log.log");
|
||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||
while (resultSet.next()) {
|
||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||
String column = metaData.getColumnLabel(i);
|
||||
String value = resultSet.getString(i);
|
||||
System.out.print(column + ":" + value + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
statement.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// given
|
||||
String sql = "drop database if exists restful_test";
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
|
||||
// given
|
||||
sql = "create database if not exists restful_test";
|
||||
// when
|
||||
execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
|
||||
// given
|
||||
sql = "use restful_test";
|
||||
// when
|
||||
execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
/**
|
||||
* create database
|
||||
*/
|
||||
@Test
|
||||
public void testCase002() {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
stmt.execute("drop database if exists restful_test");
|
||||
stmt.execute("create database if not exists restful_test");
|
||||
stmt.execute("use restful_test");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create super table
|
||||
***/
|
||||
@Test
|
||||
public void testCase003() {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
stmt.execute("create table weather(ts timestamp, temperature float, humidity int) tags(location nchar(64), groupId int)");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// given
|
||||
String sql = "create table weather(ts timestamp, temperature float, humidity int) tags(location nchar(64), groupId int)";
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase004() {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
for (int i = 1; i <= 100; i++) {
|
||||
stmt.execute("create table t" + i + " using weather tags('beijing', '" + i + "')");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
for (int i = 1; i <= 100; i++) {
|
||||
// given
|
||||
String sql = "create table t" + i + " using weather tags('beijing', '" + i + "')";
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testCase005() {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
int rows = 0;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
for (int j = 1; j <= 100; j++) {
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
int affectRows = stmt.executeUpdate("insert into t" + j + " values(" + currentTimeMillis + "," + (random.nextFloat() * 50) + "," + random.nextInt(100) + ")");
|
||||
Assert.assertEquals(1, affectRows);
|
||||
rows += affectRows;
|
||||
}
|
||||
int rows = 0;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
for (int j = 1; j <= 100; j++) {
|
||||
|
||||
// given
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
String sql = "insert into t" + j + " values(" + currentTimeMillis + "," + (random.nextFloat() * 50) + "," + random.nextInt(100) + ")";
|
||||
// when
|
||||
int affectRows = executeUpdate(connection, sql);
|
||||
// then
|
||||
Assert.assertEquals(1, affectRows);
|
||||
|
||||
rows += affectRows;
|
||||
}
|
||||
Assert.assertEquals(1000, rows);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Assert.assertEquals(1000, rows);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase006() {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||
while (rs.next()) {
|
||||
System.out.print("ts: " + rs.getTimestamp("ts"));
|
||||
System.out.print(", temperature: " + rs.getString("temperature"));
|
||||
System.out.print(", humidity: " + rs.getString("humidity"));
|
||||
System.out.println(", location: " + rs.getString("location"));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
public void testCase006() throws SQLException {
|
||||
// given
|
||||
String sql = "select * from weather";
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
|
||||
// then
|
||||
Assert.assertEquals(5, meta.getColumnCount());
|
||||
|
||||
while (rs.next()) {
|
||||
Assert.assertNotNull(rs.getTimestamp("ts"));
|
||||
Assert.assertNotNull(rs.getFloat("temperature"));
|
||||
Assert.assertNotNull(rs.getInt("humidity"));
|
||||
Assert.assertNotNull(rs.getString("location"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase007() {
|
||||
// given
|
||||
String sql = "drop database restful_test";
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
private int executeUpdate(Connection connection, String sql) {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
int columnCount = meta.getColumnCount();
|
||||
for (int i = 1; i <= columnCount; i++) {
|
||||
String columnLabel = meta.getColumnLabel(i);
|
||||
String value = rs.getString(i);
|
||||
System.out.print(columnLabel + ": " + value + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
return stmt.executeUpdate(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private boolean execute(Connection connection, String sql) {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
return stmt.execute(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
private ResultSet executeQuery(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
return statement.executeQuery(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
try {
|
||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void before() throws ClassNotFoundException, SQLException {
|
||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void after() throws SQLException {
|
||||
if (connection != null)
|
||||
connection.close();
|
||||
@After
|
||||
public void after() {
|
||||
try {
|
||||
if (connection != null)
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -54,16 +54,17 @@ public class RestfulParameterMetaDataTest {
|
|||
|
||||
@Test
|
||||
public void getPrecision() throws SQLException {
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(1));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(2));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(3));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(4));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(5));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(6));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(7));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getPrecision(8));
|
||||
Assert.assertEquals(5, parameterMetaData_insert.getPrecision(9));
|
||||
Assert.assertEquals(5, parameterMetaData_insert.getPrecision(10));
|
||||
//create table weather(ts timestamp, f1 int, f2 bigint, f3 float, f4 double, f5 smallint, f6 tinyint, f7 bool, f8 binary(64), f9 nchar(64))
|
||||
Assert.assertEquals(TSDBConstants.TIMESTAMP_MS_PRECISION, parameterMetaData_insert.getPrecision(1));
|
||||
Assert.assertEquals(TSDBConstants.INT_PRECISION, parameterMetaData_insert.getPrecision(2));
|
||||
Assert.assertEquals(TSDBConstants.BIGINT_PRECISION, parameterMetaData_insert.getPrecision(3));
|
||||
Assert.assertEquals(TSDBConstants.FLOAT_PRECISION, parameterMetaData_insert.getPrecision(4));
|
||||
Assert.assertEquals(TSDBConstants.DOUBLE_PRECISION, parameterMetaData_insert.getPrecision(5));
|
||||
Assert.assertEquals(TSDBConstants.SMALLINT_PRECISION, parameterMetaData_insert.getPrecision(6));
|
||||
Assert.assertEquals(TSDBConstants.TINYINT_PRECISION, parameterMetaData_insert.getPrecision(7));
|
||||
Assert.assertEquals(TSDBConstants.BOOLEAN_PRECISION, parameterMetaData_insert.getPrecision(8));
|
||||
Assert.assertEquals("hello".getBytes().length, parameterMetaData_insert.getPrecision(9));
|
||||
Assert.assertEquals("涛思数据".length(), parameterMetaData_insert.getPrecision(10));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -71,8 +72,8 @@ public class RestfulParameterMetaDataTest {
|
|||
Assert.assertEquals(0, parameterMetaData_insert.getScale(1));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(2));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(3));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(4));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(5));
|
||||
Assert.assertEquals(31, parameterMetaData_insert.getScale(4));
|
||||
Assert.assertEquals(31, parameterMetaData_insert.getScale(5));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(6));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(7));
|
||||
Assert.assertEquals(0, parameterMetaData_insert.getScale(8));
|
||||
|
@ -164,7 +165,7 @@ public class RestfulParameterMetaDataTest {
|
|||
pstmt_insert.setObject(7, Byte.MAX_VALUE);
|
||||
pstmt_insert.setObject(8, true);
|
||||
pstmt_insert.setObject(9, "hello".getBytes());
|
||||
pstmt_insert.setObject(10, "Hello");
|
||||
pstmt_insert.setObject(10, "涛思数据");
|
||||
parameterMetaData_insert = pstmt_insert.getParameterMetaData();
|
||||
|
||||
pstmt_select = conn.prepareStatement(sql_select);
|
||||
|
|
|
@ -27,12 +27,9 @@ public class RestfulPreparedStatementTest {
|
|||
ResultSet rs = pstmt_select.executeQuery();
|
||||
Assert.assertNotNull(rs);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
int columnCount = meta.getColumnCount();
|
||||
Assert.assertEquals(10, columnCount);
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -373,18 +370,19 @@ public class RestfulPreparedStatementTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.execute("drop database if exists test_pstmt");
|
||||
stmt.execute("create database if not exists test_pstmt");
|
||||
stmt.execute("use test_pstmt");
|
||||
stmt.execute("create table weather(ts timestamp, f1 int, f2 bigint, f3 float, f4 double, f5 smallint, f6 tinyint, f7 bool, f8 binary(64), f9 nchar(64)) tags(loc nchar(64))");
|
||||
stmt.execute("create table t1 using weather tags('beijing')");
|
||||
}
|
||||
|
||||
Statement stmt = conn.createStatement();
|
||||
stmt.execute("drop database if exists test_pstmt");
|
||||
stmt.execute("create database if not exists test_pstmt");
|
||||
stmt.execute("use test_pstmt");
|
||||
stmt.execute("create table weather(ts timestamp, f1 int, f2 bigint, f3 float, f4 double, f5 smallint, f6 tinyint, f7 bool, f8 binary(64), f9 nchar(64)) tags(loc nchar(64))");
|
||||
stmt.execute("create table t1 using weather tags('beijing')");
|
||||
stmt.close();
|
||||
|
||||
pstmt_insert = conn.prepareStatement(sql_insert);
|
||||
pstmt_select = conn.prepareStatement(sql_select);
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import java.util.UUID;
|
|||
|
||||
public class RestfulStatementTest {
|
||||
private static final String host = "127.0.0.1";
|
||||
|
||||
private static Connection conn;
|
||||
private static Statement stmt;
|
||||
|
||||
|
@ -21,11 +22,11 @@ public class RestfulStatementTest {
|
|||
ResultSet rs = stmt.executeQuery("show databases");
|
||||
Assert.assertNotNull(rs);
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
int columnCount = meta.getColumnCount();
|
||||
Assert.assertTrue(columnCount > 1);
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
Assert.assertEquals("name", meta.getColumnLabel(1));
|
||||
Assert.assertNotNull(rs.getString("name"));
|
||||
}
|
||||
rs.close();
|
||||
} catch (SQLException e) {
|
||||
|
@ -174,10 +175,10 @@ public class RestfulStatementTest {
|
|||
Assert.assertEquals(3, meta.getColumnCount());
|
||||
int count = 0;
|
||||
while (rs.next()) {
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||
}
|
||||
System.out.println();
|
||||
Assert.assertEquals("ts", meta.getColumnLabel(1));
|
||||
Assert.assertNotNull(rs.getTimestamp(1));
|
||||
Assert.assertEquals("temperature", meta.getColumnLabel(2));
|
||||
Assert.assertEquals(22.33, rs.getFloat(2), 0.001f);
|
||||
count++;
|
||||
}
|
||||
Assert.assertEquals(1, count);
|
||||
|
@ -388,15 +389,12 @@ public class RestfulStatementTest {
|
|||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
try {
|
||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata", properties);
|
||||
stmt = conn.createStatement();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -1,342 +1,586 @@
|
|||
package com.taosdata.jdbc.rs;
|
||||
|
||||
import com.taosdata.jdbc.utils.SQLExecutor;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.*;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class SQLTest {
|
||||
|
||||
private static final String host = "127.0.0.1";
|
||||
private static Connection connection;
|
||||
|
||||
@Test
|
||||
public void testCase001() {
|
||||
// given
|
||||
String sql = "create database if not exists restful_test";
|
||||
SQLExecutor.execute(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase002() {
|
||||
// given
|
||||
String sql = "use restful_test";
|
||||
SQLExecutor.execute(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase003() {
|
||||
// given
|
||||
String sql = "show databases";
|
||||
SQLExecutor.executeWithResult(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase004() {
|
||||
// given
|
||||
String sql = "show tables";
|
||||
SQLExecutor.executeWithResult(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase005() {
|
||||
// given
|
||||
String sql = "show stables";
|
||||
SQLExecutor.executeWithResult(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase006() {
|
||||
// given
|
||||
String sql = "show dnodes";
|
||||
SQLExecutor.executeWithResult(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase007() {
|
||||
// given
|
||||
String sql = "show vgroups";
|
||||
SQLExecutor.executeWithResult(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase008() {
|
||||
// given
|
||||
String sql = "drop table if exists restful_test.weather";
|
||||
SQLExecutor.execute(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase009() {
|
||||
// given
|
||||
String sql = "create table if not exists restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))";
|
||||
SQLExecutor.execute(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase010() {
|
||||
// given
|
||||
String sql = "create table t1 using restful_test.weather tags('北京')";
|
||||
SQLExecutor.execute(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase011() {
|
||||
// given
|
||||
String sql = "insert into restful_test.t1 values(now, 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase012() {
|
||||
// given
|
||||
String sql = "insert into restful_test.t1 values('2020-01-01 00:00:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase013() {
|
||||
// given
|
||||
String sql = "insert into restful_test.t1 values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase014() {
|
||||
// given
|
||||
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:03:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase015() {
|
||||
// given
|
||||
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase016() {
|
||||
// given
|
||||
String sql = "insert into t1 values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t2 values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase017() {
|
||||
// given
|
||||
String sql = "Insert into t3 using weather tags('广东') values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t4 using weather tags('天津') values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
|
||||
// then
|
||||
Assert.assertFalse(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase018() {
|
||||
// given
|
||||
String sql = "select * from restful_test.t1";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase019() {
|
||||
// given
|
||||
String sql = "select * from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase020() {
|
||||
// given
|
||||
String sql = "select ts, temperature from restful_test.t1";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase021() {
|
||||
// given
|
||||
String sql = "select ts, temperature from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase022() {
|
||||
// given
|
||||
String sql = "select temperature, ts from restful_test.t1";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase023() {
|
||||
// given
|
||||
String sql = "select temperature, ts from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
boolean execute = execute(connection, sql);
|
||||
// then
|
||||
Assert.assertTrue(execute);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase024() {
|
||||
// given
|
||||
String sql = "import into restful_test.t5 using weather tags('石家庄') values('2020-01-01 00:01:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
// when
|
||||
int affectedRows = executeUpdate(connection, sql);
|
||||
// then
|
||||
Assert.assertEquals(1, affectedRows);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase025() {
|
||||
// given
|
||||
String sql = "import into restful_test.t6 using weather tags('沈阳') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
// when
|
||||
int affectedRows = executeUpdate(connection, sql);
|
||||
// then
|
||||
Assert.assertEquals(2, affectedRows);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase026() {
|
||||
// given
|
||||
String sql = "import into restful_test.t7 using weather tags('长沙') values('2020-01-01 00:01:00.000', 22.22) restful_test.t8 using weather tags('吉林') values('2020-01-01 00:01:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
|
||||
// when
|
||||
int affectedRows = executeUpdate(connection, sql);
|
||||
// then
|
||||
Assert.assertEquals(2, affectedRows);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase027() {
|
||||
// given
|
||||
String sql = "import into restful_test.t9 using weather tags('武汉') values('2020-01-01 00:01:00.000', 22.22) ,('2020-01-02 00:01:00.000', 22.22) restful_test.t10 using weather tags('哈尔滨') values('2020-01-01 00:01:00.000', 22.22),('2020-01-02 00:01:00.000', 22.22)";
|
||||
SQLExecutor.executeUpdate(connection, sql);
|
||||
// when
|
||||
int affectedRows = executeUpdate(connection, sql);
|
||||
// then
|
||||
Assert.assertEquals(4, affectedRows);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase028() {
|
||||
// given
|
||||
String sql = "select location, temperature, ts from restful_test.weather where temperature > 1";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase029() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where temperature < 1";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase030() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where ts > now";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase031() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where ts < now";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase032() {
|
||||
String sql = "select count(*) from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase033() {
|
||||
String sql = "select first(*) from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase034() {
|
||||
String sql = "select last(*) from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase035() {
|
||||
String sql = "select last_row(*) from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase036() {
|
||||
String sql = "select ts, ts as primary_key from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testCase037() {
|
||||
String sql = "select database()";
|
||||
SQLExecutor.execute(connection, "use restful_test");
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase038() {
|
||||
String sql = "select client_version()";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase039() {
|
||||
String sql = "select server_status()";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase040() {
|
||||
String sql = "select server_status() as status";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase041() {
|
||||
String sql = "select tbname, location from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase042() {
|
||||
String sql = "select count(tbname) from restful_test.weather";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase043() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase044() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h and location like '%'";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase045() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h order by ts";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase046() {
|
||||
String sql = "select last(*) from restful_test.weather where ts < now - 1h group by tbname order by tbname";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase047() {
|
||||
String sql = "select * from restful_test.weather limit 2";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase048() {
|
||||
String sql = "select * from restful_test.weather limit 2 offset 5";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase049() {
|
||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts ";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase050() {
|
||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts and t1.location = t3.location";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase051() {
|
||||
String sql = "select * from restful_test.t1 tt, restful_test.t3 yy where tt.ts = yy.ts";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase052() {
|
||||
String sql = "select server_status()";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase053() {
|
||||
String sql = "select avg(cpu_taosd), avg(cpu_system), max(cpu_cores), avg(mem_taosd), avg(mem_system), max(mem_total), avg(disk_used), max(disk_total), avg(band_speed), avg(io_read), avg(io_write), sum(req_http), sum(req_select), sum(req_insert) from log.dn1 where ts> now - 60m and ts<= now interval(1m) fill(value, 0)";
|
||||
SQLExecutor.executeQuery(connection, sql);
|
||||
// when
|
||||
ResultSet rs = executeQuery(connection, sql);
|
||||
// then
|
||||
Assert.assertNotNull(rs);
|
||||
}
|
||||
|
||||
private boolean execute(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
return statement.execute(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private ResultSet executeQuery(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
return statement.executeQuery(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private int executeUpdate(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
return statement.executeUpdate(sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void before() throws ClassNotFoundException, SQLException {
|
||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||
public static void before() throws SQLException {
|
||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
|
||||
}
|
||||
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
package com.taosdata.jdbc.utils;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class SQLExecutor {
|
||||
|
||||
// insert, import
|
||||
public static void executeUpdate(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
long start = System.currentTimeMillis();
|
||||
int affectedRows = statement.executeUpdate(sql);
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println("[ affected rows : " + affectedRows + " ] time cost: " + (end - start) + " ms, execute statement ====> " + sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// show databases, show tables, show stables
|
||||
public static void executeWithResult(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.execute(sql);
|
||||
ResultSet resultSet = statement.getResultSet();
|
||||
printResult(resultSet);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// use database, create database, create table, drop table...
|
||||
public static void execute(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
long start = System.currentTimeMillis();
|
||||
boolean execute = statement.execute(sql);
|
||||
long end = System.currentTimeMillis();
|
||||
printSql(sql, execute, (end - start));
|
||||
} catch (SQLException e) {
|
||||
System.out.println("ERROR execute SQL ===> " + sql);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// select
|
||||
public static void executeQuery(Connection connection, String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
long start = System.currentTimeMillis();
|
||||
ResultSet resultSet = statement.executeQuery(sql);
|
||||
long end = System.currentTimeMillis();
|
||||
printSql(sql, true, (end - start));
|
||||
printResult(resultSet);
|
||||
} catch (SQLException e) {
|
||||
System.out.println("ERROR execute SQL ===> " + sql);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void printSql(String sql, boolean succeed, long cost) {
|
||||
System.out.println("[ " + (succeed ? "OK" : "ERROR!") + " ] time cost: " + cost + " ms, execute statement ====> " + sql);
|
||||
}
|
||||
|
||||
private static void printResult(ResultSet resultSet) throws SQLException {
|
||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||
while (resultSet.next()) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||
String columnLabel = metaData.getColumnLabel(i);
|
||||
String value = resultSet.getString(i);
|
||||
sb.append(columnLabel + ": " + value + "\t");
|
||||
}
|
||||
System.out.println(sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -3,22 +3,98 @@ package com.taosdata.jdbc.utils;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class UtilsTest {
|
||||
|
||||
@Test
|
||||
public void escapeSingleQuota() {
|
||||
// given
|
||||
String s = "'''''a\\'";
|
||||
// when
|
||||
String news = Utils.escapeSingleQuota(s);
|
||||
// then
|
||||
Assert.assertEquals("\\'\\'\\'\\'\\'a\\'", news);
|
||||
|
||||
// given
|
||||
s = "\'''''a\\'";
|
||||
// when
|
||||
news = Utils.escapeSingleQuota(s);
|
||||
// then
|
||||
Assert.assertEquals("\\'\\'\\'\\'\\'a\\'", news);
|
||||
|
||||
// given
|
||||
s = "\'\'\'\''a\\'";
|
||||
// when
|
||||
news = Utils.escapeSingleQuota(s);
|
||||
// then
|
||||
Assert.assertEquals("\\'\\'\\'\\'\\'a\\'", news);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNativeSqlReplaceQuestionMarks() {
|
||||
// given
|
||||
String nativeSql = "insert into ?.? (ts, temperature, humidity) using ?.? tags(?,?) values(now, ?, ?)";
|
||||
Object[] parameters = Stream.of("test", "t1", "test", "weather", "beijing", 1, 12.2, 4).toArray();
|
||||
|
||||
// when
|
||||
String actual = Utils.getNativeSql(nativeSql, parameters);
|
||||
|
||||
// then
|
||||
String expected = "insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)";
|
||||
Assert.assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNativeSqlReplaceQuestionMarks2() {
|
||||
// given
|
||||
String nativeSql = "INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)";
|
||||
Object[] parameters = Stream.of("d1", 1, 123, 3.14, 220, 4).toArray();
|
||||
|
||||
// when
|
||||
String actual = Utils.getNativeSql(nativeSql, parameters);
|
||||
|
||||
// then
|
||||
String expected = "INSERT INTO d1 (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (1) VALUES (123,3.14,220,4)";
|
||||
Assert.assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getNativeSqlReplaceNothing() {
|
||||
// given
|
||||
String nativeSql = "insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)";
|
||||
|
||||
// when
|
||||
String actual = Utils.getNativeSql(nativeSql, null);
|
||||
|
||||
// then
|
||||
Assert.assertEquals(nativeSql, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNativeSqlReplaceNothing2() {
|
||||
// given
|
||||
String nativeSql = "insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)";
|
||||
Object[] parameters = Stream.of("test", "t1", "test", "weather", "beijing", 1, 12.2, 4).toArray();
|
||||
|
||||
// when
|
||||
String actual = Utils.getNativeSql(nativeSql, parameters);
|
||||
|
||||
// then
|
||||
Assert.assertEquals(nativeSql, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNativeSqlReplaceNothing3() {
|
||||
// given
|
||||
String nativeSql = "insert into ?.? (ts, temperature, humidity) using ?.? tags(?,?) values(now, ?, ?)";
|
||||
|
||||
// when
|
||||
String actual = Utils.getNativeSql(nativeSql, null);
|
||||
|
||||
// then
|
||||
Assert.assertEquals(nativeSql, actual);
|
||||
|
||||
}
|
||||
}
|
|
@ -126,28 +126,18 @@ function convertDouble(data, num_of_rows, nbytes = 0, offset = 0, micro = false)
|
|||
}
|
||||
return res;
|
||||
}
|
||||
function convertBinary(data, num_of_rows, nbytes = 0, offset = 0, micro = false) {
|
||||
data = ref.reinterpret(data.deref(), nbytes * num_of_rows, offset);
|
||||
let res = [];
|
||||
let currOffset = 0;
|
||||
while (currOffset < data.length) {
|
||||
let dataEntry = data.slice(currOffset, currOffset + nbytes);
|
||||
if (dataEntry[0] == FieldTypes.C_BINARY_NULL) {
|
||||
res.push(null);
|
||||
}
|
||||
else {
|
||||
res.push(ref.readCString(dataEntry));
|
||||
}
|
||||
currOffset += nbytes;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
function convertNchar(data, num_of_rows, nbytes = 0, offset = 0, micro = false) {
|
||||
data = ref.reinterpret(data.deref(), nbytes * num_of_rows, offset);
|
||||
let res = [];
|
||||
let dataEntry = data.slice(0, nbytes); //one entry in a row under a column;
|
||||
//TODO: should use the correct character encoding
|
||||
res.push(dataEntry.toString("utf-8"));
|
||||
|
||||
let currOffset = 0;
|
||||
while (currOffset < data.length) {
|
||||
let len = data.readIntLE(currOffset, 2);
|
||||
let dataEntry = data.slice(currOffset + 2, currOffset + len + 2); //one entry in a row under a column;
|
||||
res.push(dataEntry.toString("utf-8"));
|
||||
currOffset += nbytes;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -160,7 +150,7 @@ let convertFunctions = {
|
|||
[FieldTypes.C_BIGINT]: convertBigint,
|
||||
[FieldTypes.C_FLOAT]: convertFloat,
|
||||
[FieldTypes.C_DOUBLE]: convertDouble,
|
||||
[FieldTypes.C_BINARY]: convertBinary,
|
||||
[FieldTypes.C_BINARY]: convertNchar,
|
||||
[FieldTypes.C_TIMESTAMP]: convertTimestamp,
|
||||
[FieldTypes.C_NCHAR]: convertNchar
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "td2.0-connector",
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.8",
|
||||
"description": "A Node.js connector for TDengine.",
|
||||
"main": "tdengine.js",
|
||||
"directories": {
|
||||
|
|
|
@ -5,12 +5,13 @@
|
|||
## Install
|
||||
|
||||
```sh
|
||||
pip install git+https://github.com/taosdata/TDengine-connector-python
|
||||
git clone --depth 1 https://github.com/taosdata/TDengine.git
|
||||
pip install ./TDengine/src/connector/python
|
||||
```
|
||||
|
||||
## Source Code
|
||||
|
||||
[TDengine] connector for Python source code is hosted on [GitHub](https://github.com/taosdata/TDengine-connector-python).
|
||||
[TDengine] connector for Python source code is hosted on [GitHub](https://github.com/taosdata/TDengine/tree/develop/src/connector/python).
|
||||
|
||||
## License - AGPL
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|||
|
||||
setuptools.setup(
|
||||
name="taos",
|
||||
version="2.0.10",
|
||||
version="2.0.11",
|
||||
author="Taosdata Inc.",
|
||||
author_email="support@taosdata.com",
|
||||
description="TDengine python client package",
|
||||
|
|
|
@ -2,6 +2,10 @@
|
|||
from .connection import TDengineConnection
|
||||
from .cursor import TDengineCursor
|
||||
|
||||
# For some reason, the following is needed for VS Code (through PyLance) to
|
||||
# recognize that "error" is a valid module of the "taos" package.
|
||||
from .error import ProgrammingError
|
||||
|
||||
# Globals
|
||||
threadsafety = 0
|
||||
paramstyle = 'pyformat'
|
||||
|
|
|
@ -14,12 +14,22 @@ def _convert_microsecond_to_datetime(micro):
|
|||
return datetime.datetime.fromtimestamp(micro / 1000000.0)
|
||||
|
||||
|
||||
def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _convert_nanosecond_to_datetime(nanosec):
|
||||
return nanosec
|
||||
|
||||
|
||||
def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C bool row to python row
|
||||
"""
|
||||
_timestamp_converter = _convert_millisecond_to_datetime
|
||||
if micro:
|
||||
if precision == FieldType.C_TIMESTAMP_MILLI:
|
||||
_timestamp_converter = _convert_millisecond_to_datetime
|
||||
elif precision == FieldType.C_TIMESTAMP_MICRO:
|
||||
_timestamp_converter = _convert_microsecond_to_datetime
|
||||
elif precision == FieldType.C_TIMESTAMP_NANO:
|
||||
_timestamp_converter = _convert_nanosecond_to_datetime
|
||||
else:
|
||||
raise DatabaseError("Unknown precision returned from database")
|
||||
|
||||
return [
|
||||
None if ele == FieldType.C_BIGINT_NULL else _timestamp_converter(ele) for ele in ctypes.cast(
|
||||
|
@ -28,7 +38,7 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_bool_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C bool row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -38,7 +48,7 @@ def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C tinyint row to python row
|
||||
"""
|
||||
return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
|
||||
|
@ -49,7 +59,7 @@ def _crow_tinyint_unsigned_to_python(
|
|||
data,
|
||||
num_of_rows,
|
||||
nbytes=None,
|
||||
micro=False):
|
||||
precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C tinyint row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -59,7 +69,7 @@ def _crow_tinyint_unsigned_to_python(
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_smallint_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C smallint row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -70,7 +80,7 @@ def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
|
||||
|
||||
def _crow_smallint_unsigned_to_python(
|
||||
data, num_of_rows, nbytes=None, micro=False):
|
||||
data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C smallint row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -80,14 +90,14 @@ def _crow_smallint_unsigned_to_python(
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_int_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C int row to python row
|
||||
"""
|
||||
return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
|
||||
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C int row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -97,7 +107,7 @@ def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_bigint_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C bigint row to python row
|
||||
"""
|
||||
return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
|
||||
|
@ -108,7 +118,7 @@ def _crow_bigint_unsigned_to_python(
|
|||
data,
|
||||
num_of_rows,
|
||||
nbytes=None,
|
||||
micro=False):
|
||||
precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C bigint row to python row
|
||||
"""
|
||||
return [
|
||||
|
@ -118,21 +128,21 @@ def _crow_bigint_unsigned_to_python(
|
|||
:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_float_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C float row to python row
|
||||
"""
|
||||
return [None if math.isnan(ele) else ele for ele in ctypes.cast(
|
||||
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_double_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C double row to python row
|
||||
"""
|
||||
return [None if math.isnan(ele) else ele for ele in ctypes.cast(
|
||||
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C binary row to python row
|
||||
"""
|
||||
assert(nbytes is not None)
|
||||
|
@ -140,7 +150,7 @@ def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
||||
|
||||
|
||||
def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_nchar_to_python(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C nchar row to python row
|
||||
"""
|
||||
assert(nbytes is not None)
|
||||
|
@ -159,7 +169,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
|||
return res
|
||||
|
||||
|
||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C binary row to python row
|
||||
"""
|
||||
assert(nbytes is not None)
|
||||
|
@ -178,7 +188,7 @@ def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
|||
return res
|
||||
|
||||
|
||||
def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||
def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):
|
||||
"""Function to convert C nchar row to python row
|
||||
"""
|
||||
assert(nbytes is not None)
|
||||
|
@ -242,7 +252,7 @@ def _load_taos_linux():
|
|||
|
||||
|
||||
def _load_taos_darwin():
|
||||
return ctypes.cDLL('libtaos.dylib')
|
||||
return ctypes.CDLL('libtaos.dylib')
|
||||
|
||||
|
||||
def _load_taos_windows():
|
||||
|
@ -448,8 +458,7 @@ class CTaosInterface(object):
|
|||
result, ctypes.byref(pblock))
|
||||
if num_of_rows == 0:
|
||||
return None, 0
|
||||
isMicro = (CTaosInterface.libtaos.taos_result_precision(
|
||||
result) == FieldType.C_TIMESTAMP_MICRO)
|
||||
precision = CTaosInterface.libtaos.taos_result_precision(result)
|
||||
blocks = [None] * len(fields)
|
||||
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
|
||||
fieldLen = [
|
||||
|
@ -462,7 +471,7 @@ class CTaosInterface(object):
|
|||
if fields[i]['type'] not in _CONVERT_FUNC_BLOCK:
|
||||
raise DatabaseError("Invalid data type returned from database")
|
||||
blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](
|
||||
data, num_of_rows, fieldLen[i], isMicro)
|
||||
data, num_of_rows, fieldLen[i], precision)
|
||||
|
||||
return blocks, abs(num_of_rows)
|
||||
|
||||
|
@ -472,8 +481,7 @@ class CTaosInterface(object):
|
|||
pblock = CTaosInterface.libtaos.taos_fetch_row(result)
|
||||
if pblock:
|
||||
num_of_rows = 1
|
||||
isMicro = (CTaosInterface.libtaos.taos_result_precision(
|
||||
result) == FieldType.C_TIMESTAMP_MICRO)
|
||||
precision = CTaosInterface.libtaos.taos_result_precision(result)
|
||||
blocks = [None] * len(fields)
|
||||
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
|
||||
fieldLen = [
|
||||
|
@ -490,7 +498,7 @@ class CTaosInterface(object):
|
|||
blocks[i] = [None]
|
||||
else:
|
||||
blocks[i] = _CONVERT_FUNC[fields[i]['type']](
|
||||
data, num_of_rows, fieldLen[i], isMicro)
|
||||
data, num_of_rows, fieldLen[i], precision)
|
||||
else:
|
||||
return None, 0
|
||||
return blocks, abs(num_of_rows)
|
||||
|
|
|
@ -40,3 +40,5 @@ class FieldType(object):
|
|||
# Timestamp precision definition
|
||||
C_TIMESTAMP_MILLI = 0
|
||||
C_TIMESTAMP_MICRO = 1
|
||||
C_TIMESTAMP_NANO = 2
|
||||
C_TIMESTAMP_UNKNOWN = 3
|
||||
|
|
|
@ -1458,6 +1458,160 @@ int stmt_funcb_autoctb3(TAOS_STMT *stmt) {
|
|||
|
||||
|
||||
|
||||
|
||||
//1 tables 10 records
|
||||
int stmt_funcb_autoctb4(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
int64_t *ts;
|
||||
int8_t b[10];
|
||||
int8_t v1[10];
|
||||
int16_t v2[10];
|
||||
int32_t v4[10];
|
||||
int64_t v8[10];
|
||||
float f4[10];
|
||||
double f8[10];
|
||||
char bin[10][40];
|
||||
} v = {0};
|
||||
|
||||
v.ts = malloc(sizeof(int64_t) * 1 * 10);
|
||||
|
||||
int *lb = malloc(10 * sizeof(int));
|
||||
|
||||
TAOS_BIND *tags = calloc(1, sizeof(TAOS_BIND) * 9 * 1);
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * 1*5);
|
||||
|
||||
// int one_null = 1;
|
||||
int one_not_null = 0;
|
||||
|
||||
char* is_null = malloc(sizeof(char) * 10);
|
||||
char* no_null = malloc(sizeof(char) * 10);
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
lb[i] = 40;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v.b[i] = (int8_t)(i % 2);
|
||||
v.v1[i] = (int8_t)((i+1) % 2);
|
||||
v.v2[i] = (int16_t)i;
|
||||
v.v4[i] = (int32_t)(i+1);
|
||||
v.v8[i] = (int64_t)(i+2);
|
||||
v.f4[i] = (float)(i+3);
|
||||
v.f8[i] = (double)(i+4);
|
||||
memset(v.bin[i], '0'+i%10, 40);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; i+=5) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v.ts[10*i/10];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = 10;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v.b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = 10;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+2].buffer_length = sizeof(int32_t);
|
||||
params[i+2].buffer = v.v4;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = 10;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
params[i+3].buffer_length = sizeof(int64_t);
|
||||
params[i+3].buffer = v.v8;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = 10;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
params[i+4].buffer_length = sizeof(double);
|
||||
params[i+4].buffer = v.f8;
|
||||
params[i+4].length = NULL;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = 10;
|
||||
}
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
v.ts[i] = tts + i;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
tags[i+0].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
tags[i+0].buffer = v.b;
|
||||
tags[i+0].is_null = &one_not_null;
|
||||
tags[i+0].length = NULL;
|
||||
|
||||
tags[i+1].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
tags[i+1].buffer = v.v2;
|
||||
tags[i+1].is_null = &one_not_null;
|
||||
tags[i+1].length = NULL;
|
||||
|
||||
tags[i+2].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
tags[i+2].buffer = v.f4;
|
||||
tags[i+2].is_null = &one_not_null;
|
||||
tags[i+2].length = NULL;
|
||||
|
||||
tags[i+3].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
tags[i+3].buffer = v.bin;
|
||||
tags[i+3].is_null = &one_not_null;
|
||||
tags[i+3].length = (uintptr_t *)lb;
|
||||
}
|
||||
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
char *sql = "insert into ? using stb1 tags(1,?,2,?,4,?,6.0,?,'b') (ts,b,v4,v8,f8) values(?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:0x%x\n", code);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int zz = 0; zz < 1; zz++) {
|
||||
char buf[32];
|
||||
sprintf(buf, "m%d", zz);
|
||||
code = taos_stmt_set_tbname_tags(stmt, buf, tags);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_set_tbname_tags. code:0x%x\n", code);
|
||||
}
|
||||
|
||||
taos_stmt_bind_param_batch(stmt, params + id * 5);
|
||||
taos_stmt_add_batch(stmt);
|
||||
}
|
||||
|
||||
if (taos_stmt_execute(stmt) != 0) {
|
||||
printf("failed to execute insert statement.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
++id;
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds\n", 10, (endtime-starttime)/1000000UL, (endtime-starttime)/(10));
|
||||
|
||||
free(v.ts);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
free(tags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//1 tables 10 records
|
||||
int stmt_funcb_autoctb_e1(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
|
@ -1606,7 +1760,7 @@ int stmt_funcb_autoctb_e1(TAOS_STMT *stmt) {
|
|||
char *sql = "insert into ? using stb1 (id1,id2,id3,id4,id5,id6,id7,id8,id9) tags(1,?,2,?,4,?,6.0,?,'b') values(?,?,?,?,?,?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:0x%x\n", code);
|
||||
printf("failed to execute taos_stmt_prepare. error:%s\n", taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1824,6 +1978,224 @@ int stmt_funcb_autoctb_e2(TAOS_STMT *stmt) {
|
|||
exit(1);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int zz = 0; zz < 1; zz++) {
|
||||
char buf[32];
|
||||
sprintf(buf, "m%d", zz);
|
||||
code = taos_stmt_set_tbname_tags(stmt, buf, NULL);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_set_tbname_tags. code:%s\n", taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
taos_stmt_bind_param_batch(stmt, params + id * 10);
|
||||
taos_stmt_add_batch(stmt);
|
||||
}
|
||||
|
||||
if (taos_stmt_execute(stmt) != 0) {
|
||||
printf("failed to execute insert statement.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
++id;
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds\n", 10, (endtime-starttime)/1000000UL, (endtime-starttime)/(10));
|
||||
|
||||
free(v.ts);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
free(tags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//1 tables 10 records
|
||||
int stmt_funcb_autoctb_e3(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
int64_t *ts;
|
||||
int8_t b[10];
|
||||
int8_t v1[10];
|
||||
int16_t v2[10];
|
||||
int32_t v4[10];
|
||||
int64_t v8[10];
|
||||
float f4[10];
|
||||
double f8[10];
|
||||
char bin[10][40];
|
||||
} v = {0};
|
||||
|
||||
v.ts = malloc(sizeof(int64_t) * 1 * 10);
|
||||
|
||||
int *lb = malloc(10 * sizeof(int));
|
||||
|
||||
TAOS_BIND *tags = calloc(1, sizeof(TAOS_BIND) * 9 * 1);
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * 1*10);
|
||||
|
||||
// int one_null = 1;
|
||||
int one_not_null = 0;
|
||||
|
||||
char* is_null = malloc(sizeof(char) * 10);
|
||||
char* no_null = malloc(sizeof(char) * 10);
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
lb[i] = 40;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v.b[i] = (int8_t)(i % 2);
|
||||
v.v1[i] = (int8_t)((i+1) % 2);
|
||||
v.v2[i] = (int16_t)i;
|
||||
v.v4[i] = (int32_t)(i+1);
|
||||
v.v8[i] = (int64_t)(i+2);
|
||||
v.f4[i] = (float)(i+3);
|
||||
v.f8[i] = (double)(i+4);
|
||||
memset(v.bin[i], '0'+i%10, 40);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 10; i+=10) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v.ts[10*i/10];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = 10;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v.b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = 10;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
params[i+2].buffer_length = sizeof(int8_t);
|
||||
params[i+2].buffer = v.v1;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = 10;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
params[i+3].buffer_length = sizeof(int16_t);
|
||||
params[i+3].buffer = v.v2;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = 10;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+4].buffer_length = sizeof(int32_t);
|
||||
params[i+4].buffer = v.v4;
|
||||
params[i+4].length = NULL;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = 10;
|
||||
|
||||
params[i+5].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
params[i+5].buffer_length = sizeof(int64_t);
|
||||
params[i+5].buffer = v.v8;
|
||||
params[i+5].length = NULL;
|
||||
params[i+5].is_null = is_null;
|
||||
params[i+5].num = 10;
|
||||
|
||||
params[i+6].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
params[i+6].buffer_length = sizeof(float);
|
||||
params[i+6].buffer = v.f4;
|
||||
params[i+6].length = NULL;
|
||||
params[i+6].is_null = is_null;
|
||||
params[i+6].num = 10;
|
||||
|
||||
params[i+7].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
params[i+7].buffer_length = sizeof(double);
|
||||
params[i+7].buffer = v.f8;
|
||||
params[i+7].length = NULL;
|
||||
params[i+7].is_null = is_null;
|
||||
params[i+7].num = 10;
|
||||
|
||||
params[i+8].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+8].buffer_length = 40;
|
||||
params[i+8].buffer = v.bin;
|
||||
params[i+8].length = lb;
|
||||
params[i+8].is_null = is_null;
|
||||
params[i+8].num = 10;
|
||||
|
||||
params[i+9].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+9].buffer_length = 40;
|
||||
params[i+9].buffer = v.bin;
|
||||
params[i+9].length = lb;
|
||||
params[i+9].is_null = is_null;
|
||||
params[i+9].num = 10;
|
||||
|
||||
}
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
v.ts[i] = tts + i;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
tags[i+0].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
tags[i+0].buffer = v.v4;
|
||||
tags[i+0].is_null = &one_not_null;
|
||||
tags[i+0].length = NULL;
|
||||
|
||||
tags[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
tags[i+1].buffer = v.b;
|
||||
tags[i+1].is_null = &one_not_null;
|
||||
tags[i+1].length = NULL;
|
||||
|
||||
tags[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
tags[i+2].buffer = v.v1;
|
||||
tags[i+2].is_null = &one_not_null;
|
||||
tags[i+2].length = NULL;
|
||||
|
||||
tags[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
tags[i+3].buffer = v.v2;
|
||||
tags[i+3].is_null = &one_not_null;
|
||||
tags[i+3].length = NULL;
|
||||
|
||||
tags[i+4].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
tags[i+4].buffer = v.v8;
|
||||
tags[i+4].is_null = &one_not_null;
|
||||
tags[i+4].length = NULL;
|
||||
|
||||
tags[i+5].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
tags[i+5].buffer = v.f4;
|
||||
tags[i+5].is_null = &one_not_null;
|
||||
tags[i+5].length = NULL;
|
||||
|
||||
tags[i+6].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
tags[i+6].buffer = v.f8;
|
||||
tags[i+6].is_null = &one_not_null;
|
||||
tags[i+6].length = NULL;
|
||||
|
||||
tags[i+7].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
tags[i+7].buffer = v.bin;
|
||||
tags[i+7].is_null = &one_not_null;
|
||||
tags[i+7].length = (uintptr_t *)lb;
|
||||
|
||||
tags[i+8].buffer_type = TSDB_DATA_TYPE_NCHAR;
|
||||
tags[i+8].buffer = v.bin;
|
||||
tags[i+8].is_null = &one_not_null;
|
||||
tags[i+8].length = (uintptr_t *)lb;
|
||||
}
|
||||
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
char *sql = "insert into ? using stb1 (id1,id2,id3,id4,id5,id6,id7,id8,id9) tags(?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:%s\n", taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
//exit(1);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int zz = 0; zz < 1; zz++) {
|
||||
char buf[32];
|
||||
|
@ -1860,6 +2232,458 @@ int stmt_funcb_autoctb_e2(TAOS_STMT *stmt) {
|
|||
|
||||
|
||||
|
||||
|
||||
//1 tables 10 records
|
||||
int stmt_funcb_autoctb_e4(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
int64_t *ts;
|
||||
int8_t b[10];
|
||||
int8_t v1[10];
|
||||
int16_t v2[10];
|
||||
int32_t v4[10];
|
||||
int64_t v8[10];
|
||||
float f4[10];
|
||||
double f8[10];
|
||||
char bin[10][40];
|
||||
} v = {0};
|
||||
|
||||
v.ts = malloc(sizeof(int64_t) * 1 * 10);
|
||||
|
||||
int *lb = malloc(10 * sizeof(int));
|
||||
|
||||
TAOS_BIND *tags = calloc(1, sizeof(TAOS_BIND) * 9 * 1);
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * 1*10);
|
||||
|
||||
// int one_null = 1;
|
||||
int one_not_null = 0;
|
||||
|
||||
char* is_null = malloc(sizeof(char) * 10);
|
||||
char* no_null = malloc(sizeof(char) * 10);
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
lb[i] = 40;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v.b[i] = (int8_t)(i % 2);
|
||||
v.v1[i] = (int8_t)((i+1) % 2);
|
||||
v.v2[i] = (int16_t)i;
|
||||
v.v4[i] = (int32_t)(i+1);
|
||||
v.v8[i] = (int64_t)(i+2);
|
||||
v.f4[i] = (float)(i+3);
|
||||
v.f8[i] = (double)(i+4);
|
||||
memset(v.bin[i], '0'+i%10, 40);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 10; i+=10) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v.ts[10*i/10];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = 10;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v.b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = 10;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
params[i+2].buffer_length = sizeof(int8_t);
|
||||
params[i+2].buffer = v.v1;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = 10;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
params[i+3].buffer_length = sizeof(int16_t);
|
||||
params[i+3].buffer = v.v2;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = 10;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+4].buffer_length = sizeof(int32_t);
|
||||
params[i+4].buffer = v.v4;
|
||||
params[i+4].length = NULL;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = 10;
|
||||
|
||||
params[i+5].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
params[i+5].buffer_length = sizeof(int64_t);
|
||||
params[i+5].buffer = v.v8;
|
||||
params[i+5].length = NULL;
|
||||
params[i+5].is_null = is_null;
|
||||
params[i+5].num = 10;
|
||||
|
||||
params[i+6].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
params[i+6].buffer_length = sizeof(float);
|
||||
params[i+6].buffer = v.f4;
|
||||
params[i+6].length = NULL;
|
||||
params[i+6].is_null = is_null;
|
||||
params[i+6].num = 10;
|
||||
|
||||
params[i+7].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
params[i+7].buffer_length = sizeof(double);
|
||||
params[i+7].buffer = v.f8;
|
||||
params[i+7].length = NULL;
|
||||
params[i+7].is_null = is_null;
|
||||
params[i+7].num = 10;
|
||||
|
||||
params[i+8].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+8].buffer_length = 40;
|
||||
params[i+8].buffer = v.bin;
|
||||
params[i+8].length = lb;
|
||||
params[i+8].is_null = is_null;
|
||||
params[i+8].num = 10;
|
||||
|
||||
params[i+9].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+9].buffer_length = 40;
|
||||
params[i+9].buffer = v.bin;
|
||||
params[i+9].length = lb;
|
||||
params[i+9].is_null = is_null;
|
||||
params[i+9].num = 10;
|
||||
|
||||
}
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
v.ts[i] = tts + i;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
tags[i+0].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
tags[i+0].buffer = v.v4;
|
||||
tags[i+0].is_null = &one_not_null;
|
||||
tags[i+0].length = NULL;
|
||||
|
||||
tags[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
tags[i+1].buffer = v.b;
|
||||
tags[i+1].is_null = &one_not_null;
|
||||
tags[i+1].length = NULL;
|
||||
|
||||
tags[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
tags[i+2].buffer = v.v1;
|
||||
tags[i+2].is_null = &one_not_null;
|
||||
tags[i+2].length = NULL;
|
||||
|
||||
tags[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
tags[i+3].buffer = v.v2;
|
||||
tags[i+3].is_null = &one_not_null;
|
||||
tags[i+3].length = NULL;
|
||||
|
||||
tags[i+4].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
tags[i+4].buffer = v.v8;
|
||||
tags[i+4].is_null = &one_not_null;
|
||||
tags[i+4].length = NULL;
|
||||
|
||||
tags[i+5].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
tags[i+5].buffer = v.f4;
|
||||
tags[i+5].is_null = &one_not_null;
|
||||
tags[i+5].length = NULL;
|
||||
|
||||
tags[i+6].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
tags[i+6].buffer = v.f8;
|
||||
tags[i+6].is_null = &one_not_null;
|
||||
tags[i+6].length = NULL;
|
||||
|
||||
tags[i+7].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
tags[i+7].buffer = v.bin;
|
||||
tags[i+7].is_null = &one_not_null;
|
||||
tags[i+7].length = (uintptr_t *)lb;
|
||||
|
||||
tags[i+8].buffer_type = TSDB_DATA_TYPE_NCHAR;
|
||||
tags[i+8].buffer = v.bin;
|
||||
tags[i+8].is_null = &one_not_null;
|
||||
tags[i+8].length = (uintptr_t *)lb;
|
||||
}
|
||||
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
char *sql = "insert into ? using stb1 tags(?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int zz = 0; zz < 1; zz++) {
|
||||
char buf[32];
|
||||
sprintf(buf, "m%d", zz);
|
||||
code = taos_stmt_set_tbname_tags(stmt, buf, tags);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_set_tbname_tags. error:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
code = taos_stmt_bind_param_batch(stmt, params + id * 10);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_bind_param_batch. error:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
code = taos_stmt_bind_param_batch(stmt, params + id * 10);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_bind_param_batch. error:%s\n", taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
taos_stmt_add_batch(stmt);
|
||||
}
|
||||
|
||||
if (taos_stmt_execute(stmt) != 0) {
|
||||
printf("failed to execute insert statement.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
++id;
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds\n", 10, (endtime-starttime)/1000000UL, (endtime-starttime)/(10));
|
||||
|
||||
free(v.ts);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
free(tags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//1 tables 10 records
|
||||
int stmt_funcb_autoctb_e5(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
int64_t *ts;
|
||||
int8_t b[10];
|
||||
int8_t v1[10];
|
||||
int16_t v2[10];
|
||||
int32_t v4[10];
|
||||
int64_t v8[10];
|
||||
float f4[10];
|
||||
double f8[10];
|
||||
char bin[10][40];
|
||||
} v = {0};
|
||||
|
||||
v.ts = malloc(sizeof(int64_t) * 1 * 10);
|
||||
|
||||
int *lb = malloc(10 * sizeof(int));
|
||||
|
||||
TAOS_BIND *tags = calloc(1, sizeof(TAOS_BIND) * 9 * 1);
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * 1*10);
|
||||
|
||||
// int one_null = 1;
|
||||
int one_not_null = 0;
|
||||
|
||||
char* is_null = malloc(sizeof(char) * 10);
|
||||
char* no_null = malloc(sizeof(char) * 10);
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
lb[i] = 40;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v.b[i] = (int8_t)(i % 2);
|
||||
v.v1[i] = (int8_t)((i+1) % 2);
|
||||
v.v2[i] = (int16_t)i;
|
||||
v.v4[i] = (int32_t)(i+1);
|
||||
v.v8[i] = (int64_t)(i+2);
|
||||
v.f4[i] = (float)(i+3);
|
||||
v.f8[i] = (double)(i+4);
|
||||
memset(v.bin[i], '0'+i%10, 40);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 10; i+=10) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v.ts[10*i/10];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = 10;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v.b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = 10;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
params[i+2].buffer_length = sizeof(int8_t);
|
||||
params[i+2].buffer = v.v1;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = 10;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
params[i+3].buffer_length = sizeof(int16_t);
|
||||
params[i+3].buffer = v.v2;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = 10;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+4].buffer_length = sizeof(int32_t);
|
||||
params[i+4].buffer = v.v4;
|
||||
params[i+4].length = NULL;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = 10;
|
||||
|
||||
params[i+5].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
params[i+5].buffer_length = sizeof(int64_t);
|
||||
params[i+5].buffer = v.v8;
|
||||
params[i+5].length = NULL;
|
||||
params[i+5].is_null = is_null;
|
||||
params[i+5].num = 10;
|
||||
|
||||
params[i+6].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
params[i+6].buffer_length = sizeof(float);
|
||||
params[i+6].buffer = v.f4;
|
||||
params[i+6].length = NULL;
|
||||
params[i+6].is_null = is_null;
|
||||
params[i+6].num = 10;
|
||||
|
||||
params[i+7].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
params[i+7].buffer_length = sizeof(double);
|
||||
params[i+7].buffer = v.f8;
|
||||
params[i+7].length = NULL;
|
||||
params[i+7].is_null = is_null;
|
||||
params[i+7].num = 10;
|
||||
|
||||
params[i+8].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+8].buffer_length = 40;
|
||||
params[i+8].buffer = v.bin;
|
||||
params[i+8].length = lb;
|
||||
params[i+8].is_null = is_null;
|
||||
params[i+8].num = 10;
|
||||
|
||||
params[i+9].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+9].buffer_length = 40;
|
||||
params[i+9].buffer = v.bin;
|
||||
params[i+9].length = lb;
|
||||
params[i+9].is_null = is_null;
|
||||
params[i+9].num = 10;
|
||||
|
||||
}
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
v.ts[i] = tts + i;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
tags[i+0].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
tags[i+0].buffer = v.v4;
|
||||
tags[i+0].is_null = &one_not_null;
|
||||
tags[i+0].length = NULL;
|
||||
|
||||
tags[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
tags[i+1].buffer = v.b;
|
||||
tags[i+1].is_null = &one_not_null;
|
||||
tags[i+1].length = NULL;
|
||||
|
||||
tags[i+2].buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
tags[i+2].buffer = v.v1;
|
||||
tags[i+2].is_null = &one_not_null;
|
||||
tags[i+2].length = NULL;
|
||||
|
||||
tags[i+3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
tags[i+3].buffer = v.v2;
|
||||
tags[i+3].is_null = &one_not_null;
|
||||
tags[i+3].length = NULL;
|
||||
|
||||
tags[i+4].buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
tags[i+4].buffer = v.v8;
|
||||
tags[i+4].is_null = &one_not_null;
|
||||
tags[i+4].length = NULL;
|
||||
|
||||
tags[i+5].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
tags[i+5].buffer = v.f4;
|
||||
tags[i+5].is_null = &one_not_null;
|
||||
tags[i+5].length = NULL;
|
||||
|
||||
tags[i+6].buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
tags[i+6].buffer = v.f8;
|
||||
tags[i+6].is_null = &one_not_null;
|
||||
tags[i+6].length = NULL;
|
||||
|
||||
tags[i+7].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
tags[i+7].buffer = v.bin;
|
||||
tags[i+7].is_null = &one_not_null;
|
||||
tags[i+7].length = (uintptr_t *)lb;
|
||||
|
||||
tags[i+8].buffer_type = TSDB_DATA_TYPE_NCHAR;
|
||||
tags[i+8].buffer = v.bin;
|
||||
tags[i+8].is_null = &one_not_null;
|
||||
tags[i+8].length = (uintptr_t *)lb;
|
||||
}
|
||||
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
char *sql = "insert into ? using stb1 tags(?,?,?,?,?,?,?,?,?) values(?,?,?,?,?,?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(NULL, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:%s\n", taos_stmt_errstr(NULL));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int zz = 0; zz < 1; zz++) {
|
||||
char buf[32];
|
||||
sprintf(buf, "m%d", zz);
|
||||
code = taos_stmt_set_tbname_tags(stmt, buf, tags);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_set_tbname_tags. error:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
code = taos_stmt_bind_param_batch(stmt, params + id * 10);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_bind_param_batch. error:%s\n", taos_stmt_errstr(stmt));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
code = taos_stmt_bind_param_batch(stmt, params + id * 10);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_bind_param_batch. error:%s\n", taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
taos_stmt_add_batch(stmt);
|
||||
}
|
||||
|
||||
if (taos_stmt_execute(stmt) != 0) {
|
||||
printf("failed to execute insert statement.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
++id;
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds\n", 10, (endtime-starttime)/1000000UL, (endtime-starttime)/(10));
|
||||
|
||||
free(v.ts);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
free(tags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//300 tables 60 records
|
||||
int stmt_funcb1(TAOS_STMT *stmt) {
|
||||
struct {
|
||||
|
@ -3375,6 +4199,9 @@ void check_result(TAOS *taos, char *tname, int printr, int expected) {
|
|||
char sql[255] = "SELECT * FROM ";
|
||||
TAOS_RES *result;
|
||||
|
||||
//FORCE NO PRINT
|
||||
printr = 0;
|
||||
|
||||
strcat(sql, tname);
|
||||
|
||||
result = taos_query(taos, sql);
|
||||
|
@ -3835,7 +4662,7 @@ void* runcase(void *par) {
|
|||
#endif
|
||||
|
||||
|
||||
#if 1
|
||||
#if 1
|
||||
prepare(taos, 1, 1);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
@ -3859,9 +4686,9 @@ void* runcase(void *par) {
|
|||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb start\n");
|
||||
printf("1t+10r+bm+autoctb1 start\n");
|
||||
stmt_funcb_autoctb1(stmt);
|
||||
printf("1t+10r+bm+autoctb end\n");
|
||||
printf("1t+10r+bm+autoctb1 end\n");
|
||||
printf("check result start\n");
|
||||
check_result(taos, "m0", 1, 10);
|
||||
printf("check result end\n");
|
||||
|
@ -3874,9 +4701,9 @@ void* runcase(void *par) {
|
|||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb start\n");
|
||||
printf("1t+10r+bm+autoctb2 start\n");
|
||||
stmt_funcb_autoctb2(stmt);
|
||||
printf("1t+10r+bm+autoctb end\n");
|
||||
printf("1t+10r+bm+autoctb2 end\n");
|
||||
printf("check result start\n");
|
||||
check_result(taos, "m0", 1, 10);
|
||||
printf("check result end\n");
|
||||
|
@ -3890,9 +4717,9 @@ void* runcase(void *par) {
|
|||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb start\n");
|
||||
printf("1t+10r+bm+autoctb3 start\n");
|
||||
stmt_funcb_autoctb3(stmt);
|
||||
printf("1t+10r+bm+autoctb end\n");
|
||||
printf("1t+10r+bm+autoctb3 end\n");
|
||||
printf("check result start\n");
|
||||
check_result(taos, "m0", 1, 10);
|
||||
printf("check result end\n");
|
||||
|
@ -3900,11 +4727,27 @@ void* runcase(void *par) {
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 0);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb4 start\n");
|
||||
stmt_funcb_autoctb4(stmt);
|
||||
printf("1t+10r+bm+autoctb4 end\n");
|
||||
printf("check result start\n");
|
||||
check_result(taos, "m0", 1, 10);
|
||||
printf("check result end\n");
|
||||
taos_stmt_close(stmt);
|
||||
#endif
|
||||
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 0);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb+e1 start\n");
|
||||
stmt_funcb_autoctb_e1(stmt);
|
||||
printf("1t+10r+bm+autoctb+e1 end\n");
|
||||
|
@ -3930,6 +4773,52 @@ void* runcase(void *par) {
|
|||
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 0);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb+e3 start\n");
|
||||
stmt_funcb_autoctb_e3(stmt);
|
||||
printf("1t+10r+bm+autoctb+e3 end\n");
|
||||
printf("check result start\n");
|
||||
//check_result(taos, "m0", 1, 0);
|
||||
printf("check result end\n");
|
||||
taos_stmt_close(stmt);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 0);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb+e4 start\n");
|
||||
stmt_funcb_autoctb_e4(stmt);
|
||||
printf("1t+10r+bm+autoctb+e4 end\n");
|
||||
printf("check result start\n");
|
||||
//check_result(taos, "m0", 1, 0);
|
||||
printf("check result end\n");
|
||||
taos_stmt_close(stmt);
|
||||
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 0);
|
||||
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
printf("1t+10r+bm+autoctb+e5 start\n");
|
||||
stmt_funcb_autoctb_e5(stmt);
|
||||
printf("1t+10r+bm+autoctb+e5 end\n");
|
||||
printf("check result start\n");
|
||||
//check_result(taos, "m0", 1, 0);
|
||||
printf("check result end\n");
|
||||
taos_stmt_close(stmt);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if 1
|
||||
prepare(taos, 1, 1);
|
||||
|
@ -4138,6 +5027,8 @@ void* runcase(void *par) {
|
|||
|
||||
#endif
|
||||
|
||||
printf("test end\n");
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
|
|
@ -4406,6 +4406,654 @@ static void SpecifyColumnBatchCase_autoCreateTbl(TAOS *taos) {
|
|||
}
|
||||
|
||||
|
||||
/*=======================*/
|
||||
/*
|
||||
char * taos_stmt_errstr(TAOS_STMT *stmt) 用于在其他stmt API 返回错误(返回错误码或空指针)时获取错误信息,返回的错误信息可能是以下3种的一个:
|
||||
1. 当stmt或sqlobj为空时的terrno对于的错误消息;
|
||||
2. (可有的)详细错误消息;
|
||||
3. 返回的错误码对于的错误消息;
|
||||
*/
|
||||
static int stmt_specifyCol_bind_error_case_001(TAOS_STMT *stmt, int tableNum, int rowsOfPerColum, int bingNum, int lenOfBinaryDef, int lenOfBinaryAct, int columnNum) {
|
||||
sampleValue* v = (sampleValue *)calloc(1, sizeof(sampleValue));
|
||||
|
||||
int totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
|
||||
v->ts = (int64_t *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * tableNum));
|
||||
v->br = (char *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * lenOfBinaryDef));
|
||||
v->nr = (char *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * lenOfBinaryDef));
|
||||
|
||||
int *lb = (int *)malloc(MAX_ROWS_OF_PER_COLUMN * sizeof(int));
|
||||
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * (size_t)(bingNum * columnNum * (tableNum+1) * rowsOfPerColum));
|
||||
char* is_null = malloc(sizeof(char) * MAX_ROWS_OF_PER_COLUMN);
|
||||
char* no_null = malloc(sizeof(char) * MAX_ROWS_OF_PER_COLUMN);
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
|
||||
for (int i = 0; i < rowsOfPerColum; ++i) {
|
||||
lb[i] = lenOfBinaryAct;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v->b[i] = (int8_t)(i % 2);
|
||||
v->v1[i] = (int8_t)((i+1) % 2);
|
||||
v->v2[i] = (int16_t)i;
|
||||
v->v4[i] = (int32_t)(i+1);
|
||||
v->v8[i] = (int64_t)(i+2);
|
||||
v->f4[i] = (float)(i+3);
|
||||
v->f8[i] = (double)(i+4);
|
||||
char tbuf[MAX_BINARY_DEF_LEN];
|
||||
memset(tbuf, 0, MAX_BINARY_DEF_LEN);
|
||||
sprintf(tbuf, "binary-%d-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", i%10);
|
||||
memcpy(v->br + i*lenOfBinaryDef, tbuf, (size_t)lenOfBinaryAct);
|
||||
memset(tbuf, 0, MAX_BINARY_DEF_LEN);
|
||||
sprintf(tbuf, "nchar-%d-0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", i%10);
|
||||
memcpy(v->nr + i*lenOfBinaryDef, tbuf, (size_t)lenOfBinaryAct);
|
||||
v->ts2[i] = tts + i;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (int j = 0; j < bingNum * tableNum; j++) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v->ts[j*rowsOfPerColum];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = rowsOfPerColum;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v->b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = rowsOfPerColum;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+2].buffer_length = sizeof(int32_t);
|
||||
params[i+2].buffer = v->v4;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = rowsOfPerColum;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
params[i+3].buffer_length = sizeof(float);
|
||||
params[i+3].buffer = v->f4;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = rowsOfPerColum;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+4].buffer_length = (uintptr_t)lenOfBinaryDef;
|
||||
params[i+4].buffer = v->br;
|
||||
params[i+4].length = lb;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = rowsOfPerColum;
|
||||
|
||||
i+=columnNum;
|
||||
}
|
||||
|
||||
//int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < totalRowsPerTbl * tableNum; ++i) {
|
||||
v->ts[i] = tts + i;
|
||||
}
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
// create table m%d (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, br binary(%d), nr nchar(%d), ts2 timestamp)
|
||||
char *sql = "insert into m0 (ts,b,v4,f4,br) values(?,?,?,?,?)";
|
||||
|
||||
int code;
|
||||
//TAOS_STMT *stmtNull = NULL;
|
||||
//int code = taos_stmt_prepare(stmtNull, sql, 0);
|
||||
//if (code != 0){
|
||||
// printf("failed to execute taos_stmt_prepare. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmtNull));
|
||||
// return -1;
|
||||
//}
|
||||
|
||||
//char* sqlNull = NULL;
|
||||
//code = taos_stmt_prepare(stmt, sqlNull, 0);
|
||||
//if (code != 0){
|
||||
// printf("failed to execute taos_stmt_prepare. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
//}
|
||||
|
||||
code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int l = 0; l < bingNum; l++) {
|
||||
for (int zz = 0; zz < tableNum; zz++) {
|
||||
//char buf[32];
|
||||
//sprintf(buf, "m%d", zz);
|
||||
//code = taos_stmt_set_tbname(stmt, buf);
|
||||
//if (code != 0){
|
||||
// printf("failed to execute taos_stmt_set_tbname. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
// return -1;
|
||||
//}
|
||||
|
||||
//for (int col=0; col < columnNum + 1000; ++col) {
|
||||
for (int col=0; col < columnNum; ++col) {
|
||||
if (col >= columnNum) col = 0;
|
||||
//code = taos_stmt_bind_single_param_batch(NULL, params + id, col);
|
||||
//code = taos_stmt_bind_single_param_batch(stmt, NULL, col);
|
||||
//code = taos_stmt_bind_single_param_batch(stmt, params + id, columnNum);
|
||||
code = taos_stmt_bind_single_param_batch(stmt, params + id, col);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_bind_single_param_batch. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
id++;
|
||||
}
|
||||
|
||||
//code = taos_stmt_add_batch(NULL);
|
||||
code = taos_stmt_add_batch(stmt);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_add_batch. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
//code = taos_stmt_add_batch(stmt);
|
||||
//if (code != 0) {
|
||||
// printf("failed to execute taos_stmt_add_batch second. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
// return -1;
|
||||
//}
|
||||
}
|
||||
|
||||
code = taos_stmt_execute(stmt);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_execute. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
unsigned long long totalRows = (uint32_t)(totalRowsPerTbl * tableNum);
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds per record\n", totalRows, (endtime-starttime)/1000000UL, (endtime-starttime)/totalRows);
|
||||
|
||||
free(v->ts);
|
||||
free(v->br);
|
||||
free(v->nr);
|
||||
free(v);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stmt_specifyCol_bind_error_case_002(TAOS_STMT *stmt, int tableNum, int rowsOfPerColum, int bingNum, int lenOfBinaryDef, int lenOfBinaryAct, int columnNum) {
|
||||
sampleValue* v = (sampleValue *)calloc(1, sizeof(sampleValue));
|
||||
|
||||
int totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
|
||||
v->ts = (int64_t *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * tableNum));
|
||||
v->br = (char *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * lenOfBinaryDef));
|
||||
v->nr = (char *)malloc(sizeof(int64_t) * (size_t)(totalRowsPerTbl * lenOfBinaryDef));
|
||||
|
||||
int *lb = (int *)malloc(MAX_ROWS_OF_PER_COLUMN * sizeof(int));
|
||||
|
||||
TAOS_MULTI_BIND *params = calloc(1, sizeof(TAOS_MULTI_BIND) * (size_t)(bingNum * columnNum * (tableNum+1) * rowsOfPerColum));
|
||||
char* is_null = malloc(sizeof(char) * MAX_ROWS_OF_PER_COLUMN);
|
||||
char* no_null = malloc(sizeof(char) * MAX_ROWS_OF_PER_COLUMN);
|
||||
|
||||
int64_t tts = 1591060628000;
|
||||
|
||||
for (int i = 0; i < rowsOfPerColum; ++i) {
|
||||
lb[i] = lenOfBinaryAct;
|
||||
no_null[i] = 0;
|
||||
is_null[i] = (i % 10 == 2) ? 1 : 0;
|
||||
v->b[i] = (int8_t)(i % 2);
|
||||
v->v1[i] = (int8_t)((i+1) % 2);
|
||||
v->v2[i] = (int16_t)i;
|
||||
v->v4[i] = (int32_t)(i+1);
|
||||
v->v8[i] = (int64_t)(i+2);
|
||||
v->f4[i] = (float)(i+3);
|
||||
v->f8[i] = (double)(i+4);
|
||||
char tbuf[MAX_BINARY_DEF_LEN];
|
||||
memset(tbuf, 0, MAX_BINARY_DEF_LEN);
|
||||
sprintf(tbuf, "binary-%d", i%10);
|
||||
memcpy(v->br + i*lenOfBinaryDef, tbuf, (size_t)lenOfBinaryAct);
|
||||
memset(tbuf, 0, MAX_BINARY_DEF_LEN);
|
||||
sprintf(tbuf, "nchar-%d", i%10);
|
||||
memcpy(v->nr + i*lenOfBinaryDef, tbuf, (size_t)lenOfBinaryAct);
|
||||
v->ts2[i] = tts + i;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (int j = 0; j < bingNum * tableNum; j++) {
|
||||
params[i+0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
params[i+0].buffer_length = sizeof(int64_t);
|
||||
params[i+0].buffer = &v->ts[j*rowsOfPerColum];
|
||||
params[i+0].length = NULL;
|
||||
params[i+0].is_null = no_null;
|
||||
params[i+0].num = rowsOfPerColum;
|
||||
|
||||
params[i+1].buffer_type = TSDB_DATA_TYPE_BOOL;
|
||||
params[i+1].buffer_length = sizeof(int8_t);
|
||||
params[i+1].buffer = v->b;
|
||||
params[i+1].length = NULL;
|
||||
params[i+1].is_null = is_null;
|
||||
params[i+1].num = rowsOfPerColum;
|
||||
|
||||
params[i+2].buffer_type = TSDB_DATA_TYPE_INT;
|
||||
params[i+2].buffer_length = sizeof(int32_t);
|
||||
params[i+2].buffer = v->v4;
|
||||
params[i+2].length = NULL;
|
||||
params[i+2].is_null = is_null;
|
||||
params[i+2].num = rowsOfPerColum;
|
||||
|
||||
params[i+3].buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
params[i+3].buffer_length = sizeof(float);
|
||||
params[i+3].buffer = v->f4;
|
||||
params[i+3].length = NULL;
|
||||
params[i+3].is_null = is_null;
|
||||
params[i+3].num = rowsOfPerColum;
|
||||
|
||||
params[i+4].buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
params[i+4].buffer_length = (uintptr_t)lenOfBinaryDef;
|
||||
params[i+4].buffer = v->br;
|
||||
params[i+4].length = lb;
|
||||
params[i+4].is_null = is_null;
|
||||
params[i+4].num = rowsOfPerColum;
|
||||
|
||||
i+=columnNum;
|
||||
}
|
||||
|
||||
//int64_t tts = 1591060628000;
|
||||
for (int i = 0; i < totalRowsPerTbl * tableNum; ++i) {
|
||||
v->ts[i] = tts + i;
|
||||
}
|
||||
|
||||
unsigned long long starttime = getCurrentTime();
|
||||
|
||||
// create table m%d (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, br binary(%d), nr nchar(%d), ts2 timestamp)
|
||||
char *sql = "insert into ? (ts,b,v4,f4,br) values(?,?,?,?,?)";
|
||||
int code = taos_stmt_prepare(stmt, sql, 0);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_prepare. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
for (int l = 0; l < bingNum; l++) {
|
||||
for (int zz = 0; zz < tableNum; zz++) {
|
||||
char buf[32];
|
||||
sprintf(buf, "m%d", zz);
|
||||
|
||||
//stmt=NULL;
|
||||
code = taos_stmt_set_tbname(stmt, buf);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_set_tbname. code:0x%x[%s][%s]\n", code, tstrerror(code), taos_stmt_errstr(stmt));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int col=0; col < columnNum; ++col) {
|
||||
code = taos_stmt_bind_single_param_batch(stmt, params + id, col);
|
||||
if (code != 0){
|
||||
printf("failed to execute taos_stmt_bind_single_param_batch. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
return -1;
|
||||
}
|
||||
id++;
|
||||
}
|
||||
|
||||
code = taos_stmt_add_batch(stmt);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_add_batch. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
code = taos_stmt_execute(stmt);
|
||||
if (code != 0) {
|
||||
printf("failed to execute taos_stmt_execute. code:0x%x[%s]\n", code, tstrerror(code));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long long endtime = getCurrentTime();
|
||||
unsigned long long totalRows = (uint32_t)(totalRowsPerTbl * tableNum);
|
||||
printf("insert total %d records, used %u seconds, avg:%u useconds per record\n", totalRows, (endtime-starttime)/1000000UL, (endtime-starttime)/totalRows);
|
||||
|
||||
free(v->ts);
|
||||
free(v->br);
|
||||
free(v->nr);
|
||||
free(v);
|
||||
free(lb);
|
||||
free(params);
|
||||
free(is_null);
|
||||
free(no_null);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void SpecifyColumnBatchErrorCase(TAOS *taos) {
|
||||
TAOS_STMT *stmt = NULL;
|
||||
|
||||
int tableNum;
|
||||
int lenOfBinaryDef;
|
||||
int rowsOfPerColum;
|
||||
int bingNum;
|
||||
int lenOfBinaryAct;
|
||||
int columnNum;
|
||||
|
||||
int totalRowsPerTbl;
|
||||
|
||||
//=======================================================================//
|
||||
//=============================== single table ==========================//
|
||||
//========== case 1: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 1;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 40;
|
||||
lenOfBinaryAct = 8;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db1");
|
||||
stmt_specifyCol_bind_error_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 1 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 2: ======================//
|
||||
#if 1
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 5;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 15;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db2");
|
||||
stmt_specifyCol_bind_error_case_002(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m5", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m6", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m7", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m8", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m9", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 2 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 2-1: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 32767;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 15;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db2_1");
|
||||
stmt_specifyCol_bind_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m5", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m6", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m7", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m8", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m9", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 2-1 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
//========== case 2-2: ======================//
|
||||
#if 0
|
||||
{
|
||||
printf("====case 2-2 error test start\n");
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 32768;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 15;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db2_2");
|
||||
stmt_specifyCol_bind_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m5", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m6", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m7", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m8", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m9", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("====case 2-2 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//========== case 3: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 1;
|
||||
bingNum = 5;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 20;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db3");
|
||||
stmt_specifyCol_bind_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m5", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m6", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m7", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m8", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m9", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 3 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 4: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 5;
|
||||
bingNum = 5;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 33;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db4");
|
||||
stmt_specifyCol_bind_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m5", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m6", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m7", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m8", 0, totalRowsPerTbl);
|
||||
//checkResult(taos, "m9", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 4 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//=======================================================================//
|
||||
//=============================== multi tables ==========================//
|
||||
//========== case 5: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 5;
|
||||
rowsOfPerColum = 1;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 40;
|
||||
lenOfBinaryAct = 16;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db5");
|
||||
stmt_specifyCol_bind_case_002(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 5 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 6: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 5;
|
||||
rowsOfPerColum = 5;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 20;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db6");
|
||||
stmt_specifyCol_bind_case_002(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 6 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 7: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 5;
|
||||
rowsOfPerColum = 1;
|
||||
bingNum = 5;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 33;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db7");
|
||||
stmt_specifyCol_bind_case_002(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 7 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//========== case 8: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 5;
|
||||
rowsOfPerColum = 5;
|
||||
bingNum = 5;
|
||||
lenOfBinaryDef = 1000;
|
||||
lenOfBinaryAct = 40;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db8");
|
||||
stmt_specifyCol_bind_case_002(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m1", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m2", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m3", 0, totalRowsPerTbl);
|
||||
checkResult(taos, "m4", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 8 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//=======================================================================//
|
||||
//=============================== multi-rows to single table ==========================//
|
||||
//========== case 9: ======================//
|
||||
#if 0
|
||||
{
|
||||
stmt = taos_stmt_init(taos);
|
||||
|
||||
tableNum = 1;
|
||||
rowsOfPerColum = 23740;
|
||||
bingNum = 1;
|
||||
lenOfBinaryDef = 40;
|
||||
lenOfBinaryAct = 8;
|
||||
columnNum = 5;
|
||||
|
||||
prepareVcolumn(taos, 1, tableNum, lenOfBinaryDef, "db9");
|
||||
stmt_specifyCol_bind_case_001(stmt, tableNum, rowsOfPerColum, bingNum, lenOfBinaryDef, lenOfBinaryAct, columnNum);
|
||||
|
||||
totalRowsPerTbl = rowsOfPerColum * bingNum;
|
||||
checkResult(taos, "m0", 0, totalRowsPerTbl);
|
||||
taos_stmt_close(stmt);
|
||||
printf("case 9 check result end\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return ;
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
TAOS *taos;
|
||||
|
@ -4472,6 +5120,7 @@ int main(int argc, char *argv[])
|
|||
//runCase_long(taos);
|
||||
//SpecifyColumnBatchCase(taos);
|
||||
SpecifyColumnBatchCase_autoCreateTbl(taos);
|
||||
//SpecifyColumnBatchErrorCase(taos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -131,10 +131,12 @@ run general/parser/join.sim
|
|||
run general/parser/join_multivnode.sim
|
||||
run general/parser/select_with_tags.sim
|
||||
run general/parser/groupby.sim
|
||||
run general/parser/top_groupby.sim
|
||||
run general/parser/tags_dynamically_specifiy.sim
|
||||
run general/parser/set_tag_vals.sim
|
||||
#unsupport run general/parser/repeatAlter.sim
|
||||
#unsupport run general/parser/slimit_alter_tags.sim
|
||||
run general/parser/precision_ns.sim
|
||||
run general/stable/disk.sim
|
||||
run general/stable/dnode3.sim
|
||||
run general/stable/metrics.sim
|
||||
|
|
|
@ -112,25 +112,25 @@ endi
|
|||
sql alter database db keep 30
|
||||
sql show databases
|
||||
print keep $data7_db
|
||||
if $data7_db != 20,20,30 then
|
||||
if $data7_db != 30,30,30 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql alter database db keep 40
|
||||
sql show databases
|
||||
print keep $data7_db
|
||||
if $data7_db != 20,20,40 then
|
||||
if $data7_db != 40,40,40 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql alter database db keep 40
|
||||
sql alter database db keep 30
|
||||
sql alter database db keep 40,50
|
||||
sql alter database db keep 30,31
|
||||
sql alter database db keep 20
|
||||
sql_error alter database db keep 10
|
||||
sql_error alter database db keep 10.0
|
||||
sql_error alter database db keep 9
|
||||
sql_error alter database db keep 1
|
||||
sql alter database db keep 0
|
||||
sql alter database db keep -1
|
||||
sql_error alter database db keep 0
|
||||
sql_error alter database db keep -1
|
||||
sql_error alter database db keep 365001
|
||||
|
||||
print ============== step cache
|
||||
|
@ -177,7 +177,7 @@ sql alter database db blocks 20
|
|||
sql alter database db blocks 10
|
||||
sql_error alter database db blocks 2
|
||||
sql_error alter database db blocks 1
|
||||
sql alter database db blocks 0
|
||||
sql_error alter database db blocks 0
|
||||
sql_error alter database db blocks -1
|
||||
sql_error alter database db blocks 10001
|
||||
|
||||
|
|
|
@ -367,7 +367,7 @@ sql_error topic db keep 30
|
|||
sql alter database db keep 30
|
||||
sql show databases
|
||||
print keep $data7_db
|
||||
if $data7_db != 20,20,30 then
|
||||
if $data7_db != 30,30,30 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -375,18 +375,18 @@ sql_error alter topic db keep 40
|
|||
sql alter database db keep 40
|
||||
sql show databases
|
||||
print keep $data7_db
|
||||
if $data7_db != 20,20,40 then
|
||||
if $data7_db != 40,40,40 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql alter database db keep 40
|
||||
sql alter database db keep 30
|
||||
sql alter database db keep 20
|
||||
sql_error alter database db keep 10
|
||||
sql_error alter database db keep 10.0
|
||||
sql_error alter database db keep 9
|
||||
sql_error alter database db keep 1
|
||||
sql alter database db keep 0
|
||||
sql alter database db keep -1
|
||||
sql_error alter database db keep 0
|
||||
sql_error alter database db keep -1
|
||||
sql_error alter database db keep 365001
|
||||
|
||||
sql_error alter topic db keep 40
|
||||
|
@ -455,7 +455,7 @@ sql alter database db blocks 20
|
|||
sql alter database db blocks 10
|
||||
sql_error alter database db blocks 2
|
||||
sql_error alter database db blocks 1
|
||||
sql alter database db blocks 0
|
||||
sql_error alter database db blocks 0
|
||||
sql_error alter database db blocks -1
|
||||
sql_error alter database db blocks 10001
|
||||
|
||||
|
|
|
@ -159,4 +159,4 @@ if $rows != 0 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
|
|
|
@ -0,0 +1,166 @@
|
|||
system sh/stop_dnodes.sh
|
||||
system sh/deploy.sh -n dnode1 -i 1
|
||||
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||
system sh/exec.sh -n dnode1 -s start
|
||||
|
||||
sleep 2000
|
||||
sql connect
|
||||
print ======================== dnode1 start
|
||||
|
||||
$dbPrefix = db
|
||||
$tbPrefix = tb
|
||||
$mtPrefix = st
|
||||
$tbNum = 10
|
||||
$rowNum = 20
|
||||
$totalNum = 200
|
||||
|
||||
print =============== step1
|
||||
$i = 0
|
||||
$db = $dbPrefix . $i
|
||||
$mt = $mtPrefix . $i
|
||||
|
||||
sql create database $db
|
||||
sql use $db
|
||||
sql create table $mt (ts timestamp, tbcol bigint unsigned) TAGS(tgcol bigint unsigned)
|
||||
|
||||
$i = 0
|
||||
while $i < 5
|
||||
$tb = $tbPrefix . $i
|
||||
sql create table $tb using $mt tags( 0 )
|
||||
sql create table $tb using $mt tags( -111 )
|
||||
$x = 0
|
||||
while $x < $rowNum
|
||||
$ms = $x . m
|
||||
sql insert into $tb values (now + $ms , 0 )
|
||||
$x = $x + 1
|
||||
sql_error insert into $tb values (now + $ms , -10)
|
||||
sql_error insert into $tb values (now + $ms , -1000)
|
||||
sql_error insert into $tb values (now + $ms , -10000000)
|
||||
endw
|
||||
$i = $i + 1
|
||||
endw
|
||||
while $i < 10
|
||||
$tb = $tbPrefix . $i
|
||||
sql create table $tb using $mt tags( 1 )
|
||||
$x = 0
|
||||
while $x < $rowNum
|
||||
$ms = $x . m
|
||||
sql insert into $tb values (now + $ms , 1 )
|
||||
$x = $x + 1
|
||||
endw
|
||||
$i = $i + 1
|
||||
endw
|
||||
|
||||
print =============== step2
|
||||
sql select * from $mt where tbcol = 0
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol <> 0
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol = 1
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol <> 1
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol = 1
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol <> 1
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol = 0
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where tbcol <> 0
|
||||
if $rows != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step3
|
||||
sql select * from $mt where ts > now + 4m and tbcol = 1
|
||||
if $rows != 75 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts > now + 4m and tbcol <> 1
|
||||
if $rows != 75 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts < now + 4m and tbcol = 0
|
||||
if $rows != 25 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts < now + 4m and tbcol <> 0
|
||||
if $rows != 25 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts <= now + 4m and tbcol = 0
|
||||
if $rows != 25 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts <= now + 4m and tbcol <> 0
|
||||
if $rows != 25 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts > now + 4m and ts < now + 5m and tbcol <> 0
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from $mt where ts > now + 4m and tbcol <> 0 and ts < now + 5m
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step4
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 200 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step5
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step6
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
print $data10 $data11 $data12 $data13 $data14 $data15 $data16
|
||||
if $data00 != 100 then
|
||||
print expect 100, actual $data00
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step7
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < now + 4m and tbcol = 1 group by tgcol
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step8
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 interval(1d) group by tgcol order by tgcol desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data01 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== clear
|
||||
sql drop database $db
|
||||
sql show databases
|
||||
if $rows != 0 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -20,17 +20,22 @@ sql use db
|
|||
sql create table tb (ts timestamp, val int, val1 int, val2 int)
|
||||
sql create table tb2 (ts timestamp, val int, val1 int, val2 int)
|
||||
sql create table t2 (ts timestamp, val int)
|
||||
sql create table tb3 (ts timestamp, val int, val1 int, val2 int)
|
||||
|
||||
sql insert into tb values('2020-01-01 00:00:00.000', 1, 11, 21)
|
||||
sql insert into tb values('2020-01-02 00:00:00.000', 1, 12, 22)
|
||||
sql insert into tb values('2020-01-03 00:00:00.000', 2, 13, 23)
|
||||
sql insert into tb values('2020-01-04 00:00:00.000', 2, 14, 24)
|
||||
|
||||
|
||||
sql insert into tb2 values('2020-01-01 00:00:00.000', 21, 211, 221)
|
||||
sql insert into tb2 values('2020-01-02 00:00:00.000', 21, 212, 222)
|
||||
sql insert into tb2 values('2020-01-03 00:00:00.000', 22, 213, 223)
|
||||
sql insert into tb2 values('2020-01-04 00:00:00.000', 22, 214, 224)
|
||||
|
||||
|
||||
sql insert into tb3 values('2020-01-01 00:00:00.000', NULL, NULL, NULL)
|
||||
sql insert into tb3 values('2020-01-02 00:00:00.000', NULL, NULL, NULL)
|
||||
print =============== step1 - one query, 1 column, with timestamp
|
||||
|
||||
system_content curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d '[ {"refId":"A","alias":"","sql":"select ts from db.tb where ts >= 1577980800000 "} ]' 127.0.0.1:7111/grafana/query
|
||||
|
@ -235,4 +240,11 @@ if $system_content != @[{"refId":"B","target":"BB{val2:223,}","datapoints":[[213
|
|||
return -1
|
||||
endi
|
||||
|
||||
print =============== step26 - 2 column, no timestamp, NULL
|
||||
system_content curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d '[ {"refId":"A","alias":"","sql":"select * from db.tb3 "} ]' 127.0.0.1:7111/grafana/query
|
||||
print step1-> $system_content
|
||||
if $system_content != @[{"refId":"A","target":"{val1:nil, val2:nil}","datapoints":[[null,1577808000000],[null,1577894400000]]}]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -88,7 +88,7 @@ print =============== step2 - no db
|
|||
#11
|
||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql
|
||||
print 11-> $system_content
|
||||
if $system_content != @{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep0,keep1,keep(D)","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"column_meta":[["name",8,32],["created_time",9,8],["ntables",4,4],["vgroups",4,4],["replica",3,2],["quorum",3,2],["days",3,2],["keep0,keep1,keep(D)",8,24],["cache(MB)",4,4],["blocks",4,4],["minrows",4,4],["maxrows",4,4],["wallevel",2,1],["fsync",4,4],["comp",2,1],["cachelast",2,1],["precision",8,3],["update",2,1],["status",8,10]],"data":[],"rows":0}@ then
|
||||
if $system_content != @{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep0,keep1,keep2","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"column_meta":[["name",8,32],["created_time",9,8],["ntables",4,4],["vgroups",4,4],["replica",3,2],["quorum",3,2],["days",3,2],["keep0,keep1,keep2",8,24],["cache(MB)",4,4],["blocks",4,4],["minrows",4,4],["maxrows",4,4],["wallevel",2,1],["fsync",4,4],["comp",2,1],["cachelast",2,1],["precision",8,3],["update",2,1],["status",8,10]],"data":[],"rows":0}@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
|
|
@ -424,6 +424,10 @@ cd ../../../debug; make
|
|||
./test.sh -f general/parser/stableOp.sim
|
||||
./test.sh -f general/parser/timestamp.sim
|
||||
./test.sh -f general/parser/sliding.sim
|
||||
./test.sh -f general/parser/having.sim
|
||||
./test.sh -f general/parser/having_child.sim
|
||||
./test.sh -f general/parser/between_and.sim
|
||||
./test.sh -f general/parser/last_cache.sim
|
||||
./test.sh -f unique/big/balance.sim
|
||||
|
||||
#======================b7-end===============
|
||||
|
|
|
@ -134,6 +134,7 @@ run general/parser/bug.sim
|
|||
run general/parser/tags_dynamically_specifiy.sim
|
||||
run general/parser/set_tag_vals.sim
|
||||
run general/parser/repeatAlter.sim
|
||||
run general/parser/precision_ns.sim
|
||||
##unsupport run general/parser/slimit_alter_tags.sim
|
||||
run general/stable/disk.sim
|
||||
run general/stable/dnode3.sim
|
||||
|
|
|
@ -34,6 +34,7 @@ print =============== step1 - login
|
|||
system_content curl 127.0.0.1:7111/admin/
|
||||
print 1-> $system_content
|
||||
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||
print actual: $system_content
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
@ -149,6 +150,8 @@ endi
|
|||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from d1.table_admin' 127.0.0.1:7111/admin/all
|
||||
print curl 127.0.0.1:7111/admin/all -----> $system_content
|
||||
if $system_content != @{"status":"succ","head":["ts","i"],"data":[["2017-12-25 21:28:41.022",1],["2017-12-25 21:28:42.022",2],["2017-12-25 21:28:43.022",3],["2017-12-25 21:28:44.022",4],["2017-12-25 21:28:45.022",5],["2017-12-25 21:28:46.022",6],["2017-12-25 21:28:47.022",7],["2017-12-25 21:28:48.022",8],["2017-12-25 21:28:49.022",9],["2017-12-25 21:28:50.022",10],["2017-12-25 21:28:51.022",11]],"rows":11}@ then
|
||||
print actual: $system_content
|
||||
print expect =======> {"status":"succ","head":["ts","i"],"data":[["2017-12-25 21:28:41.022",1],["2017-12-25 21:28:42.022",2],["2017-12-25 21:28:43.022",3],["2017-12-25 21:28:44.022",4],["2017-12-25 21:28:45.022",5],["2017-12-25 21:28:46.022",6],["2017-12-25 21:28:47.022",7],["2017-12-25 21:28:48.022",8],["2017-12-25 21:28:49.022",9],["2017-12-25 21:28:50.022",10],["2017-12-25 21:28:51.022",11]],"rows":11}
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
|
Loading…
Reference in New Issue