Merge branch 'develop' into compress_float
This commit is contained in:
commit
c0e3c29cde
|
@ -32,7 +32,7 @@ ELSEIF (TD_WINDOWS)
|
||||||
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
||||||
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
||||||
IF (TD_MVN_INSTALLED)
|
IF (TD_MVN_INSTALLED)
|
||||||
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.31.jar DESTINATION connector/jdbc)
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.32-dist.jar DESTINATION connector/jdbc)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
ELSEIF (TD_DARWIN)
|
ELSEIF (TD_DARWIN)
|
||||||
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
||||||
|
|
|
@ -557,6 +557,13 @@ c1.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### 关于纳秒 (nanosecon) 在 Python 连接器中的说明
|
||||||
|
|
||||||
|
由于目前 Python 对 nanosecond 支持的不完善(参见链接 1. 2. ),目前的实现方式是在 nanosecond 精度时返回整数,而不是 ms 和 us 返回的 datetime 类型,应用开发者需要自行处理,建议使用 pandas 的 to_datetime()。未来如果 Python 正式完整支持了纳秒,涛思数据可能会修改相关接口。
|
||||||
|
|
||||||
|
1. https://stackoverflow.com/questions/10611328/parsing-datetime-strings-containing-nanoseconds
|
||||||
|
2. https://www.python.org/dev/peps/pep-0564/
|
||||||
|
|
||||||
#### 帮助信息
|
#### 帮助信息
|
||||||
|
|
||||||
用户可通过python的帮助信息直接查看模块的使用信息,或者参考tests/examples/python中的示例程序。以下为部分常用类和方法:
|
用户可通过python的帮助信息直接查看模块的使用信息,或者参考tests/examples/python中的示例程序。以下为部分常用类和方法:
|
||||||
|
|
|
@ -465,43 +465,44 @@ TDengine的所有可执行文件默认存放在 _/usr/local/taos/bin_ 目录下
|
||||||
|
|
||||||
目前 TDengine 有将近 200 个内部保留关键字,这些关键字无论大小写均不可以用作库名、表名、STable 名、数据列名及标签列名等。这些关键字列表如下:
|
目前 TDengine 有将近 200 个内部保留关键字,这些关键字无论大小写均不可以用作库名、表名、STable 名、数据列名及标签列名等。这些关键字列表如下:
|
||||||
|
|
||||||
| 关键字列表 | | | | |
|
| 关键字列表 | | | | |
|
||||||
| ---------- | ----------- | ------------ | ---------- | --------- |
|
| ------------ | ------------ | ------------ | ------------ | ------------ |
|
||||||
| ABLOCKS | CONNECTIONS | HAVING | MODULES | SMALLINT |
|
| ABORT | CREATE | IGNORE | NULL | STAR |
|
||||||
| ABORT | COPY | ID | NCHAR | SPREAD |
|
| ACCOUNT | CTIME | IMMEDIATE | OF | STATE |
|
||||||
| ACCOUNT | COUNT | IF | NE | STABLE |
|
| ACCOUNTS | DATABASE | IMPORT | OFFSET | STATEMENT |
|
||||||
| ACCOUNTS | CREATE | IGNORE | NONE | STABLES |
|
| ADD | DATABASES | IN | OR | STATE_WINDOW |
|
||||||
| ADD | CTIME | IMMEDIATE | NOT | STAR |
|
| AFTER | DAYS | INITIALLY | ORDER | STORAGE |
|
||||||
| AFTER | DATABASE | IMPORT | NOTNULL | STATEMENT |
|
| ALL | DBS | INSERT | PARTITIONS | STREAM |
|
||||||
| ALL | DATABASES | IN | NOW | STDDEV |
|
| ALTER | DEFERRED | INSTEAD | PASS | STREAMS |
|
||||||
| ALTER | DAYS | INITIALLY | OF | STREAM |
|
| AND | DELIMITERS | INT | PLUS | STRING |
|
||||||
| AND | DEFERRED | INSERT | OFFSET | STREAMS |
|
| AS | DESC | INTEGER | PPS | SYNCDB |
|
||||||
| AS | DELIMITERS | INSTEAD | OR | STRING |
|
| ASC | DESCRIBE | INTERVAL | PRECISION | TABLE |
|
||||||
| ASC | DESC | INTEGER | ORDER | SUM |
|
| ATTACH | DETACH | INTO | PREV | TABLES |
|
||||||
| ATTACH | DESCRIBE | INTERVAL | PASS | TABLE |
|
| BEFORE | DISTINCT | IS | PRIVILEGE | TAG |
|
||||||
| AVG | DETACH | INTO | PERCENTILE | TABLES |
|
| BEGIN | DIVIDE | ISNULL | QTIME | TAGS |
|
||||||
| BEFORE | DIFF | IP | PLUS | TAG |
|
| BETWEEN | DNODE | JOIN | QUERIES | TBNAME |
|
||||||
| BEGIN | DISTINCT | IS | PRAGMA | TAGS |
|
| BIGINT | DNODES | KEEP | QUERY | TIMES |
|
||||||
| BETWEEN | DIVIDE | ISNULL | PREV | TBLOCKS |
|
| BINARY | DOT | KEY | QUORUM | TIMESTAMP |
|
||||||
| BIGINT | DNODE | JOIN | PRIVILEGE | TBNAME |
|
| BITAND | DOUBLE | KILL | RAISE | TINYINT |
|
||||||
| BINARY | DNODES | KEEP | QUERIES | TIMES |
|
| BITNOT | DROP | LE | REM | TOPIC |
|
||||||
| BITAND | DOT | KEY | QUERY | TIMESTAMP |
|
| BITOR | EACH | LIKE | REPLACE | TOPICS |
|
||||||
| BITNOT | DOUBLE | KILL | RAISE | TINYINT |
|
| BLOCKS | END | LIMIT | REPLICA | TRIGGER |
|
||||||
| BITOR | DROP | LAST | REM | TOP |
|
| BOOL | EQ | LINEAR | RESET | TSERIES |
|
||||||
| BOOL | EACH | LE | REPLACE | TOPIC |
|
| BY | EXISTS | LOCAL | RESTRICT | UMINUS |
|
||||||
| BOTTOM | END | LEASTSQUARES | REPLICA | TRIGGER |
|
| CACHE | EXPLAIN | LP | ROW | UNION |
|
||||||
| BY | EQ | LIKE | RESET | UMINUS |
|
| CACHELAST | FAIL | LSHIFT | RP | UNSIGNED |
|
||||||
| CACHE | EXISTS | LIMIT | RESTRICT | UNION |
|
| CASCADE | FILE | LT | RSHIFT | UPDATE |
|
||||||
| CASCADE | EXPLAIN | LINEAR | ROW | UPLUS |
|
| CHANGE | FILL | MATCH | SCORES | UPLUS |
|
||||||
| CHANGE | FAIL | LOCAL | ROWS | USE |
|
| CLUSTER | FLOAT | MAXROWS | SELECT | USE |
|
||||||
| CLOG | FILL | LP | RP | USER |
|
| COLON | FOR | MINROWS | SEMI | USER |
|
||||||
| CLUSTER | FIRST | LSHIFT | RSHIFT | USERS |
|
| COLUMN | FROM | MINUS | SESSION | USERS |
|
||||||
| COLON | FLOAT | LT | SCORES | USING |
|
| COMMA | FSYNC | MNODES | SET | USING |
|
||||||
| COLUMN | FOR | MATCH | SELECT | VALUES |
|
| COMP | GE | MODIFY | SHOW | VALUES |
|
||||||
| COMMA | FROM | MAX | SEMI | VARIABLE |
|
| COMPACT | GLOB | MODULES | SLASH | VARIABLE |
|
||||||
| COMP | GE | METRIC | SET | VGROUPS |
|
| CONCAT | GRANTS | NCHAR | SLIDING | VARIABLES |
|
||||||
| CONCAT | GLOB | METRICS | SHOW | VIEW |
|
| CONFLICT | GROUP | NE | SLIMIT | VGROUPS |
|
||||||
| CONFIGS | GRANTS | MIN | SLASH | WAVG |
|
| CONNECTION | GT | NONE | SMALLINT | VIEW |
|
||||||
| CONFLICT | GROUP | MINUS | SLIDING | WHERE |
|
| CONNECTIONS | HAVING | NOT | SOFFSET | VNODES |
|
||||||
| CONNECTION | GT | MNODES | SLIMIT | |
|
| CONNS | ID | NOTNULL | STABLE | WAL |
|
||||||
|
| COPY | IF | NOW | STABLES | WHERE |
|
||||||
|
|
||||||
|
|
|
@ -89,13 +89,13 @@ TDengine 缺省的时间戳是毫秒精度,但通过在 CREATE DATABASE 时传
|
||||||
```mysql
|
```mysql
|
||||||
USE db_name;
|
USE db_name;
|
||||||
```
|
```
|
||||||
使用/切换数据库
|
使用/切换数据库(在 RESTful 连接方式下无效)。
|
||||||
|
|
||||||
- **删除数据库**
|
- **删除数据库**
|
||||||
```mysql
|
```mysql
|
||||||
DROP DATABASE [IF EXISTS] db_name;
|
DROP DATABASE [IF EXISTS] db_name;
|
||||||
```
|
```
|
||||||
删除数据库。所包含的全部数据表将被删除,谨慎使用
|
删除数据库。指定 Database 所包含的全部数据表将被删除,谨慎使用!
|
||||||
|
|
||||||
- **修改数据库参数**
|
- **修改数据库参数**
|
||||||
```mysql
|
```mysql
|
||||||
|
@ -703,22 +703,24 @@ Query OK, 1 row(s) in set (0.001091s)
|
||||||
|
|
||||||
### 支持的条件过滤操作
|
### 支持的条件过滤操作
|
||||||
|
|
||||||
| **Operation** | **Note** | **Applicable Data Types** |
|
| **Operation** | **Note** | **Applicable Data Types** |
|
||||||
| --------------- | ----------------------------- | ------------------------------------- |
|
| --------------- | ----------------------------- | ----------------------------------------- |
|
||||||
| > | larger than | **`timestamp`** and all numeric types |
|
| > | larger than | **`timestamp`** and all numeric types |
|
||||||
| < | smaller than | **`timestamp`** and all numeric types |
|
| < | smaller than | **`timestamp`** and all numeric types |
|
||||||
| >= | larger than or equal to | **`timestamp`** and all numeric types |
|
| >= | larger than or equal to | **`timestamp`** and all numeric types |
|
||||||
| <= | smaller than or equal to | **`timestamp`** and all numeric types |
|
| <= | smaller than or equal to | **`timestamp`** and all numeric types |
|
||||||
| = | equal to | all types |
|
| = | equal to | all types |
|
||||||
| <> | not equal to | all types |
|
| <> | not equal to | all types |
|
||||||
| between and | within a certain range | **`timestamp`** and all numeric types |
|
| between and | within a certain range | **`timestamp`** and all numeric types |
|
||||||
| % | match with any char sequences | **`binary`** **`nchar`** |
|
| in | matches any value in a set | all types except first column `timestamp` |
|
||||||
| _ | match with a single char | **`binary`** **`nchar`** |
|
| % | match with any char sequences | **`binary`** **`nchar`** |
|
||||||
|
| _ | match with a single char | **`binary`** **`nchar`** |
|
||||||
|
|
||||||
1. <> 算子也可以写为 != ,请注意,这个算子不能用于数据表第一列的 timestamp 字段。
|
1. <> 算子也可以写为 != ,请注意,这个算子不能用于数据表第一列的 timestamp 字段。
|
||||||
2. 同时进行多个字段的范围过滤,需要使用关键词 AND 来连接不同的查询条件,暂不支持 OR 连接的不同列之间的查询过滤条件。
|
2. 同时进行多个字段的范围过滤,需要使用关键词 AND 来连接不同的查询条件,暂不支持 OR 连接的不同列之间的查询过滤条件。
|
||||||
3. 针对单一字段的过滤,如果是时间过滤条件,则一条语句中只支持设定一个;但针对其他的(普通)列或标签列,则可以使用 `OR` 关键字进行组合条件的查询过滤。例如:((value > 20 AND value < 30) OR (value < 12)) 。
|
3. 针对单一字段的过滤,如果是时间过滤条件,则一条语句中只支持设定一个;但针对其他的(普通)列或标签列,则可以使用 `OR` 关键字进行组合条件的查询过滤。例如: `((value > 20 AND value < 30) OR (value < 12))`。
|
||||||
4. 从 2.0.17 版本开始,条件过滤开始支持 BETWEEN AND 语法,例如 `WHERE col2 BETWEEN 1.5 AND 3.25` 表示查询条件为“1.5 ≤ col2 ≤ 3.25”。
|
4. 从 2.0.17.0 版本开始,条件过滤开始支持 BETWEEN AND 语法,例如 `WHERE col2 BETWEEN 1.5 AND 3.25` 表示查询条件为“1.5 ≤ col2 ≤ 3.25”。
|
||||||
|
5. 从 2.1.4.0 版本开始,条件过滤开始支持 IN 算子,例如 `WHERE city IN ('Beijing', 'Shanghai')`。说明:BOOL 类型写作 `{true, false}` 或 `{0, 1}` 均可,但不能写作 0、1 之外的整数;FLOAT 和 DOUBLE 类型会受到浮点数精度影响,集合内的值在精度范围内认为和数据行的值完全相等才能匹配成功。<!-- REPLACE_OPEN_TO_ENTERPRISE__IN_OPERATOR_AND_UNSIGNED_INTEGER -->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
<a class="anchor" id="having"></a>
|
<a class="anchor" id="having"></a>
|
||||||
|
|
|
@ -8,7 +8,7 @@ IF (TD_MVN_INSTALLED)
|
||||||
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
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.31.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
|
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||||
COMMENT "build jdbc driver")
|
COMMENT "build jdbc driver")
|
||||||
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.31</version>
|
<version>2.0.32</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.31</version>
|
<version>2.0.32</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
||||||
|
@ -113,16 +113,16 @@
|
||||||
<include>**/*Test.java</include>
|
<include>**/*Test.java</include>
|
||||||
</includes>
|
</includes>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>**/TSDBJNIConnectorTest.java</exclude>
|
|
||||||
<exclude>**/UnsignedNumberJniTest.java</exclude>
|
|
||||||
<exclude>**/DatetimeBefore1970Test.java</exclude>
|
|
||||||
<exclude>**/AppMemoryLeakTest.java</exclude>
|
<exclude>**/AppMemoryLeakTest.java</exclude>
|
||||||
<exclude>**/AuthenticationTest.java</exclude>
|
<exclude>**/AuthenticationTest.java</exclude>
|
||||||
<exclude>**/TaosInfoMonitorTest.java</exclude>
|
<exclude>**/ConnectMultiTaosdByRestfulWithDifferentTokenTest.java</exclude>
|
||||||
|
<exclude>**/DatetimeBefore1970Test.java</exclude>
|
||||||
<exclude>**/FailOverTest.java</exclude>
|
<exclude>**/FailOverTest.java</exclude>
|
||||||
<exclude>**/InvalidResultSetPointerTest.java</exclude>
|
<exclude>**/InvalidResultSetPointerTest.java</exclude>
|
||||||
<exclude>**/RestfulConnectionTest.java</exclude>
|
<exclude>**/RestfulConnectionTest.java</exclude>
|
||||||
<exclude>**/ConnectMultiTaosdByRestfulWithDifferentTokenTest.java</exclude>
|
<exclude>**/TSDBJNIConnectorTest.java</exclude>
|
||||||
|
<exclude>**/TaosInfoMonitorTest.java</exclude>
|
||||||
|
<exclude>**/UnsignedNumberJniTest.java</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
<testFailureIgnore>true</testFailureIgnore>
|
<testFailureIgnore>true</testFailureIgnore>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import com.taosdata.jdbc.rs.enums.TimestampFormat;
|
import com.taosdata.jdbc.enums.TimestampFormat;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
|
@ -306,9 +306,6 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
|
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
|
||||||
|
|
||||||
switch (resultSetHoldability) {
|
switch (resultSetHoldability) {
|
||||||
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
||||||
break;
|
break;
|
||||||
|
@ -322,11 +319,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
|
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
|
||||||
throws SQLException {
|
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
|
||||||
|
|
||||||
switch (resultSetHoldability) {
|
switch (resultSetHoldability) {
|
||||||
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
|
||||||
break;
|
break;
|
||||||
|
@ -425,7 +418,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
status = resultSet.getInt("server_status()");
|
status = resultSet.getInt("server_status()");
|
||||||
resultSet.close();
|
resultSet.close();
|
||||||
}
|
}
|
||||||
return status == 1 ? true : false;
|
return status == 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
boolean status = false;
|
boolean status = false;
|
||||||
|
@ -434,9 +427,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
status = future.get();
|
status = future.get();
|
||||||
else
|
else
|
||||||
status = future.get(timeout, TimeUnit.SECONDS);
|
status = future.get(timeout, TimeUnit.SECONDS);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
e.printStackTrace();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
future.cancel(true);
|
future.cancel(true);
|
||||||
|
@ -452,8 +443,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
|
||||||
if (clientInfoProps != null)
|
clientInfoProps.setProperty(name, value);
|
||||||
clientInfoProps.setProperty(name, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -461,8 +451,8 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
|
||||||
for (Enumeration<Object> enumer = properties.keys(); enumer.hasMoreElements(); ) {
|
for (Enumeration<Object> enumeration = properties.keys(); enumeration.hasMoreElements(); ) {
|
||||||
String name = (String) enumer.nextElement();
|
String name = (String) enumeration.nextElement();
|
||||||
clientInfoProps.put(name, properties.getProperty(name));
|
clientInfoProps.put(name, properties.getProperty(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -528,14 +518,13 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
if (milliseconds < 0)
|
if (milliseconds < 0)
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNetworkTimeout() throws SQLException {
|
public int getNetworkTimeout() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
|
return 0;
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,7 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da
|
||||||
private final static int DRIVER_MAJAR_VERSION = 2;
|
private final static int DRIVER_MAJAR_VERSION = 2;
|
||||||
private final static int DRIVER_MINOR_VERSION = 0;
|
private final static int DRIVER_MINOR_VERSION = 0;
|
||||||
|
|
||||||
private String precision = "ms";
|
private String precision = TSDBConstants.DEFAULT_PRECISION;
|
||||||
private String database;
|
|
||||||
|
|
||||||
public boolean allProceduresAreCallable() throws SQLException {
|
public boolean allProceduresAreCallable() throws SQLException {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1223,7 +1222,6 @@ public abstract class AbstractDatabaseMetaData extends WrapperImpl implements Da
|
||||||
ResultSet databases = stmt.executeQuery("show databases");
|
ResultSet databases = stmt.executeQuery("show databases");
|
||||||
while (databases.next()) {
|
while (databases.next()) {
|
||||||
String dbname = databases.getString("name");
|
String dbname = databases.getString("name");
|
||||||
this.database = dbname;
|
|
||||||
this.precision = databases.getString("precision");
|
this.precision = databases.getString("precision");
|
||||||
if (dbname.equalsIgnoreCase(catalog))
|
if (dbname.equalsIgnoreCase(catalog))
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -58,7 +58,7 @@ public abstract class AbstractDriver implements Driver {
|
||||||
value = parameterValuePair.substring(indexOfEqual + 1);
|
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);
|
urlProps.setProperty(parameter, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ public abstract class AbstractDriver implements Driver {
|
||||||
url = url.substring(0, indexOfColon);
|
url = url.substring(0, indexOfColon);
|
||||||
}
|
}
|
||||||
// parse host
|
// 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);
|
urlProps.setProperty(TSDBDriver.PROPERTY_KEY_HOST, url);
|
||||||
}
|
}
|
||||||
return urlProps;
|
return urlProps;
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import com.sun.org.apache.xpath.internal.operations.Bool;
|
|
||||||
|
|
||||||
import java.sql.ParameterMetaData;
|
import java.sql.ParameterMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.*;
|
import java.sql.ResultSetMetaData;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -130,7 +132,7 @@ public class DatabaseMetaDataResultSet extends AbstractResultSet {
|
||||||
public Timestamp getTimestamp(int columnIndex) throws SQLException {
|
public Timestamp getTimestamp(int columnIndex) throws SQLException {
|
||||||
int colType = columnMetaDataList.get(columnIndex - 1).getColType();
|
int colType = columnMetaDataList.get(columnIndex - 1).getColType();
|
||||||
int nativeType = TSDBConstants.jdbcType2TaosType(colType);
|
int nativeType = TSDBConstants.jdbcType2TaosType(colType);
|
||||||
return rowCursor.getTimestamp(columnIndex,nativeType);
|
return rowCursor.getTimestamp(columnIndex, nativeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -145,9 +147,7 @@ public class DatabaseMetaDataResultSet extends AbstractResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int findColumn(String columnLabel) throws SQLException {
|
public int findColumn(String columnLabel) throws SQLException {
|
||||||
Iterator<ColumnMetaData> colMetaDataIt = this.columnMetaDataList.iterator();
|
for (ColumnMetaData colMetaData : this.columnMetaDataList) {
|
||||||
while (colMetaDataIt.hasNext()) {
|
|
||||||
ColumnMetaData colMetaData = colMetaDataIt.next();
|
|
||||||
if (colMetaData.getColName() != null && colMetaData.getColName().equals(columnLabel)) {
|
if (colMetaData.getColName() != null && colMetaData.getColName().equals(columnLabel)) {
|
||||||
return colMetaData.getColIndex();
|
return colMetaData.getColIndex();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ import java.util.Calendar;
|
||||||
import java.util.Map;
|
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
|
* standard JDBC API contains more or less some adjustments customized for certain
|
||||||
* compatibility needs.
|
* compatibility needs.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.util.Properties;
|
||||||
public class TSDBConnection extends AbstractConnection {
|
public class TSDBConnection extends AbstractConnection {
|
||||||
|
|
||||||
private TSDBJNIConnector connector;
|
private TSDBJNIConnector connector;
|
||||||
private TSDBDatabaseMetaData databaseMetaData;
|
private final TSDBDatabaseMetaData databaseMetaData;
|
||||||
private boolean batchFetch;
|
private boolean batchFetch;
|
||||||
|
|
||||||
public Boolean getBatchFetch() {
|
public Boolean getBatchFetch() {
|
||||||
|
|
|
@ -54,10 +54,11 @@ public abstract class TSDBConstants {
|
||||||
public static final int TSDB_DATA_TYPE_USMALLINT = 12; //unsigned smallint
|
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_UINT = 13; //unsigned int
|
||||||
public static final int TSDB_DATA_TYPE_UBIGINT = 14; //unsigned bigint
|
public static final int TSDB_DATA_TYPE_UBIGINT = 14; //unsigned bigint
|
||||||
|
|
||||||
// nchar column max length
|
// nchar column max length
|
||||||
public static final int maxFieldSize = 16 * 1024;
|
public static final int maxFieldSize = 16 * 1024;
|
||||||
|
|
||||||
// precision for data types
|
// precision for data types, this is used for metadata
|
||||||
public static final int BOOLEAN_PRECISION = 1;
|
public static final int BOOLEAN_PRECISION = 1;
|
||||||
public static final int TINYINT_PRECISION = 4;
|
public static final int TINYINT_PRECISION = 4;
|
||||||
public static final int SMALLINT_PRECISION = 6;
|
public static final int SMALLINT_PRECISION = 6;
|
||||||
|
@ -67,10 +68,12 @@ public abstract class TSDBConstants {
|
||||||
public static final int DOUBLE_PRECISION = 22;
|
public static final int DOUBLE_PRECISION = 22;
|
||||||
public static final int TIMESTAMP_MS_PRECISION = 23;
|
public static final int TIMESTAMP_MS_PRECISION = 23;
|
||||||
public static final int TIMESTAMP_US_PRECISION = 26;
|
public static final int TIMESTAMP_US_PRECISION = 26;
|
||||||
// scale for data types
|
// scale for data types, this is used for metadata
|
||||||
public static final int FLOAT_SCALE = 31;
|
public static final int FLOAT_SCALE = 31;
|
||||||
public static final int DOUBLE_SCALE = 31;
|
public static final int DOUBLE_SCALE = 31;
|
||||||
|
|
||||||
|
public static final String DEFAULT_PRECISION = "ms";
|
||||||
|
|
||||||
public static int typeName2JdbcType(String type) {
|
public static int typeName2JdbcType(String type) {
|
||||||
switch (type.toUpperCase()) {
|
switch (type.toUpperCase()) {
|
||||||
case "TIMESTAMP":
|
case "TIMESTAMP":
|
||||||
|
|
|
@ -20,8 +20,8 @@ import java.sql.SQLException;
|
||||||
|
|
||||||
public class TSDBDatabaseMetaData extends AbstractDatabaseMetaData {
|
public class TSDBDatabaseMetaData extends AbstractDatabaseMetaData {
|
||||||
|
|
||||||
private String url;
|
private final String url;
|
||||||
private String userName;
|
private final String userName;
|
||||||
private Connection conn;
|
private Connection conn;
|
||||||
|
|
||||||
public TSDBDatabaseMetaData(String url, String userName) {
|
public TSDBDatabaseMetaData(String url, String userName) {
|
||||||
|
|
|
@ -176,7 +176,7 @@ public class TSDBDriver extends AbstractDriver {
|
||||||
int beginningOfSlashes = url.indexOf("//");
|
int beginningOfSlashes = url.indexOf("//");
|
||||||
int index = url.indexOf("?");
|
int index = url.indexOf("?");
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
String paramString = url.substring(index + 1, url.length());
|
String paramString = url.substring(index + 1);
|
||||||
url = url.substring(0, index);
|
url = url.substring(0, index);
|
||||||
StringTokenizer queryParams = new StringTokenizer(paramString, "&");
|
StringTokenizer queryParams = new StringTokenizer(paramString, "&");
|
||||||
while (queryParams.hasMoreElements()) {
|
while (queryParams.hasMoreElements()) {
|
||||||
|
@ -213,7 +213,7 @@ public class TSDBDriver extends AbstractDriver {
|
||||||
url = url.substring(0, indexOfColon);
|
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);
|
urlProps.setProperty(TSDBDriver.PROPERTY_KEY_HOST, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ public class TSDBDriver extends AbstractDriver {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
|
public Logger getParentLogger() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class TSDBError {
|
public class TSDBError {
|
||||||
private static Map<Integer, String> TSDBErrorMap = new HashMap<>();
|
private static final Map<Integer, String> TSDBErrorMap = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED, "connection already closed");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED, "connection already closed");
|
||||||
|
@ -34,9 +34,8 @@ public class TSDBError {
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE, "unknown taos type in tdengine");
|
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_TIMESTAMP_PERCISION, "unknown timestamp precision");
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN, "unknown error");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN, "unknown error");
|
||||||
/**************************************************/
|
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SUBSCRIBE_FAILED, "failed to create subscription");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SUBSCRIBE_FAILED, "failed to create subscription");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_TDENGINE_ERROR, "internal error of database");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_TDENGINE_ERROR, "internal error of database");
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class TSDBErrorNumbers {
|
public class TSDBErrorNumbers {
|
||||||
|
|
||||||
|
@ -39,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_FETCH_END = 0x2358; // fetch to the end of resultSet
|
||||||
public static final int ERROR_JNI_OUT_OF_MEMORY = 0x2359; // JNI alloc memory failed
|
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 {
|
static {
|
||||||
errorNumbers = new HashSet();
|
|
||||||
errorNumbers.add(ERROR_CONNECTION_CLOSED);
|
errorNumbers.add(ERROR_CONNECTION_CLOSED);
|
||||||
errorNumbers.add(ERROR_UNSUPPORTED_METHOD);
|
errorNumbers.add(ERROR_UNSUPPORTED_METHOD);
|
||||||
errorNumbers.add(ERROR_INVALID_VARIABLE);
|
errorNumbers.add(ERROR_INVALID_VARIABLE);
|
||||||
|
@ -65,7 +65,6 @@ public class TSDBErrorNumbers {
|
||||||
errorNumbers.add(ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE);
|
errorNumbers.add(ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE);
|
||||||
errorNumbers.add(ERROR_UNKNOWN_TIMESTAMP_PERCISION);
|
errorNumbers.add(ERROR_UNKNOWN_TIMESTAMP_PERCISION);
|
||||||
|
|
||||||
/*****************************************************/
|
|
||||||
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
||||||
errorNumbers.add(ERROR_UNSUPPORTED_ENCODING);
|
errorNumbers.add(ERROR_UNSUPPORTED_ENCODING);
|
||||||
errorNumbers.add(ERROR_JNI_TDENGINE_ERROR);
|
errorNumbers.add(ERROR_JNI_TDENGINE_ERROR);
|
||||||
|
|
|
@ -29,14 +29,9 @@ import java.util.List;
|
||||||
public class TSDBJNIConnector {
|
public class TSDBJNIConnector {
|
||||||
private static volatile Boolean isInitialized = false;
|
private static volatile Boolean isInitialized = false;
|
||||||
|
|
||||||
private TaosInfo taosInfo = TaosInfo.getInstance();
|
private final TaosInfo taosInfo = TaosInfo.getInstance();
|
||||||
|
private long taos = TSDBConstants.JNI_NULL_POINTER; // Connection pointer used in C
|
||||||
// Connection pointer used in C
|
private boolean isResultsetClosed; // result set status in current connection
|
||||||
private long taos = TSDBConstants.JNI_NULL_POINTER;
|
|
||||||
|
|
||||||
// result set status in current connection
|
|
||||||
private boolean isResultsetClosed;
|
|
||||||
|
|
||||||
private int affectedRows = -1;
|
private int affectedRows = -1;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@ -96,11 +91,9 @@ public class TSDBJNIConnector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute DML/DDL operation
|
* Execute DML/DDL operation
|
||||||
*
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
*/
|
||||||
public long executeQuery(String sql) throws SQLException {
|
public long executeQuery(String sql) throws SQLException {
|
||||||
Long pSql = 0l;
|
long pSql = 0L;
|
||||||
try {
|
try {
|
||||||
pSql = this.executeQueryImp(sql.getBytes(TaosGlobalConfig.getCharset()), this.taos);
|
pSql = this.executeQueryImp(sql.getBytes(TaosGlobalConfig.getCharset()), this.taos);
|
||||||
taosInfo.stmt_count_increment();
|
taosInfo.stmt_count_increment();
|
||||||
|
@ -161,7 +154,7 @@ public class TSDBJNIConnector {
|
||||||
private native long getResultSetImp(long connection, long pSql);
|
private native long getResultSetImp(long connection, long pSql);
|
||||||
|
|
||||||
public boolean isUpdateQuery(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);
|
private native long isUpdateQueryImp(long connection, long pSql);
|
||||||
|
@ -195,7 +188,7 @@ public class TSDBJNIConnector {
|
||||||
*/
|
*/
|
||||||
public int getSchemaMetaData(long resultSet, List<ColumnMetaData> columnMetaData) {
|
public int getSchemaMetaData(long resultSet, List<ColumnMetaData> columnMetaData) {
|
||||||
int ret = this.getSchemaMetaDataImp(this.taos, resultSet, columnMetaData);
|
int ret = this.getSchemaMetaDataImp(this.taos, resultSet, columnMetaData);
|
||||||
columnMetaData.stream().forEach(column -> column.setColIndex(column.getColIndex() + 1));
|
columnMetaData.forEach(column -> column.setColIndex(column.getColIndex() + 1));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,8 +211,9 @@ public class TSDBJNIConnector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Result Time Precision.
|
* Get Result Time Precision.
|
||||||
|
*
|
||||||
* @return 0: ms, 1: us, 2: ns
|
* @return 0: ms, 1: us, 2: ns
|
||||||
*/
|
*/
|
||||||
public int getResultTimePrecision(long sqlObj) {
|
public int getResultTimePrecision(long sqlObj) {
|
||||||
return this.getResultTimePrecisionImp(this.taos, sqlObj);
|
return this.getResultTimePrecisionImp(this.taos, sqlObj);
|
||||||
}
|
}
|
||||||
|
@ -228,8 +222,6 @@ public class TSDBJNIConnector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute close operation from C to release connection pointer by JNI
|
* Execute close operation from C to release connection pointer by JNI
|
||||||
*
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
*/
|
||||||
public void closeConnection() throws SQLException {
|
public void closeConnection() throws SQLException {
|
||||||
int code = this.closeConnectionImp(this.taos);
|
int code = this.closeConnectionImp(this.taos);
|
||||||
|
@ -268,8 +260,6 @@ public class TSDBJNIConnector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unsubscribe, close a subscription
|
* Unsubscribe, close a subscription
|
||||||
*
|
|
||||||
* @param subscription
|
|
||||||
*/
|
*/
|
||||||
void unsubscribe(long subscription, boolean isKeep) {
|
void unsubscribe(long subscription, boolean isKeep) {
|
||||||
unsubscribeImp(subscription, isKeep);
|
unsubscribeImp(subscription, isKeep);
|
||||||
|
@ -282,13 +272,13 @@ public class TSDBJNIConnector {
|
||||||
*/
|
*/
|
||||||
public boolean validateCreateTableSql(String sql) {
|
public boolean validateCreateTableSql(String sql) {
|
||||||
int res = validateCreateTableSqlImp(taos, sql.getBytes());
|
int res = validateCreateTableSqlImp(taos, sql.getBytes());
|
||||||
return res != 0 ? false : true;
|
return res == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native int validateCreateTableSqlImp(long connection, byte[] sqlBytes);
|
private native int validateCreateTableSqlImp(long connection, byte[] sqlBytes);
|
||||||
|
|
||||||
public long prepareStmt(String sql) throws SQLException {
|
public long prepareStmt(String sql) throws SQLException {
|
||||||
Long stmt;
|
long stmt;
|
||||||
try {
|
try {
|
||||||
stmt = prepareStmtImp(sql.getBytes(), this.taos);
|
stmt = prepareStmtImp(sql.getBytes(), this.taos);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -62,8 +62,8 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
|
|
||||||
if (parameterCnt > 1) {
|
if (parameterCnt > 1) {
|
||||||
// the table name is also a parameter, so ignore it.
|
// the table name is also a parameter, so ignore it.
|
||||||
this.colData = new ArrayList<ColumnInfo>();
|
this.colData = new ArrayList<>();
|
||||||
this.tableTags = new ArrayList<TableTagInfo>();
|
this.tableTags = new ArrayList<>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,12 +73,16 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
* Some of the SQLs sent by other popular frameworks or tools like Spark, contains syntax that cannot be parsed by
|
* Some of the SQLs sent by other popular frameworks or tools like Spark, contains syntax that cannot be parsed by
|
||||||
* the TDengine client. Thus, some simple parsers/filters are intentionally added in this JDBC implementation in
|
* the TDengine client. Thus, some simple parsers/filters are intentionally added in this JDBC implementation in
|
||||||
* order to process those supported SQLs.
|
* order to process those supported SQLs.
|
||||||
*/
|
*/
|
||||||
private void preprocessSql() {
|
private void preprocessSql() {
|
||||||
/***** For processing some of Spark SQLs*****/
|
/***For processing some of Spark SQLs*/
|
||||||
// should replace it first
|
// should replace it first
|
||||||
this.rawSql = this.rawSql.replaceAll("or (.*) is null", "");
|
this.rawSql = this.rawSql.replaceAll("or (.*) is null", "");
|
||||||
this.rawSql = this.rawSql.replaceAll(" where ", " WHERE ");
|
this.rawSql = this.rawSql.replaceAll(" where ", " WHERE ");
|
||||||
|
@ -125,7 +129,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
}
|
}
|
||||||
rawSql = rawSql.replace(matcher.group(1), tableFullName);
|
rawSql = rawSql.replace(matcher.group(1), tableFullName);
|
||||||
}
|
}
|
||||||
/***** for inner queries *****/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -519,12 +522,10 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
private static class TableTagInfo {
|
private static class TableTagInfo {
|
||||||
private boolean isNull;
|
private boolean isNull;
|
||||||
private Object value;
|
private final Object value;
|
||||||
private int type;
|
private final int type;
|
||||||
|
|
||||||
public TableTagInfo(Object value, int type) {
|
public TableTagInfo(Object value, int type) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
@ -538,8 +539,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
public void setTableName(String name) {
|
public void setTableName(String name) {
|
||||||
this.tableName = name;
|
this.tableName = name;
|
||||||
}
|
}
|
||||||
|
@ -627,7 +626,7 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
this.colData.addAll(Collections.nCopies(this.parameters.length - 1 - this.tableTags.size(), null));
|
this.colData.addAll(Collections.nCopies(this.parameters.length - 1 - this.tableTags.size(), null));
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnInfo col = (ColumnInfo) this.colData.get(columnIndex);
|
ColumnInfo col = this.colData.get(columnIndex);
|
||||||
if (col == null) {
|
if (col == null) {
|
||||||
ColumnInfo p = new ColumnInfo();
|
ColumnInfo p = new ColumnInfo();
|
||||||
p.setType(type);
|
p.setType(type);
|
||||||
|
@ -718,8 +717,7 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
ByteBuffer isNullList = ByteBuffer.allocate(num * Integer.BYTES);
|
ByteBuffer isNullList = ByteBuffer.allocate(num * Integer.BYTES);
|
||||||
isNullList.order(ByteOrder.LITTLE_ENDIAN);
|
isNullList.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
for (int i = 0; i < num; ++i) {
|
for (TableTagInfo tag : this.tableTags) {
|
||||||
TableTagInfo tag = this.tableTags.get(i);
|
|
||||||
if (tag.isNull) {
|
if (tag.isNull) {
|
||||||
typeList.put((byte) tag.type);
|
typeList.put((byte) tag.type);
|
||||||
isNullList.putInt(1);
|
isNullList.putInt(1);
|
||||||
|
@ -818,7 +816,7 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
typeList, lengthList, isNullList);
|
typeList, lengthList, isNullList);
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnInfo colInfo = (ColumnInfo) this.colData.get(0);
|
ColumnInfo colInfo = this.colData.get(0);
|
||||||
if (colInfo == null) {
|
if (colInfo == null) {
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "column data not bind");
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "column data not bind");
|
||||||
}
|
}
|
||||||
|
@ -954,7 +952,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "not support data types");
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "not support data types");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
;
|
|
||||||
|
|
||||||
connector.bindColumnDataArray(this.nativeStmtHandle, colDataList, lengthList, isNullList, col1.type, col1.bytes, rows, i);
|
connector.bindColumnDataArray(this.nativeStmtHandle, colDataList, lengthList, isNullList, col1.type, col1.bytes, rows, i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,11 +339,11 @@ public class TSDBResultSet extends AbstractResultSet implements ResultSet {
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||||
res = new BigDecimal(Long.valueOf(this.rowData.getObject(columnIndex).toString()));
|
res = new BigDecimal(Long.parseLong(this.rowData.getObject(columnIndex).toString()));
|
||||||
break;
|
break;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||||
res = new BigDecimal(Double.valueOf(this.rowData.getObject(columnIndex).toString()));
|
res = BigDecimal.valueOf(Double.parseDouble(this.rowData.getObject(columnIndex).toString()));
|
||||||
break;
|
break;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
return new BigDecimal(((Timestamp) this.rowData.getObject(columnIndex)).getTime());
|
return new BigDecimal(((Timestamp) this.rowData.getObject(columnIndex)).getTime());
|
||||||
|
|
|
@ -36,23 +36,20 @@ public class TSDBResultSetBlockData {
|
||||||
private int rowIndex = 0;
|
private int rowIndex = 0;
|
||||||
|
|
||||||
private List<ColumnMetaData> columnMetaDataList;
|
private List<ColumnMetaData> columnMetaDataList;
|
||||||
private ArrayList<Object> colData = null;
|
private ArrayList<Object> colData;
|
||||||
|
|
||||||
public TSDBResultSetBlockData(List<ColumnMetaData> colMeta, int numOfCols) {
|
public TSDBResultSetBlockData(List<ColumnMetaData> colMeta, int numOfCols) {
|
||||||
this.columnMetaDataList = colMeta;
|
this.columnMetaDataList = colMeta;
|
||||||
this.colData = new ArrayList<Object>(numOfCols);
|
this.colData = new ArrayList<>(numOfCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSDBResultSetBlockData() {
|
public TSDBResultSetBlockData() {
|
||||||
this.colData = new ArrayList<Object>();
|
this.colData = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
int size = this.colData.size();
|
int size = this.colData.size();
|
||||||
if (this.colData != null) {
|
this.colData.clear();
|
||||||
this.colData.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
setNumOfCols(size);
|
setNumOfCols(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +66,7 @@ public class TSDBResultSetBlockData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNumOfCols(int numOfCols) {
|
public void setNumOfCols(int numOfCols) {
|
||||||
this.colData = new ArrayList<Object>(numOfCols);
|
this.colData = new ArrayList<>(numOfCols);
|
||||||
this.colData.addAll(Collections.nCopies(numOfCols, null));
|
this.colData.addAll(Collections.nCopies(numOfCols, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,14 +164,9 @@ public class TSDBResultSetBlockData {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The original type may not be a string type, but will be converted to by
|
* The original type may not be a string type, but will be converted to by
|
||||||
* calling this method
|
* calling this method
|
||||||
*
|
|
||||||
* @param col column index
|
|
||||||
* @return
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
*/
|
||||||
public String getString(int col) throws SQLException {
|
public String getString(int col) throws SQLException {
|
||||||
Object obj = get(col);
|
Object obj = get(col);
|
||||||
|
@ -387,7 +379,7 @@ public class TSDBResultSetBlockData {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (long) val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_FLOAT: {
|
case TSDBConstants.TSDB_DATA_TYPE_FLOAT: {
|
||||||
|
|
|
@ -41,10 +41,7 @@ public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaD
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSearchable(int column) throws SQLException {
|
public boolean isSearchable(int column) throws SQLException {
|
||||||
if (column == 1) {
|
return column == 1;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCurrency(int column) throws SQLException {
|
public boolean isCurrency(int column) throws SQLException {
|
||||||
|
|
|
@ -19,14 +19,13 @@ import com.taosdata.jdbc.utils.NullType;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
public class TSDBResultSetRowData {
|
public class TSDBResultSetRowData {
|
||||||
|
|
||||||
private ArrayList<Object> data;
|
private ArrayList<Object> data;
|
||||||
private int colSize;
|
private final int colSize;
|
||||||
|
|
||||||
public TSDBResultSetRowData(int colSize) {
|
public TSDBResultSetRowData(int colSize) {
|
||||||
this.colSize = colSize;
|
this.colSize = colSize;
|
||||||
|
@ -390,27 +389,27 @@ public class TSDBResultSetRowData {
|
||||||
|
|
||||||
switch (nativeType) {
|
switch (nativeType) {
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT: {
|
case TSDBConstants.TSDB_DATA_TYPE_UTINYINT: {
|
||||||
Byte value = new Byte(String.valueOf(obj));
|
byte value = new Byte(String.valueOf(obj));
|
||||||
if (value >= 0)
|
if (value >= 0)
|
||||||
return value.toString();
|
return Byte.toString(value);
|
||||||
return Integer.toString(value & 0xff);
|
return Integer.toString(value & 0xff);
|
||||||
}
|
}
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_USMALLINT: {
|
case TSDBConstants.TSDB_DATA_TYPE_USMALLINT: {
|
||||||
Short value = new Short(String.valueOf(obj));
|
short value = new Short(String.valueOf(obj));
|
||||||
if (value >= 0)
|
if (value >= 0)
|
||||||
return value.toString();
|
return Short.toString(value);
|
||||||
return Integer.toString(value & 0xffff);
|
return Integer.toString(value & 0xffff);
|
||||||
}
|
}
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_UINT: {
|
case TSDBConstants.TSDB_DATA_TYPE_UINT: {
|
||||||
Integer value = new Integer(String.valueOf(obj));
|
int value = new Integer(String.valueOf(obj));
|
||||||
if (value >= 0)
|
if (value >= 0)
|
||||||
return value.toString();
|
return Integer.toString(value);
|
||||||
return Long.toString(value & 0xffffffffl);
|
return Long.toString(value & 0xffffffffL);
|
||||||
}
|
}
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_UBIGINT: {
|
case TSDBConstants.TSDB_DATA_TYPE_UBIGINT: {
|
||||||
Long value = new Long(String.valueOf(obj));
|
long value = new Long(String.valueOf(obj));
|
||||||
if (value >= 0)
|
if (value >= 0)
|
||||||
return value.toString();
|
return Long.toString(value);
|
||||||
long lowValue = value & 0x7fffffffffffffffL;
|
long lowValue = value & 0x7fffffffffffffffL;
|
||||||
return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1)).toString();
|
return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1)).toString();
|
||||||
}
|
}
|
||||||
|
@ -432,25 +431,26 @@ public class TSDBResultSetRowData {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
|
||||||
|
*
|
||||||
* @param precision 0 : ms, 1 : us, 2 : ns
|
* @param precision 0 : ms, 1 : us, 2 : ns
|
||||||
*/
|
*/
|
||||||
public void setTimestamp(int col, long ts, int precision) {
|
public void setTimestamp(int col, long ts, int precision) {
|
||||||
long milliseconds = 0;
|
long milliseconds;
|
||||||
int fracNanoseconds = 0;
|
int fracNanoseconds;
|
||||||
switch (precision) {
|
switch (precision) {
|
||||||
case 0: {
|
case 0: {
|
||||||
milliseconds = ts;
|
milliseconds = ts;
|
||||||
fracNanoseconds = (int)(ts*1_000_000%1_000_000_000);
|
fracNanoseconds = (int) (ts * 1_000_000 % 1_000_000_000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case 1: {
|
||||||
milliseconds = ts/1_000;
|
milliseconds = ts / 1_000;
|
||||||
fracNanoseconds = (int)(ts*1_000%1_000_000_000);
|
fracNanoseconds = (int) (ts * 1_000 % 1_000_000_000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case 2: {
|
||||||
milliseconds = ts/1_000_000;
|
milliseconds = ts / 1_000_000;
|
||||||
fracNanoseconds = (int)(ts%1_000_000_000);
|
fracNanoseconds = (int) (ts % 1_000_000_000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
@ -467,12 +467,10 @@ public class TSDBResultSetRowData {
|
||||||
Object obj = data.get(col - 1);
|
Object obj = data.get(col - 1);
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
return null;
|
return null;
|
||||||
switch (nativeType) {
|
if (nativeType == TSDBConstants.TSDB_DATA_TYPE_BIGINT) {
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
return new Timestamp((Long) obj);
|
||||||
return new Timestamp((Long) obj);
|
|
||||||
default:
|
|
||||||
return (Timestamp) obj;
|
|
||||||
}
|
}
|
||||||
|
return (Timestamp) obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getObject(int col) {
|
public Object getObject(int col) {
|
||||||
|
|
|
@ -47,9 +47,6 @@ public class TSDBSubscribe {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* close subscription
|
* close subscription
|
||||||
*
|
|
||||||
* @param keepProgress
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
*/
|
||||||
public void close(boolean keepProgress) throws SQLException {
|
public void close(boolean keepProgress) throws SQLException {
|
||||||
if (this.connecter.isClosed())
|
if (this.connecter.isClosed())
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.taosdata.jdbc.rs.enums;
|
package com.taosdata.jdbc.enums;
|
||||||
|
|
||||||
public enum TimestampFormat {
|
public enum TimestampFormat {
|
||||||
STRING,
|
STRING,
|
|
@ -16,7 +16,7 @@ public class RestfulConnection extends AbstractConnection {
|
||||||
private final String host;
|
private final String host;
|
||||||
private final int port;
|
private final int port;
|
||||||
private final String url;
|
private final String url;
|
||||||
private volatile String database;
|
private final String database;
|
||||||
private final String token;
|
private final String token;
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
private boolean isClosed;
|
private boolean isClosed;
|
||||||
|
|
|
@ -13,7 +13,7 @@ import java.util.Calendar;
|
||||||
|
|
||||||
public class RestfulPreparedStatement extends RestfulStatement implements PreparedStatement {
|
public class RestfulPreparedStatement extends RestfulStatement implements PreparedStatement {
|
||||||
|
|
||||||
private ParameterMetaData parameterMetaData;
|
private final ParameterMetaData parameterMetaData;
|
||||||
private final String rawSql;
|
private final String rawSql;
|
||||||
private Object[] parameters;
|
private Object[] parameters;
|
||||||
private boolean isPrepared;
|
private boolean isPrepared;
|
||||||
|
|
|
@ -7,7 +7,7 @@ import com.google.common.primitives.Longs;
|
||||||
import com.google.common.primitives.Shorts;
|
import com.google.common.primitives.Shorts;
|
||||||
import com.taosdata.jdbc.*;
|
import com.taosdata.jdbc.*;
|
||||||
import com.taosdata.jdbc.enums.TimestampPrecision;
|
import com.taosdata.jdbc.enums.TimestampPrecision;
|
||||||
import com.taosdata.jdbc.rs.enums.TimestampFormat;
|
import com.taosdata.jdbc.enums.TimestampFormat;
|
||||||
import com.taosdata.jdbc.utils.Utils;
|
import com.taosdata.jdbc.utils.Utils;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
@ -17,19 +17,20 @@ import java.time.ZoneOffset;
|
||||||
import java.time.format.DateTimeParseException;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
private volatile boolean isClosed;
|
|
||||||
private int pos = -1;
|
|
||||||
|
|
||||||
private final String database;
|
|
||||||
private final Statement statement;
|
private final Statement statement;
|
||||||
// data
|
// data
|
||||||
private final ArrayList<ArrayList<Object>> resultSet = new ArrayList<>();
|
private final List<List<Object>> resultSet = new ArrayList<>();
|
||||||
// meta
|
// meta
|
||||||
private ArrayList<String> columnNames = new ArrayList<>();
|
private final List<String> columnNames = new ArrayList<>();
|
||||||
private ArrayList<Field> columns = new ArrayList<>();
|
private final List<Field> columns = new ArrayList<>();
|
||||||
private RestfulResultSetMetaData metaData;
|
private final RestfulResultSetMetaData metaData;
|
||||||
|
|
||||||
|
private volatile boolean isClosed;
|
||||||
|
private int pos = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 由一个result的Json构造结果集,对应执行show databases, show tables等这些语句,返回结果集,但无法获取结果集对应的meta,统一当成String处理
|
* 由一个result的Json构造结果集,对应执行show databases, show tables等这些语句,返回结果集,但无法获取结果集对应的meta,统一当成String处理
|
||||||
|
@ -37,35 +38,30 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
||||||
***/
|
***/
|
||||||
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) throws SQLException {
|
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) throws SQLException {
|
||||||
this.database = database;
|
|
||||||
this.statement = statement;
|
this.statement = statement;
|
||||||
|
|
||||||
|
// get head
|
||||||
|
JSONArray head = resultJson.getJSONArray("head");
|
||||||
// get column metadata
|
// get column metadata
|
||||||
JSONArray columnMeta = resultJson.getJSONArray("column_meta");
|
JSONArray columnMeta = resultJson.getJSONArray("column_meta");
|
||||||
// get row data
|
// get row data
|
||||||
JSONArray data = resultJson.getJSONArray("data");
|
JSONArray data = resultJson.getJSONArray("data");
|
||||||
if (data == null || data.isEmpty()) {
|
|
||||||
columnNames.clear();
|
|
||||||
columns.clear();
|
|
||||||
this.resultSet.clear();
|
|
||||||
this.metaData = new RestfulResultSetMetaData(this.database, null, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// get head
|
|
||||||
JSONArray head = resultJson.getJSONArray("head");
|
|
||||||
// get rows
|
// get rows
|
||||||
Integer rows = resultJson.getInteger("rows");
|
Integer rows = resultJson.getInteger("rows");
|
||||||
|
|
||||||
// parse column_meta
|
// parse column_meta
|
||||||
if (columnMeta != null) {
|
if (columnMeta != null) {
|
||||||
parseColumnMeta_new(columnMeta);
|
parseColumnMeta_new(columnMeta);
|
||||||
} else {
|
} else {
|
||||||
parseColumnMeta_old(head, data, rows);
|
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
|
// parse row data
|
||||||
resultSet.clear();
|
|
||||||
for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
|
for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
|
||||||
ArrayList row = new ArrayList();
|
List<Object> row = new ArrayList();
|
||||||
JSONArray jsonRow = data.getJSONArray(rowIndex);
|
JSONArray jsonRow = data.getJSONArray(rowIndex);
|
||||||
for (int colIndex = 0; colIndex < this.metaData.getColumnCount(); colIndex++) {
|
for (int colIndex = 0; colIndex < this.metaData.getColumnCount(); colIndex++) {
|
||||||
row.add(parseColumnData(jsonRow, colIndex, columns.get(colIndex).taos_type));
|
row.add(parseColumnData(jsonRow, colIndex, columns.get(colIndex).taos_type));
|
||||||
|
@ -174,8 +170,8 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
|
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
|
||||||
if (value < 1_0000_0000_0000_0L)
|
if (value < 1_0000_0000_0000_0L)
|
||||||
return new Timestamp(value);
|
return new Timestamp(value);
|
||||||
long epochSec = value / 1000_000l;
|
long epochSec = value / 1000_000L;
|
||||||
long nanoAdjustment = value % 1000_000l * 1000l;
|
long nanoAdjustment = value % 1000_000L * 1000L;
|
||||||
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
return Timestamp.from(Instant.ofEpochSecond(epochSec, nanoAdjustment));
|
||||||
}
|
}
|
||||||
case UTC: {
|
case UTC: {
|
||||||
|
@ -244,10 +240,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
pos++;
|
pos++;
|
||||||
if (pos <= resultSet.size() - 1) {
|
return pos <= resultSet.size() - 1;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -257,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
|
@Override
|
||||||
public String getString(int columnIndex) throws SQLException {
|
public String getString(int columnIndex) throws SQLException {
|
||||||
checkAvailability(columnIndex, resultSet.get(pos).size());
|
checkAvailability(columnIndex, resultSet.get(pos).size());
|
||||||
|
@ -288,7 +274,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
wasNull = false;
|
wasNull = false;
|
||||||
if (value instanceof Boolean)
|
if (value instanceof Boolean)
|
||||||
return (boolean) value;
|
return (boolean) value;
|
||||||
return Boolean.valueOf(value.toString());
|
return Boolean.parseBoolean(value.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -443,9 +429,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
return null;
|
return null;
|
||||||
if (value instanceof Timestamp)
|
if (value instanceof Timestamp)
|
||||||
return new Date(((Timestamp) value).getTime());
|
return new Date(((Timestamp) value).getTime());
|
||||||
Date date = null;
|
return Utils.parseDate(value.toString());
|
||||||
date = Utils.parseDate(value.toString());
|
|
||||||
return date;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -460,8 +444,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
Time time = null;
|
Time time = null;
|
||||||
try {
|
try {
|
||||||
time = Utils.parseTime(value.toString());
|
time = Utils.parseTime(value.toString());
|
||||||
} catch (DateTimeParseException e) {
|
} catch (DateTimeParseException ignored) {
|
||||||
time = null;
|
|
||||||
}
|
}
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
@ -525,9 +508,9 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof Byte)
|
if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof Byte)
|
||||||
return new BigDecimal(Long.valueOf(value.toString()));
|
return new BigDecimal(Long.parseLong(value.toString()));
|
||||||
if (value instanceof Double || value instanceof Float)
|
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)
|
if (value instanceof Timestamp)
|
||||||
return new BigDecimal(((Timestamp) value).getTime());
|
return new BigDecimal(((Timestamp) value).getTime());
|
||||||
BigDecimal ret;
|
BigDecimal ret;
|
||||||
|
@ -637,36 +620,6 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
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);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,5 +663,4 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
return isClosed;
|
return isClosed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,20 +7,17 @@ import java.sql.ResultSetMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMetaData {
|
public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMetaData {
|
||||||
|
|
||||||
private final String database;
|
private final String database;
|
||||||
private List<RestfulResultSet.Field> fields;
|
private final List<RestfulResultSet.Field> fields;
|
||||||
private final RestfulResultSet resultSet;
|
|
||||||
|
|
||||||
public RestfulResultSetMetaData(String database, ArrayList<RestfulResultSet.Field> fields, RestfulResultSet resultSet) {
|
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields, RestfulResultSet resultSet) {
|
||||||
this.database = database;
|
this.database = database;
|
||||||
this.fields = fields == null ? Collections.emptyList() : fields;
|
this.fields = fields == null ? Collections.emptyList() : fields;
|
||||||
this.resultSet = resultSet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<RestfulResultSet.Field> getFields() {
|
public List<RestfulResultSet.Field> getFields() {
|
||||||
|
@ -141,8 +138,8 @@ public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMe
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getColumnTypeName(int column) throws SQLException {
|
public String getColumnTypeName(int column) throws SQLException {
|
||||||
int taos_type = fields.get(column - 1).taos_type;
|
int taosType = fields.get(column - 1).taos_type;
|
||||||
return TSDBConstants.taosType2JdbcTypeName(taos_type);
|
return TSDBConstants.taosType2JdbcTypeName(taosType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -35,10 +35,6 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
if (!SqlSyntaxValidator.isValidForExecuteQuery(sql))
|
if (!SqlSyntaxValidator.isValidForExecuteQuery(sql))
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_QUERY, "not a valid sql for executeQuery: " + 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);
|
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);
|
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";
|
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||||
if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
|
|
||||||
return executeOneUpdate(url, sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
return executeOneUpdate(url, sql);
|
return executeOneUpdate(url, sql);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,19 +27,18 @@ public class HttpClientPoolUtil {
|
||||||
private static final int DEFAULT_MAX_TOTAL = 1000;
|
private static final int DEFAULT_MAX_TOTAL = 1000;
|
||||||
private static final int DEFAULT_HTTP_KEEP_TIME = 15000;
|
private static final int DEFAULT_HTTP_KEEP_TIME = 15000;
|
||||||
|
|
||||||
private static PoolingHttpClientConnectionManager connectionManager;
|
|
||||||
private static CloseableHttpClient httpClient;
|
private static CloseableHttpClient httpClient;
|
||||||
|
|
||||||
private static synchronized void initPools() {
|
private static synchronized void initPools() {
|
||||||
if (httpClient == null) {
|
if (httpClient == null) {
|
||||||
connectionManager = new PoolingHttpClientConnectionManager();
|
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
|
||||||
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
|
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
|
||||||
connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL);
|
connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL);
|
||||||
httpClient = HttpClients.custom().setKeepAliveStrategy(DEFAULT_KEEP_ALIVE_STRATEGY).setConnectionManager(connectionManager).build();
|
httpClient = HttpClients.custom().setKeepAliveStrategy(DEFAULT_KEEP_ALIVE_STRATEGY).setConnectionManager(connectionManager).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ConnectionKeepAliveStrategy DEFAULT_KEEP_ALIVE_STRATEGY = (response, context) -> {
|
private static final ConnectionKeepAliveStrategy DEFAULT_KEEP_ALIVE_STRATEGY = (response, context) -> {
|
||||||
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
|
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
|
||||||
int keepTime = DEFAULT_HTTP_KEEP_TIME * 1000;
|
int keepTime = DEFAULT_HTTP_KEEP_TIME * 1000;
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
|
|
|
@ -14,10 +14,6 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package com.taosdata.jdbc.utils;
|
package com.taosdata.jdbc.utils;
|
||||||
|
|
||||||
import com.taosdata.jdbc.TSDBConnection;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
|
|
||||||
public class SqlSyntaxValidator {
|
public class SqlSyntaxValidator {
|
||||||
|
|
||||||
private static final String[] SQL = {"select", "insert", "import", "create", "use", "alter", "drop", "set", "show", "describe"};
|
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 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) {
|
public static boolean isValidForExecuteUpdate(String sql) {
|
||||||
for (String prefix : updateSQL) {
|
for (String prefix : updateSQL) {
|
||||||
if (sql.trim().toLowerCase().startsWith(prefix))
|
if (sql.trim().toLowerCase().startsWith(prefix))
|
||||||
|
|
|
@ -6,6 +6,7 @@ import com.google.common.collect.TreeRangeSet;
|
||||||
import com.taosdata.jdbc.enums.TimestampPrecision;
|
import com.taosdata.jdbc.enums.TimestampPrecision;
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.sql.Date;
|
import java.sql.Date;
|
||||||
import java.sql.Time;
|
import java.sql.Time;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -160,7 +161,7 @@ public class Utils {
|
||||||
String paraStr;
|
String paraStr;
|
||||||
if (para != null) {
|
if (para != null) {
|
||||||
if (para instanceof byte[]) {
|
if (para instanceof byte[]) {
|
||||||
paraStr = new String((byte[]) para, Charset.forName("UTF-8"));
|
paraStr = new String((byte[]) para, StandardCharsets.UTF_8);
|
||||||
} else {
|
} else {
|
||||||
paraStr = para.toString();
|
paraStr = para.toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -380,14 +380,15 @@ public class TSDBConnectionTest {
|
||||||
conn.abort(null);
|
conn.abort(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = SQLFeatureNotSupportedException.class)
|
@Test
|
||||||
public void setNetworkTimeout() throws SQLException {
|
public void setNetworkTimeout() throws SQLException {
|
||||||
conn.setNetworkTimeout(null, 1000);
|
conn.setNetworkTimeout(null, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = SQLFeatureNotSupportedException.class)
|
@Test
|
||||||
public void getNetworkTimeout() throws SQLException {
|
public void getNetworkTimeout() throws SQLException {
|
||||||
conn.getNetworkTimeout();
|
int networkTimeout = conn.getNetworkTimeout();
|
||||||
|
Assert.assertEquals(0, networkTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -14,24 +14,6 @@ public class TSDBStatementTest {
|
||||||
private static Connection conn;
|
private static Connection conn;
|
||||||
private static Statement stmt;
|
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
|
@Test
|
||||||
public void executeUpdate() {
|
public void executeUpdate() {
|
||||||
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
@ -173,10 +155,6 @@ public class TSDBStatementTest {
|
||||||
Assert.assertEquals(3, meta.getColumnCount());
|
Assert.assertEquals(3, meta.getColumnCount());
|
||||||
int count = 0;
|
int count = 0;
|
||||||
while (rs.next()) {
|
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++;
|
count++;
|
||||||
}
|
}
|
||||||
Assert.assertEquals(1, count);
|
Assert.assertEquals(1, count);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.taosdata.jdbc.cases;
|
package com.taosdata.jdbc.cases;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
@ -12,21 +13,19 @@ public class AppMemoryLeakTest {
|
||||||
@Test(expected = SQLException.class)
|
@Test(expected = SQLException.class)
|
||||||
public void testCreateTooManyConnection() throws ClassNotFoundException, SQLException {
|
public void testCreateTooManyConnection() throws ClassNotFoundException, SQLException {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
int conCnt = 0;
|
|
||||||
while (true) {
|
while (true) {
|
||||||
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||||
System.out.println(conCnt++ + " : " + conn);
|
Assert.assertNotNull(conn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = Exception.class)
|
@Test(expected = Exception.class)
|
||||||
public void testCreateTooManyStatement() throws ClassNotFoundException, SQLException {
|
public void testCreateTooManyStatement() throws ClassNotFoundException, SQLException {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
int stmtCnt = 0;
|
|
||||||
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
Connection conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||||
while (true) {
|
while (true) {
|
||||||
Statement stmt = conn.createStatement();
|
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.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
|
@ -60,7 +60,6 @@ public class BatchInsertTest {
|
||||||
final int index = i;
|
final int index = i;
|
||||||
executorService.execute(() -> {
|
executorService.execute(() -> {
|
||||||
try {
|
try {
|
||||||
long startTime = System.currentTimeMillis();
|
|
||||||
Statement statement = connection.createStatement(); // get statement
|
Statement statement = connection.createStatement(); // get statement
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
|
sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
|
||||||
|
@ -73,8 +72,6 @@ public class BatchInsertTest {
|
||||||
}
|
}
|
||||||
statement.addBatch(sb.toString());
|
statement.addBatch(sb.toString());
|
||||||
statement.executeBatch();
|
statement.executeBatch();
|
||||||
long endTime = System.currentTimeMillis();
|
|
||||||
System.out.println("Thread " + index + " takes " + (endTime - startTime) + " microseconds");
|
|
||||||
connection.commit();
|
connection.commit();
|
||||||
statement.close();
|
statement.close();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -31,9 +31,6 @@ public class ConnectMultiTaosdByRestfulWithDifferentTokenTest {
|
||||||
ResultSet rs = stmt.executeQuery("select server_status()");
|
ResultSet rs = stmt.executeQuery("select server_status()");
|
||||||
ResultSetMetaData meta = rs.getMetaData();
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
|
||||||
System.out.println(meta.getColumnLabel(i) + ": " + rs.getString(i));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -1,64 +1,76 @@
|
||||||
package com.taosdata.jdbc.cases;
|
package com.taosdata.jdbc.cases;
|
||||||
|
|
||||||
import com.taosdata.jdbc.utils.TimestampUtil;
|
import com.taosdata.jdbc.utils.TimestampUtil;
|
||||||
import org.junit.AfterClass;
|
import org.junit.*;
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
public class DatetimeBefore1970Test {
|
public class DatetimeBefore1970Test {
|
||||||
|
|
||||||
private static Connection conn;
|
private static final String host = "127.0.0.1";
|
||||||
|
private Connection conn;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
try (Statement stmt = conn.createStatement()) {
|
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('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 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 08:00:00.000')");
|
||||||
stmt.executeUpdate("insert into weather(ts) values('1970-01-01 07:59:59.999')");
|
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) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
@Before
|
||||||
System.out.println("timestamp: " + Long.MAX_VALUE + ", string: " + TimestampUtil.longToDatetime(Long.MAX_VALUE));
|
public void before() {
|
||||||
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() {
|
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||||
conn = DriverManager.getConnection("jdbc:TAOS://127.0.0.1:6030/?user=root&password=taosdata");
|
|
||||||
Statement stmt = conn.createStatement();
|
Statement stmt = conn.createStatement();
|
||||||
stmt.execute("drop database if exists test_timestamp");
|
stmt.execute("drop database if exists test_timestamp");
|
||||||
stmt.execute("create database if not exists test_timestamp keep 36500");
|
stmt.execute("create database if not exists test_timestamp keep 36500");
|
||||||
stmt.execute("use test_timestamp");
|
stmt.execute("use test_timestamp");
|
||||||
stmt.execute("create table weather(ts timestamp,f1 float)");
|
stmt.execute("create table weather(ts timestamp,f1 float)");
|
||||||
stmt.close();
|
stmt.close();
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterClass
|
@After
|
||||||
public static void afterClass() {
|
public void after() {
|
||||||
try {
|
try {
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.execute("drop database if exists test_timestamp");
|
||||||
if (conn != null)
|
if (conn != null)
|
||||||
conn.close();
|
conn.close();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
|
@ -20,7 +20,6 @@ public class ImportTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void before() {
|
public static void before() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||||
|
@ -33,8 +32,6 @@ public class ImportTest {
|
||||||
stmt.close();
|
stmt.close();
|
||||||
|
|
||||||
ts = System.currentTimeMillis();
|
ts = System.currentTimeMillis();
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -47,7 +44,6 @@ public class ImportTest {
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
ts++;
|
ts++;
|
||||||
int row = stmt.executeUpdate("import into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")");
|
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);
|
assertEquals(1, row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +80,6 @@ public class ImportTest {
|
||||||
long t = (++ts) + a;
|
long t = (++ts) + a;
|
||||||
sqlBuilder.append("(").append(t).append(",").append((100 + i)).append(",").append(i).append(") ");
|
sqlBuilder.append("(").append(t).append(",").append((100 + i)).append(",").append(i).append(") ");
|
||||||
}
|
}
|
||||||
System.out.println(sqlBuilder.toString());
|
|
||||||
int rows = stmt.executeUpdate(sqlBuilder.toString());
|
int rows = stmt.executeUpdate(sqlBuilder.toString());
|
||||||
assertEquals(50, rows);
|
assertEquals(50, rows);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
|
@ -41,7 +41,6 @@ public class MicroSecondPrecisionJNITest {
|
||||||
rs.next();
|
rs.next();
|
||||||
|
|
||||||
Timestamp timestamp = rs.getTimestamp(1);
|
Timestamp timestamp = rs.getTimestamp(1);
|
||||||
System.out.println(timestamp);
|
|
||||||
long ts = timestamp.getTime();
|
long ts = timestamp.getTime();
|
||||||
Assert.assertEquals(timestamp1, ts);
|
Assert.assertEquals(timestamp1, ts);
|
||||||
int nanos = timestamp.getNanos();
|
int nanos = timestamp.getNanos();
|
||||||
|
|
|
@ -7,7 +7,7 @@ import org.junit.Test;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class MultiThreadsWithSameStatmentTest {
|
public class MultiThreadsWithSameStatementTest {
|
||||||
|
|
||||||
|
|
||||||
private class Service {
|
private class Service {
|
||||||
|
@ -16,12 +16,11 @@ public class MultiThreadsWithSameStatmentTest {
|
||||||
|
|
||||||
public Service() {
|
public Service() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
conn = DriverManager.getConnection("jdbc:TAOS://localhost:6030/?user=root&password=taosdata");
|
||||||
stmt = conn.createStatement();
|
stmt = conn.createStatement();
|
||||||
stmt.execute("create database if not exists jdbctest");
|
stmt.execute("create database if not exists jdbctest");
|
||||||
stmt.executeUpdate("create table if not exists jdbctest.weather (ts timestamp, f1 int)");
|
stmt.executeUpdate("create table if not exists jdbctest.weather (ts timestamp, f1 int)");
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,10 +47,6 @@ public class MultiThreadsWithSameStatmentTest {
|
||||||
ResultSet resultSet = service.stmt.executeQuery("select * from jdbctest.weather");
|
ResultSet resultSet = service.stmt.executeQuery("select * from jdbctest.weather");
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
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();
|
resultSet.close();
|
||||||
service.release();
|
service.release();
|
|
@ -17,11 +17,6 @@ public class NullValueInResultSetJNITest {
|
||||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
ResultSet rs = stmt.executeQuery("select * from weather");
|
||||||
ResultSetMetaData meta = rs.getMetaData();
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
while (rs.next()) {
|
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) {
|
} catch (SQLException e) {
|
||||||
|
|
|
@ -19,9 +19,7 @@ public class NullValueInResultSetRestfulTest {
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||||
Object value = rs.getObject(i);
|
Object value = rs.getObject(i);
|
||||||
System.out.print(meta.getColumnLabel(i) + ": " + value + "\t");
|
|
||||||
}
|
}
|
||||||
System.out.println();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
|
@ -21,7 +21,6 @@ public class QueryDataTest {
|
||||||
@Before
|
@Before
|
||||||
public void createDatabase() {
|
public void createDatabase() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.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))";
|
String createTableSql = "create table " + stbName + "(ts timestamp, name binary(64))";
|
||||||
statement.executeUpdate(createTableSql);
|
statement.executeUpdate(createTableSql);
|
||||||
|
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (SQLException e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +43,6 @@ public class QueryDataTest {
|
||||||
@Test
|
@Test
|
||||||
public void testQueryBinaryData() throws SQLException {
|
public void testQueryBinaryData() throws SQLException {
|
||||||
String insertSql = "insert into " + stbName + " values(now, 'taosdata')";
|
String insertSql = "insert into " + stbName + " values(now, 'taosdata')";
|
||||||
System.out.println(insertSql);
|
|
||||||
statement.executeUpdate(insertSql);
|
statement.executeUpdate(insertSql);
|
||||||
|
|
||||||
String querySql = "select * from " + stbName;
|
String querySql = "select * from " + stbName;
|
||||||
|
@ -52,7 +50,6 @@ public class QueryDataTest {
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
String name = rs.getString(2);
|
String name = rs.getString(2);
|
||||||
System.out.println("name = " + name);
|
|
||||||
assertEquals("taosdata", name);
|
assertEquals("taosdata", name);
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class ResultSetMetaShouldNotBeNullRestfulTest {
|
||||||
|
|
||||||
// then
|
// then
|
||||||
Assert.assertNotNull(metaData);
|
Assert.assertNotNull(metaData);
|
||||||
Assert.assertEquals(0, columnCount);
|
Assert.assertEquals(2, columnCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -53,7 +53,7 @@ public class ResultSetMetaShouldNotBeNullRestfulTest {
|
||||||
// then
|
// then
|
||||||
Assert.assertEquals(true, execute);
|
Assert.assertEquals(true, execute);
|
||||||
Assert.assertNotNull(metaData);
|
Assert.assertNotNull(metaData);
|
||||||
Assert.assertEquals(0, columnCount);
|
Assert.assertEquals(2, columnCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|
|
@ -19,7 +19,6 @@ public class SelectTest {
|
||||||
@Before
|
@Before
|
||||||
public void createDatabaseAndTable() {
|
public void createDatabaseAndTable() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.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 database if not exists " + dbName);
|
||||||
stmt.execute("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)");
|
stmt.execute("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)");
|
||||||
stmt.close();
|
stmt.close();
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
return;
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -47,7 +44,6 @@ public class SelectTest {
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
ts++;
|
ts++;
|
||||||
int row = stmt.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")");
|
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);
|
assertEquals(1, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ public class StableTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void createDatabase() {
|
public static void createDatabase() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.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("create database if not exists " + dbName);
|
||||||
statement.execute("use " + dbName);
|
statement.execute("use " + dbName);
|
||||||
statement.close();
|
statement.close();
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
return;
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -68,9 +65,6 @@ public class StableTest {
|
||||||
String sql = "describe " + stbName;
|
String sql = "describe " + stbName;
|
||||||
ResultSet rs = stmt.executeQuery(sql);
|
ResultSet rs = stmt.executeQuery(sql);
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
|
|
||||||
System.out.println(i + ":" + rs.getString(i));
|
|
||||||
}
|
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
|
@ -86,9 +80,6 @@ public class StableTest {
|
||||||
try (Statement stmt = connection.createStatement()) {
|
try (Statement stmt = connection.createStatement()) {
|
||||||
ResultSet rs = stmt.executeQuery("describe t1");
|
ResultSet rs = stmt.executeQuery("describe t1");
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
|
|
||||||
System.out.printf("%d: %s\n", i, rs.getString(i));
|
|
||||||
}
|
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
|
|
|
@ -8,11 +8,6 @@ import java.sql.*;
|
||||||
public class RestfulDriverTest {
|
public class RestfulDriverTest {
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
|
|
||||||
@Test
|
|
||||||
public void connect() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void acceptsURL() throws SQLException {
|
public void acceptsURL() throws SQLException {
|
||||||
Driver driver = new RestfulDriver();
|
Driver driver = new RestfulDriver();
|
||||||
|
@ -27,9 +22,7 @@ public class RestfulDriverTest {
|
||||||
Driver driver = new RestfulDriver();
|
Driver driver = new RestfulDriver();
|
||||||
final String url = "";
|
final String url = "";
|
||||||
DriverPropertyInfo[] propertyInfo = driver.getPropertyInfo(url, null);
|
DriverPropertyInfo[] propertyInfo = driver.getPropertyInfo(url, null);
|
||||||
for (DriverPropertyInfo prop : propertyInfo) {
|
Assert.assertNotNull(propertyInfo);
|
||||||
System.out.println(prop);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -10,132 +10,151 @@ import java.util.Random;
|
||||||
public class RestfulJDBCTest {
|
public class RestfulJDBCTest {
|
||||||
|
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
private static Connection connection;
|
private final Random random = new Random(System.currentTimeMillis());
|
||||||
private Random random = new Random(System.currentTimeMillis());
|
private Connection connection;
|
||||||
|
|
||||||
/**
|
|
||||||
* select * from log.log
|
|
||||||
**/
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase001() {
|
public void testCase001() {
|
||||||
try {
|
// given
|
||||||
Statement statement = connection.createStatement();
|
String sql = "drop database if exists restful_test";
|
||||||
ResultSet resultSet = statement.executeQuery("select * from log.log");
|
// when
|
||||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
boolean execute = execute(connection, sql);
|
||||||
while (resultSet.next()) {
|
// then
|
||||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
Assert.assertFalse(execute);
|
||||||
String column = metaData.getColumnLabel(i);
|
|
||||||
String value = resultSet.getString(i);
|
// given
|
||||||
System.out.print(column + ":" + value + "\t");
|
sql = "create database if not exists restful_test";
|
||||||
}
|
// when
|
||||||
System.out.println();
|
execute = execute(connection, sql);
|
||||||
}
|
// then
|
||||||
statement.close();
|
Assert.assertFalse(execute);
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
// given
|
||||||
}
|
sql = "use restful_test";
|
||||||
|
// when
|
||||||
|
execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertFalse(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* create database
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase002() {
|
public void testCase002() {
|
||||||
try (Statement stmt = connection.createStatement()) {
|
// given
|
||||||
stmt.execute("drop database if exists restful_test");
|
String sql = "create table weather(ts timestamp, temperature float, humidity int) tags(location nchar(64), groupId int)";
|
||||||
stmt.execute("create database if not exists restful_test");
|
// when
|
||||||
stmt.execute("use restful_test");
|
boolean execute = execute(connection, sql);
|
||||||
} catch (SQLException e) {
|
// then
|
||||||
e.printStackTrace();
|
Assert.assertFalse(execute);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase004() {
|
public void testCase004() {
|
||||||
try (Statement stmt = connection.createStatement()) {
|
for (int i = 1; i <= 100; i++) {
|
||||||
for (int i = 1; i <= 100; i++) {
|
// given
|
||||||
stmt.execute("create table t" + i + " using weather tags('beijing', '" + i + "')");
|
String sql = "create table t" + i + " using weather tags('beijing', '" + i + "')";
|
||||||
}
|
// when
|
||||||
} catch (SQLException e) {
|
boolean execute = execute(connection, sql);
|
||||||
e.printStackTrace();
|
// then
|
||||||
|
Assert.assertFalse(execute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase005() {
|
public void testCase005() {
|
||||||
try (Statement stmt = connection.createStatement()) {
|
int rows = 0;
|
||||||
int rows = 0;
|
for (int i = 0; i < 10; i++) {
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int j = 1; j <= 100; j++) {
|
||||||
for (int j = 1; j <= 100; j++) {
|
|
||||||
long currentTimeMillis = System.currentTimeMillis();
|
// given
|
||||||
int affectRows = stmt.executeUpdate("insert into t" + j + " values(" + currentTimeMillis + "," + (random.nextFloat() * 50) + "," + random.nextInt(100) + ")");
|
long currentTimeMillis = System.currentTimeMillis();
|
||||||
Assert.assertEquals(1, affectRows);
|
String sql = "insert into t" + j + " values(" + currentTimeMillis + "," + (random.nextFloat() * 50) + "," + random.nextInt(100) + ")";
|
||||||
rows += affectRows;
|
// 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
|
@Test
|
||||||
public void testCase006() {
|
public void testCase006() throws SQLException {
|
||||||
try (Statement stmt = connection.createStatement()) {
|
// given
|
||||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
String sql = "select * from weather";
|
||||||
while (rs.next()) {
|
// when
|
||||||
System.out.print("ts: " + rs.getTimestamp("ts"));
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
System.out.print(", temperature: " + rs.getString("temperature"));
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
System.out.print(", humidity: " + rs.getString("humidity"));
|
|
||||||
System.out.println(", location: " + rs.getString("location"));
|
// then
|
||||||
}
|
Assert.assertEquals(5, meta.getColumnCount());
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
while (rs.next()) {
|
||||||
|
Assert.assertNotNull(rs.getTimestamp("ts"));
|
||||||
|
Assert.assertNotNull(rs.getFloat("temperature"));
|
||||||
|
Assert.assertNotNull(rs.getInt("humidity"));
|
||||||
|
Assert.assertNotNull(rs.getString("location"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase007() {
|
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()) {
|
try (Statement stmt = connection.createStatement()) {
|
||||||
ResultSet rs = stmt.executeQuery("select * from weather");
|
return stmt.executeUpdate(sql);
|
||||||
ResultSetMetaData meta = rs.getMetaData();
|
} catch (SQLException e) {
|
||||||
while (rs.next()) {
|
e.printStackTrace();
|
||||||
int columnCount = meta.getColumnCount();
|
}
|
||||||
for (int i = 1; i <= columnCount; i++) {
|
return 0;
|
||||||
String columnLabel = meta.getColumnLabel(i);
|
}
|
||||||
String value = rs.getString(i);
|
|
||||||
System.out.print(columnLabel + ": " + value + "\t");
|
private boolean execute(Connection connection, String sql) {
|
||||||
}
|
try (Statement stmt = connection.createStatement()) {
|
||||||
System.out.println();
|
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) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@After
|
||||||
public static void before() throws ClassNotFoundException, SQLException {
|
public void after() {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
try {
|
||||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
|
if (connection != null)
|
||||||
}
|
connection.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
@AfterClass
|
e.printStackTrace();
|
||||||
public static void after() throws SQLException {
|
}
|
||||||
if (connection != null)
|
|
||||||
connection.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,9 @@ public class RestfulPreparedStatementTest {
|
||||||
ResultSet rs = pstmt_select.executeQuery();
|
ResultSet rs = pstmt_select.executeQuery();
|
||||||
Assert.assertNotNull(rs);
|
Assert.assertNotNull(rs);
|
||||||
ResultSetMetaData meta = rs.getMetaData();
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
while (rs.next()) {
|
int columnCount = meta.getColumnCount();
|
||||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
Assert.assertEquals(10, columnCount);
|
||||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
Assert.assertNotNull(rs);
|
||||||
}
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -373,18 +370,19 @@ public class RestfulPreparedStatementTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass() {
|
public static void beforeClass() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
|
||||||
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
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");
|
Statement stmt = conn.createStatement();
|
||||||
stmt.execute("create database if not exists test_pstmt");
|
stmt.execute("drop database if exists test_pstmt");
|
||||||
stmt.execute("use test_pstmt");
|
stmt.execute("create database if not exists 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("use test_pstmt");
|
||||||
stmt.execute("create table t1 using weather tags('beijing')");
|
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_insert = conn.prepareStatement(sql_insert);
|
||||||
pstmt_select = conn.prepareStatement(sql_select);
|
pstmt_select = conn.prepareStatement(sql_select);
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.UUID;
|
||||||
|
|
||||||
public class RestfulStatementTest {
|
public class RestfulStatementTest {
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
|
|
||||||
private static Connection conn;
|
private static Connection conn;
|
||||||
private static Statement stmt;
|
private static Statement stmt;
|
||||||
|
|
||||||
|
@ -21,11 +22,11 @@ public class RestfulStatementTest {
|
||||||
ResultSet rs = stmt.executeQuery("show databases");
|
ResultSet rs = stmt.executeQuery("show databases");
|
||||||
Assert.assertNotNull(rs);
|
Assert.assertNotNull(rs);
|
||||||
ResultSetMetaData meta = rs.getMetaData();
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
|
int columnCount = meta.getColumnCount();
|
||||||
|
Assert.assertTrue(columnCount > 1);
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
Assert.assertEquals("name", meta.getColumnLabel(1));
|
||||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
Assert.assertNotNull(rs.getString("name"));
|
||||||
}
|
|
||||||
System.out.println();
|
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
@ -174,10 +175,10 @@ public class RestfulStatementTest {
|
||||||
Assert.assertEquals(3, meta.getColumnCount());
|
Assert.assertEquals(3, meta.getColumnCount());
|
||||||
int count = 0;
|
int count = 0;
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
Assert.assertEquals("ts", meta.getColumnLabel(1));
|
||||||
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
Assert.assertNotNull(rs.getTimestamp(1));
|
||||||
}
|
Assert.assertEquals("temperature", meta.getColumnLabel(2));
|
||||||
System.out.println();
|
Assert.assertEquals(22.33, rs.getFloat(2), 0.001f);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
Assert.assertEquals(1, count);
|
Assert.assertEquals(1, count);
|
||||||
|
@ -388,15 +389,12 @@ public class RestfulStatementTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass() {
|
public static void beforeClass() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||||
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata", properties);
|
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata", properties);
|
||||||
stmt = conn.createStatement();
|
stmt = conn.createStatement();
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,342 +1,586 @@
|
||||||
package com.taosdata.jdbc.rs;
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
import com.taosdata.jdbc.utils.SQLExecutor;
|
import org.junit.*;
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.FixMethodOrder;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runners.MethodSorters;
|
import org.junit.runners.MethodSorters;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
public class SQLTest {
|
public class SQLTest {
|
||||||
|
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
private static Connection connection;
|
private static Connection connection;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase001() {
|
public void testCase001() {
|
||||||
|
// given
|
||||||
String sql = "create database if not exists restful_test";
|
String sql = "create database if not exists restful_test";
|
||||||
SQLExecutor.execute(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertFalse(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase002() {
|
public void testCase002() {
|
||||||
|
// given
|
||||||
String sql = "use restful_test";
|
String sql = "use restful_test";
|
||||||
SQLExecutor.execute(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertFalse(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase003() {
|
public void testCase003() {
|
||||||
|
// given
|
||||||
String sql = "show databases";
|
String sql = "show databases";
|
||||||
SQLExecutor.executeWithResult(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase004() {
|
public void testCase004() {
|
||||||
|
// given
|
||||||
String sql = "show tables";
|
String sql = "show tables";
|
||||||
SQLExecutor.executeWithResult(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase005() {
|
public void testCase005() {
|
||||||
|
// given
|
||||||
String sql = "show stables";
|
String sql = "show stables";
|
||||||
SQLExecutor.executeWithResult(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase006() {
|
public void testCase006() {
|
||||||
|
// given
|
||||||
String sql = "show dnodes";
|
String sql = "show dnodes";
|
||||||
SQLExecutor.executeWithResult(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase007() {
|
public void testCase007() {
|
||||||
|
// given
|
||||||
String sql = "show vgroups";
|
String sql = "show vgroups";
|
||||||
SQLExecutor.executeWithResult(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase008() {
|
public void testCase008() {
|
||||||
|
// given
|
||||||
String sql = "drop table if exists restful_test.weather";
|
String sql = "drop table if exists restful_test.weather";
|
||||||
SQLExecutor.execute(connection, sql);
|
|
||||||
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assert.assertFalse(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase009() {
|
public void testCase009() {
|
||||||
|
// given
|
||||||
String sql = "create table if not exists restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))";
|
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
|
@Test
|
||||||
public void testCase010() {
|
public void testCase010() {
|
||||||
|
// given
|
||||||
String sql = "create table t1 using restful_test.weather tags('北京')";
|
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
|
@Test
|
||||||
public void testCase011() {
|
public void testCase011() {
|
||||||
|
// given
|
||||||
String sql = "insert into restful_test.t1 values(now, 22.22)";
|
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
|
@Test
|
||||||
public void testCase012() {
|
public void testCase012() {
|
||||||
|
// given
|
||||||
String sql = "insert into restful_test.t1 values('2020-01-01 00:00:00.000', 22.22)";
|
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
|
@Test
|
||||||
public void testCase013() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase014() {
|
public void testCase014() {
|
||||||
|
// given
|
||||||
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:03:00.000', 22.22)";
|
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
|
@Test
|
||||||
public void testCase015() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase016() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase017() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase018() {
|
public void testCase018() {
|
||||||
|
// given
|
||||||
String sql = "select * from restful_test.t1";
|
String sql = "select * from restful_test.t1";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase019() {
|
public void testCase019() {
|
||||||
|
// given
|
||||||
String sql = "select * from restful_test.weather";
|
String sql = "select * from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase020() {
|
public void testCase020() {
|
||||||
|
// given
|
||||||
String sql = "select ts, temperature from restful_test.t1";
|
String sql = "select ts, temperature from restful_test.t1";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase021() {
|
public void testCase021() {
|
||||||
|
// given
|
||||||
String sql = "select ts, temperature from restful_test.weather";
|
String sql = "select ts, temperature from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase022() {
|
public void testCase022() {
|
||||||
|
// given
|
||||||
String sql = "select temperature, ts from restful_test.t1";
|
String sql = "select temperature, ts from restful_test.t1";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase023() {
|
public void testCase023() {
|
||||||
|
// given
|
||||||
String sql = "select temperature, ts from restful_test.weather";
|
String sql = "select temperature, ts from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
boolean execute = execute(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertTrue(execute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase024() {
|
public void testCase024() {
|
||||||
|
// given
|
||||||
String sql = "import into restful_test.t5 using weather tags('石家庄') values('2020-01-01 00:01:00.000', 22.22)";
|
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
|
@Test
|
||||||
public void testCase025() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase026() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase027() {
|
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)";
|
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
|
@Test
|
||||||
public void testCase028() {
|
public void testCase028() {
|
||||||
|
// given
|
||||||
String sql = "select location, temperature, ts from restful_test.weather where temperature > 1";
|
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
|
@Test
|
||||||
public void testCase029() {
|
public void testCase029() {
|
||||||
String sql = "select location, temperature, ts from restful_test.weather where temperature < 1";
|
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
|
@Test
|
||||||
public void testCase030() {
|
public void testCase030() {
|
||||||
String sql = "select location, temperature, ts from restful_test.weather where ts > now";
|
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
|
@Test
|
||||||
public void testCase031() {
|
public void testCase031() {
|
||||||
String sql = "select location, temperature, ts from restful_test.weather where ts < now";
|
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
|
@Test
|
||||||
public void testCase032() {
|
public void testCase032() {
|
||||||
String sql = "select count(*) from restful_test.weather";
|
String sql = "select count(*) from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase033() {
|
public void testCase033() {
|
||||||
String sql = "select first(*) from restful_test.weather";
|
String sql = "select first(*) from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase034() {
|
public void testCase034() {
|
||||||
String sql = "select last(*) from restful_test.weather";
|
String sql = "select last(*) from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase035() {
|
public void testCase035() {
|
||||||
String sql = "select last_row(*) from restful_test.weather";
|
String sql = "select last_row(*) from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase036() {
|
public void testCase036() {
|
||||||
String sql = "select ts, ts as primary_key from restful_test.weather";
|
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
|
@Test
|
||||||
public void testCase037() {
|
public void testCase037() {
|
||||||
String sql = "select database()";
|
String sql = "select database()";
|
||||||
SQLExecutor.execute(connection, "use restful_test");
|
// when
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase038() {
|
public void testCase038() {
|
||||||
String sql = "select client_version()";
|
String sql = "select client_version()";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase039() {
|
public void testCase039() {
|
||||||
String sql = "select server_status()";
|
String sql = "select server_status()";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase040() {
|
public void testCase040() {
|
||||||
String sql = "select server_status() as status";
|
String sql = "select server_status() as status";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase041() {
|
public void testCase041() {
|
||||||
String sql = "select tbname, location from restful_test.weather";
|
String sql = "select tbname, location from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase042() {
|
public void testCase042() {
|
||||||
String sql = "select count(tbname) from restful_test.weather";
|
String sql = "select count(tbname) from restful_test.weather";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase043() {
|
public void testCase043() {
|
||||||
String sql = "select * from restful_test.weather where ts < now - 1h";
|
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
|
@Test
|
||||||
public void testCase044() {
|
public void testCase044() {
|
||||||
String sql = "select * from restful_test.weather where ts < now - 1h and location like '%'";
|
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
|
@Test
|
||||||
public void testCase045() {
|
public void testCase045() {
|
||||||
String sql = "select * from restful_test.weather where ts < now - 1h order by ts";
|
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
|
@Test
|
||||||
public void testCase046() {
|
public void testCase046() {
|
||||||
String sql = "select last(*) from restful_test.weather where ts < now - 1h group by tbname order by tbname";
|
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
|
@Test
|
||||||
public void testCase047() {
|
public void testCase047() {
|
||||||
String sql = "select * from restful_test.weather limit 2";
|
String sql = "select * from restful_test.weather limit 2";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase048() {
|
public void testCase048() {
|
||||||
String sql = "select * from restful_test.weather limit 2 offset 5";
|
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
|
@Test
|
||||||
public void testCase049() {
|
public void testCase049() {
|
||||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts ";
|
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
|
@Test
|
||||||
public void testCase050() {
|
public void testCase050() {
|
||||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts and t1.location = t3.location";
|
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
|
@Test
|
||||||
public void testCase051() {
|
public void testCase051() {
|
||||||
String sql = "select * from restful_test.t1 tt, restful_test.t3 yy where tt.ts = yy.ts";
|
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
|
@Test
|
||||||
public void testCase052() {
|
public void testCase052() {
|
||||||
String sql = "select server_status()";
|
String sql = "select server_status()";
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
// when
|
||||||
|
ResultSet rs = executeQuery(connection, sql);
|
||||||
|
// then
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase053() {
|
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)";
|
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
|
@BeforeClass
|
||||||
public static void before() throws ClassNotFoundException, SQLException {
|
public static void before() throws SQLException {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
|
||||||
connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
|
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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -4408,14 +4408,12 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* resubAfterConsume =
|
cJSON* resubAfterConsume =
|
||||||
cJSON_GetObjectItem(specifiedQuery, "resubAfterConsume");
|
cJSON_GetObjectItem(specifiedQuery, "resubAfterConsume");
|
||||||
|
g_queryInfo.specifiedQueryInfo.resubAfterConsume[j] = -1;
|
||||||
if ((resubAfterConsume)
|
if ((resubAfterConsume)
|
||||||
&& (resubAfterConsume->type == cJSON_Number)
|
&& (resubAfterConsume->type == cJSON_Number)
|
||||||
&& (resubAfterConsume->valueint >= 0)) {
|
&& (resubAfterConsume->valueint >= 0)) {
|
||||||
g_queryInfo.specifiedQueryInfo.resubAfterConsume[j]
|
g_queryInfo.specifiedQueryInfo.resubAfterConsume[j]
|
||||||
= resubAfterConsume->valueint;
|
= resubAfterConsume->valueint;
|
||||||
} else if (!resubAfterConsume) {
|
|
||||||
// default value is -1, which mean do not resub
|
|
||||||
g_queryInfo.specifiedQueryInfo.resubAfterConsume[j] = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
||||||
|
@ -4572,14 +4570,12 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* superResubAfterConsume =
|
cJSON* superResubAfterConsume =
|
||||||
cJSON_GetObjectItem(superQuery, "resubAfterConsume");
|
cJSON_GetObjectItem(superQuery, "resubAfterConsume");
|
||||||
|
g_queryInfo.superQueryInfo.resubAfterConsume = -1;
|
||||||
if ((superResubAfterConsume)
|
if ((superResubAfterConsume)
|
||||||
&& (superResubAfterConsume->type == cJSON_Number)
|
&& (superResubAfterConsume->type == cJSON_Number)
|
||||||
&& (superResubAfterConsume->valueint >= 0)) {
|
&& (superResubAfterConsume->valueint >= 0)) {
|
||||||
g_queryInfo.superQueryInfo.resubAfterConsume =
|
g_queryInfo.superQueryInfo.resubAfterConsume =
|
||||||
superResubAfterConsume->valueint;
|
superResubAfterConsume->valueint;
|
||||||
} else if (!superResubAfterConsume) {
|
|
||||||
// default value is -1, which mean do not resub
|
|
||||||
g_queryInfo.superQueryInfo.resubAfterConsume = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// supert table sqls
|
// supert table sqls
|
||||||
|
@ -7222,151 +7218,159 @@ static TAOS_SUB* subscribeImpl(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsub == NULL) {
|
if (tsub == NULL) {
|
||||||
printf("failed to create subscription. topic:%s, sql:%s\n", topic, sql);
|
errorPrint("failed to create subscription. topic:%s, sql:%s\n", topic, sql);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tsub;
|
return tsub;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *superSubscribe(void *sarg) {
|
static void *superSubscribe(void *sarg) {
|
||||||
threadInfo *pThreadInfo = (threadInfo *)sarg;
|
threadInfo *pThreadInfo = (threadInfo *)sarg;
|
||||||
char subSqlstr[MAX_QUERY_SQL_LENGTH];
|
char subSqlstr[MAX_QUERY_SQL_LENGTH];
|
||||||
TAOS_SUB* tsub[MAX_QUERY_SQL_COUNT] = {0};
|
TAOS_SUB* tsub[MAX_QUERY_SQL_COUNT] = {0};
|
||||||
uint64_t tsubSeq;
|
uint64_t tsubSeq;
|
||||||
|
|
||||||
if (pThreadInfo->ntables > MAX_QUERY_SQL_COUNT) {
|
if (pThreadInfo->ntables > MAX_QUERY_SQL_COUNT) {
|
||||||
errorPrint("The table number(%"PRId64") of the thread is more than max query sql count: %d\n",
|
errorPrint("The table number(%"PRId64") of the thread is more than max query sql count: %d\n",
|
||||||
pThreadInfo->ntables,
|
pThreadInfo->ntables, MAX_QUERY_SQL_COUNT);
|
||||||
MAX_QUERY_SQL_COUNT);
|
exit(-1);
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pThreadInfo->taos == NULL) {
|
|
||||||
pThreadInfo->taos = taos_connect(g_queryInfo.host,
|
|
||||||
g_queryInfo.user,
|
|
||||||
g_queryInfo.password,
|
|
||||||
g_queryInfo.dbName,
|
|
||||||
g_queryInfo.port);
|
|
||||||
if (pThreadInfo->taos == NULL) {
|
|
||||||
errorPrint("[%d] Failed to connect to TDengine, reason:%s\n",
|
|
||||||
pThreadInfo->threadID, taos_errstr(NULL));
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
char sqlStr[MAX_TB_NAME_SIZE*2];
|
if (pThreadInfo->taos == NULL) {
|
||||||
sprintf(sqlStr, "use %s", g_queryInfo.dbName);
|
pThreadInfo->taos = taos_connect(g_queryInfo.host,
|
||||||
if (0 != queryDbExec(pThreadInfo->taos, sqlStr, NO_INSERT_TYPE, false)) {
|
g_queryInfo.user,
|
||||||
taos_close(pThreadInfo->taos);
|
g_queryInfo.password,
|
||||||
errorPrint( "use database %s failed!\n\n",
|
g_queryInfo.dbName,
|
||||||
g_queryInfo.dbName);
|
g_queryInfo.port);
|
||||||
return NULL;
|
if (pThreadInfo->taos == NULL) {
|
||||||
}
|
errorPrint("[%d] Failed to connect to TDengine, reason:%s\n",
|
||||||
|
pThreadInfo->threadID, taos_errstr(NULL));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char topic[32] = {0};
|
char sqlStr[MAX_TB_NAME_SIZE*2];
|
||||||
for (uint64_t i = pThreadInfo->start_table_from;
|
sprintf(sqlStr, "use %s", g_queryInfo.dbName);
|
||||||
i <= pThreadInfo->end_table_to; i++) {
|
if (0 != queryDbExec(pThreadInfo->taos, sqlStr, NO_INSERT_TYPE, false)) {
|
||||||
|
|
||||||
tsubSeq = i - pThreadInfo->start_table_from;
|
|
||||||
verbosePrint("%s() LN%d, [%d], start=%"PRId64" end=%"PRId64" i=%"PRIu64"\n",
|
|
||||||
__func__, __LINE__,
|
|
||||||
pThreadInfo->threadID,
|
|
||||||
pThreadInfo->start_table_from,
|
|
||||||
pThreadInfo->end_table_to, i);
|
|
||||||
sprintf(topic, "taosdemo-subscribe-%"PRIu64"-%"PRIu64"",
|
|
||||||
i, pThreadInfo->querySeq);
|
|
||||||
memset(subSqlstr, 0, sizeof(subSqlstr));
|
|
||||||
replaceChildTblName(
|
|
||||||
g_queryInfo.superQueryInfo.sql[pThreadInfo->querySeq],
|
|
||||||
subSqlstr, i);
|
|
||||||
if (g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq][0] != 0) {
|
|
||||||
sprintf(pThreadInfo->filePath, "%s-%d",
|
|
||||||
g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq],
|
|
||||||
pThreadInfo->threadID);
|
|
||||||
}
|
|
||||||
|
|
||||||
debugPrint("%s() LN%d, [%d] subSqlstr: %s\n",
|
|
||||||
__func__, __LINE__, pThreadInfo->threadID, subSqlstr);
|
|
||||||
tsub[tsubSeq] = subscribeImpl(
|
|
||||||
STABLE_CLASS,
|
|
||||||
pThreadInfo, subSqlstr, topic,
|
|
||||||
g_queryInfo.superQueryInfo.subscribeRestart,
|
|
||||||
g_queryInfo.superQueryInfo.subscribeInterval);
|
|
||||||
if (NULL == tsub[tsubSeq]) {
|
|
||||||
taos_close(pThreadInfo->taos);
|
taos_close(pThreadInfo->taos);
|
||||||
|
errorPrint( "use database %s failed!\n\n",
|
||||||
|
g_queryInfo.dbName);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// start loop to consume result
|
char topic[32] = {0};
|
||||||
int consumed[MAX_QUERY_SQL_COUNT];
|
for (uint64_t i = pThreadInfo->start_table_from;
|
||||||
for (int i = 0; i < MAX_QUERY_SQL_COUNT; i++) {
|
i <= pThreadInfo->end_table_to; i++) {
|
||||||
consumed[i] = 0;
|
tsubSeq = i - pThreadInfo->start_table_from;
|
||||||
}
|
verbosePrint("%s() LN%d, [%d], start=%"PRId64" end=%"PRId64" i=%"PRIu64"\n",
|
||||||
TAOS_RES* res = NULL;
|
__func__, __LINE__,
|
||||||
|
pThreadInfo->threadID,
|
||||||
|
pThreadInfo->start_table_from,
|
||||||
|
pThreadInfo->end_table_to, i);
|
||||||
|
sprintf(topic, "taosdemo-subscribe-%"PRIu64"-%"PRIu64"",
|
||||||
|
i, pThreadInfo->querySeq);
|
||||||
|
memset(subSqlstr, 0, sizeof(subSqlstr));
|
||||||
|
replaceChildTblName(
|
||||||
|
g_queryInfo.superQueryInfo.sql[pThreadInfo->querySeq],
|
||||||
|
subSqlstr, i);
|
||||||
|
if (g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq][0] != 0) {
|
||||||
|
sprintf(pThreadInfo->filePath, "%s-%d",
|
||||||
|
g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq],
|
||||||
|
pThreadInfo->threadID);
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t st = 0, et = 0;
|
debugPrint("%s() LN%d, [%d] subSqlstr: %s\n",
|
||||||
|
__func__, __LINE__, pThreadInfo->threadID, subSqlstr);
|
||||||
|
tsub[tsubSeq] = subscribeImpl(
|
||||||
|
STABLE_CLASS,
|
||||||
|
pThreadInfo, subSqlstr, topic,
|
||||||
|
g_queryInfo.superQueryInfo.subscribeRestart,
|
||||||
|
g_queryInfo.superQueryInfo.subscribeInterval);
|
||||||
|
if (NULL == tsub[tsubSeq]) {
|
||||||
|
taos_close(pThreadInfo->taos);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while ((g_queryInfo.superQueryInfo.endAfterConsume == -1)
|
// start loop to consume result
|
||||||
|| (g_queryInfo.superQueryInfo.endAfterConsume <
|
int consumed[MAX_QUERY_SQL_COUNT];
|
||||||
consumed[pThreadInfo->end_table_to - pThreadInfo->start_table_from])) {
|
for (int i = 0; i < MAX_QUERY_SQL_COUNT; i++) {
|
||||||
|
consumed[i] = 0;
|
||||||
|
}
|
||||||
|
TAOS_RES* res = NULL;
|
||||||
|
|
||||||
|
uint64_t st = 0, et = 0;
|
||||||
|
|
||||||
|
while ((g_queryInfo.superQueryInfo.endAfterConsume == -1)
|
||||||
|
|| (g_queryInfo.superQueryInfo.endAfterConsume >
|
||||||
|
consumed[pThreadInfo->end_table_to
|
||||||
|
- pThreadInfo->start_table_from])) {
|
||||||
|
|
||||||
|
verbosePrint("super endAfterConsume: %d, consumed: %d\n",
|
||||||
|
g_queryInfo.superQueryInfo.endAfterConsume,
|
||||||
|
consumed[pThreadInfo->end_table_to
|
||||||
|
- pThreadInfo->start_table_from]);
|
||||||
|
for (uint64_t i = pThreadInfo->start_table_from;
|
||||||
|
i <= pThreadInfo->end_table_to; i++) {
|
||||||
|
tsubSeq = i - pThreadInfo->start_table_from;
|
||||||
|
if (ASYNC_MODE == g_queryInfo.superQueryInfo.asyncMode) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
st = taosGetTimestampMs();
|
||||||
|
performancePrint("st: %"PRIu64" et: %"PRIu64" st-et: %"PRIu64"\n", st, et, (st - et));
|
||||||
|
res = taos_consume(tsub[tsubSeq]);
|
||||||
|
et = taosGetTimestampMs();
|
||||||
|
performancePrint("st: %"PRIu64" et: %"PRIu64" delta: %"PRIu64"\n", st, et, (et - st));
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
if (g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq][0] != 0) {
|
||||||
|
sprintf(pThreadInfo->filePath, "%s-%d",
|
||||||
|
g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq],
|
||||||
|
pThreadInfo->threadID);
|
||||||
|
fetchResult(res, pThreadInfo);
|
||||||
|
}
|
||||||
|
consumed[tsubSeq] ++;
|
||||||
|
|
||||||
|
if ((g_queryInfo.superQueryInfo.resubAfterConsume != -1)
|
||||||
|
&& (consumed[tsubSeq] >=
|
||||||
|
g_queryInfo.superQueryInfo.resubAfterConsume)) {
|
||||||
|
verbosePrint("%s() LN%d, keepProgress:%d, resub super table query: %"PRIu64"\n",
|
||||||
|
__func__, __LINE__,
|
||||||
|
g_queryInfo.superQueryInfo.subscribeKeepProgress,
|
||||||
|
pThreadInfo->querySeq);
|
||||||
|
taos_unsubscribe(tsub[tsubSeq],
|
||||||
|
g_queryInfo.superQueryInfo.subscribeKeepProgress);
|
||||||
|
consumed[tsubSeq]= 0;
|
||||||
|
tsub[tsubSeq] = subscribeImpl(
|
||||||
|
STABLE_CLASS,
|
||||||
|
pThreadInfo, subSqlstr, topic,
|
||||||
|
g_queryInfo.superQueryInfo.subscribeRestart,
|
||||||
|
g_queryInfo.superQueryInfo.subscribeInterval
|
||||||
|
);
|
||||||
|
if (NULL == tsub[tsubSeq]) {
|
||||||
|
taos_close(pThreadInfo->taos);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verbosePrint("%s() LN%d, super endAfterConsume: %d, consumed: %d\n",
|
||||||
|
__func__, __LINE__,
|
||||||
|
g_queryInfo.superQueryInfo.endAfterConsume,
|
||||||
|
consumed[pThreadInfo->end_table_to - pThreadInfo->start_table_from]);
|
||||||
|
taos_free_result(res);
|
||||||
|
|
||||||
for (uint64_t i = pThreadInfo->start_table_from;
|
for (uint64_t i = pThreadInfo->start_table_from;
|
||||||
i <= pThreadInfo->end_table_to; i++) {
|
i <= pThreadInfo->end_table_to; i++) {
|
||||||
tsubSeq = i - pThreadInfo->start_table_from;
|
tsubSeq = i - pThreadInfo->start_table_from;
|
||||||
if (ASYNC_MODE == g_queryInfo.superQueryInfo.asyncMode) {
|
taos_unsubscribe(tsub[tsubSeq], 0);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
st = taosGetTimestampMs();
|
|
||||||
performancePrint("st: %"PRIu64" et: %"PRIu64" st-et: %"PRIu64"\n", st, et, (st - et));
|
|
||||||
res = taos_consume(tsub[tsubSeq]);
|
|
||||||
et = taosGetTimestampMs();
|
|
||||||
performancePrint("st: %"PRIu64" et: %"PRIu64" delta: %"PRIu64"\n", st, et, (et - st));
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
if (g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq][0] != 0) {
|
|
||||||
sprintf(pThreadInfo->filePath, "%s-%d",
|
|
||||||
g_queryInfo.superQueryInfo.result[pThreadInfo->querySeq],
|
|
||||||
pThreadInfo->threadID);
|
|
||||||
fetchResult(res, pThreadInfo);
|
|
||||||
}
|
|
||||||
consumed[tsubSeq] ++;
|
|
||||||
|
|
||||||
if ((g_queryInfo.superQueryInfo.resubAfterConsume != -1)
|
|
||||||
&& (consumed[tsubSeq] >=
|
|
||||||
g_queryInfo.superQueryInfo.resubAfterConsume)) {
|
|
||||||
printf("keepProgress:%d, resub super table query: %"PRIu64"\n",
|
|
||||||
g_queryInfo.superQueryInfo.subscribeKeepProgress,
|
|
||||||
pThreadInfo->querySeq);
|
|
||||||
taos_unsubscribe(tsub[tsubSeq],
|
|
||||||
g_queryInfo.superQueryInfo.subscribeKeepProgress);
|
|
||||||
consumed[tsubSeq]= 0;
|
|
||||||
tsub[tsubSeq] = subscribeImpl(
|
|
||||||
STABLE_CLASS,
|
|
||||||
pThreadInfo, subSqlstr, topic,
|
|
||||||
g_queryInfo.superQueryInfo.subscribeRestart,
|
|
||||||
g_queryInfo.superQueryInfo.subscribeInterval
|
|
||||||
);
|
|
||||||
if (NULL == tsub[tsubSeq]) {
|
|
||||||
taos_close(pThreadInfo->taos);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
taos_free_result(res);
|
|
||||||
|
|
||||||
for (uint64_t i = pThreadInfo->start_table_from;
|
taos_close(pThreadInfo->taos);
|
||||||
i <= pThreadInfo->end_table_to; i++) {
|
return NULL;
|
||||||
tsubSeq = i - pThreadInfo->start_table_from;
|
|
||||||
taos_unsubscribe(tsub[tsubSeq], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_close(pThreadInfo->taos);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *specifiedSubscribe(void *sarg) {
|
static void *specifiedSubscribe(void *sarg) {
|
||||||
|
@ -7420,8 +7424,13 @@ static void *specifiedSubscribe(void *sarg) {
|
||||||
|| (g_queryInfo.specifiedQueryInfo.consumed[pThreadInfo->threadID] <
|
|| (g_queryInfo.specifiedQueryInfo.consumed[pThreadInfo->threadID] <
|
||||||
g_queryInfo.specifiedQueryInfo.endAfterConsume[pThreadInfo->querySeq])) {
|
g_queryInfo.specifiedQueryInfo.endAfterConsume[pThreadInfo->querySeq])) {
|
||||||
|
|
||||||
|
printf("consumed[%d]: %d, endAfterConsum[%"PRId64"]: %d\n",
|
||||||
|
pThreadInfo->threadID,
|
||||||
|
g_queryInfo.specifiedQueryInfo.consumed[pThreadInfo->threadID],
|
||||||
|
pThreadInfo->querySeq,
|
||||||
|
g_queryInfo.specifiedQueryInfo.endAfterConsume[pThreadInfo->querySeq]);
|
||||||
if (ASYNC_MODE == g_queryInfo.specifiedQueryInfo.asyncMode) {
|
if (ASYNC_MODE == g_queryInfo.specifiedQueryInfo.asyncMode) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_queryInfo.specifiedQueryInfo.res[pThreadInfo->threadID] = taos_consume(
|
g_queryInfo.specifiedQueryInfo.res[pThreadInfo->threadID] = taos_consume(
|
||||||
|
|
|
@ -150,6 +150,7 @@ python3 ./test.py -f import_merge/importCSV.py
|
||||||
#======================p2-start===============
|
#======================p2-start===============
|
||||||
# tools
|
# tools
|
||||||
python3 test.py -f tools/taosdumpTest.py
|
python3 test.py -f tools/taosdumpTest.py
|
||||||
|
python3 test.py -f tools/taosdumpTest2.py
|
||||||
|
|
||||||
python3 test.py -f tools/taosdemoTest.py
|
python3 test.py -f tools/taosdemoTest.py
|
||||||
python3 test.py -f tools/taosdemoTestWithoutMetric.py
|
python3 test.py -f tools/taosdemoTestWithoutMetric.py
|
||||||
|
|
|
@ -25,6 +25,21 @@ from multiprocessing import cpu_count
|
||||||
|
|
||||||
# TODO: fully test the function. Handle exceptions.
|
# TODO: fully test the function. Handle exceptions.
|
||||||
# Handle json format not accepted by taosdemo
|
# Handle json format not accepted by taosdemo
|
||||||
|
|
||||||
|
### How to use TaosdemoCfg:
|
||||||
|
# Before you start:
|
||||||
|
# Make sure you understand how is taosdemo's JSON file structured. Because the python used does
|
||||||
|
# not support directory in directory for self objects, the config is being tear to different parts.
|
||||||
|
# Please make sure you understand which directory represent which part of which type of the file
|
||||||
|
# This module will reassemble the parts when creating the JSON file.
|
||||||
|
#
|
||||||
|
# Basic use example
|
||||||
|
# step 1:use self.append_sql_stb() to append the insert/query/subscribe directory into the module
|
||||||
|
# you can append many insert/query/subscribe directory, but pay attention about taosdemo's limit
|
||||||
|
# step 2:use alter function to alter the specific config
|
||||||
|
# step 3:use the generation function to generate the files
|
||||||
|
#
|
||||||
|
# step 1 and step 2 can be replaced with using import functions
|
||||||
class TDTaosdemoCfg:
|
class TDTaosdemoCfg:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.insert_cfg = {
|
self.insert_cfg = {
|
||||||
|
@ -264,7 +279,7 @@ class TDTaosdemoCfg:
|
||||||
elif key == "super_table_query":
|
elif key == "super_table_query":
|
||||||
self.query_cfg["super_table_query"] = self.stable_query
|
self.query_cfg["super_table_query"] = self.stable_query
|
||||||
else:
|
else:
|
||||||
self.table_query[key] = value
|
self.query_cfg[key] = value
|
||||||
|
|
||||||
def alter_sub_cfg(self, key, value):
|
def alter_sub_cfg(self, key, value):
|
||||||
if key == "specified_table_query":
|
if key == "specified_table_query":
|
||||||
|
@ -272,7 +287,7 @@ class TDTaosdemoCfg:
|
||||||
elif key == "super_table_query":
|
elif key == "super_table_query":
|
||||||
self.sub_cfg["super_table_query"] = self.stable_sub
|
self.sub_cfg["super_table_query"] = self.stable_sub
|
||||||
else:
|
else:
|
||||||
self.table_query[key] = value
|
self.sub_cfg[key] = value
|
||||||
|
|
||||||
def alter_sub_stb(self, key, value):
|
def alter_sub_stb(self, key, value):
|
||||||
if key == "sqls":
|
if key == "sqls":
|
||||||
|
|
Loading…
Reference in New Issue