Merge from develop
This commit is contained in:
commit
c17139097a
|
@ -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.13-dist.jar DESTINATION connector/jdbc)
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.14-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")
|
||||||
|
|
|
@ -4,7 +4,7 @@ PROJECT(TDengine)
|
||||||
IF (DEFINED VERNUMBER)
|
IF (DEFINED VERNUMBER)
|
||||||
SET(TD_VER_NUMBER ${VERNUMBER})
|
SET(TD_VER_NUMBER ${VERNUMBER})
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(TD_VER_NUMBER "2.0.8.0")
|
SET(TD_VER_NUMBER "2.0.9.0")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (DEFINED VERCOMPATIBLE)
|
IF (DEFINED VERCOMPATIBLE)
|
||||||
|
|
|
@ -12,7 +12,7 @@ TDengine采用关系型数据模型,需要建库、建表。因此对于一个
|
||||||
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 4;
|
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 4;
|
||||||
```
|
```
|
||||||
上述语句将创建一个名为power的库,这个库的数据将保留365天(超过365天将被自动删除),每10天一个数据文件,内存块数为4。详细的语法及参数请见<a href="https://www.taosdata.com/cn/documentation20/taos-sql/">TAOS SQL</a>
|
上述语句将创建一个名为power的库,这个库的数据将保留365天(超过365天将被自动删除),每10天一个数据文件,内存块数为4。详细的语法及参数请见<a href="https://www.taosdata.com/cn/documentation20/taos-sql/">TAOS SQL</a>
|
||||||
|
|
||||||
创建库之后,需要使用SQL命令USE将当前库切换过来,例如:
|
创建库之后,需要使用SQL命令USE将当前库切换过来,例如:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
|
@ -20,7 +20,7 @@ USE power;
|
||||||
```
|
```
|
||||||
|
|
||||||
就当前连接里操作的库换为power,否则对具体表操作前,需要使用“库名.表名”来指定库的名字。
|
就当前连接里操作的库换为power,否则对具体表操作前,需要使用“库名.表名”来指定库的名字。
|
||||||
|
|
||||||
**注意:**
|
**注意:**
|
||||||
|
|
||||||
- 任何一张表或超级表是属于一个库的,在创建表之前,必须先创建库。
|
- 任何一张表或超级表是属于一个库的,在创建表之前,必须先创建库。
|
||||||
|
@ -44,15 +44,17 @@ CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
|
||||||
```
|
```
|
||||||
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 TAOS SQL。
|
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 TAOS SQL。
|
||||||
|
|
||||||
|
**注意:**目前 TDengine 没有从技术层面限制使用一个 database (dbA)的超级表作为模板建立另一个 database (dbB)的子表,后续会禁止这种用法,不建议使用这种方法建表。
|
||||||
|
|
||||||
TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列号)。但对于有的场景,并没有唯一的ID,可以将多个ID组合成一个唯一的ID。不建议将具有唯一性的ID作为标签值。
|
TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列号)。但对于有的场景,并没有唯一的ID,可以将多个ID组合成一个唯一的ID。不建议将具有唯一性的ID作为标签值。
|
||||||
|
|
||||||
**自动建表**:在某些特殊场景中,用户在写数据时并不确定某个数据采集点的表是否存在,此时可在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。比如:
|
**自动建表**:在某些特殊场景中,用户在写数据时并不确定某个数据采集点的表是否存在,此时可在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。比如:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
|
INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
|
||||||
```
|
```
|
||||||
上述SQL语句将记录(now, 10.2, 219, 0.32) 插入进表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值“Beijing.Chaoyang", 2。
|
上述SQL语句将记录(now, 10.2, 219, 0.32) 插入进表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值“Beijing.Chaoyang", 2。
|
||||||
|
|
||||||
## 多列模型 vs 单列模型
|
## 多列模型 vs 单列模型
|
||||||
TDengine支持多列模型,只要物理量是一个数据采集点同时采集的(时间戳一致),这些量就可以作为不同列放在一张超级表里。但还有一种极限的设计,单列模型,每个采集的物理量都单独建表,因此每种类型的物理量都单独建立一超级表。比如电流、电压、相位,就建三张超级表。
|
TDengine支持多列模型,只要物理量是一个数据采集点同时采集的(时间戳一致),这些量就可以作为不同列放在一张超级表里。但还有一种极限的设计,单列模型,每个采集的物理量都单独建表,因此每种类型的物理量都单独建立一超级表。比如电流、电压、相位,就建三张超级表。
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,7 @@ TDengine系统后台服务由taosd提供,可以在配置文件taos.cfg里修
|
||||||
- logKeepDays:日志文件的最长保存时间。大于0时,日志文件会被重命名为taosdlog.xxx,其中xxx为日志文件最后修改的时间戳,单位为秒。默认值:0天。
|
- logKeepDays:日志文件的最长保存时间。大于0时,日志文件会被重命名为taosdlog.xxx,其中xxx为日志文件最后修改的时间戳,单位为秒。默认值:0天。
|
||||||
- maxSQLLength:单条SQL语句允许最长限制。默认值:65380字节。
|
- maxSQLLength:单条SQL语句允许最长限制。默认值:65380字节。
|
||||||
- telemetryReporting: 是否允许 TDengine 采集和上报基本使用信息,0表示不允许,1表示允许。 默认值:1。
|
- telemetryReporting: 是否允许 TDengine 采集和上报基本使用信息,0表示不允许,1表示允许。 默认值:1。
|
||||||
|
- stream: 是否启用连续查询(流计算功能),0表示不允许,1表示允许。 默认值:1。
|
||||||
|
|
||||||
**注意:**对于端口,TDengine会使用从serverPort起13个连续的TCP和UDP端口号,请务必在防火墙打开。因此如果是缺省配置,需要打开从6030都6042共13个端口,而且必须TCP和UDP都打开。
|
**注意:**对于端口,TDengine会使用从serverPort起13个连续的TCP和UDP端口号,请务必在防火墙打开。因此如果是缺省配置,需要打开从6030都6042共13个端口,而且必须TCP和UDP都打开。
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ fqdn h1.taosdata.com
|
||||||
// 配置本数据节点的端口号,缺省是6030
|
// 配置本数据节点的端口号,缺省是6030
|
||||||
serverPort 6030
|
serverPort 6030
|
||||||
|
|
||||||
// 服务端节点数为偶数的时候,需要配置,请参考《Arbitrator的使用》的部分
|
// 使用场景,请参考《Arbitrator的使用》的部分
|
||||||
arbitrator ha.taosdata.com:6042
|
arbitrator ha.taosdata.com:6042
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -36,16 +36,20 @@
|
||||||
|
|
||||||
5. ping服务器FQDN,如果没有反应,请检查你的网络,DNS设置,或客户端所在计算机的系统hosts文件
|
5. ping服务器FQDN,如果没有反应,请检查你的网络,DNS设置,或客户端所在计算机的系统hosts文件
|
||||||
|
|
||||||
6. 检查防火墙设置,确认TCP/UDP 端口6030-6042 是打开的
|
6. 检查防火墙设置(Ubuntu 使用 ufw status,CentOS 使用 firewall-cmd --list-port),确认TCP/UDP 端口6030-6042 是打开的
|
||||||
|
|
||||||
7. 对于Linux上的JDBC(ODBC, Python, Go等接口类似)连接, 确保*libtaos.so*在目录*/usr/local/taos/driver*里, 并且*/usr/local/taos/driver*在系统库函数搜索路径*LD_LIBRARY_PATH*里
|
7. 对于Linux上的JDBC(ODBC, Python, Go等接口类似)连接, 确保*libtaos.so*在目录*/usr/local/taos/driver*里, 并且*/usr/local/taos/driver*在系统库函数搜索路径*LD_LIBRARY_PATH*里
|
||||||
|
|
||||||
8. 对于windows上的JDBC, ODBC, Python, Go等连接,确保*C:\TDengine\driver\taos.dll*在你的系统库函数搜索目录里 (建议*taos.dll*放在目录 *C:\Windows\System32*)
|
8. 对于windows上的JDBC, ODBC, Python, Go等连接,确保*C:\TDengine\driver\taos.dll*在你的系统库函数搜索目录里 (建议*taos.dll*放在目录 *C:\Windows\System32*)
|
||||||
|
|
||||||
9. 如果仍不能排除连接故障,请使用命令行工具nc来分别判断指定端口的TCP和UDP连接是否通畅
|
9. 如果仍不能排除连接故障
|
||||||
检查UDP端口连接是否工作:`nc -vuz {hostIP} {port} `
|
|
||||||
检查服务器侧TCP端口连接是否工作:`nc -l {port}`
|
* Linux 系统请使用命令行工具nc来分别判断指定端口的TCP和UDP连接是否通畅
|
||||||
检查客户端侧TCP端口连接是否工作:`nc {hostIP} {port}`
|
检查UDP端口连接是否工作:`nc -vuz {hostIP} {port} `
|
||||||
|
检查服务器侧TCP端口连接是否工作:`nc -l {port}`
|
||||||
|
检查客户端侧TCP端口连接是否工作:`nc {hostIP} {port}`
|
||||||
|
|
||||||
|
* Windows 系统请使用 PowerShell 命令 Net-TestConnection -ComputerName {fqdn} -Port {port} 检测服务段端口是否访问
|
||||||
|
|
||||||
10. 也可以使用taos程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅(包括TCP和UDP):[TDengine 内嵌网络检测工具使用指南](https://www.taosdata.com/blog/2020/09/08/1816.html)。
|
10. 也可以使用taos程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅(包括TCP和UDP):[TDengine 内嵌网络检测工具使用指南](https://www.taosdata.com/blog/2020/09/08/1816.html)。
|
||||||
|
|
||||||
|
@ -101,7 +105,20 @@ Connection = DriverManager.getConnection(url, properties);
|
||||||
<version>2.0.4</version>
|
<version>2.0.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
## 14. 怎么报告问题?
|
## 14. taos connect failed, reason: invalid timestamp
|
||||||
|
|
||||||
|
常见原因是服务器和客户端时间没有校准,可以通过和时间服务器同步的方式(Linux 下使用 ntpdate 命令,Windows 在系统时间设置中选择自动同步)校准。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 15. 表名显示不全
|
||||||
|
|
||||||
|
由于 taos shell 在终端中显示宽度有限,有可能比较长的表名显示不全,如果按照显示的不全的表名进行相关操作会发生 Table does not exist 错误。解决方法可以是通过修改 taos.cfg 文件中的设置项 maxBinaryDisplayWidth, 或者直接输入命令 set max_binary_display_width 100。或者在命令结尾使用 \G 参数来调整结果的显示方式。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 16. 怎么报告问题?
|
||||||
|
|
||||||
如果 FAQ 中的信息不能够帮到您,需要 TDengine 技术团队的技术支持与协助,请将以下两个目录中内容打包:
|
如果 FAQ 中的信息不能够帮到您,需要 TDengine 技术团队的技术支持与协助,请将以下两个目录中内容打包:
|
||||||
1. /var/log/taos
|
1. /var/log/taos
|
||||||
2. /etc/taos
|
2. /etc/taos
|
||||||
|
|
|
@ -251,7 +251,7 @@
|
||||||
# cqDebugFlag 131
|
# cqDebugFlag 131
|
||||||
|
|
||||||
# enable/disable recording the SQL in taos client
|
# enable/disable recording the SQL in taos client
|
||||||
# tscEnableRecordSql 0
|
# enableRecordSql 0
|
||||||
|
|
||||||
# generate core file when service crash
|
# generate core file when service crash
|
||||||
# enableCoreFile 1
|
# enableCoreFile 1
|
||||||
|
@ -260,4 +260,10 @@
|
||||||
# maxBinaryDisplayWidth 30
|
# maxBinaryDisplayWidth 30
|
||||||
|
|
||||||
# enable/disable telemetry reporting
|
# enable/disable telemetry reporting
|
||||||
# telemetryReporting 1
|
# telemetryReporting 1
|
||||||
|
|
||||||
|
# enable/disable stream (continuous query)
|
||||||
|
# stream 1
|
||||||
|
|
||||||
|
# only 50% CPU resources will be used in query processing
|
||||||
|
# halfCoresForQuery 0
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: tdengine
|
name: tdengine
|
||||||
base: core18
|
base: core18
|
||||||
version: '2.0.8.0'
|
version: '2.0.9.0'
|
||||||
icon: snap/gui/t-dengine.svg
|
icon: snap/gui/t-dengine.svg
|
||||||
summary: an open-source big data platform designed and optimized for IoT.
|
summary: an open-source big data platform designed and optimized for IoT.
|
||||||
description: |
|
description: |
|
||||||
|
@ -72,7 +72,7 @@ parts:
|
||||||
- usr/bin/taosd
|
- usr/bin/taosd
|
||||||
- usr/bin/taos
|
- usr/bin/taos
|
||||||
- usr/bin/taosdemo
|
- usr/bin/taosdemo
|
||||||
- usr/lib/libtaos.so.2.0.8.0
|
- usr/lib/libtaos.so.2.0.9.0
|
||||||
- usr/lib/libtaos.so.1
|
- usr/lib/libtaos.so.1
|
||||||
- usr/lib/libtaos.so
|
- usr/lib/libtaos.so
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ typedef struct SVgroupTableInfo {
|
||||||
} SVgroupTableInfo;
|
} SVgroupTableInfo;
|
||||||
|
|
||||||
static FORCE_INLINE SQueryInfo* tscGetQueryInfoDetail(SSqlCmd* pCmd, int32_t subClauseIndex) {
|
static FORCE_INLINE SQueryInfo* tscGetQueryInfoDetail(SSqlCmd* pCmd, int32_t subClauseIndex) {
|
||||||
assert(pCmd != NULL && subClauseIndex >= 0 && subClauseIndex < TSDB_MAX_UNION_CLAUSE);
|
assert(pCmd != NULL && subClauseIndex >= 0);
|
||||||
|
|
||||||
if (pCmd->pQueryInfo == NULL || subClauseIndex >= pCmd->numOfClause) {
|
if (pCmd->pQueryInfo == NULL || subClauseIndex >= pCmd->numOfClause) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -278,7 +278,7 @@ bool hasMoreClauseToTry(SSqlObj* pSql);
|
||||||
void tscTryQueryNextVnode(SSqlObj *pSql, __async_cb_func_t fp);
|
void tscTryQueryNextVnode(SSqlObj *pSql, __async_cb_func_t fp);
|
||||||
void tscAsyncQuerySingleRowForNextVnode(void *param, TAOS_RES *tres, int numOfRows);
|
void tscAsyncQuerySingleRowForNextVnode(void *param, TAOS_RES *tres, int numOfRows);
|
||||||
void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp);
|
void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp);
|
||||||
int tscSetMgmtEpSetFromCfg(const char *first, const char *second);
|
int tscSetMgmtEpSetFromCfg(const char *first, const char *second, SRpcCorEpSet *corEpSet);
|
||||||
|
|
||||||
bool tscSetSqlOwner(SSqlObj* pSql);
|
bool tscSetSqlOwner(SSqlObj* pSql);
|
||||||
void tscClearSqlOwner(SSqlObj* pSql);
|
void tscClearSqlOwner(SSqlObj* pSql);
|
||||||
|
|
|
@ -246,11 +246,14 @@ typedef struct SQueryInfo {
|
||||||
int16_t fillType; // final result fill type
|
int16_t fillType; // final result fill type
|
||||||
int16_t numOfTables;
|
int16_t numOfTables;
|
||||||
STableMetaInfo **pTableMetaInfo;
|
STableMetaInfo **pTableMetaInfo;
|
||||||
struct STSBuf * tsBuf;
|
struct STSBuf *tsBuf;
|
||||||
int64_t * fillVal; // default value for fill
|
int64_t * fillVal; // default value for fill
|
||||||
char * msg; // pointer to the pCmd->payload to keep error message temporarily
|
char * msg; // pointer to the pCmd->payload to keep error message temporarily
|
||||||
int64_t clauseLimit; // limit for current sub clause
|
int64_t clauseLimit; // limit for current sub clause
|
||||||
|
|
||||||
int64_t prjOffset; // offset value in the original sql expression, only applied at client side
|
int64_t prjOffset; // offset value in the original sql expression, only applied at client side
|
||||||
|
int64_t tableLimit; // table limit in case of super table projection query + global order + limit
|
||||||
|
|
||||||
int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
|
int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
|
||||||
int16_t resColumnId; // result column id
|
int16_t resColumnId; // result column id
|
||||||
} SQueryInfo;
|
} SQueryInfo;
|
||||||
|
@ -336,6 +339,7 @@ typedef struct STscObj {
|
||||||
int64_t hbrid;
|
int64_t hbrid;
|
||||||
struct SSqlObj * sqlList;
|
struct SSqlObj * sqlList;
|
||||||
struct SSqlStream *streamList;
|
struct SSqlStream *streamList;
|
||||||
|
SRpcCorEpSet *tscCorMgmtEpSet;
|
||||||
void* pDnodeConn;
|
void* pDnodeConn;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
T_REF_DECLARE()
|
T_REF_DECLARE()
|
||||||
|
@ -515,7 +519,6 @@ extern int tsInsertHeadSize;
|
||||||
extern int tscNumOfThreads;
|
extern int tscNumOfThreads;
|
||||||
extern int tscRefId;
|
extern int tscRefId;
|
||||||
|
|
||||||
extern SRpcCorEpSet tscMgmtEpSet;
|
|
||||||
|
|
||||||
extern int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo);
|
extern int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo);
|
||||||
|
|
||||||
|
|
|
@ -54,8 +54,8 @@
|
||||||
|
|
||||||
#define DO_UPDATE_TAG_COLUMNS(ctx, ts) \
|
#define DO_UPDATE_TAG_COLUMNS(ctx, ts) \
|
||||||
do { \
|
do { \
|
||||||
for (int32_t i = 0; i < (ctx)->tagInfo.numOfTagCols; ++i) { \
|
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
|
||||||
SQLFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[i]; \
|
SQLFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
|
||||||
if (__ctx->functionId == TSDB_FUNC_TS_DUMMY) { \
|
if (__ctx->functionId == TSDB_FUNC_TS_DUMMY) { \
|
||||||
__ctx->tag.i64Key = (ts); \
|
__ctx->tag.i64Key = (ts); \
|
||||||
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
|
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
|
||||||
|
@ -66,8 +66,8 @@
|
||||||
|
|
||||||
#define DO_UPDATE_TAG_COLUMNS_WITHOUT_TS(ctx) \
|
#define DO_UPDATE_TAG_COLUMNS_WITHOUT_TS(ctx) \
|
||||||
do { \
|
do { \
|
||||||
for (int32_t i = 0; i < (ctx)->tagInfo.numOfTagCols; ++i) { \
|
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
|
||||||
SQLFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[i]; \
|
SQLFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
|
||||||
aAggs[TSDB_FUNC_TAG].xFunction(__ctx); \
|
aAggs[TSDB_FUNC_TAG].xFunction(__ctx); \
|
||||||
} \
|
} \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
@ -305,7 +305,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
} else if (functionId == TSDB_FUNC_FIRST || functionId == TSDB_FUNC_LAST) {
|
} else if (functionId == TSDB_FUNC_FIRST || functionId == TSDB_FUNC_LAST) {
|
||||||
*type = (int16_t)dataType;
|
*type = (int16_t)dataType;
|
||||||
*bytes = (int16_t)dataBytes;
|
*bytes = (int16_t)dataBytes;
|
||||||
*interBytes = dataBytes;
|
*interBytes = (int16_t)(dataBytes + sizeof(SFirstLastInfo));
|
||||||
} else if (functionId == TSDB_FUNC_SPREAD) {
|
} else if (functionId == TSDB_FUNC_SPREAD) {
|
||||||
*type = (int16_t)TSDB_DATA_TYPE_DOUBLE;
|
*type = (int16_t)TSDB_DATA_TYPE_DOUBLE;
|
||||||
*bytes = sizeof(double);
|
*bytes = sizeof(double);
|
||||||
|
@ -426,8 +426,7 @@ static void count_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_VAL(pCtx, 1, 1);
|
SET_VAL(pCtx, 1, 1);
|
||||||
|
*((int64_t *)pCtx->aOutputBuf) += pCtx->size;
|
||||||
*((int64_t *)pCtx->aOutputBuf) += 1;
|
|
||||||
|
|
||||||
// do not need it actually
|
// do not need it actually
|
||||||
SResultRowCellInfo *pInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pInfo = GET_RES_INFO(pCtx);
|
||||||
|
@ -1170,8 +1169,8 @@ static int32_t minmax_merge_impl(SQLFunctionCtx *pCtx, int32_t bytes, char *outp
|
||||||
if ((*(int32_t *)output < v) ^ isMin) {
|
if ((*(int32_t *)output < v) ^ isMin) {
|
||||||
*(int32_t *)output = v;
|
*(int32_t *)output = v;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->tagInfo.numOfTagCols; ++i) {
|
for (int32_t j = 0; j < pCtx->tagInfo.numOfTagCols; ++j) {
|
||||||
SQLFunctionCtx *__ctx = pCtx->tagInfo.pTagCtxList[i];
|
SQLFunctionCtx *__ctx = pCtx->tagInfo.pTagCtxList[j];
|
||||||
aAggs[TSDB_FUNC_TAG].xFunction(__ctx);
|
aAggs[TSDB_FUNC_TAG].xFunction(__ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1680,16 +1679,35 @@ static void last_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
if (pCtx->hasNull && isNull(pData, pCtx->inputType)) {
|
if (pCtx->hasNull && isNull(pData, pCtx->inputType)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_VAL(pCtx, 1, 1);
|
// the scan order is not the required order, ignore it
|
||||||
memcpy(pCtx->aOutputBuf, pData, pCtx->inputBytes);
|
if (pCtx->order != pCtx->param[0].i64Key) {
|
||||||
|
return;
|
||||||
TSKEY ts = pCtx->ptsList[index];
|
}
|
||||||
DO_UPDATE_TAG_COLUMNS(pCtx, ts);
|
|
||||||
|
if (pCtx->order == TSDB_ORDER_DESC) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SET_VAL(pCtx, 1, 1);
|
||||||
pResInfo->hasResult = DATA_SET_FLAG;
|
memcpy(pCtx->aOutputBuf, pData, pCtx->inputBytes);
|
||||||
pResInfo->complete = true; // set query completed
|
|
||||||
|
TSKEY ts = pCtx->ptsList[index];
|
||||||
|
DO_UPDATE_TAG_COLUMNS(pCtx, ts);
|
||||||
|
|
||||||
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
pResInfo->complete = true; // set query completed
|
||||||
|
} else { // in case of ascending order check, all data needs to be checked
|
||||||
|
SResultRowCellInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
TSKEY ts = pCtx->ptsList[index];
|
||||||
|
|
||||||
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
if (pResInfo->hasResult != DATA_SET_FLAG || (*(TSKEY*)buf) < ts) {
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
memcpy(pCtx->aOutputBuf, pData, pCtx->inputBytes);
|
||||||
|
|
||||||
|
*(TSKEY*)buf = ts;
|
||||||
|
DO_UPDATE_TAG_COLUMNS(pCtx, ts);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void last_data_assign_impl(SQLFunctionCtx *pCtx, char *pData, int32_t index) {
|
static void last_data_assign_impl(SQLFunctionCtx *pCtx, char *pData, int32_t index) {
|
||||||
|
@ -1712,7 +1730,7 @@ static void last_data_assign_impl(SQLFunctionCtx *pCtx, char *pData, int32_t ind
|
||||||
|
|
||||||
static void last_dist_function(SQLFunctionCtx *pCtx) {
|
static void last_dist_function(SQLFunctionCtx *pCtx) {
|
||||||
/*
|
/*
|
||||||
* 1. for scan data in asc order, no need to check data
|
* 1. for scan data is not the required order
|
||||||
* 2. for data blocks that are not loaded, no need to check data
|
* 2. for data blocks that are not loaded, no need to check data
|
||||||
*/
|
*/
|
||||||
if (pCtx->order != pCtx->param[0].i64Key) {
|
if (pCtx->order != pCtx->param[0].i64Key) {
|
||||||
|
@ -2448,7 +2466,7 @@ static bool percentile_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
static void percentile_function(SQLFunctionCtx *pCtx) {
|
static void percentile_function(SQLFunctionCtx *pCtx) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SPercentileInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SPercentileInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// the first stage, only acquire the min/max value
|
// the first stage, only acquire the min/max value
|
||||||
|
@ -2549,12 +2567,14 @@ static void percentile_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
double v = pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i64Key : pCtx->param[0].dKey;
|
double v = pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i64Key : pCtx->param[0].dKey;
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
tMemBucket * pMemBucket = ((SPercentileInfo *)GET_ROWCELL_INTERBUF(pResInfo))->pMemBucket;
|
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pMemBucket->total > 0) { // check for null
|
tMemBucket * pMemBucket = ppInfo->pMemBucket;
|
||||||
*(double *)pCtx->aOutputBuf = getPercentile(pMemBucket, v);
|
if (pMemBucket == NULL || pMemBucket->total == 0) { // check for null
|
||||||
} else {
|
assert(ppInfo->numOfElems == 0);
|
||||||
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
||||||
|
} else {
|
||||||
|
*(double *)pCtx->aOutputBuf = getPercentile(pMemBucket, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
tMemBucketDestroy(pMemBucket);
|
tMemBucketDestroy(pMemBucket);
|
||||||
|
@ -3632,114 +3652,119 @@ static bool twa_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t index, int32_t size) {
|
static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t index, int32_t size) {
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
TSKEY *primaryKey = pCtx->ptsList;
|
TSKEY *primaryKey = pCtx->ptsList;
|
||||||
|
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
int32_t i = index;
|
int32_t i = index;
|
||||||
|
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pCtx->order);
|
||||||
|
|
||||||
if (pCtx->start.key != INT64_MIN) {
|
if (pCtx->start.key != INT64_MIN) {
|
||||||
assert(pCtx->start.key < primaryKey[index] && pInfo->lastKey == INT64_MIN);
|
assert((pCtx->start.key < primaryKey[tsIndex + i] && pCtx->order == TSDB_ORDER_ASC) ||
|
||||||
|
(pCtx->start.key > primaryKey[tsIndex + i] && pCtx->order == TSDB_ORDER_DESC));
|
||||||
|
|
||||||
pInfo->lastKey = primaryKey[index];
|
assert(pInfo->lastKey == INT64_MIN);
|
||||||
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, 0));
|
|
||||||
|
pInfo->lastKey = primaryKey[tsIndex + i];
|
||||||
|
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, index));
|
||||||
|
|
||||||
pInfo->dOutput += ((pInfo->lastValue + pCtx->start.val) / 2) * (pInfo->lastKey - pCtx->start.key);
|
pInfo->dOutput += ((pInfo->lastValue + pCtx->start.val) / 2) * (pInfo->lastKey - pCtx->start.key);
|
||||||
|
|
||||||
pInfo->hasResult = DATA_SET_FLAG;
|
pInfo->hasResult = DATA_SET_FLAG;
|
||||||
pInfo->win.skey = pCtx->start.key;
|
pInfo->win.skey = pCtx->start.key;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
i += 1;
|
i += step;
|
||||||
} else if (pInfo->lastKey == INT64_MIN) {
|
} else if (pInfo->lastKey == INT64_MIN) {
|
||||||
pInfo->lastKey = primaryKey[index];
|
pInfo->lastKey = primaryKey[tsIndex + i];
|
||||||
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, 0));
|
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, index));
|
||||||
|
|
||||||
pInfo->hasResult = DATA_SET_FLAG;
|
pInfo->hasResult = DATA_SET_FLAG;
|
||||||
pInfo->win.skey = pInfo->lastKey;
|
pInfo->win.skey = pInfo->lastKey;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
i += 1;
|
i += step;
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate the value of
|
// calculate the value of
|
||||||
switch(pCtx->inputType) {
|
switch(pCtx->inputType) {
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t *val = (int8_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
int8_t *val = (int8_t*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = val[i];
|
pInfo->lastValue = val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int16_t *val = (int16_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
int16_t *val = (int16_t*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = val[i];
|
pInfo->lastValue = val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int32_t *val = (int32_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
int32_t *val = (int32_t*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = val[i];
|
pInfo->lastValue = val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t *val = (int64_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
int64_t *val = (int64_t*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = (double) val[i];
|
pInfo->lastValue = (double) val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float *val = (float*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
float *val = (float*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = val[i];
|
pInfo->lastValue = val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double *val = (double*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
double *val = (double*) GET_INPUT_CHAR_INDEX(pCtx, 0);
|
||||||
for (; i < size; i++) {
|
for (; i < size && i >= 0; i += step) {
|
||||||
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i] - pInfo->lastKey);
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + tsIndex] - pInfo->lastKey);
|
||||||
pInfo->lastValue = val[i];
|
pInfo->lastValue = val[i];
|
||||||
pInfo->lastKey = primaryKey[i];
|
pInfo->lastKey = primaryKey[i + tsIndex];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3764,16 +3789,13 @@ static void twa_function(SQLFunctionCtx *pCtx) {
|
||||||
STwaInfo * pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STwaInfo * pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// skip null value
|
// skip null value
|
||||||
int32_t i = 0;
|
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pCtx->order);
|
||||||
|
int32_t i = (pCtx->order == TSDB_ORDER_ASC)? 0:(pCtx->size - 1);
|
||||||
while (pCtx->hasNull && i < pCtx->size && isNull((char *)data + pCtx->inputBytes * i, pCtx->inputType)) {
|
while (pCtx->hasNull && i < pCtx->size && isNull((char *)data + pCtx->inputBytes * i, pCtx->inputType)) {
|
||||||
i++;
|
i += step;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= pCtx->size) {
|
int32_t notNullElems = twa_function_impl(pCtx, pCtx->startOffset, i, pCtx->size);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t notNullElems = twa_function_impl(pCtx, pCtx->startOffset, pCtx->size);
|
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
if (notNullElems > 0) {
|
if (notNullElems > 0) {
|
||||||
|
@ -3791,11 +3813,136 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t notNullElems = twa_function_impl(pCtx, index, 1);
|
int32_t notNullElems = 0;
|
||||||
|
TSKEY *primaryKey = pCtx->ptsList;
|
||||||
|
|
||||||
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
|
STwaInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
int32_t i = pCtx->startOffset;
|
||||||
|
int32_t size = pCtx->size;
|
||||||
|
|
||||||
|
if (pCtx->start.key != INT64_MIN) {
|
||||||
|
assert(pInfo->lastKey == INT64_MIN);
|
||||||
|
|
||||||
|
pInfo->lastKey = primaryKey[index];
|
||||||
|
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, index));
|
||||||
|
|
||||||
|
pInfo->dOutput += ((pInfo->lastValue + pCtx->start.val) / 2) * (pInfo->lastKey - pCtx->start.key);
|
||||||
|
|
||||||
|
pInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
pInfo->win.skey = pCtx->start.key;
|
||||||
|
notNullElems++;
|
||||||
|
i += 1;
|
||||||
|
} else if (pInfo->lastKey == INT64_MIN) {
|
||||||
|
pInfo->lastKey = primaryKey[index];
|
||||||
|
GET_TYPED_DATA(pInfo->lastValue, double, pCtx->inputType, GET_INPUT_CHAR_INDEX(pCtx, index));
|
||||||
|
|
||||||
|
pInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
pInfo->win.skey = pInfo->lastKey;
|
||||||
|
notNullElems++;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the value of
|
||||||
|
switch(pCtx->inputType) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
|
int8_t *val = (int8_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
|
int16_t *val = (int16_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_INT: {
|
||||||
|
int32_t *val = (int32_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
|
int64_t *val = (int64_t*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = (double) val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
|
float *val = (float*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
double *val = (double*) GET_INPUT_CHAR_INDEX(pCtx, index);
|
||||||
|
for (; i < size; i++) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->dOutput += ((val[i] + pInfo->lastValue) / 2) * (primaryKey[i + index] - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = val[i];
|
||||||
|
pInfo->lastKey = primaryKey[i + index];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// the last interpolated time window value
|
||||||
|
if (pCtx->end.key != INT64_MIN) {
|
||||||
|
pInfo->dOutput += ((pInfo->lastValue + pCtx->end.val) / 2) * (pCtx->end.key - pInfo->lastKey);
|
||||||
|
pInfo->lastValue = pCtx->end.val;
|
||||||
|
pInfo->lastKey = pCtx->end.key;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->win.ekey = pInfo->lastKey;
|
||||||
|
|
||||||
SET_VAL(pCtx, notNullElems, 1);
|
SET_VAL(pCtx, notNullElems, 1);
|
||||||
|
|
||||||
|
if (notNullElems > 0) {
|
||||||
|
pResInfo->hasResult = DATA_SET_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
if (pCtx->stableQuery) {
|
if (pCtx->stableQuery) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
|
||||||
memcpy(pCtx->aOutputBuf, GET_ROWCELL_INTERBUF(pResInfo), sizeof(STwaInfo));
|
memcpy(pCtx->aOutputBuf, GET_ROWCELL_INTERBUF(pResInfo), sizeof(STwaInfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4414,11 +4561,11 @@ static void sumrate_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int32_t functionCompatList[] = {
|
int32_t functionCompatList[] = {
|
||||||
// count, sum, avg, min, max, stddev, percentile, apercentile, first, last
|
// count, sum, avg, min, max, stddev, percentile, apercentile, first, last
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
// last_row, top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_z
|
// last_row,top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_z
|
||||||
4, -1, -1, 1, 1, 1, 1, 1, 1, -1,
|
4, -1, -1, 1, 1, 1, 1, 1, 1, -1,
|
||||||
// tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, interp rate irate
|
// tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, interp rate irate
|
||||||
1, 1, 1, 1, -1, 1, 1, 5, 1, 1,
|
1, 1, 1, 1, -1, 1, 1, 5, 1, 1,
|
||||||
// sum_rate, sum_irate, avg_rate, avg_irate
|
// sum_rate, sum_irate, avg_rate, avg_irate
|
||||||
1, 1, 1, 1,
|
1, 1, 1, 1,
|
||||||
|
|
|
@ -726,13 +726,12 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
|
||||||
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, i);
|
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, i);
|
||||||
|
|
||||||
SSchema p1 = {0};
|
SSchema p1 = {0};
|
||||||
if (pExpr->colInfo.colIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
if (pExpr->colInfo.colIndex != TSDB_TBNAME_COLUMN_INDEX) {
|
||||||
p1 = tscGetTbnameColumnSchema();
|
p1 = *tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pExpr->colInfo.colIndex);
|
||||||
} else {
|
} else {
|
||||||
p1 = *(SSchema*) tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pExpr->colInfo.colIndex);
|
p1 = tGetTableNameColumnSchema();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t inter = 0;
|
int32_t inter = 0;
|
||||||
int16_t type = -1;
|
int16_t type = -1;
|
||||||
int16_t bytes = 0;
|
int16_t bytes = 0;
|
||||||
|
@ -750,7 +749,7 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
|
||||||
functionId = TSDB_FUNC_LAST;
|
functionId = TSDB_FUNC_LAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = getResultDataInfo(p1.type, p1.bytes, functionId, 0, &type, &bytes, &inter, 0, false);
|
int32_t ret = getResultDataInfo(p1.type, p1.bytes, functionId, 0, &type, &bytes, &inter, 0, false);
|
||||||
assert(ret == TSDB_CODE_SUCCESS);
|
assert(ret == TSDB_CODE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1634,7 +1633,7 @@ void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen)
|
||||||
|
|
||||||
int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_t rowSize, int32_t finalRowSize) {
|
int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_t rowSize, int32_t finalRowSize) {
|
||||||
int32_t maxRowSize = MAX(rowSize, finalRowSize);
|
int32_t maxRowSize = MAX(rowSize, finalRowSize);
|
||||||
char* pbuf = calloc(1, pOutput->num * maxRowSize);
|
char* pbuf = calloc(1, (size_t)(pOutput->num * maxRowSize));
|
||||||
|
|
||||||
size_t size = tscNumOfFields(pQueryInfo);
|
size_t size = tscNumOfFields(pQueryInfo);
|
||||||
SArithmeticSupport arithSup = {0};
|
SArithmeticSupport arithSup = {0};
|
||||||
|
@ -1661,16 +1660,16 @@ int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_
|
||||||
tExprTreeCalcTraverse(arithSup.pArithExpr->pExpr, (int32_t) pOutput->num, pbuf + pOutput->num*offset, &arithSup, TSDB_ORDER_ASC, getArithmeticInputSrc);
|
tExprTreeCalcTraverse(arithSup.pArithExpr->pExpr, (int32_t) pOutput->num, pbuf + pOutput->num*offset, &arithSup, TSDB_ORDER_ASC, getArithmeticInputSrc);
|
||||||
} else {
|
} else {
|
||||||
SSqlExpr* pExpr = pSup->pSqlExpr;
|
SSqlExpr* pExpr = pSup->pSqlExpr;
|
||||||
memcpy(pbuf + pOutput->num * offset, pExpr->offset * pOutput->num + pOutput->data, pExpr->resBytes * pOutput->num);
|
memcpy(pbuf + pOutput->num * offset, pExpr->offset * pOutput->num + pOutput->data, (size_t)(pExpr->resBytes * pOutput->num));
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += pSup->field.bytes;
|
offset += pSup->field.bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pOutput->data, pbuf, pOutput->num * offset);
|
memcpy(pOutput->data, pbuf, (size_t)(pOutput->num * offset));
|
||||||
|
|
||||||
tfree(pbuf);
|
tfree(pbuf);
|
||||||
tfree(arithSup.data);
|
tfree(arithSup.data);
|
||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -630,11 +630,17 @@ int32_t tscAllocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int3
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tsSetBlockInfo(SSubmitBlk *pBlocks, const STableMeta *pTableMeta, int32_t numOfRows) {
|
static int32_t tsSetBlockInfo(SSubmitBlk *pBlocks, const STableMeta *pTableMeta, int32_t numOfRows) {
|
||||||
pBlocks->tid = pTableMeta->id.tid;
|
pBlocks->tid = pTableMeta->id.tid;
|
||||||
pBlocks->uid = pTableMeta->id.uid;
|
pBlocks->uid = pTableMeta->id.uid;
|
||||||
pBlocks->sversion = pTableMeta->sversion;
|
pBlocks->sversion = pTableMeta->sversion;
|
||||||
pBlocks->numOfRows += numOfRows;
|
|
||||||
|
if (pBlocks->numOfRows + numOfRows >= INT16_MAX) {
|
||||||
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
} else {
|
||||||
|
pBlocks->numOfRows += numOfRows;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// data block is disordered, sort it in ascending order
|
// data block is disordered, sort it in ascending order
|
||||||
|
@ -722,7 +728,11 @@ static int32_t doParseInsertStatement(SSqlObj *pSql, void *pTableList, char **st
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitBlk *pBlocks = (SSubmitBlk *)(dataBuf->pData);
|
SSubmitBlk *pBlocks = (SSubmitBlk *)(dataBuf->pData);
|
||||||
tsSetBlockInfo(pBlocks, pTableMeta, numOfRows);
|
code = tsSetBlockInfo(pBlocks, pTableMeta, numOfRows);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tscInvalidSQLErrMsg(pCmd->payload, "too many rows in sql, total number of rows should be less than 32767", *str);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
dataBuf->vgId = pTableMeta->vgroupInfo.vgId;
|
dataBuf->vgId = pTableMeta->vgroupInfo.vgId;
|
||||||
dataBuf->numOfTables = 1;
|
dataBuf->numOfTables = 1;
|
||||||
|
@ -1384,7 +1394,10 @@ static int doPackSendDataBlock(SSqlObj *pSql, int32_t numOfRows, STableDataBlock
|
||||||
STableMeta *pTableMeta = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0)->pTableMeta;
|
STableMeta *pTableMeta = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0)->pTableMeta;
|
||||||
|
|
||||||
SSubmitBlk *pBlocks = (SSubmitBlk *)(pTableDataBlocks->pData);
|
SSubmitBlk *pBlocks = (SSubmitBlk *)(pTableDataBlocks->pData);
|
||||||
tsSetBlockInfo(pBlocks, pTableMeta, numOfRows);
|
code = tsSetBlockInfo(pBlocks, pTableMeta, numOfRows);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return tscInvalidSQLErrMsg(pCmd->payload, "too many rows in sql, total number of rows should be less than 32767", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if ((code = tscMergeTableDataBlocks(pSql, pCmd->pDataBlocks)) != TSDB_CODE_SUCCESS) {
|
if ((code = tscMergeTableDataBlocks(pSql, pCmd->pDataBlocks)) != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -39,6 +39,7 @@ void tscInitConnCb(void *param, TAOS_RES *result, int code) {
|
||||||
tscSlowQueryConnInitialized = true;
|
tscSlowQueryConnInitialized = true;
|
||||||
tscSaveSlowQueryFp(sql, NULL);
|
tscSaveSlowQueryFp(sql, NULL);
|
||||||
}
|
}
|
||||||
|
taos_free_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscAddIntoSqlList(SSqlObj *pSql) {
|
void tscAddIntoSqlList(SSqlObj *pSql) {
|
||||||
|
@ -69,6 +70,7 @@ void tscSaveSlowQueryFpCb(void *param, TAOS_RES *result, int code) {
|
||||||
} else {
|
} else {
|
||||||
tscDebug("success to save slow query, code:%d", code);
|
tscDebug("success to save slow query, code:%d", code);
|
||||||
}
|
}
|
||||||
|
taos_free_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscSaveSlowQueryFp(void *handle, void *tmrId) {
|
void tscSaveSlowQueryFp(void *handle, void *tmrId) {
|
||||||
|
|
|
@ -2835,6 +2835,10 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery) {
|
||||||
|
|
||||||
if (functionCompatList[functionId] != factor) {
|
if (functionCompatList[functionId] != factor) {
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
if (factor == -1) { // two functions with the same -1 flag
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (functionId == TSDB_FUNC_LAST_ROW && joinQuery) {
|
if (functionId == TSDB_FUNC_LAST_ROW && joinQuery) {
|
||||||
|
@ -5307,15 +5311,18 @@ int32_t parseLimitClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t clauseIn
|
||||||
|
|
||||||
// keep original limitation value in globalLimit
|
// keep original limitation value in globalLimit
|
||||||
pQueryInfo->clauseLimit = pQueryInfo->limit.limit;
|
pQueryInfo->clauseLimit = pQueryInfo->limit.limit;
|
||||||
pQueryInfo->prjOffset = pQueryInfo->limit.offset;
|
pQueryInfo->prjOffset = pQueryInfo->limit.offset;
|
||||||
|
pQueryInfo->tableLimit = -1;
|
||||||
|
|
||||||
if (tscOrderedProjectionQueryOnSTable(pQueryInfo, 0)) {
|
if (tscOrderedProjectionQueryOnSTable(pQueryInfo, 0)) {
|
||||||
/*
|
/*
|
||||||
* the limitation/offset value should be removed during retrieve data from virtual node,
|
* the offset value should be removed during retrieve data from virtual node, since the
|
||||||
* since the global order are done in client side, so the limitation should also
|
* global order are done in client side, so the offset is applied at the client side
|
||||||
* be done at the client side.
|
* However, note that the maximum allowed number of result for each table should be less
|
||||||
|
* than or equal to the value of limit.
|
||||||
*/
|
*/
|
||||||
if (pQueryInfo->limit.limit > 0) {
|
if (pQueryInfo->limit.limit > 0) {
|
||||||
|
pQueryInfo->tableLimit = pQueryInfo->limit.limit + pQueryInfo->limit.offset;
|
||||||
pQueryInfo->limit.limit = -1;
|
pQueryInfo->limit.limit = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
|
|
||||||
SRpcCorEpSet tscMgmtEpSet;
|
///SRpcCorEpSet tscMgmtEpSet;
|
||||||
|
|
||||||
int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo) = {0};
|
int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo) = {0};
|
||||||
|
|
||||||
|
@ -73,10 +73,11 @@ static void tscSetDnodeEpSet(SSqlObj* pSql, SVgroupInfo* pVgroupInfo) {
|
||||||
assert(hasFqdn);
|
assert(hasFqdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tscDumpMgmtEpSet(SRpcEpSet *epSet) {
|
static void tscDumpMgmtEpSet(SSqlObj *pSql) {
|
||||||
taosCorBeginRead(&tscMgmtEpSet.version);
|
SRpcCorEpSet *pCorEpSet = pSql->pTscObj->tscCorMgmtEpSet;
|
||||||
*epSet = tscMgmtEpSet.epSet;
|
taosCorBeginRead(&pCorEpSet->version);
|
||||||
taosCorEndRead(&tscMgmtEpSet.version);
|
pSql->epSet = pCorEpSet->epSet;
|
||||||
|
taosCorEndRead(&pCorEpSet->version);
|
||||||
}
|
}
|
||||||
static void tscEpSetHtons(SRpcEpSet *s) {
|
static void tscEpSetHtons(SRpcEpSet *s) {
|
||||||
for (int32_t i = 0; i < s->numOfEps; i++) {
|
for (int32_t i = 0; i < s->numOfEps; i++) {
|
||||||
|
@ -94,11 +95,12 @@ bool tscEpSetIsEqual(SRpcEpSet *s1, SRpcEpSet *s2) {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void tscUpdateMgmtEpSet(SRpcEpSet *pEpSet) {
|
void tscUpdateMgmtEpSet(SSqlObj *pSql, SRpcEpSet *pEpSet) {
|
||||||
// no need to update if equal
|
// no need to update if equal
|
||||||
taosCorBeginWrite(&tscMgmtEpSet.version);
|
SRpcCorEpSet *pCorEpSet = pSql->pTscObj->tscCorMgmtEpSet;
|
||||||
tscMgmtEpSet.epSet = *pEpSet;
|
taosCorBeginWrite(&pCorEpSet->version);
|
||||||
taosCorEndWrite(&tscMgmtEpSet.version);
|
pCorEpSet->epSet = *pEpSet;
|
||||||
|
taosCorEndWrite(&pCorEpSet->version);
|
||||||
}
|
}
|
||||||
static void tscDumpEpSetFromVgroupInfo(SCorVgroupInfo *pVgroupInfo, SRpcEpSet *pEpSet) {
|
static void tscDumpEpSetFromVgroupInfo(SCorVgroupInfo *pVgroupInfo, SRpcEpSet *pEpSet) {
|
||||||
if (pVgroupInfo == NULL) { return;}
|
if (pVgroupInfo == NULL) { return;}
|
||||||
|
@ -133,18 +135,6 @@ static void tscUpdateVgroupInfo(SSqlObj *pObj, SRpcEpSet *pEpSet) {
|
||||||
taosCorEndWrite(&pVgroupInfo->version);
|
taosCorEndWrite(&pVgroupInfo->version);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscPrintMgmtEp() {
|
|
||||||
SRpcEpSet dump;
|
|
||||||
tscDumpMgmtEpSet(&dump);
|
|
||||||
if (dump.numOfEps <= 0) {
|
|
||||||
tscError("invalid mnode EP list:%d", dump.numOfEps);
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < dump.numOfEps; ++i) {
|
|
||||||
tscDebug("mnode index:%d %s:%d", i, dump.fqdn[i], dump.port[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void tscProcessHeartBeatRsp(void *param, TAOS_RES *tres, int code) {
|
void tscProcessHeartBeatRsp(void *param, TAOS_RES *tres, int code) {
|
||||||
STscObj *pObj = (STscObj *)param;
|
STscObj *pObj = (STscObj *)param;
|
||||||
if (pObj == NULL) return;
|
if (pObj == NULL) return;
|
||||||
|
@ -162,7 +152,7 @@ void tscProcessHeartBeatRsp(void *param, TAOS_RES *tres, int code) {
|
||||||
SRpcEpSet * epSet = &pRsp->epSet;
|
SRpcEpSet * epSet = &pRsp->epSet;
|
||||||
if (epSet->numOfEps > 0) {
|
if (epSet->numOfEps > 0) {
|
||||||
tscEpSetHtons(epSet);
|
tscEpSetHtons(epSet);
|
||||||
tscUpdateMgmtEpSet(epSet);
|
tscUpdateMgmtEpSet(pSql, epSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
pSql->pTscObj->connId = htonl(pRsp->connId);
|
pSql->pTscObj->connId = htonl(pRsp->connId);
|
||||||
|
@ -191,9 +181,16 @@ void tscProcessHeartBeatRsp(void *param, TAOS_RES *tres, int code) {
|
||||||
void tscProcessActivityTimer(void *handle, void *tmrId) {
|
void tscProcessActivityTimer(void *handle, void *tmrId) {
|
||||||
int64_t rid = (int64_t) handle;
|
int64_t rid = (int64_t) handle;
|
||||||
STscObj *pObj = taosAcquireRef(tscRefId, rid);
|
STscObj *pObj = taosAcquireRef(tscRefId, rid);
|
||||||
if (pObj == NULL) return;
|
if (pObj == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SSqlObj* pHB = taosAcquireRef(tscObjRef, pObj->hbrid);
|
SSqlObj* pHB = taosAcquireRef(tscObjRef, pObj->hbrid);
|
||||||
|
if (pHB == NULL) {
|
||||||
|
taosReleaseRef(tscRefId, rid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
assert(pHB->self == pObj->hbrid);
|
assert(pHB->self == pObj->hbrid);
|
||||||
|
|
||||||
pHB->retry = 0;
|
pHB->retry = 0;
|
||||||
|
@ -219,7 +216,7 @@ int tscSendMsgToServer(SSqlObj *pSql) {
|
||||||
|
|
||||||
// set the mgmt ip list
|
// set the mgmt ip list
|
||||||
if (pSql->cmd.command >= TSDB_SQL_MGMT) {
|
if (pSql->cmd.command >= TSDB_SQL_MGMT) {
|
||||||
tscDumpMgmtEpSet(&pSql->epSet);
|
tscDumpMgmtEpSet(pSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pMsg, pSql->cmd.payload, pSql->cmd.payloadLen);
|
memcpy(pMsg, pSql->cmd.payload, pSql->cmd.payloadLen);
|
||||||
|
@ -277,7 +274,7 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) {
|
||||||
if (pCmd->command < TSDB_SQL_MGMT) {
|
if (pCmd->command < TSDB_SQL_MGMT) {
|
||||||
tscUpdateVgroupInfo(pSql, pEpSet);
|
tscUpdateVgroupInfo(pSql, pEpSet);
|
||||||
} else {
|
} else {
|
||||||
tscUpdateMgmtEpSet(pEpSet);
|
tscUpdateMgmtEpSet(pSql, pEpSet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -684,6 +681,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
pQueryMsg->tagNameRelType = htons(pQueryInfo->tagCond.relType);
|
pQueryMsg->tagNameRelType = htons(pQueryInfo->tagCond.relType);
|
||||||
pQueryMsg->numOfTags = htonl(numOfTags);
|
pQueryMsg->numOfTags = htonl(numOfTags);
|
||||||
pQueryMsg->queryType = htonl(pQueryInfo->type);
|
pQueryMsg->queryType = htonl(pQueryInfo->type);
|
||||||
|
pQueryMsg->tableLimit = htobe64(pQueryInfo->tableLimit);
|
||||||
|
|
||||||
size_t numOfOutput = tscSqlExprNumOfExprs(pQueryInfo);
|
size_t numOfOutput = tscSqlExprNumOfExprs(pQueryInfo);
|
||||||
pQueryMsg->numOfOutput = htons((int16_t)numOfOutput); // this is the stage one output column number
|
pQueryMsg->numOfOutput = htons((int16_t)numOfOutput); // this is the stage one output column number
|
||||||
|
@ -2057,11 +2055,7 @@ int tscProcessConnectRsp(SSqlObj *pSql) {
|
||||||
|
|
||||||
if (pConnect->epSet.numOfEps > 0) {
|
if (pConnect->epSet.numOfEps > 0) {
|
||||||
tscEpSetHtons(&pConnect->epSet);
|
tscEpSetHtons(&pConnect->epSet);
|
||||||
tscUpdateMgmtEpSet(&pConnect->epSet);
|
tscUpdateMgmtEpSet(pSql, &pConnect->epSet);
|
||||||
|
|
||||||
for (int i = 0; i < pConnect->epSet.numOfEps; ++i) {
|
|
||||||
tscDebug("%p epSet.fqdn[%d]: %s, pObj:%p", pSql, i, pConnect->epSet.fqdn[i], pObj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(pObj->sversion, pConnect->serverVersion);
|
strcpy(pObj->sversion, pConnect->serverVersion);
|
||||||
|
|
|
@ -58,6 +58,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
terrno = TSDB_CODE_TSC_INVALID_USER_LENGTH;
|
terrno = TSDB_CODE_TSC_INVALID_USER_LENGTH;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
SRpcCorEpSet corMgmtEpSet;
|
||||||
|
|
||||||
char secretEncrypt[32] = {0};
|
char secretEncrypt[32] = {0};
|
||||||
int secretEncryptLen = 0;
|
int secretEncryptLen = 0;
|
||||||
|
@ -82,11 +83,13 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
}
|
}
|
||||||
secretEncryptLen = outlen;
|
secretEncryptLen = outlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ip) {
|
if (ip) {
|
||||||
if (tscSetMgmtEpSetFromCfg(ip, NULL) < 0) return NULL;
|
if (tscSetMgmtEpSetFromCfg(ip, NULL, &corMgmtEpSet) < 0) return NULL;
|
||||||
if (port) tscMgmtEpSet.epSet.port[0] = port;
|
if (port) corMgmtEpSet.epSet.port[0] = port;
|
||||||
}
|
} else {
|
||||||
|
if (tscSetMgmtEpSetFromCfg(tsFirst, tsSecond, &corMgmtEpSet) < 0) return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void *pDnodeConn = NULL;
|
void *pDnodeConn = NULL;
|
||||||
if (tscInitRpc(user, secretEncrypt, &pDnodeConn) != 0) {
|
if (tscInitRpc(user, secretEncrypt, &pDnodeConn) != 0) {
|
||||||
|
@ -100,10 +103,20 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
rpcClose(pDnodeConn);
|
rpcClose(pDnodeConn);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
// set up tscObj's mgmtEpSet
|
||||||
|
pObj->tscCorMgmtEpSet = (SRpcCorEpSet *)malloc(sizeof(SRpcCorEpSet));
|
||||||
|
if (NULL == pObj->tscCorMgmtEpSet) {
|
||||||
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
rpcClose(pDnodeConn);
|
||||||
|
free(pObj->tscCorMgmtEpSet);
|
||||||
|
free(pObj);
|
||||||
|
}
|
||||||
|
memcpy(pObj->tscCorMgmtEpSet, &corMgmtEpSet, sizeof(SRpcCorEpSet));
|
||||||
|
|
||||||
pObj->signature = pObj;
|
pObj->signature = pObj;
|
||||||
pObj->pDnodeConn = pDnodeConn;
|
pObj->pDnodeConn = pDnodeConn;
|
||||||
T_REF_INIT_VAL(pObj, 1);
|
T_REF_INIT_VAL(pObj, 1);
|
||||||
|
|
||||||
|
|
||||||
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
||||||
secretEncryptLen = MIN(secretEncryptLen, sizeof(pObj->pass));
|
secretEncryptLen = MIN(secretEncryptLen, sizeof(pObj->pass));
|
||||||
|
@ -115,6 +128,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
if (len >= TSDB_DB_NAME_LEN) {
|
if (len >= TSDB_DB_NAME_LEN) {
|
||||||
terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH;
|
terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH;
|
||||||
rpcClose(pDnodeConn);
|
rpcClose(pDnodeConn);
|
||||||
|
free(pObj->tscCorMgmtEpSet);
|
||||||
free(pObj);
|
free(pObj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -132,6 +146,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
if (NULL == pSql) {
|
if (NULL == pSql) {
|
||||||
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
rpcClose(pDnodeConn);
|
rpcClose(pDnodeConn);
|
||||||
|
free(pObj->tscCorMgmtEpSet);
|
||||||
free(pObj);
|
free(pObj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -149,6 +164,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
rpcClose(pDnodeConn);
|
rpcClose(pDnodeConn);
|
||||||
free(pSql);
|
free(pSql);
|
||||||
|
free(pObj->tscCorMgmtEpSet);
|
||||||
free(pObj);
|
free(pObj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -276,16 +292,18 @@ void taos_close(TAOS *taos) {
|
||||||
pObj->signature = NULL;
|
pObj->signature = NULL;
|
||||||
taosTmrStopA(&(pObj->pTimer));
|
taosTmrStopA(&(pObj->pTimer));
|
||||||
|
|
||||||
SSqlObj* pHb = (SSqlObj*)taosAcquireRef(tscObjRef, pObj->hbrid);
|
if (pObj->hbrid > 0) {
|
||||||
if (pHb != NULL) {
|
SSqlObj* pHb = (SSqlObj*)taosAcquireRef(tscObjRef, pObj->hbrid);
|
||||||
if (pHb->rpcRid > 0) { // wait for rsp from dnode
|
if (pHb != NULL) {
|
||||||
rpcCancelRequest(pHb->rpcRid);
|
if (pHb->rpcRid > 0) { // wait for rsp from dnode
|
||||||
pHb->rpcRid = -1;
|
rpcCancelRequest(pHb->rpcRid);
|
||||||
}
|
pHb->rpcRid = -1;
|
||||||
|
}
|
||||||
|
|
||||||
tscDebug("%p HB is freed", pHb);
|
tscDebug("%p HB is freed", pHb);
|
||||||
taos_free_result(pHb);
|
taos_free_result(pHb);
|
||||||
taosReleaseRef(tscObjRef, pHb->self);
|
taosReleaseRef(tscObjRef, pHb->self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ref = T_REF_DEC(pObj);
|
int32_t ref = T_REF_DEC(pObj);
|
||||||
|
|
|
@ -115,11 +115,6 @@ void taos_init_imp(void) {
|
||||||
taosInitNote(tsNumOfLogLines / 10, 1, (char*)"tsc_note");
|
taosInitNote(tsNumOfLogLines / 10, 1, (char*)"tsc_note");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tscSetMgmtEpSetFromCfg(tsFirst, tsSecond) < 0) {
|
|
||||||
tscError("failed to init mnode EP list");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tscInitMsgsFp();
|
tscInitMsgsFp();
|
||||||
int queueSize = tsMaxConnections*2;
|
int queueSize = tsMaxConnections*2;
|
||||||
|
|
||||||
|
@ -143,7 +138,7 @@ void taos_init_imp(void) {
|
||||||
int64_t refreshTime = 10; // 10 seconds by default
|
int64_t refreshTime = 10; // 10 seconds by default
|
||||||
if (tscMetaCache == NULL) {
|
if (tscMetaCache == NULL) {
|
||||||
tscMetaCache = taosCacheInit(TSDB_DATA_TYPE_BINARY, refreshTime, false, tscFreeTableMetaHelper, "tableMeta");
|
tscMetaCache = taosCacheInit(TSDB_DATA_TYPE_BINARY, refreshTime, false, tscFreeTableMetaHelper, "tableMeta");
|
||||||
tscObjRef = taosOpenRef(4096, tscFreeRegisteredSqlObj);
|
tscObjRef = taosOpenRef(40960, tscFreeRegisteredSqlObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
tscRefId = taosOpenRef(200, tscCloseTscObj);
|
tscRefId = taosOpenRef(200, tscCloseTscObj);
|
||||||
|
|
|
@ -864,7 +864,7 @@ void tscCloseTscObj(void *param) {
|
||||||
rpcClose(pObj->pDnodeConn);
|
rpcClose(pObj->pDnodeConn);
|
||||||
pObj->pDnodeConn = NULL;
|
pObj->pDnodeConn = NULL;
|
||||||
}
|
}
|
||||||
|
tfree(pObj->tscCorMgmtEpSet);
|
||||||
pthread_mutex_destroy(&pObj->mutex);
|
pthread_mutex_destroy(&pObj->mutex);
|
||||||
|
|
||||||
tscDebug("%p DB connection is closed, dnodeConn:%p", pObj, p);
|
tscDebug("%p DB connection is closed, dnodeConn:%p", pObj, p);
|
||||||
|
@ -2440,10 +2440,10 @@ char* strdup_throw(const char* str) {
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tscSetMgmtEpSetFromCfg(const char *first, const char *second) {
|
int tscSetMgmtEpSetFromCfg(const char *first, const char *second, SRpcCorEpSet *corMgmtEpSet) {
|
||||||
|
corMgmtEpSet->version = 0;
|
||||||
// init mgmt ip set
|
// init mgmt ip set
|
||||||
tscMgmtEpSet.version = 0;
|
SRpcEpSet *mgmtEpSet = &(corMgmtEpSet->epSet);
|
||||||
SRpcEpSet *mgmtEpSet = &(tscMgmtEpSet.epSet);
|
|
||||||
mgmtEpSet->numOfEps = 0;
|
mgmtEpSet->numOfEps = 0;
|
||||||
mgmtEpSet->inUse = 0;
|
mgmtEpSet->inUse = 0;
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ extern char tsTempDir[];
|
||||||
|
|
||||||
//query buffer management
|
//query buffer management
|
||||||
extern int32_t tsQueryBufferSize; // maximum allowed usage buffer for each data node during query processing
|
extern int32_t tsQueryBufferSize; // maximum allowed usage buffer for each data node during query processing
|
||||||
|
extern int32_t tsHalfCoresForQuery; // only 50% will be used in query processing
|
||||||
|
|
||||||
// client
|
// client
|
||||||
extern int32_t tsTableMetaKeepTimer;
|
extern int32_t tsTableMetaKeepTimer;
|
||||||
|
@ -126,6 +127,9 @@ extern char tsMonitorDbName[];
|
||||||
extern char tsInternalPass[];
|
extern char tsInternalPass[];
|
||||||
extern int32_t tsMonitorInterval;
|
extern int32_t tsMonitorInterval;
|
||||||
|
|
||||||
|
// stream
|
||||||
|
extern int32_t tsEnableStream;
|
||||||
|
|
||||||
// internal
|
// internal
|
||||||
extern int32_t tsPrintAuth;
|
extern int32_t tsPrintAuth;
|
||||||
extern int32_t tscEmbedded;
|
extern int32_t tscEmbedded;
|
||||||
|
|
|
@ -25,6 +25,8 @@ void extractTableName(const char *tableId, char *name);
|
||||||
|
|
||||||
char* extractDBName(const char *tableId, char *name);
|
char* extractDBName(const char *tableId, char *name);
|
||||||
|
|
||||||
|
size_t tableIdPrefix(const char* name, char* prefix, int32_t len);
|
||||||
|
|
||||||
void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable);
|
void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable);
|
||||||
|
|
||||||
SSchema tGetTableNameColumnSchema();
|
SSchema tGetTableNameColumnSchema();
|
||||||
|
|
|
@ -107,6 +107,9 @@ int64_t tsMaxRetentWindow = 24 * 3600L; // maximum time window tolerance
|
||||||
// positive value (in MB)
|
// positive value (in MB)
|
||||||
int32_t tsQueryBufferSize = -1;
|
int32_t tsQueryBufferSize = -1;
|
||||||
|
|
||||||
|
// only 50% cpu will be used in query processing in dnode
|
||||||
|
int32_t tsHalfCoresForQuery = 0;
|
||||||
|
|
||||||
// db parameters
|
// db parameters
|
||||||
int32_t tsCacheBlockSize = TSDB_DEFAULT_CACHE_BLOCK_SIZE;
|
int32_t tsCacheBlockSize = TSDB_DEFAULT_CACHE_BLOCK_SIZE;
|
||||||
int32_t tsBlocksPerVnode = TSDB_DEFAULT_TOTAL_BLOCKS;
|
int32_t tsBlocksPerVnode = TSDB_DEFAULT_TOTAL_BLOCKS;
|
||||||
|
@ -161,6 +164,9 @@ char tsMonitorDbName[TSDB_DB_NAME_LEN] = "log";
|
||||||
char tsInternalPass[] = "secretkey";
|
char tsInternalPass[] = "secretkey";
|
||||||
int32_t tsMonitorInterval = 30; // seconds
|
int32_t tsMonitorInterval = 30; // seconds
|
||||||
|
|
||||||
|
// stream
|
||||||
|
int32_t tsEnableStream = 1;
|
||||||
|
|
||||||
// internal
|
// internal
|
||||||
int32_t tsPrintAuth = 0;
|
int32_t tsPrintAuth = 0;
|
||||||
int32_t tscEmbedded = 0;
|
int32_t tscEmbedded = 0;
|
||||||
|
@ -921,6 +927,16 @@ static void doInitGlobalConfig(void) {
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_BYTE;
|
cfg.unitType = TAOS_CFG_UTYPE_BYTE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
|
cfg.option = "halfCoresForQuery";
|
||||||
|
cfg.ptr = &tsHalfCoresForQuery;
|
||||||
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
|
||||||
|
cfg.minValue = 0;
|
||||||
|
cfg.maxValue = 1;
|
||||||
|
cfg.ptrLength = 1;
|
||||||
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
// locale & charset
|
// locale & charset
|
||||||
cfg.option = "timezone";
|
cfg.option = "timezone";
|
||||||
cfg.ptr = tsTimezone;
|
cfg.ptr = tsTimezone;
|
||||||
|
@ -1055,6 +1071,16 @@ static void doInitGlobalConfig(void) {
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
|
cfg.option = "stream";
|
||||||
|
cfg.ptr = &tsEnableStream;
|
||||||
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
|
||||||
|
cfg.minValue = 0;
|
||||||
|
cfg.maxValue = 1;
|
||||||
|
cfg.ptrLength = 1;
|
||||||
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
cfg.option = "httpEnableRecordSql";
|
cfg.option = "httpEnableRecordSql";
|
||||||
cfg.ptr = &tsHttpEnableRecordSql;
|
cfg.ptr = &tsHttpEnableRecordSql;
|
||||||
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
|
@ -1317,7 +1343,7 @@ static void doInitGlobalConfig(void) {
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
cfg.option = "tscEnableRecordSql";
|
cfg.option = "enableRecordSql";
|
||||||
cfg.ptr = &tsTscEnableRecordSql;
|
cfg.ptr = &tsTscEnableRecordSql;
|
||||||
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
|
||||||
|
|
|
@ -39,6 +39,13 @@ char* extractDBName(const char* tableId, char* name) {
|
||||||
return strncpy(name, &tableId[offset1 + 1], len);
|
return strncpy(name, &tableId[offset1 + 1], len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t tableIdPrefix(const char* name, char* prefix, int32_t len) {
|
||||||
|
tstrncpy(prefix, name, len);
|
||||||
|
strcat(prefix, TS_PATH_DELIMITER);
|
||||||
|
|
||||||
|
return strlen(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
SSchema tGetTableNameColumnSchema() {
|
SSchema tGetTableNameColumnSchema() {
|
||||||
SSchema s = {0};
|
SSchema s = {0};
|
||||||
s.bytes = TSDB_TABLE_NAME_LEN - 1 + VARSTR_HEADER_SIZE;
|
s.bytes = TSDB_TABLE_NAME_LEN - 1 + VARSTR_HEADER_SIZE;
|
||||||
|
@ -198,4 +205,4 @@ SSchema tscGetTbnameColumnSchema() {
|
||||||
|
|
||||||
strcpy(s.name, TSQL_TBNAME_L);
|
strcpy(s.name, TSQL_TBNAME_L);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 8c58c512b6acda8bcdfa48fdc7140227b5221766
|
Subproject commit 050667e5b4d0eafa5387e4283e713559b421203f
|
|
@ -1 +1 @@
|
||||||
Subproject commit d598db167eb256fe67409b7bb3d0eb7fffc3ff8c
|
Subproject commit ec77d9049a719dabfd1a7c1122a209e201861944
|
|
@ -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.13-dist.jar ${LIBRARY_OUTPUT_PATH}
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.14-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.13</version>
|
<version>2.0.14</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.13</version>
|
<version>2.0.14</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>
|
||||||
|
|
|
@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="taos",
|
name="taos",
|
||||||
version="2.0.2",
|
version="2.0.3",
|
||||||
author="Taosdata Inc.",
|
author="Taosdata Inc.",
|
||||||
author_email="support@taosdata.com",
|
author_email="support@taosdata.com",
|
||||||
description="TDengine python client package",
|
description="TDengine python client package",
|
||||||
|
|
|
@ -3,7 +3,7 @@ from .connection import TDengineConnection
|
||||||
from .cursor import TDengineCursor
|
from .cursor import TDengineCursor
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
apilevel = '2.0'
|
apilevel = '2.0.3'
|
||||||
threadsafety = 0
|
threadsafety = 0
|
||||||
paramstyle = 'pyformat'
|
paramstyle = 'pyformat'
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
||||||
else:
|
else:
|
||||||
|
@ -106,6 +107,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
res=[]
|
res=[]
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
for i in range(abs(num_of_rows)):
|
for i in range(abs(num_of_rows)):
|
||||||
|
|
|
@ -26,7 +26,7 @@ class TDengineCursor(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, connection=None):
|
def __init__(self, connection=None):
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
self._connection = None
|
self._connection = None
|
||||||
self._result = None
|
self._result = None
|
||||||
|
@ -234,7 +234,7 @@ class TDengineCursor(object):
|
||||||
def _reset_result(self):
|
def _reset_result(self):
|
||||||
"""Reset the result to unused version.
|
"""Reset the result to unused version.
|
||||||
"""
|
"""
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
if self._result is not None:
|
if self._result is not None:
|
||||||
CTaosInterface.freeResult(self._result)
|
CTaosInterface.freeResult(self._result)
|
||||||
|
|
|
@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="taos",
|
name="taos",
|
||||||
version="2.0.2",
|
version="2.0.3",
|
||||||
author="Taosdata Inc.",
|
author="Taosdata Inc.",
|
||||||
author_email="support@taosdata.com",
|
author_email="support@taosdata.com",
|
||||||
description="TDengine python client package",
|
description="TDengine python client package",
|
||||||
|
|
|
@ -3,7 +3,7 @@ from .connection import TDengineConnection
|
||||||
from .cursor import TDengineCursor
|
from .cursor import TDengineCursor
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
apilevel = '2.0'
|
apilevel = '2.0.3'
|
||||||
threadsafety = 0
|
threadsafety = 0
|
||||||
paramstyle = 'pyformat'
|
paramstyle = 'pyformat'
|
||||||
|
|
||||||
|
@ -21,4 +21,4 @@ def connect(*args, **kwargs):
|
||||||
|
|
||||||
@rtype: TDengineConnector
|
@rtype: TDengineConnector
|
||||||
"""
|
"""
|
||||||
return TDengineConnection(*args, **kwargs)
|
return TDengineConnection(*args, **kwargs)
|
||||||
|
|
|
@ -81,6 +81,7 @@ def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
||||||
else:
|
else:
|
||||||
|
@ -106,6 +107,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
res=[]
|
res=[]
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
for i in range(abs(num_of_rows)):
|
for i in range(abs(num_of_rows)):
|
||||||
|
|
|
@ -27,7 +27,7 @@ class TDengineCursor(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, connection=None):
|
def __init__(self, connection=None):
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
self._connection = None
|
self._connection = None
|
||||||
self._result = None
|
self._result = None
|
||||||
|
@ -242,7 +242,7 @@ class TDengineCursor(object):
|
||||||
def _reset_result(self):
|
def _reset_result(self):
|
||||||
"""Reset the result to unused version.
|
"""Reset the result to unused version.
|
||||||
"""
|
"""
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
if self._result is not None:
|
if self._result is not None:
|
||||||
CTaosInterface.freeResult(self._result)
|
CTaosInterface.freeResult(self._result)
|
||||||
|
|
|
@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="taos",
|
name="taos",
|
||||||
version="2.0.2",
|
version="2.0.3",
|
||||||
author="Taosdata Inc.",
|
author="Taosdata Inc.",
|
||||||
author_email="support@taosdata.com",
|
author_email="support@taosdata.com",
|
||||||
description="TDengine python client package",
|
description="TDengine python client package",
|
||||||
|
|
|
@ -3,7 +3,7 @@ from .connection import TDengineConnection
|
||||||
from .cursor import TDengineCursor
|
from .cursor import TDengineCursor
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
apilevel = '2.0'
|
apilevel = '2.0.3'
|
||||||
threadsafety = 0
|
threadsafety = 0
|
||||||
paramstyle = 'pyformat'
|
paramstyle = 'pyformat'
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
||||||
else:
|
else:
|
||||||
|
@ -106,6 +107,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
res=[]
|
res=[]
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
for i in range(abs(num_of_rows)):
|
for i in range(abs(num_of_rows)):
|
||||||
|
|
|
@ -27,7 +27,7 @@ class TDengineCursor(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, connection=None):
|
def __init__(self, connection=None):
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
self._connection = None
|
self._connection = None
|
||||||
self._result = None
|
self._result = None
|
||||||
|
@ -193,7 +193,7 @@ class TDengineCursor(object):
|
||||||
def _reset_result(self):
|
def _reset_result(self):
|
||||||
"""Reset the result to unused version.
|
"""Reset the result to unused version.
|
||||||
"""
|
"""
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
if self._result is not None:
|
if self._result is not None:
|
||||||
CTaosInterface.freeResult(self._result)
|
CTaosInterface.freeResult(self._result)
|
||||||
|
|
|
@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="taos",
|
name="taos",
|
||||||
version="2.0.2",
|
version="2.0.3",
|
||||||
author="Taosdata Inc.",
|
author="Taosdata Inc.",
|
||||||
author_email="support@taosdata.com",
|
author_email="support@taosdata.com",
|
||||||
description="TDengine python client package",
|
description="TDengine python client package",
|
||||||
|
|
|
@ -3,7 +3,7 @@ from .connection import TDengineConnection
|
||||||
from .cursor import TDengineCursor
|
from .cursor import TDengineCursor
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
apilevel = '2.0'
|
apilevel = '2.0.3'
|
||||||
threadsafety = 0
|
threadsafety = 0
|
||||||
paramstyle = 'pyformat'
|
paramstyle = 'pyformat'
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
|
||||||
else:
|
else:
|
||||||
|
@ -108,6 +109,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
|
||||||
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
|
||||||
"""Function to convert C binary row to python row
|
"""Function to convert C binary row to python row
|
||||||
"""
|
"""
|
||||||
|
assert(nbytes is not None)
|
||||||
res=[]
|
res=[]
|
||||||
if num_of_rows > 0:
|
if num_of_rows > 0:
|
||||||
for i in range(abs(num_of_rows)):
|
for i in range(abs(num_of_rows)):
|
||||||
|
|
|
@ -28,7 +28,7 @@ class TDengineCursor(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, connection=None):
|
def __init__(self, connection=None):
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
self._connection = None
|
self._connection = None
|
||||||
self._result = None
|
self._result = None
|
||||||
|
@ -194,7 +194,7 @@ class TDengineCursor(object):
|
||||||
def _reset_result(self):
|
def _reset_result(self):
|
||||||
"""Reset the result to unused version.
|
"""Reset the result to unused version.
|
||||||
"""
|
"""
|
||||||
self._description = None
|
self._description = []
|
||||||
self._rowcount = -1
|
self._rowcount = -1
|
||||||
if self._result is not None:
|
if self._result is not None:
|
||||||
CTaosInterface.freeResult(self._result)
|
CTaosInterface.freeResult(self._result)
|
||||||
|
|
|
@ -69,6 +69,9 @@ static void cqProcessStreamRes(void *param, TAOS_RES *tres, TAOS_ROW row);
|
||||||
static void cqCreateStream(SCqContext *pContext, SCqObj *pObj);
|
static void cqCreateStream(SCqContext *pContext, SCqObj *pObj);
|
||||||
|
|
||||||
void *cqOpen(void *ahandle, const SCqCfg *pCfg) {
|
void *cqOpen(void *ahandle, const SCqCfg *pCfg) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
SCqContext *pContext = calloc(sizeof(SCqContext), 1);
|
SCqContext *pContext = calloc(sizeof(SCqContext), 1);
|
||||||
if (pContext == NULL) {
|
if (pContext == NULL) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
@ -99,6 +102,9 @@ void *cqOpen(void *ahandle, const SCqCfg *pCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cqClose(void *handle) {
|
void cqClose(void *handle) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SCqContext *pContext = handle;
|
SCqContext *pContext = handle;
|
||||||
if (handle == NULL) return;
|
if (handle == NULL) return;
|
||||||
|
|
||||||
|
@ -129,6 +135,9 @@ void cqClose(void *handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cqStart(void *handle) {
|
void cqStart(void *handle) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SCqContext *pContext = handle;
|
SCqContext *pContext = handle;
|
||||||
if (pContext->dbConn || pContext->master) return;
|
if (pContext->dbConn || pContext->master) return;
|
||||||
|
|
||||||
|
@ -147,6 +156,9 @@ void cqStart(void *handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cqStop(void *handle) {
|
void cqStop(void *handle) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SCqContext *pContext = handle;
|
SCqContext *pContext = handle;
|
||||||
cInfo("vgId:%d, stop all CQs", pContext->vgId);
|
cInfo("vgId:%d, stop all CQs", pContext->vgId);
|
||||||
if (pContext->dbConn == NULL || pContext->master == 0) return;
|
if (pContext->dbConn == NULL || pContext->master == 0) return;
|
||||||
|
@ -174,6 +186,9 @@ void cqStop(void *handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *cqCreate(void *handle, uint64_t uid, int32_t tid, char *sqlStr, STSchema *pSchema) {
|
void *cqCreate(void *handle, uint64_t uid, int32_t tid, char *sqlStr, STSchema *pSchema) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
SCqContext *pContext = handle;
|
SCqContext *pContext = handle;
|
||||||
|
|
||||||
SCqObj *pObj = calloc(sizeof(SCqObj), 1);
|
SCqObj *pObj = calloc(sizeof(SCqObj), 1);
|
||||||
|
@ -203,6 +218,9 @@ void *cqCreate(void *handle, uint64_t uid, int32_t tid, char *sqlStr, STSchema *
|
||||||
}
|
}
|
||||||
|
|
||||||
void cqDrop(void *handle) {
|
void cqDrop(void *handle) {
|
||||||
|
if (tsEnableStream == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SCqObj *pObj = handle;
|
SCqObj *pObj = handle;
|
||||||
SCqContext *pContext = pObj->pContext;
|
SCqContext *pContext = pObj->pContext;
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,9 @@ extern "C" {
|
||||||
|
|
||||||
int32_t dnodeInitMInfos();
|
int32_t dnodeInitMInfos();
|
||||||
void dnodeCleanupMInfos();
|
void dnodeCleanupMInfos();
|
||||||
void dnodeUpdateMInfos(SMnodeInfos *minfos);
|
void dnodeUpdateMInfos(SMInfos *pMinfos);
|
||||||
void dnodeUpdateEpSetForPeer(SRpcEpSet *epSet);
|
void dnodeUpdateEpSetForPeer(SRpcEpSet *pEpSet);
|
||||||
void dnodeGetMInfos(SMnodeInfos *minfos);
|
void dnodeGetMInfos(SMInfos *pMinfos);
|
||||||
bool dnodeIsMasterEp(char *ep);
|
bool dnodeIsMasterEp(char *ep);
|
||||||
|
|
||||||
void dnodeSendRedirectMsg(SRpcMsg *rpcMsg, bool forShell);
|
void dnodeSendRedirectMsg(SRpcMsg *rpcMsg, bool forShell);
|
||||||
|
|
|
@ -233,7 +233,14 @@ PRASE_EPS_OVER:
|
||||||
dnodeResetEps(eps);
|
dnodeResetEps(eps);
|
||||||
if (eps) free(eps);
|
if (eps) free(eps);
|
||||||
|
|
||||||
|
#if 0
|
||||||
dnodeUpdateEp(dnodeGetDnodeId(), tsLocalEp, tsLocalFqdn, &tsServerPort);
|
dnodeUpdateEp(dnodeGetDnodeId(), tsLocalEp, tsLocalFqdn, &tsServerPort);
|
||||||
|
#else
|
||||||
|
if (dnodeCheckEpChanged(dnodeGetDnodeId(), tsLocalEp)) {
|
||||||
|
dError("dnode:%d, localEp is changed to %s in dnodeEps.json and need reconfigured", dnodeGetDnodeId(), tsLocalEp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -19,12 +19,12 @@
|
||||||
#include "mnode.h"
|
#include "mnode.h"
|
||||||
#include "dnodeMInfos.h"
|
#include "dnodeMInfos.h"
|
||||||
|
|
||||||
static SMnodeInfos tsMInfos;
|
static SMInfos tsMInfos;
|
||||||
static SRpcEpSet tsMEpSet;
|
static SRpcEpSet tsMEpSet;
|
||||||
static pthread_mutex_t tsMInfosMutex;
|
static pthread_mutex_t tsMInfosMutex;
|
||||||
|
|
||||||
static void dnodeResetMInfos(SMnodeInfos *minfos);
|
static void dnodeResetMInfos(SMInfos *minfos);
|
||||||
static void dnodePrintMInfos(SMnodeInfos *minfos);
|
static void dnodePrintMInfos(SMInfos *minfos);
|
||||||
static int32_t dnodeReadMInfos();
|
static int32_t dnodeReadMInfos();
|
||||||
static int32_t dnodeWriteMInfos();
|
static int32_t dnodeWriteMInfos();
|
||||||
|
|
||||||
|
@ -41,14 +41,14 @@ int32_t dnodeInitMInfos() {
|
||||||
|
|
||||||
void dnodeCleanupMInfos() { pthread_mutex_destroy(&tsMInfosMutex); }
|
void dnodeCleanupMInfos() { pthread_mutex_destroy(&tsMInfosMutex); }
|
||||||
|
|
||||||
void dnodeUpdateMInfos(SMnodeInfos *minfos) {
|
void dnodeUpdateMInfos(SMInfos *pMinfos) {
|
||||||
if (minfos->mnodeNum <= 0 || minfos->mnodeNum > 3) {
|
if (pMinfos->mnodeNum <= 0 || pMinfos->mnodeNum > 3) {
|
||||||
dError("invalid mnode infos, mnodeNum:%d", minfos->mnodeNum);
|
dError("invalid mnode infos, mnodeNum:%d", pMinfos->mnodeNum);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < minfos->mnodeNum; ++i) {
|
for (int32_t i = 0; i < pMinfos->mnodeNum; ++i) {
|
||||||
SMnodeInfo *minfo = &minfos->mnodeInfos[i];
|
SMInfo *minfo = &pMinfos->mnodeInfos[i];
|
||||||
minfo->mnodeId = htonl(minfo->mnodeId);
|
minfo->mnodeId = htonl(minfo->mnodeId);
|
||||||
if (minfo->mnodeId <= 0 || strlen(minfo->mnodeEp) <= 5) {
|
if (minfo->mnodeId <= 0 || strlen(minfo->mnodeEp) <= 5) {
|
||||||
dError("invalid mnode info:%d, mnodeId:%d mnodeEp:%s", i, minfo->mnodeId, minfo->mnodeEp);
|
dError("invalid mnode info:%d, mnodeId:%d mnodeEp:%s", i, minfo->mnodeId, minfo->mnodeEp);
|
||||||
|
@ -57,14 +57,14 @@ void dnodeUpdateMInfos(SMnodeInfos *minfos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&tsMInfosMutex);
|
pthread_mutex_lock(&tsMInfosMutex);
|
||||||
if (minfos->mnodeNum != tsMInfos.mnodeNum) {
|
if (pMinfos->mnodeNum != tsMInfos.mnodeNum) {
|
||||||
dnodeResetMInfos(minfos);
|
dnodeResetMInfos(pMinfos);
|
||||||
dnodeWriteMInfos();
|
dnodeWriteMInfos();
|
||||||
sdbUpdateAsync();
|
sdbUpdateAsync();
|
||||||
} else {
|
} else {
|
||||||
int32_t size = sizeof(SMnodeInfos);
|
int32_t size = sizeof(SMInfos);
|
||||||
if (memcmp(minfos, &tsMInfos, size) != 0) {
|
if (memcmp(pMinfos, &tsMInfos, size) != 0) {
|
||||||
dnodeResetMInfos(minfos);
|
dnodeResetMInfos(pMinfos);
|
||||||
dnodeWriteMInfos();
|
dnodeWriteMInfos();
|
||||||
sdbUpdateAsync();
|
sdbUpdateAsync();
|
||||||
}
|
}
|
||||||
|
@ -96,11 +96,11 @@ bool dnodeIsMasterEp(char *ep) {
|
||||||
return isMaster;
|
return isMaster;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeGetMInfos(SMnodeInfos *minfos) {
|
void dnodeGetMInfos(SMInfos *pMinfos) {
|
||||||
pthread_mutex_lock(&tsMInfosMutex);
|
pthread_mutex_lock(&tsMInfosMutex);
|
||||||
memcpy(minfos, &tsMInfos, sizeof(SMnodeInfos));
|
memcpy(pMinfos, &tsMInfos, sizeof(SMInfos));
|
||||||
for (int32_t i = 0; i < tsMInfos.mnodeNum; ++i) {
|
for (int32_t i = 0; i < tsMInfos.mnodeNum; ++i) {
|
||||||
minfos->mnodeInfos[i].mnodeId = htonl(tsMInfos.mnodeInfos[i].mnodeId);
|
pMinfos->mnodeInfos[i].mnodeId = htonl(tsMInfos.mnodeInfos[i].mnodeId);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&tsMInfosMutex);
|
pthread_mutex_unlock(&tsMInfosMutex);
|
||||||
}
|
}
|
||||||
|
@ -120,15 +120,15 @@ void dnodeGetEpSetForShell(SRpcEpSet *epSet) {
|
||||||
pthread_mutex_unlock(&tsMInfosMutex);
|
pthread_mutex_unlock(&tsMInfosMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodePrintMInfos(SMnodeInfos *minfos) {
|
static void dnodePrintMInfos(SMInfos *pMinfos) {
|
||||||
dInfo("print mnode infos, mnodeNum:%d inUse:%d", minfos->mnodeNum, minfos->inUse);
|
dInfo("print minfos, mnodeNum:%d inUse:%d", pMinfos->mnodeNum, pMinfos->inUse);
|
||||||
for (int32_t i = 0; i < minfos->mnodeNum; i++) {
|
for (int32_t i = 0; i < pMinfos->mnodeNum; i++) {
|
||||||
dInfo("mnode index:%d, %s", minfos->mnodeInfos[i].mnodeId, minfos->mnodeInfos[i].mnodeEp);
|
dInfo("mnode index:%d, %s", pMinfos->mnodeInfos[i].mnodeId, pMinfos->mnodeInfos[i].mnodeEp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodeResetMInfos(SMnodeInfos *minfos) {
|
static void dnodeResetMInfos(SMInfos *pMinfos) {
|
||||||
if (minfos == NULL) {
|
if (pMinfos == NULL) {
|
||||||
tsMEpSet.numOfEps = 1;
|
tsMEpSet.numOfEps = 1;
|
||||||
taosGetFqdnPortFromEp(tsFirst, tsMEpSet.fqdn[0], &tsMEpSet.port[0]);
|
taosGetFqdnPortFromEp(tsFirst, tsMEpSet.fqdn[0], &tsMEpSet.port[0]);
|
||||||
|
|
||||||
|
@ -139,10 +139,10 @@ static void dnodeResetMInfos(SMnodeInfos *minfos) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (minfos->mnodeNum == 0) return;
|
if (pMinfos->mnodeNum == 0) return;
|
||||||
|
|
||||||
int32_t size = sizeof(SMnodeInfos);
|
int32_t size = sizeof(SMInfos);
|
||||||
memcpy(&tsMInfos, minfos, size);
|
memcpy(&tsMInfos, pMinfos, size);
|
||||||
|
|
||||||
tsMEpSet.inUse = tsMInfos.inUse;
|
tsMEpSet.inUse = tsMInfos.inUse;
|
||||||
tsMEpSet.numOfEps = tsMInfos.mnodeNum;
|
tsMEpSet.numOfEps = tsMInfos.mnodeNum;
|
||||||
|
@ -150,16 +150,17 @@ static void dnodeResetMInfos(SMnodeInfos *minfos) {
|
||||||
taosGetFqdnPortFromEp(tsMInfos.mnodeInfos[i].mnodeEp, tsMEpSet.fqdn[i], &tsMEpSet.port[i]);
|
taosGetFqdnPortFromEp(tsMInfos.mnodeInfos[i].mnodeEp, tsMEpSet.fqdn[i], &tsMEpSet.port[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dnodePrintMInfos(minfos);
|
dnodePrintMInfos(pMinfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dnodeReadMInfos() {
|
static int32_t dnodeReadMInfos() {
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
int32_t maxLen = 2000;
|
int32_t maxLen = 2000;
|
||||||
char * content = calloc(1, maxLen + 1);
|
char * content = calloc(1, maxLen + 1);
|
||||||
cJSON * root = NULL;
|
cJSON * root = NULL;
|
||||||
FILE * fp = NULL;
|
FILE * fp = NULL;
|
||||||
SMnodeInfos minfos = {0};
|
SMInfos minfos = {0};
|
||||||
|
bool nodeChanged = false;
|
||||||
|
|
||||||
char file[TSDB_FILENAME_LEN + 20] = {0};
|
char file[TSDB_FILENAME_LEN + 20] = {0};
|
||||||
sprintf(file, "%s/mnodeEpSet.json", tsDnodeDir);
|
sprintf(file, "%s/mnodeEpSet.json", tsDnodeDir);
|
||||||
|
@ -218,14 +219,19 @@ static int32_t dnodeReadMInfos() {
|
||||||
dError("failed to read mnodeEpSet.json, nodeId not found");
|
dError("failed to read mnodeEpSet.json, nodeId not found");
|
||||||
goto PARSE_MINFOS_OVER;
|
goto PARSE_MINFOS_OVER;
|
||||||
}
|
}
|
||||||
minfos.mnodeInfos[i].mnodeId = nodeId->valueint;
|
|
||||||
|
|
||||||
cJSON *nodeEp = cJSON_GetObjectItem(nodeInfo, "nodeEp");
|
cJSON *nodeEp = cJSON_GetObjectItem(nodeInfo, "nodeEp");
|
||||||
if (!nodeEp || nodeEp->type != cJSON_String || nodeEp->valuestring == NULL) {
|
if (!nodeEp || nodeEp->type != cJSON_String || nodeEp->valuestring == NULL) {
|
||||||
dError("failed to read mnodeEpSet.json, nodeName not found");
|
dError("failed to read mnodeEpSet.json, nodeName not found");
|
||||||
goto PARSE_MINFOS_OVER;
|
goto PARSE_MINFOS_OVER;
|
||||||
}
|
}
|
||||||
strncpy(minfos.mnodeInfos[i].mnodeEp, nodeEp->valuestring, TSDB_EP_LEN);
|
|
||||||
|
SMInfo *pMinfo = &minfos.mnodeInfos[i];
|
||||||
|
pMinfo->mnodeId = nodeId->valueint;
|
||||||
|
tstrncpy(pMinfo->mnodeEp, nodeEp->valuestring, TSDB_EP_LEN);
|
||||||
|
|
||||||
|
bool changed = dnodeCheckEpChanged(pMinfo->mnodeId, pMinfo->mnodeEp);
|
||||||
|
if (changed) nodeChanged = changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("read file %s successed", file);
|
dInfo("read file %s successed", file);
|
||||||
|
@ -238,10 +244,15 @@ PARSE_MINFOS_OVER:
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < minfos.mnodeNum; ++i) {
|
for (int32_t i = 0; i < minfos.mnodeNum; ++i) {
|
||||||
SMnodeInfo *mInfo = &minfos.mnodeInfos[i];
|
SMInfo *mInfo = &minfos.mnodeInfos[i];
|
||||||
dnodeUpdateEp(mInfo->mnodeId, mInfo->mnodeEp, NULL, NULL);
|
dnodeUpdateEp(mInfo->mnodeId, mInfo->mnodeEp, NULL, NULL);
|
||||||
}
|
}
|
||||||
dnodeResetMInfos(&minfos);
|
dnodeResetMInfos(&minfos);
|
||||||
|
|
||||||
|
if (nodeChanged) {
|
||||||
|
dnodeWriteMInfos();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,8 +142,8 @@ void dnodeProcessModuleStatus(uint32_t moduleStatus) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dnodeStartMnode(SMnodeInfos *minfos) {
|
bool dnodeStartMnode(SMInfos *pMinfos) {
|
||||||
SMnodeInfos *mnodes = minfos;
|
SMInfos *pMnodes = pMinfos;
|
||||||
|
|
||||||
if (tsModuleStatus & (1 << TSDB_MOD_MNODE)) {
|
if (tsModuleStatus & (1 << TSDB_MOD_MNODE)) {
|
||||||
dDebug("mnode module is already started, module status:%d", tsModuleStatus);
|
dDebug("mnode module is already started, module status:%d", tsModuleStatus);
|
||||||
|
@ -154,7 +154,7 @@ bool dnodeStartMnode(SMnodeInfos *minfos) {
|
||||||
dInfo("start mnode module, module status:%d, new status:%d", tsModuleStatus, moduleStatus);
|
dInfo("start mnode module, module status:%d, new status:%d", tsModuleStatus, moduleStatus);
|
||||||
dnodeProcessModuleStatus(moduleStatus);
|
dnodeProcessModuleStatus(moduleStatus);
|
||||||
|
|
||||||
sdbUpdateSync(mnodes);
|
sdbUpdateSync(pMnodes);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,6 +180,8 @@ void dnodeSendMsgToDnode(SRpcEpSet *epSet, SRpcMsg *rpcMsg) {
|
||||||
void dnodeSendMsgToMnodeRecv(SRpcMsg *rpcMsg, SRpcMsg *rpcRsp) {
|
void dnodeSendMsgToMnodeRecv(SRpcMsg *rpcMsg, SRpcMsg *rpcRsp) {
|
||||||
SRpcEpSet epSet = {0};
|
SRpcEpSet epSet = {0};
|
||||||
dnodeGetEpSetForPeer(&epSet);
|
dnodeGetEpSetForPeer(&epSet);
|
||||||
|
|
||||||
|
assert(tsClientRpc != 0);
|
||||||
rpcSendRecv(tsClientRpc, &epSet, rpcMsg, rpcRsp);
|
rpcSendRecv(tsClientRpc, &epSet, rpcMsg, rpcRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,12 @@ int32_t dnodeInitVnodes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
free(threads);
|
free(threads);
|
||||||
dInfo("there are total vnodes:%d, openned:%d failed:%d", numOfVnodes, openVnodes, failedVnodes);
|
dInfo("there are total vnodes:%d, openned:%d", numOfVnodes, openVnodes);
|
||||||
|
|
||||||
|
if (failedVnodes != 0) {
|
||||||
|
dError("there are total vnodes:%d, failed:%d", numOfVnodes, failedVnodes);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -199,7 +204,7 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SStatusRsp *pStatusRsp = pMsg->pCont;
|
SStatusRsp *pStatusRsp = pMsg->pCont;
|
||||||
SMnodeInfos *minfos = &pStatusRsp->mnodes;
|
SMInfos *minfos = &pStatusRsp->mnodes;
|
||||||
dnodeUpdateMInfos(minfos);
|
dnodeUpdateMInfos(minfos);
|
||||||
|
|
||||||
SDnodeCfg *pCfg = &pStatusRsp->dnodeCfg;
|
SDnodeCfg *pCfg = &pStatusRsp->dnodeCfg;
|
||||||
|
|
|
@ -45,7 +45,7 @@ void dnodeGetEpSetForShell(SRpcEpSet *epSet);
|
||||||
int32_t dnodeGetDnodeId();
|
int32_t dnodeGetDnodeId();
|
||||||
void dnodeUpdateEp(int32_t dnodeId, char *ep, char *fqdn, uint16_t *port);
|
void dnodeUpdateEp(int32_t dnodeId, char *ep, char *fqdn, uint16_t *port);
|
||||||
bool dnodeCheckEpChanged(int32_t dnodeId, char *epstr);
|
bool dnodeCheckEpChanged(int32_t dnodeId, char *epstr);
|
||||||
bool dnodeStartMnode(SMnodeInfos *minfos);
|
bool dnodeStartMnode(SMInfos *pMinfos);
|
||||||
|
|
||||||
void dnodeAddClientRspHandle(uint8_t msgType, void (*fp)(SRpcMsg *rpcMsg));
|
void dnodeAddClientRspHandle(uint8_t msgType, void (*fp)(SRpcMsg *rpcMsg));
|
||||||
void dnodeSendMsgToDnode(SRpcEpSet *epSet, SRpcMsg *rpcMsg);
|
void dnodeSendMsgToDnode(SRpcEpSet *epSet, SRpcMsg *rpcMsg);
|
||||||
|
|
|
@ -431,11 +431,6 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
|
||||||
#define TSDB_PORT_SYNC 10
|
#define TSDB_PORT_SYNC 10
|
||||||
#define TSDB_PORT_HTTP 11
|
#define TSDB_PORT_HTTP 11
|
||||||
#define TSDB_PORT_ARBITRATOR 12
|
#define TSDB_PORT_ARBITRATOR 12
|
||||||
#define TSDB_PORT_DNODESHELL 0
|
|
||||||
#define TSDB_PORT_DNODEDNODE 5
|
|
||||||
#define TSDB_PORT_SYNC 10
|
|
||||||
#define TSDB_PORT_HTTP 11
|
|
||||||
#define TSDB_PORT_ARBITRATOR 12
|
|
||||||
|
|
||||||
#define TSDB_MAX_WAL_SIZE (1024*1024)
|
#define TSDB_MAX_WAL_SIZE (1024*1024)
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_TRAN_ID, 0, 0x000F, "Invalid tr
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_SESSION_ID, 0, 0x0010, "Invalid session id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_SESSION_ID, 0, 0x0010, "Invalid session id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_MSG_TYPE, 0, 0x0011, "Invalid message type")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_MSG_TYPE, 0, 0x0011, "Invalid message type")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_RESPONSE_TYPE, 0, 0x0012, "Invalid response type")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_RESPONSE_TYPE, 0, 0x0012, "Invalid response type")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_TIME_STAMP, 0, 0x0013, "Invalid timestamp")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_TIME_STAMP, 0, 0x0013, "Client and server's time is not synchronized")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_APP_NOT_READY, 0, 0x0014, "Database not ready")
|
TAOS_DEFINE_ERROR(TSDB_CODE_APP_NOT_READY, 0, 0x0014, "Database not ready")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_FQDN_ERROR, 0, 0x0015, "Unable to resolve FQDN")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_FQDN_ERROR, 0, 0x0015, "Unable to resolve FQDN")
|
||||||
|
|
||||||
|
|
|
@ -473,19 +473,21 @@ typedef struct {
|
||||||
int16_t numOfGroupCols; // num of group by columns
|
int16_t numOfGroupCols; // num of group by columns
|
||||||
int16_t orderByIdx;
|
int16_t orderByIdx;
|
||||||
int16_t orderType; // used in group by xx order by xxx
|
int16_t orderType; // used in group by xx order by xxx
|
||||||
|
int64_t tableLimit; // limit the number of rows for each table, used in order by + limit in stable projection query.
|
||||||
|
int16_t prjOrder; // global order in super table projection query.
|
||||||
int64_t limit;
|
int64_t limit;
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
uint32_t queryType; // denote another query process
|
uint32_t queryType; // denote another query process
|
||||||
int16_t numOfOutput; // final output columns numbers
|
int16_t numOfOutput; // final output columns numbers
|
||||||
int16_t tagNameRelType; // relation of tag criteria and tbname criteria
|
int16_t tagNameRelType; // relation of tag criteria and tbname criteria
|
||||||
int16_t fillType; // interpolate type
|
int16_t fillType; // interpolate type
|
||||||
uint64_t fillVal; // default value array list
|
uint64_t fillVal; // default value array list
|
||||||
int32_t secondStageOutput;
|
int32_t secondStageOutput;
|
||||||
int32_t tsOffset; // offset value in current msg body, NOTE: ts list is compressed
|
int32_t tsOffset; // offset value in current msg body, NOTE: ts list is compressed
|
||||||
int32_t tsLen; // total length of ts comp block
|
int32_t tsLen; // total length of ts comp block
|
||||||
int32_t tsNumOfBlocks; // ts comp block numbers
|
int32_t tsNumOfBlocks; // ts comp block numbers
|
||||||
int32_t tsOrder; // ts comp block order
|
int32_t tsOrder; // ts comp block order
|
||||||
int32_t numOfTags; // number of tags columns involved
|
int32_t numOfTags; // number of tags columns involved
|
||||||
SColumnInfo colList[];
|
SColumnInfo colList[];
|
||||||
} SQueryTableMsg;
|
} SQueryTableMsg;
|
||||||
|
|
||||||
|
@ -586,13 +588,13 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t mnodeId;
|
int32_t mnodeId;
|
||||||
char mnodeEp[TSDB_EP_LEN];
|
char mnodeEp[TSDB_EP_LEN];
|
||||||
} SMnodeInfo;
|
} SMInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t inUse;
|
int8_t inUse;
|
||||||
int8_t mnodeNum;
|
int8_t mnodeNum;
|
||||||
SMnodeInfo mnodeInfos[TSDB_MAX_REPLICA];
|
SMInfo mnodeInfos[TSDB_MAX_REPLICA];
|
||||||
} SMnodeInfos;
|
} SMInfos;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t numOfMnodes; // tsNumOfMnodes
|
int32_t numOfMnodes; // tsNumOfMnodes
|
||||||
|
@ -627,7 +629,7 @@ typedef struct {
|
||||||
} SStatusMsg;
|
} SStatusMsg;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMnodeInfos mnodes;
|
SMInfos mnodes;
|
||||||
SDnodeCfg dnodeCfg;
|
SDnodeCfg dnodeCfg;
|
||||||
SVgroupAccess vgAccess[];
|
SVgroupAccess vgAccess[];
|
||||||
} SStatusRsp;
|
} SStatusRsp;
|
||||||
|
@ -756,7 +758,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
char dnodeEp[TSDB_EP_LEN]; // end point, hostname:port
|
char dnodeEp[TSDB_EP_LEN]; // end point, hostname:port
|
||||||
SMnodeInfos mnodes;
|
SMInfos mnodes;
|
||||||
} SCreateMnodeMsg;
|
} SCreateMnodeMsg;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -48,7 +48,7 @@ void mnodeGetMnodeEpSetForShell(SRpcEpSet *epSet);
|
||||||
char* mnodeGetMnodeMasterEp();
|
char* mnodeGetMnodeMasterEp();
|
||||||
|
|
||||||
void mnodeGetMnodeInfos(void *mnodes);
|
void mnodeGetMnodeInfos(void *mnodes);
|
||||||
void mnodeUpdateMnodeEpSet();
|
void mnodeUpdateMnodeEpSet(SMInfos *pMnodes);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,7 @@ void* sdbGetTableByRid(int64_t rid);
|
||||||
bool sdbIsMaster();
|
bool sdbIsMaster();
|
||||||
bool sdbIsServing();
|
bool sdbIsServing();
|
||||||
void sdbUpdateMnodeRoles();
|
void sdbUpdateMnodeRoles();
|
||||||
|
int32_t sdbGetReplicaNum();
|
||||||
|
|
||||||
int32_t sdbInsertRow(SSdbRow *pRow);
|
int32_t sdbInsertRow(SSdbRow *pRow);
|
||||||
int32_t sdbDeleteRow(SSdbRow *pRow);
|
int32_t sdbDeleteRow(SSdbRow *pRow);
|
||||||
|
|
|
@ -34,14 +34,14 @@
|
||||||
#include "mnodeUser.h"
|
#include "mnodeUser.h"
|
||||||
#include "mnodeVgroup.h"
|
#include "mnodeVgroup.h"
|
||||||
|
|
||||||
int64_t tsMnodeRid = -1;
|
int64_t tsMnodeRid = -1;
|
||||||
static void * tsMnodeSdb = NULL;
|
static void * tsMnodeSdb = NULL;
|
||||||
static int32_t tsMnodeUpdateSize = 0;
|
static int32_t tsMnodeUpdateSize = 0;
|
||||||
static SRpcEpSet tsMnodeEpSetForShell;
|
static SRpcEpSet tsMEpForShell;
|
||||||
static SRpcEpSet tsMnodeEpSetForPeer;
|
static SRpcEpSet tsMEpForPeer;
|
||||||
static SMnodeInfos tsMnodeInfos;
|
static SMInfos tsMInfos;
|
||||||
static int32_t mnodeGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
|
static int32_t mnodeGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
|
||||||
static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn);
|
static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn);
|
||||||
|
|
||||||
#if defined(LINUX)
|
#if defined(LINUX)
|
||||||
static pthread_rwlock_t tsMnodeLock;
|
static pthread_rwlock_t tsMnodeLock;
|
||||||
|
@ -127,7 +127,7 @@ static int32_t mnodeMnodeActionRestored() {
|
||||||
mnodeCancelGetNextMnode(pIter);
|
mnodeCancelGetNextMnode(pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet(NULL);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -199,106 +199,130 @@ void mnodeCancelGetNextMnode(void *pIter) {
|
||||||
sdbFreeIter(tsMnodeSdb, pIter);
|
sdbFreeIter(tsMnodeSdb, pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeUpdateMnodeEpSet() {
|
void mnodeUpdateMnodeEpSet(SMInfos *pMinfos) {
|
||||||
mInfo("update mnodes epSet, numOfEps:%d ", mnodeGetMnodesNum());
|
bool set = false;
|
||||||
|
SMInfos mInfos = {0};
|
||||||
|
mInfo("vgId:1, update mnodes epSet, numOfMnodes:%d pMinfos:%p", mnodeGetMnodesNum(), pMinfos);
|
||||||
|
|
||||||
|
if (pMinfos != NULL) {
|
||||||
|
set = true;
|
||||||
|
mInfos = *pMinfos;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int32_t index = 0;
|
||||||
|
void * pIter = NULL;
|
||||||
|
while (1) {
|
||||||
|
SMnodeObj *pMnode = NULL;
|
||||||
|
pIter = mnodeGetNextMnode(pIter, &pMnode);
|
||||||
|
if (pMnode == NULL) break;
|
||||||
|
|
||||||
|
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
||||||
|
if (pDnode != NULL) {
|
||||||
|
set = true;
|
||||||
|
mInfos.mnodeInfos[index].mnodeId = pMnode->mnodeId;
|
||||||
|
strcpy(mInfos.mnodeInfos[index].mnodeEp, pDnode->dnodeEp);
|
||||||
|
if (pMnode->role == TAOS_SYNC_ROLE_MASTER) mInfos.inUse = index;
|
||||||
|
index++;
|
||||||
|
} else {
|
||||||
|
set = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeDecDnodeRef(pDnode);
|
||||||
|
mnodeDecMnodeRef(pMnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
mInfos.mnodeNum = index;
|
||||||
|
if (mInfos.mnodeNum < sdbGetReplicaNum()) {
|
||||||
|
set = false;
|
||||||
|
mDebug("vgId:1, mnodes info not synced, current:%d syncCfgNum:%d", mInfos.mnodeNum, sdbGetReplicaNum());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mnodeMnodeWrLock();
|
mnodeMnodeWrLock();
|
||||||
|
|
||||||
memset(&tsMnodeEpSetForShell, 0, sizeof(SRpcEpSet));
|
if (set) {
|
||||||
memset(&tsMnodeEpSetForPeer, 0, sizeof(SRpcEpSet));
|
memset(&tsMEpForShell, 0, sizeof(SRpcEpSet));
|
||||||
memset(&tsMnodeInfos, 0, sizeof(SMnodeInfos));
|
memset(&tsMEpForPeer, 0, sizeof(SRpcEpSet));
|
||||||
|
memcpy(&tsMInfos, &mInfos, sizeof(SMInfos));
|
||||||
|
tsMEpForShell.inUse = tsMInfos.inUse;
|
||||||
|
tsMEpForPeer.inUse = tsMInfos.inUse;
|
||||||
|
tsMEpForShell.numOfEps = tsMInfos.mnodeNum;
|
||||||
|
tsMEpForPeer.numOfEps = tsMInfos.mnodeNum;
|
||||||
|
|
||||||
int32_t index = 0;
|
mInfo("vgId:1, mnodes epSet is set, num:%d inUse:%d", tsMInfos.mnodeNum, tsMInfos.inUse);
|
||||||
void * pIter = NULL;
|
for (int index = 0; index < mInfos.mnodeNum; ++index) {
|
||||||
while (1) {
|
SMInfo *pInfo = &tsMInfos.mnodeInfos[index];
|
||||||
SMnodeObj *pMnode = NULL;
|
taosGetFqdnPortFromEp(pInfo->mnodeEp, tsMEpForShell.fqdn[index], &tsMEpForShell.port[index]);
|
||||||
pIter = mnodeGetNextMnode(pIter, &pMnode);
|
taosGetFqdnPortFromEp(pInfo->mnodeEp, tsMEpForPeer.fqdn[index], &tsMEpForPeer.port[index]);
|
||||||
if (pMnode == NULL) break;
|
tsMEpForPeer.port[index] = tsMEpForPeer.port[index] + TSDB_PORT_DNODEDNODE;
|
||||||
|
|
||||||
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
mInfo("vgId:1, mnode:%d, fqdn:%s shell:%u peer:%u", pInfo->mnodeId, tsMEpForShell.fqdn[index],
|
||||||
if (pDnode != NULL) {
|
tsMEpForShell.port[index], tsMEpForPeer.port[index]);
|
||||||
strcpy(tsMnodeEpSetForShell.fqdn[index], pDnode->dnodeFqdn);
|
|
||||||
tsMnodeEpSetForShell.port[index] = htons(pDnode->dnodePort);
|
|
||||||
mDebug("mnode:%d, for shell fqdn:%s %d", pDnode->dnodeId, tsMnodeEpSetForShell.fqdn[index], htons(tsMnodeEpSetForShell.port[index]));
|
|
||||||
|
|
||||||
strcpy(tsMnodeEpSetForPeer.fqdn[index], pDnode->dnodeFqdn);
|
tsMEpForShell.port[index] = htons(tsMEpForShell.port[index]);
|
||||||
tsMnodeEpSetForPeer.port[index] = htons(pDnode->dnodePort + TSDB_PORT_DNODEDNODE);
|
tsMEpForPeer.port[index] = htons(tsMEpForPeer.port[index]);
|
||||||
mDebug("mnode:%d, for peer fqdn:%s %d", pDnode->dnodeId, tsMnodeEpSetForPeer.fqdn[index], htons(tsMnodeEpSetForPeer.port[index]));
|
pInfo->mnodeId = htonl(pInfo->mnodeId);
|
||||||
|
}
|
||||||
tsMnodeInfos.mnodeInfos[index].mnodeId = htonl(pMnode->mnodeId);
|
} else {
|
||||||
strcpy(tsMnodeInfos.mnodeInfos[index].mnodeEp, pDnode->dnodeEp);
|
mInfo("vgId:1, mnodes epSet not set, num:%d inUse:%d", tsMInfos.mnodeNum, tsMInfos.inUse);
|
||||||
|
for (int index = 0; index < tsMInfos.mnodeNum; ++index) {
|
||||||
if (pMnode->role == TAOS_SYNC_ROLE_MASTER) {
|
mInfo("vgId:1, index:%d, ep:%s:%u", index, tsMEpForShell.fqdn[index], htons(tsMEpForShell.port[index]));
|
||||||
tsMnodeEpSetForShell.inUse = index;
|
|
||||||
tsMnodeEpSetForPeer.inUse = index;
|
|
||||||
tsMnodeInfos.inUse = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
mInfo("mnode:%d, ep:%s %s", pDnode->dnodeId, pDnode->dnodeEp, pMnode->role == TAOS_SYNC_ROLE_MASTER ? "master" : "");
|
|
||||||
index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeDecDnodeRef(pDnode);
|
|
||||||
mnodeDecMnodeRef(pMnode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tsMnodeInfos.mnodeNum = index;
|
|
||||||
tsMnodeEpSetForShell.numOfEps = index;
|
|
||||||
tsMnodeEpSetForPeer.numOfEps = index;
|
|
||||||
|
|
||||||
mnodeMnodeUnLock();
|
mnodeMnodeUnLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeGetMnodeEpSetForPeer(SRpcEpSet *epSet) {
|
void mnodeGetMnodeEpSetForPeer(SRpcEpSet *epSet) {
|
||||||
mnodeMnodeRdLock();
|
mnodeMnodeRdLock();
|
||||||
*epSet = tsMnodeEpSetForPeer;
|
*epSet = tsMEpForPeer;
|
||||||
mnodeMnodeUnLock();
|
mnodeMnodeUnLock();
|
||||||
|
|
||||||
|
mTrace("vgId:1, mnodes epSet for peer is returned, num:%d inUse:%d", tsMEpForPeer.numOfEps, tsMEpForPeer.inUse);
|
||||||
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
||||||
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort + TSDB_PORT_DNODEDNODE) {
|
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort + TSDB_PORT_DNODEDNODE) {
|
||||||
epSet->inUse = (i + 1) % epSet->numOfEps;
|
epSet->inUse = (i + 1) % epSet->numOfEps;
|
||||||
mTrace("mnode:%d, for peer ep:%s:%u, set inUse to %d", i, epSet->fqdn[i], htons(epSet->port[i]), epSet->inUse);
|
mTrace("vgId:1, mnode:%d, for peer ep:%s:%u, set inUse to %d", i, epSet->fqdn[i], htons(epSet->port[i]), epSet->inUse);
|
||||||
} else {
|
} else {
|
||||||
mTrace("mpeer:%d, for peer ep:%s:%u", i, epSet->fqdn[i], htons(epSet->port[i]));
|
mTrace("vgId:1, mpeer:%d, for peer ep:%s:%u", i, epSet->fqdn[i], htons(epSet->port[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeGetMnodeEpSetForShell(SRpcEpSet *epSet) {
|
void mnodeGetMnodeEpSetForShell(SRpcEpSet *epSet) {
|
||||||
mnodeMnodeRdLock();
|
mnodeMnodeRdLock();
|
||||||
*epSet = tsMnodeEpSetForShell;
|
*epSet = tsMEpForShell;
|
||||||
mnodeMnodeUnLock();
|
mnodeMnodeUnLock();
|
||||||
|
|
||||||
|
mTrace("vgId:1, mnodes epSet for shell is returned, num:%d inUse:%d", tsMEpForShell.numOfEps, tsMEpForShell.inUse);
|
||||||
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
||||||
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
||||||
epSet->inUse = (i + 1) % epSet->numOfEps;
|
epSet->inUse = (i + 1) % epSet->numOfEps;
|
||||||
mTrace("mnode:%d, for shell ep:%s:%u, set inUse to %d", i, epSet->fqdn[i], htons(epSet->port[i]), epSet->inUse);
|
mTrace("vgId:1, mnode:%d, for shell ep:%s:%u, set inUse to %d", i, epSet->fqdn[i], htons(epSet->port[i]), epSet->inUse);
|
||||||
} else {
|
} else {
|
||||||
mTrace("mnode:%d, for shell ep:%s:%u", i, epSet->fqdn[i], htons(epSet->port[i]));
|
mTrace("vgId:1, mnode:%d, for shell ep:%s:%u", i, epSet->fqdn[i], htons(epSet->port[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char* mnodeGetMnodeMasterEp() {
|
char* mnodeGetMnodeMasterEp() {
|
||||||
return tsMnodeInfos.mnodeInfos[tsMnodeInfos.inUse].mnodeEp;
|
return tsMInfos.mnodeInfos[tsMInfos.inUse].mnodeEp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeGetMnodeInfos(void *mnodeInfos) {
|
void mnodeGetMnodeInfos(void *pMinfos) {
|
||||||
mnodeMnodeRdLock();
|
mnodeMnodeRdLock();
|
||||||
*(SMnodeInfos *)mnodeInfos = tsMnodeInfos;
|
*(SMInfos *)pMinfos = tsMInfos;
|
||||||
mnodeMnodeUnLock();
|
mnodeMnodeUnLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeSendCreateMnodeMsg(int32_t dnodeId, char *dnodeEp) {
|
static int32_t mnodeSendCreateMnodeMsg(int32_t dnodeId, char *dnodeEp) {
|
||||||
mDebug("dnode:%d, send create mnode msg to dnode %s", dnodeId, dnodeEp);
|
|
||||||
|
|
||||||
SCreateMnodeMsg *pCreate = rpcMallocCont(sizeof(SCreateMnodeMsg));
|
SCreateMnodeMsg *pCreate = rpcMallocCont(sizeof(SCreateMnodeMsg));
|
||||||
if (pCreate == NULL) {
|
if (pCreate == NULL) {
|
||||||
return TSDB_CODE_MND_OUT_OF_MEMORY;
|
return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
} else {
|
} else {
|
||||||
pCreate->dnodeId = htonl(dnodeId);
|
pCreate->dnodeId = htonl(dnodeId);
|
||||||
tstrncpy(pCreate->dnodeEp, dnodeEp, sizeof(pCreate->dnodeEp));
|
tstrncpy(pCreate->dnodeEp, dnodeEp, sizeof(pCreate->dnodeEp));
|
||||||
pCreate->mnodes = tsMnodeInfos;
|
mnodeGetMnodeInfos(&pCreate->mnodes);
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int i = 0; i < pCreate->mnodes.mnodeNum; ++i) {
|
for (int i = 0; i < pCreate->mnodes.mnodeNum; ++i) {
|
||||||
if (pCreate->mnodes.mnodeInfos[i].mnodeId == htonl(dnodeId)) {
|
if (pCreate->mnodes.mnodeInfos[i].mnodeId == htonl(dnodeId)) {
|
||||||
|
@ -312,6 +336,11 @@ static int32_t mnodeSendCreateMnodeMsg(int32_t dnodeId, char *dnodeEp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mDebug("dnode:%d, send create mnode msg to dnode %s, numOfMnodes:%d", dnodeId, dnodeEp, pCreate->mnodes.mnodeNum);
|
||||||
|
for (int32_t i = 0; i < pCreate->mnodes.mnodeNum; ++i) {
|
||||||
|
mDebug("index:%d, mnodeId:%d ep:%s", i, pCreate->mnodes.mnodeInfos[i].mnodeId, pCreate->mnodes.mnodeInfos[i].mnodeEp);
|
||||||
|
}
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {0};
|
SRpcMsg rpcMsg = {0};
|
||||||
rpcMsg.pCont = pCreate;
|
rpcMsg.pCont = pCreate;
|
||||||
rpcMsg.contLen = sizeof(SCreateMnodeMsg);
|
rpcMsg.contLen = sizeof(SCreateMnodeMsg);
|
||||||
|
@ -336,7 +365,7 @@ static int32_t mnodeCreateMnodeCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
mError("failed to create mnode, reason:%s", tstrerror(code));
|
mError("failed to create mnode, reason:%s", tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
mDebug("mnode is created successfully");
|
mDebug("mnode is created successfully");
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet(NULL);
|
||||||
sdbUpdateAsync();
|
sdbUpdateAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +409,7 @@ void mnodeDropMnodeLocal(int32_t dnodeId) {
|
||||||
mnodeDecMnodeRef(pMnode);
|
mnodeDecMnodeRef(pMnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet(NULL);
|
||||||
sdbUpdateAsync();
|
sdbUpdateAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,7 +429,7 @@ int32_t mnodeDropMnode(int32_t dnodeId) {
|
||||||
|
|
||||||
sdbDecRef(tsMnodeSdb, pMnode);
|
sdbDecRef(tsMnodeSdb, pMnode);
|
||||||
|
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet(NULL);
|
||||||
sdbUpdateAsync();
|
sdbUpdateAsync();
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -224,11 +224,13 @@ void sdbUpdateMnodeRoles() {
|
||||||
sdbInfo("vgId:1, mnode:%d, role:%s", pMnode->mnodeId, syncRole[pMnode->role]);
|
sdbInfo("vgId:1, mnode:%d, role:%s", pMnode->mnodeId, syncRole[pMnode->role]);
|
||||||
if (pMnode->mnodeId == dnodeGetDnodeId()) tsSdbMgmt.role = pMnode->role;
|
if (pMnode->mnodeId == dnodeGetDnodeId()) tsSdbMgmt.role = pMnode->role;
|
||||||
mnodeDecMnodeRef(pMnode);
|
mnodeDecMnodeRef(pMnode);
|
||||||
|
} else {
|
||||||
|
sdbDebug("vgId:1, mnode:%d not found", roles.nodeId[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeUpdateClusterId();
|
mnodeUpdateClusterId();
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t sdbGetFileInfo(int32_t vgId, char *name, uint32_t *index, uint32_t eindex, int64_t *size, uint64_t *fversion) {
|
static uint32_t sdbGetFileInfo(int32_t vgId, char *name, uint32_t *index, uint32_t eindex, int64_t *size, uint64_t *fversion) {
|
||||||
|
@ -308,18 +310,20 @@ void sdbUpdateAsync() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdbUpdateSync(void *pMnodes) {
|
void sdbUpdateSync(void *pMnodes) {
|
||||||
SMnodeInfos *mnodes = pMnodes;
|
SMInfos *pMinfos = pMnodes;
|
||||||
if (!mnodeIsRunning()) {
|
if (!mnodeIsRunning()) {
|
||||||
mDebug("vgId:1, mnode not start yet, update sync config later");
|
mDebug("vgId:1, mnode not start yet, update sync config later");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mDebug("vgId:1, update sync config in sync module, mnodes:%p", pMnodes);
|
mDebug("vgId:1, update sync config, pMnodes:%p", pMnodes);
|
||||||
|
|
||||||
SSyncCfg syncCfg = {0};
|
SSyncCfg syncCfg = {0};
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
|
||||||
if (mnodes == NULL) {
|
if (pMinfos == NULL) {
|
||||||
|
mDebug("vgId:1, mInfos not input, use mInfos in sdb, numOfMnodes:%d", syncCfg.replica);
|
||||||
|
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
SMnodeObj *pMnode = NULL;
|
SMnodeObj *pMnode = NULL;
|
||||||
|
@ -339,16 +343,17 @@ void sdbUpdateSync(void *pMnodes) {
|
||||||
mnodeDecMnodeRef(pMnode);
|
mnodeDecMnodeRef(pMnode);
|
||||||
}
|
}
|
||||||
syncCfg.replica = index;
|
syncCfg.replica = index;
|
||||||
mDebug("vgId:1, mnodes info not input, use infos in sdb, numOfMnodes:%d", syncCfg.replica);
|
|
||||||
} else {
|
} else {
|
||||||
for (index = 0; index < mnodes->mnodeNum; ++index) {
|
mDebug("vgId:1, mInfos input, numOfMnodes:%d", pMinfos->mnodeNum);
|
||||||
SMnodeInfo *node = &mnodes->mnodeInfos[index];
|
|
||||||
|
for (index = 0; index < pMinfos->mnodeNum; ++index) {
|
||||||
|
SMInfo *node = &pMinfos->mnodeInfos[index];
|
||||||
syncCfg.nodeInfo[index].nodeId = node->mnodeId;
|
syncCfg.nodeInfo[index].nodeId = node->mnodeId;
|
||||||
taosGetFqdnPortFromEp(node->mnodeEp, syncCfg.nodeInfo[index].nodeFqdn, &syncCfg.nodeInfo[index].nodePort);
|
taosGetFqdnPortFromEp(node->mnodeEp, syncCfg.nodeInfo[index].nodeFqdn, &syncCfg.nodeInfo[index].nodePort);
|
||||||
syncCfg.nodeInfo[index].nodePort += TSDB_PORT_SYNC;
|
syncCfg.nodeInfo[index].nodePort += TSDB_PORT_SYNC;
|
||||||
}
|
}
|
||||||
syncCfg.replica = index;
|
syncCfg.replica = index;
|
||||||
mDebug("vgId:1, mnodes info input, numOfMnodes:%d", syncCfg.replica);
|
mnodeUpdateMnodeEpSet(pMnodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
syncCfg.quorum = (syncCfg.replica == 1) ? 1 : 2;
|
syncCfg.quorum = (syncCfg.replica == 1) ? 1 : 2;
|
||||||
|
@ -1103,3 +1108,7 @@ static void *sdbWorkerFp(void *pWorker) {
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t sdbGetReplicaNum() {
|
||||||
|
return tsSdbMgmt.cfg.replica;
|
||||||
|
}
|
|
@ -1734,6 +1734,16 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) {
|
||||||
|
|
||||||
if (pTable->info.type == TSDB_CHILD_TABLE) {
|
if (pTable->info.type == TSDB_CHILD_TABLE) {
|
||||||
STagData *pTagData = (STagData *)pCreate->schema; // it is a tag key
|
STagData *pTagData = (STagData *)pCreate->schema; // it is a tag key
|
||||||
|
|
||||||
|
char prefix[64] = {0};
|
||||||
|
size_t prefixLen = tableIdPrefix(pMsg->pDb->name, prefix, 64);
|
||||||
|
if (0 != strncasecmp(prefix, pTagData->name, prefixLen)) {
|
||||||
|
mError("msg:%p, app:%p table:%s, corresponding super table:%s not in this db", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
|
pCreate->tableId, pTagData->name);
|
||||||
|
mnodeDestroyChildTable(pTable);
|
||||||
|
return TSDB_CODE_TDB_INVALID_CREATE_TB_MSG;
|
||||||
|
}
|
||||||
|
|
||||||
if (pMsg->pSTable == NULL) pMsg->pSTable = mnodeGetSuperTable(pTagData->name);
|
if (pMsg->pSTable == NULL) pMsg->pSTable = mnodeGetSuperTable(pTagData->name);
|
||||||
if (pMsg->pSTable == NULL) {
|
if (pMsg->pSTable == NULL) {
|
||||||
mError("msg:%p, app:%p table:%s, corresponding super table:%s does not exist", pMsg, pMsg->rpcMsg.ahandle,
|
mError("msg:%p, app:%p table:%s, corresponding super table:%s does not exist", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
|
@ -2629,9 +2639,7 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows
|
||||||
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
||||||
|
|
||||||
char prefix[64] = {0};
|
char prefix[64] = {0};
|
||||||
tstrncpy(prefix, pDb->name, 64);
|
int32_t prefixLen = tableIdPrefix(pDb->name, prefix, 64);
|
||||||
strcat(prefix, TS_PATH_DELIMITER);
|
|
||||||
int32_t prefixLen = strlen(prefix);
|
|
||||||
|
|
||||||
char* pattern = NULL;
|
char* pattern = NULL;
|
||||||
if (pShow->payloadLen > 0) {
|
if (pShow->payloadLen > 0) {
|
||||||
|
|
|
@ -83,16 +83,15 @@ typedef struct SResultRec {
|
||||||
int32_t threshold; // result size threshold in rows.
|
int32_t threshold; // result size threshold in rows.
|
||||||
} SResultRec;
|
} SResultRec;
|
||||||
|
|
||||||
typedef struct SWindowResInfo {
|
typedef struct SResultRowInfo {
|
||||||
SResultRow** pResult; // result list
|
SResultRow** pResult; // result list
|
||||||
int16_t type:8; // data type for hash key
|
int16_t type:8; // data type for hash key
|
||||||
int32_t size:24; // number of result set
|
int32_t size:24; // number of result set
|
||||||
int32_t threshold; // threshold to halt query and return the generated results.
|
int32_t capacity; // max capacity
|
||||||
int32_t capacity; // max capacity
|
int32_t curIndex; // current start active index
|
||||||
int32_t curIndex; // current start active index
|
int64_t startTime; // start time of the first time window for sliding query
|
||||||
int64_t startTime; // start time of the first time window for sliding query
|
int64_t prevSKey; // previous (not completed) sliding window start key
|
||||||
int64_t prevSKey; // previous (not completed) sliding window start key
|
} SResultRowInfo;
|
||||||
} SWindowResInfo;
|
|
||||||
|
|
||||||
typedef struct SColumnFilterElem {
|
typedef struct SColumnFilterElem {
|
||||||
int16_t bytes; // column length
|
int16_t bytes; // column length
|
||||||
|
@ -115,7 +114,7 @@ typedef struct STableQueryInfo {
|
||||||
STimeWindow win;
|
STimeWindow win;
|
||||||
STSCursor cur;
|
STSCursor cur;
|
||||||
void* pTable; // for retrieve the page id list
|
void* pTable; // for retrieve the page id list
|
||||||
SWindowResInfo windowResInfo;
|
SResultRowInfo windowResInfo;
|
||||||
} STableQueryInfo;
|
} STableQueryInfo;
|
||||||
|
|
||||||
typedef struct SQueryCostInfo {
|
typedef struct SQueryCostInfo {
|
||||||
|
@ -179,7 +178,7 @@ typedef struct SQueryRuntimeEnv {
|
||||||
uint16_t* offset;
|
uint16_t* offset;
|
||||||
uint16_t scanFlag; // denotes reversed scan of data or not
|
uint16_t scanFlag; // denotes reversed scan of data or not
|
||||||
SFillInfo* pFillInfo;
|
SFillInfo* pFillInfo;
|
||||||
SWindowResInfo windowResInfo;
|
SResultRowInfo windowResInfo;
|
||||||
STSBuf* pTSBuf;
|
STSBuf* pTSBuf;
|
||||||
STSCursor cur;
|
STSCursor cur;
|
||||||
SQueryCostInfo summary;
|
SQueryCostInfo summary;
|
||||||
|
@ -190,6 +189,7 @@ typedef struct SQueryRuntimeEnv {
|
||||||
bool groupbyNormalCol; // denote if this is a groupby normal column query
|
bool groupbyNormalCol; // denote if this is a groupby normal column query
|
||||||
bool hasTagResults; // if there are tag values in final result or not
|
bool hasTagResults; // if there are tag values in final result or not
|
||||||
bool timeWindowInterpo;// if the time window start/end required interpolation
|
bool timeWindowInterpo;// if the time window start/end required interpolation
|
||||||
|
bool queryWindowIdentical; // all query time windows are identical for all tables in one group
|
||||||
int32_t interBufSize; // intermediate buffer sizse
|
int32_t interBufSize; // intermediate buffer sizse
|
||||||
int32_t prevGroupId; // previous executed group id
|
int32_t prevGroupId; // previous executed group id
|
||||||
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
|
@ -217,7 +217,8 @@ typedef struct SQInfo {
|
||||||
STableGroupInfo tableGroupInfo; // table <tid, last_key> list SArray<STableKeyInfo>
|
STableGroupInfo tableGroupInfo; // table <tid, last_key> list SArray<STableKeyInfo>
|
||||||
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
||||||
SQueryRuntimeEnv runtimeEnv;
|
SQueryRuntimeEnv runtimeEnv;
|
||||||
SArray* arrTableIdInfo;
|
// SArray* arrTableIdInfo;
|
||||||
|
SHashObj* arrTableIdInfo;
|
||||||
int32_t groupIndex;
|
int32_t groupIndex;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -30,19 +30,19 @@ void clearResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* pRow, int16_t typ
|
||||||
void copyResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* dst, const SResultRow* src, int16_t type);
|
void copyResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* dst, const SResultRow* src, int16_t type);
|
||||||
SResultRowCellInfo* getResultCell(SQueryRuntimeEnv* pRuntimeEnv, const SResultRow* pRow, int32_t index);
|
SResultRowCellInfo* getResultCell(SQueryRuntimeEnv* pRuntimeEnv, const SResultRow* pRow, int32_t index);
|
||||||
|
|
||||||
int32_t initWindowResInfo(SWindowResInfo* pWindowResInfo, int32_t size, int32_t threshold, int16_t type);
|
int32_t initWindowResInfo(SResultRowInfo* pWindowResInfo, int32_t size, int16_t type);
|
||||||
|
|
||||||
void cleanupTimeWindowInfo(SWindowResInfo* pWindowResInfo);
|
void cleanupTimeWindowInfo(SResultRowInfo* pWindowResInfo);
|
||||||
void resetTimeWindowInfo(SQueryRuntimeEnv* pRuntimeEnv, SWindowResInfo* pWindowResInfo);
|
void resetTimeWindowInfo(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pWindowResInfo);
|
||||||
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num);
|
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num);
|
||||||
|
|
||||||
void clearClosedTimeWindow(SQueryRuntimeEnv* pRuntimeEnv);
|
void clearClosedTimeWindow(SQueryRuntimeEnv* pRuntimeEnv);
|
||||||
int32_t numOfClosedTimeWindow(SWindowResInfo* pWindowResInfo);
|
int32_t numOfClosedTimeWindow(SResultRowInfo* pWindowResInfo);
|
||||||
void closeTimeWindow(SWindowResInfo* pWindowResInfo, int32_t slot);
|
void closeTimeWindow(SResultRowInfo* pWindowResInfo, int32_t slot);
|
||||||
void closeAllTimeWindow(SWindowResInfo* pWindowResInfo);
|
void closeAllTimeWindow(SResultRowInfo* pWindowResInfo);
|
||||||
void removeRedundantWindow(SWindowResInfo *pWindowResInfo, TSKEY lastKey, int32_t order);
|
void removeRedundantWindow(SResultRowInfo *pWindowResInfo, TSKEY lastKey, int32_t order);
|
||||||
|
|
||||||
static FORCE_INLINE SResultRow *getResultRow(SWindowResInfo *pWindowResInfo, int32_t slot) {
|
static FORCE_INLINE SResultRow *getResultRow(SResultRowInfo *pWindowResInfo, int32_t slot) {
|
||||||
assert(pWindowResInfo != NULL && slot >= 0 && slot < pWindowResInfo->size);
|
assert(pWindowResInfo != NULL && slot >= 0 && slot < pWindowResInfo->size);
|
||||||
return pWindowResInfo->pResult[slot];
|
return pWindowResInfo->pResult[slot];
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ static FORCE_INLINE SResultRow *getResultRow(SWindowResInfo *pWindowResInfo, int
|
||||||
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
|
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
|
||||||
#define GET_ROW_PARAM_FOR_MULTIOUTPUT(_q, tbq, sq) (((tbq) && (!sq))? (_q)->pExpr1[1].base.arg->argValue.i64:1)
|
#define GET_ROW_PARAM_FOR_MULTIOUTPUT(_q, tbq, sq) (((tbq) && (!sq))? (_q)->pExpr1[1].base.arg->argValue.i64:1)
|
||||||
|
|
||||||
bool isWindowResClosed(SWindowResInfo *pWindowResInfo, int32_t slot);
|
bool isWindowResClosed(SResultRowInfo *pWindowResInfo, int32_t slot);
|
||||||
|
|
||||||
int32_t initResultRow(SResultRow *pResultRow);
|
int32_t initResultRow(SResultRow *pResultRow);
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -405,14 +405,29 @@ void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
if (type->type == 0) {
|
if (type->type == 0) {
|
||||||
pField->bytes = 0;
|
pField->bytes = 0;
|
||||||
} else {
|
} else {
|
||||||
pField->bytes = (int16_t)(-(int32_t)type->type * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE);
|
int32_t bytes = -(int32_t)(type->type);
|
||||||
|
if (bytes > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
// we have to postpone reporting the error because it cannot be done here
|
||||||
|
// as pField->bytes is int16_t, use 'TSDB_MAX_NCHAR_LEN + 1' to avoid overflow
|
||||||
|
bytes = TSDB_MAX_NCHAR_LEN + 1;
|
||||||
|
} else {
|
||||||
|
bytes = bytes * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
pField->bytes = (int16_t)bytes;
|
||||||
}
|
}
|
||||||
} else if (i == TSDB_DATA_TYPE_BINARY) {
|
} else if (i == TSDB_DATA_TYPE_BINARY) {
|
||||||
/* for binary, the TOKENTYPE is the length of binary */
|
/* for binary, the TOKENTYPE is the length of binary */
|
||||||
if (type->type == 0) {
|
if (type->type == 0) {
|
||||||
pField->bytes = 0;
|
pField->bytes = 0;
|
||||||
} else {
|
} else {
|
||||||
pField->bytes = (int16_t) (-(int32_t) type->type + VARSTR_HEADER_SIZE);
|
int32_t bytes = -(int32_t)(type->type);
|
||||||
|
if (bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {
|
||||||
|
// refer comment for NCHAR above
|
||||||
|
bytes = TSDB_MAX_BINARY_LEN + 1;
|
||||||
|
} else {
|
||||||
|
bytes += VARSTR_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
pField->bytes = (int16_t)bytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -43,51 +43,48 @@ int32_t getOutputInterResultBufSize(SQuery* pQuery) {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t initWindowResInfo(SWindowResInfo *pWindowResInfo, int32_t size, int32_t threshold, int16_t type) {
|
int32_t initWindowResInfo(SResultRowInfo *pResultRowInfo, int32_t size, int16_t type) {
|
||||||
pWindowResInfo->capacity = size;
|
pResultRowInfo->capacity = size;
|
||||||
pWindowResInfo->threshold = threshold;
|
|
||||||
|
|
||||||
pWindowResInfo->type = type;
|
|
||||||
pWindowResInfo->curIndex = -1;
|
|
||||||
pWindowResInfo->size = 0;
|
|
||||||
pWindowResInfo->prevSKey = TSKEY_INITIAL_VAL;
|
|
||||||
|
|
||||||
pWindowResInfo->pResult = calloc(pWindowResInfo->capacity, POINTER_BYTES);
|
pResultRowInfo->type = type;
|
||||||
if (pWindowResInfo->pResult == NULL) {
|
pResultRowInfo->curIndex = -1;
|
||||||
|
pResultRowInfo->size = 0;
|
||||||
|
pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
||||||
|
|
||||||
|
pResultRowInfo->pResult = calloc(pResultRowInfo->capacity, POINTER_BYTES);
|
||||||
|
if (pResultRowInfo->pResult == NULL) {
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanupTimeWindowInfo(SWindowResInfo *pWindowResInfo) {
|
void cleanupTimeWindowInfo(SResultRowInfo *pResultRowInfo) {
|
||||||
if (pWindowResInfo == NULL) {
|
if (pResultRowInfo == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pWindowResInfo->capacity == 0) {
|
if (pResultRowInfo->capacity == 0) {
|
||||||
assert(pWindowResInfo->pResult == NULL);
|
assert(pResultRowInfo->pResult == NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWindowResInfo->type == TSDB_DATA_TYPE_BINARY || pWindowResInfo->type == TSDB_DATA_TYPE_NCHAR) {
|
if (pResultRowInfo->type == TSDB_DATA_TYPE_BINARY || pResultRowInfo->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
for(int32_t i = 0; i < pWindowResInfo->size; ++i) {
|
for(int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
||||||
tfree(pWindowResInfo->pResult[i]->key);
|
tfree(pResultRowInfo->pResult[i]->key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tfree(pWindowResInfo->pResult);
|
tfree(pResultRowInfo->pResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SWindowResInfo *pWindowResInfo) {
|
void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo) {
|
||||||
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0) {
|
if (pResultRowInfo == NULL || pResultRowInfo->capacity == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert(pWindowResInfo->size == 1);
|
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
||||||
|
SResultRow *pWindowRes = pResultRowInfo->pResult[i];
|
||||||
for (int32_t i = 0; i < pWindowResInfo->size; ++i) {
|
clearResultRow(pRuntimeEnv, pWindowRes, pResultRowInfo->type);
|
||||||
SResultRow *pWindowRes = pWindowResInfo->pResult[i];
|
|
||||||
clearResultRow(pRuntimeEnv, pWindowRes, pWindowResInfo->type);
|
|
||||||
|
|
||||||
int32_t groupIndex = 0;
|
int32_t groupIndex = 0;
|
||||||
int64_t uid = 0;
|
int64_t uid = 0;
|
||||||
|
@ -96,30 +93,30 @@ void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SWindowResInfo *pWindowR
|
||||||
taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(sizeof(groupIndex)));
|
taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(sizeof(groupIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
pWindowResInfo->curIndex = -1;
|
pResultRowInfo->curIndex = -1;
|
||||||
pWindowResInfo->size = 0;
|
pResultRowInfo->size = 0;
|
||||||
|
|
||||||
pWindowResInfo->startTime = TSKEY_INITIAL_VAL;
|
pResultRowInfo->startTime = TSKEY_INITIAL_VAL;
|
||||||
pWindowResInfo->prevSKey = TSKEY_INITIAL_VAL;
|
pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
SWindowResInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
|
SResultRowInfo *pResultRowInfo = &pRuntimeEnv->windowResInfo;
|
||||||
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0 || pWindowResInfo->size == 0 || num == 0) {
|
if (pResultRowInfo == NULL || pResultRowInfo->capacity == 0 || pResultRowInfo->size == 0 || num == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosed = numOfClosedTimeWindow(pWindowResInfo);
|
int32_t numOfClosed = numOfClosedTimeWindow(pResultRowInfo);
|
||||||
assert(num >= 0 && num <= numOfClosed);
|
assert(num >= 0 && num <= numOfClosed);
|
||||||
|
|
||||||
int16_t type = pWindowResInfo->type;
|
int16_t type = pResultRowInfo->type;
|
||||||
int64_t uid = getResultInfoUId(pRuntimeEnv);
|
int64_t uid = getResultInfoUId(pRuntimeEnv);
|
||||||
|
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
int16_t bytes = -1;
|
int16_t bytes = -1;
|
||||||
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
SResultRow *pResult = pWindowResInfo->pResult[i];
|
SResultRow *pResult = pResultRowInfo->pResult[i];
|
||||||
if (pResult->closed) { // remove the window slot from hash table
|
if (pResult->closed) { // remove the window slot from hash table
|
||||||
getResultRowKeyInfo(pResult, type, &key, &bytes);
|
getResultRowKeyInfo(pResult, type, &key, &bytes);
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
|
@ -129,23 +126,23 @@ void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t remain = pWindowResInfo->size - num;
|
int32_t remain = pResultRowInfo->size - num;
|
||||||
|
|
||||||
// clear all the closed windows from the window list
|
// clear all the closed windows from the window list
|
||||||
for (int32_t k = 0; k < remain; ++k) {
|
for (int32_t k = 0; k < remain; ++k) {
|
||||||
copyResultRow(pRuntimeEnv, pWindowResInfo->pResult[k], pWindowResInfo->pResult[num + k], type);
|
copyResultRow(pRuntimeEnv, pResultRowInfo->pResult[k], pResultRowInfo->pResult[num + k], type);
|
||||||
}
|
}
|
||||||
|
|
||||||
// move the unclosed window in the front of the window list
|
// move the unclosed window in the front of the window list
|
||||||
for (int32_t k = remain; k < pWindowResInfo->size; ++k) {
|
for (int32_t k = remain; k < pResultRowInfo->size; ++k) {
|
||||||
SResultRow *pWindowRes = pWindowResInfo->pResult[k];
|
SResultRow *pWindowRes = pResultRowInfo->pResult[k];
|
||||||
clearResultRow(pRuntimeEnv, pWindowRes, pWindowResInfo->type);
|
clearResultRow(pRuntimeEnv, pWindowRes, pResultRowInfo->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
pWindowResInfo->size = remain;
|
pResultRowInfo->size = remain;
|
||||||
|
|
||||||
for (int32_t k = 0; k < pWindowResInfo->size; ++k) {
|
for (int32_t k = 0; k < pResultRowInfo->size; ++k) {
|
||||||
SResultRow *pResult = pWindowResInfo->pResult[k];
|
SResultRow *pResult = pResultRowInfo->pResult[k];
|
||||||
getResultRowKeyInfo(pResult, type, &key, &bytes);
|
getResultRowKeyInfo(pResult, type, &key, &bytes);
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
|
|
||||||
|
@ -153,43 +150,43 @@ void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
assert(p != NULL);
|
assert(p != NULL);
|
||||||
|
|
||||||
int32_t v = (*p - num);
|
int32_t v = (*p - num);
|
||||||
assert(v >= 0 && v <= pWindowResInfo->size);
|
assert(v >= 0 && v <= pResultRowInfo->size);
|
||||||
|
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), (char *)&v, sizeof(int32_t));
|
taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), (char *)&v, sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
pWindowResInfo->curIndex = -1;
|
pResultRowInfo->curIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearClosedTimeWindow(SQueryRuntimeEnv *pRuntimeEnv) {
|
void clearClosedTimeWindow(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
SWindowResInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
|
SResultRowInfo *pResultRowInfo = &pRuntimeEnv->windowResInfo;
|
||||||
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0 || pWindowResInfo->size == 0) {
|
if (pResultRowInfo == NULL || pResultRowInfo->capacity == 0 || pResultRowInfo->size == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosed = numOfClosedTimeWindow(pWindowResInfo);
|
int32_t numOfClosed = numOfClosedTimeWindow(pResultRowInfo);
|
||||||
clearFirstNWindowRes(pRuntimeEnv, numOfClosed);
|
clearFirstNWindowRes(pRuntimeEnv, numOfClosed);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosedTimeWindow(SWindowResInfo *pWindowResInfo) {
|
int32_t numOfClosedTimeWindow(SResultRowInfo *pResultRowInfo) {
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
while (i < pWindowResInfo->size && pWindowResInfo->pResult[i]->closed) {
|
while (i < pResultRowInfo->size && pResultRowInfo->pResult[i]->closed) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeAllTimeWindow(SWindowResInfo *pWindowResInfo) {
|
void closeAllTimeWindow(SResultRowInfo *pResultRowInfo) {
|
||||||
assert(pWindowResInfo->size >= 0 && pWindowResInfo->capacity >= pWindowResInfo->size);
|
assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pWindowResInfo->size; ++i) {
|
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
||||||
if (pWindowResInfo->pResult[i]->closed) {
|
if (pResultRowInfo->pResult[i]->closed) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pWindowResInfo->pResult[i]->closed = true;
|
pResultRowInfo->pResult[i]->closed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,41 +195,41 @@ void closeAllTimeWindow(SWindowResInfo *pWindowResInfo) {
|
||||||
* the last qualified time stamp in case of sliding query, which the sliding time is not equalled to the interval time.
|
* the last qualified time stamp in case of sliding query, which the sliding time is not equalled to the interval time.
|
||||||
* NOTE: remove redundant, only when the result set order equals to traverse order
|
* NOTE: remove redundant, only when the result set order equals to traverse order
|
||||||
*/
|
*/
|
||||||
void removeRedundantWindow(SWindowResInfo *pWindowResInfo, TSKEY lastKey, int32_t order) {
|
void removeRedundantWindow(SResultRowInfo *pResultRowInfo, TSKEY lastKey, int32_t order) {
|
||||||
assert(pWindowResInfo->size >= 0 && pWindowResInfo->capacity >= pWindowResInfo->size);
|
assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
|
||||||
if (pWindowResInfo->size <= 1) {
|
if (pResultRowInfo->size <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the result order
|
// get the result order
|
||||||
int32_t resultOrder = (pWindowResInfo->pResult[0]->win.skey < pWindowResInfo->pResult[1]->win.skey)? 1:-1;
|
int32_t resultOrder = (pResultRowInfo->pResult[0]->win.skey < pResultRowInfo->pResult[1]->win.skey)? 1:-1;
|
||||||
if (order != resultOrder) {
|
if (order != resultOrder) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
if (order == QUERY_ASC_FORWARD_STEP) {
|
if (order == QUERY_ASC_FORWARD_STEP) {
|
||||||
TSKEY ekey = pWindowResInfo->pResult[i]->win.ekey;
|
TSKEY ekey = pResultRowInfo->pResult[i]->win.ekey;
|
||||||
while (i < pWindowResInfo->size && (ekey < lastKey)) {
|
while (i < pResultRowInfo->size && (ekey < lastKey)) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
} else if (order == QUERY_DESC_FORWARD_STEP) {
|
} else if (order == QUERY_DESC_FORWARD_STEP) {
|
||||||
while (i < pWindowResInfo->size && (pWindowResInfo->pResult[i]->win.skey > lastKey)) {
|
while (i < pResultRowInfo->size && (pResultRowInfo->pResult[i]->win.skey > lastKey)) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < pWindowResInfo->size) {
|
if (i < pResultRowInfo->size) {
|
||||||
pWindowResInfo->size = (i + 1);
|
pResultRowInfo->size = (i + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isWindowResClosed(SWindowResInfo *pWindowResInfo, int32_t slot) {
|
bool isWindowResClosed(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
||||||
return (getResultRow(pWindowResInfo, slot)->closed == true);
|
return (getResultRow(pResultRowInfo, slot)->closed == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeTimeWindow(SWindowResInfo *pWindowResInfo, int32_t slot) {
|
void closeTimeWindow(SResultRowInfo *pResultRowInfo, int32_t slot) {
|
||||||
getResultRow(pWindowResInfo, slot)->closed = true;
|
getResultRow(pResultRowInfo, slot)->closed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pWindowRes, int16_t type) {
|
void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pWindowRes, int16_t type) {
|
||||||
|
|
|
@ -226,7 +226,7 @@ int64_t syncStart(const SSyncInfo *pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pNode->selfIndex < 0) {
|
if (pNode->selfIndex < 0) {
|
||||||
sInfo("vgId:%d, this node is not configured", pNode->vgId);
|
sError("vgId:%d, this node is not configured", pNode->vgId);
|
||||||
terrno = TSDB_CODE_SYN_INVALID_CONFIG;
|
terrno = TSDB_CODE_SYN_INVALID_CONFIG;
|
||||||
syncStop(pNode->rid);
|
syncStop(pNode->rid);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -548,7 +548,7 @@ static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo) {
|
||||||
pPeer->pSyncNode = pNode;
|
pPeer->pSyncNode = pNode;
|
||||||
pPeer->refCount = 1;
|
pPeer->refCount = 1;
|
||||||
|
|
||||||
sInfo("%s, it is configured", pPeer->id);
|
sInfo("%s, it is configured, ep:%s:%u", pPeer->id, pPeer->fqdn, pPeer->port);
|
||||||
int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
|
int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
|
||||||
if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
|
if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
|
||||||
int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
|
int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
|
||||||
|
@ -1134,7 +1134,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
|
|
||||||
pPeer = (i < pNode->replica) ? pNode->peerInfo[i] : NULL;
|
pPeer = (i < pNode->replica) ? pNode->peerInfo[i] : NULL;
|
||||||
if (pPeer == NULL) {
|
if (pPeer == NULL) {
|
||||||
sError("vgId:%d, peer:%s not configured", pNode->vgId, firstPkt.fqdn);
|
sError("vgId:%d, peer:%s:%u not configured", pNode->vgId, firstPkt.fqdn, firstPkt.port);
|
||||||
taosCloseSocket(connFd);
|
taosCloseSocket(connFd);
|
||||||
// syncSendVpeerCfgMsg(sync);
|
// syncSendVpeerCfgMsg(sync);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -151,6 +151,7 @@ SFileGroup *tsdbCreateFGroup(STsdbRepo *pRepo, int fid, int level) {
|
||||||
// SET FILE GROUP
|
// SET FILE GROUP
|
||||||
fg.fileId = fid;
|
fg.fileId = fid;
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
// CREATE FILES
|
// CREATE FILES
|
||||||
for (int type = 0; type < TSDB_FILE_TYPE_MAX; type++) {
|
for (int type = 0; type < TSDB_FILE_TYPE_MAX; type++) {
|
||||||
SFile *pFile = &(fg.files[type]);
|
SFile *pFile = &(fg.files[type]);
|
||||||
|
@ -167,6 +168,19 @@ SFileGroup *tsdbCreateFGroup(STsdbRepo *pRepo, int fid, int level) {
|
||||||
if (tsdbUpdateFileHeader(pFile) < 0) {
|
if (tsdbUpdateFileHeader(pFile) < 0) {
|
||||||
tsdbCloseFile(pFile);
|
tsdbCloseFile(pFile);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
=======
|
||||||
|
SFileGroup *pGroup = tsdbSearchFGroup(pFileH, fid, TD_EQ);
|
||||||
|
if (pGroup == NULL) { // if not exists, create one
|
||||||
|
pFGroup->fileId = fid;
|
||||||
|
for (int type = 0; type < TSDB_FILE_TYPE_MAX; type++) {
|
||||||
|
if (tsdbCreateFile(&pFGroup->files[type], pRepo, fid, type) < 0) {
|
||||||
|
for (int i = type; i >= 0; i--) {
|
||||||
|
remove(pFGroup->files[i].fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
>>>>>>> origin/develop
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbCloseFile(pFile);
|
tsdbCloseFile(pFile);
|
||||||
|
@ -175,6 +189,7 @@ SFileGroup *tsdbCreateFGroup(STsdbRepo *pRepo, int fid, int level) {
|
||||||
id = TFILE_ID(&(pFile->file));
|
id = TFILE_ID(&(pFile->file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
// PUT GROUP INTO FILE HANDLE
|
// PUT GROUP INTO FILE HANDLE
|
||||||
pthread_rwlock_wrlock(&pFileH->fhlock);
|
pthread_rwlock_wrlock(&pFileH->fhlock);
|
||||||
pFileH->pFGroup[pFileH->nFGroups++] = fg;
|
pFileH->pFGroup[pFileH->nFGroups++] = fg;
|
||||||
|
@ -184,6 +199,9 @@ SFileGroup *tsdbCreateFGroup(STsdbRepo *pRepo, int fid, int level) {
|
||||||
SFileGroup *pfg = tsdbSearchFGroup(pFileH, fid, TD_EQ);
|
SFileGroup *pfg = tsdbSearchFGroup(pFileH, fid, TD_EQ);
|
||||||
ASSERT(pfg != NULL);
|
ASSERT(pfg != NULL);
|
||||||
return pfg;
|
return pfg;
|
||||||
|
=======
|
||||||
|
return pGroup;
|
||||||
|
>>>>>>> origin/develop
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbRemoveFileGroup(STsdbRepo *pRepo, SFileGroup *pFGroup) {
|
void tsdbRemoveFileGroup(STsdbRepo *pRepo, SFileGroup *pFGroup) {
|
||||||
|
|
|
@ -789,9 +789,9 @@ static int tsdbCheckTableSchema(STsdbRepo *pRepo, SSubmitBlk *pBlock, STable *pT
|
||||||
if (tsdbGetTableSchemaImpl(pTable, false, false, pBlock->sversion) == NULL) {
|
if (tsdbGetTableSchemaImpl(pTable, false, false, pBlock->sversion) == NULL) {
|
||||||
tsdbError("vgId:%d invalid submit schema version %d to table %s tid %d from client", REPO_ID(pRepo),
|
tsdbError("vgId:%d invalid submit schema version %d to table %s tid %d from client", REPO_ID(pRepo),
|
||||||
pBlock->sversion, TABLE_CHAR_NAME(pTable), TABLE_TID(pTable));
|
pBlock->sversion, TABLE_CHAR_NAME(pTable), TABLE_TID(pTable));
|
||||||
|
terrno = TSDB_CODE_TDB_IVD_TB_SCHEMA_VERSION;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
terrno = TSDB_CODE_TDB_IVD_TB_SCHEMA_VERSION;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -151,8 +151,9 @@ static void pushfrontNodeInEntryList(SHashEntry *pEntry, SHashNode *pNode);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SHashObj *taosHashInit(size_t capacity, _hash_fn_t fn, bool update, SHashLockTypeE type) {
|
SHashObj *taosHashInit(size_t capacity, _hash_fn_t fn, bool update, SHashLockTypeE type) {
|
||||||
if (capacity == 0 || fn == NULL) {
|
assert(fn != NULL);
|
||||||
return NULL;
|
if (capacity == 0) {
|
||||||
|
capacity = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHashObj *pHashObj = (SHashObj *)calloc(1, sizeof(SHashObj));
|
SHashObj *pHashObj = (SHashObj *)calloc(1, sizeof(SHashObj));
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tkey.h"
|
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
#include "tsocket.h"
|
#include "tsocket.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
|
@ -329,7 +329,7 @@ void *taosIterateRef(int rsetId, int64_t rid) {
|
||||||
pNode->count++; // acquire it
|
pNode->count++; // acquire it
|
||||||
newP = pNode->p;
|
newP = pNode->p;
|
||||||
taosUnlockList(pSet->lockedBy+hash);
|
taosUnlockList(pSet->lockedBy+hash);
|
||||||
uTrace("rsetId:%d p:%p rid:%" PRId64 " is returned", rsetId, newP, rid);
|
uTrace("rsetId:%d p:%p rid:%" PRId64 " is returned", rsetId, newP, rid);
|
||||||
} else {
|
} else {
|
||||||
uTrace("rsetId:%d the list is over", rsetId);
|
uTrace("rsetId:%d the list is over", rsetId);
|
||||||
}
|
}
|
||||||
|
@ -423,24 +423,25 @@ static int taosDecRefCount(int rsetId, int64_t rid, int remove) {
|
||||||
if (pNode->next) {
|
if (pNode->next) {
|
||||||
pNode->next->prev = pNode->prev;
|
pNode->next->prev = pNode->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pSet->fp)(pNode->p);
|
|
||||||
|
|
||||||
uTrace("rsetId:%d p:%p rid:%" PRId64 " is removed, count:%d, free mem: %p", rsetId, pNode->p, rid, pSet->count, pNode);
|
|
||||||
free(pNode);
|
|
||||||
released = 1;
|
released = 1;
|
||||||
} else {
|
} else {
|
||||||
uTrace("rsetId:%d p:%p rid:%" PRId64 " is released, count:%d", rsetId, pNode->p, rid, pNode->count);
|
uTrace("rsetId:%d p:%p rid:%" PRId64 " is released", rsetId, pNode->p, rid);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uTrace("rsetId:%d rid:%" PRId64 " is not there, failed to release/remove", rsetId, rid);
|
uTrace("rsetId:%d rid:%" PRId64 " is not there, failed to release/remove", rsetId, rid);
|
||||||
terrno = TSDB_CODE_REF_NOT_EXIST;
|
terrno = TSDB_CODE_REF_NOT_EXIST;
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosUnlockList(pSet->lockedBy+hash);
|
taosUnlockList(pSet->lockedBy+hash);
|
||||||
|
|
||||||
if (released) taosDecRsetCount(pSet);
|
if (released) {
|
||||||
|
uTrace("rsetId:%d p:%p rid:%" PRId64 " is removed, count:%d, free mem: %p", rsetId, pNode->p, rid, pSet->count, pNode);
|
||||||
|
(*pSet->fp)(pNode->p);
|
||||||
|
free(pNode);
|
||||||
|
|
||||||
|
taosDecRsetCount(pSet);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,9 +238,8 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
|
||||||
}
|
}
|
||||||
tstrncpy(node->nodeEp, nodeEp->valuestring, TSDB_EP_LEN);
|
tstrncpy(node->nodeEp, nodeEp->valuestring, TSDB_EP_LEN);
|
||||||
|
|
||||||
if (!nodeChanged) {
|
bool changed = dnodeCheckEpChanged(node->nodeId, node->nodeEp);
|
||||||
nodeChanged = dnodeCheckEpChanged(node->nodeId, node->nodeEp);
|
if (changed) nodeChanged = changed;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TSDB_CODE_SUCCESS;
|
ret = TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -204,16 +204,18 @@ int32_t vnodeOpen(int32_t vgId) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCqCfg cqCfg = {0};
|
if (tsEnableStream) {
|
||||||
sprintf(cqCfg.user, "_root");
|
SCqCfg cqCfg = {0};
|
||||||
strcpy(cqCfg.pass, tsInternalPass);
|
sprintf(cqCfg.user, "_root");
|
||||||
strcpy(cqCfg.db, pVnode->db);
|
strcpy(cqCfg.pass, tsInternalPass);
|
||||||
cqCfg.vgId = vgId;
|
strcpy(cqCfg.db, pVnode->db);
|
||||||
cqCfg.cqWrite = vnodeWriteToCache;
|
cqCfg.vgId = vgId;
|
||||||
pVnode->cq = cqOpen(pVnode, &cqCfg);
|
cqCfg.cqWrite = vnodeWriteToCache;
|
||||||
if (pVnode->cq == NULL) {
|
pVnode->cq = cqOpen(pVnode, &cqCfg);
|
||||||
vnodeCleanUp(pVnode);
|
if (pVnode->cq == NULL) {
|
||||||
return terrno;
|
vnodeCleanUp(pVnode);
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STsdbAppH appH = {0};
|
STsdbAppH appH = {0};
|
||||||
|
@ -294,9 +296,8 @@ int32_t vnodeOpen(int32_t vgId) {
|
||||||
pVnode->sync = syncStart(&syncInfo);
|
pVnode->sync = syncStart(&syncInfo);
|
||||||
|
|
||||||
if (pVnode->sync <= 0) {
|
if (pVnode->sync <= 0) {
|
||||||
vError("vgId:%d, failed to open sync module, replica:%d reason:%s", pVnode->vgId, pVnode->syncCfg.replica,
|
vError("vgId:%d, failed to open sync, replica:%d reason:%s", pVnode->vgId, pVnode->syncCfg.replica,
|
||||||
tstrerror(terrno));
|
tstrerror(terrno));
|
||||||
vnodeRelease(pVnode);
|
|
||||||
vnodeCleanUp(pVnode);
|
vnodeCleanUp(pVnode);
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,41 +274,40 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
|
||||||
|
|
||||||
vDebug("vgId:%d, QInfo:%p, dnode continues to exec query", pVnode->vgId, *qhandle);
|
vDebug("vgId:%d, QInfo:%p, dnode continues to exec query", pVnode->vgId, *qhandle);
|
||||||
|
|
||||||
|
// In the retrieve blocking model, only 50% CPU will be used in query processing
|
||||||
#if _NON_BLOCKING_RETRIEVE
|
if (tsHalfCoresForQuery) {
|
||||||
bool freehandle = false;
|
qTableQuery(*qhandle); // do execute query
|
||||||
bool buildRes = qTableQuery(*qhandle); // do execute query
|
qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, false);
|
||||||
|
|
||||||
// build query rsp, the retrieve request has reached here already
|
|
||||||
if (buildRes) {
|
|
||||||
// update the connection info according to the retrieve connection
|
|
||||||
pRead->rpcHandle = qGetResultRetrieveMsg(*qhandle);
|
|
||||||
assert(pRead->rpcHandle != NULL);
|
|
||||||
|
|
||||||
vDebug("vgId:%d, QInfo:%p, start to build retrieval rsp after query paused, %p", pVnode->vgId, *qhandle,
|
|
||||||
pRead->rpcHandle);
|
|
||||||
|
|
||||||
// set the real rsp error code
|
|
||||||
pRead->code = vnodeDumpQueryResult(&pRead->rspRet, pVnode, qhandle, &freehandle, pRead->rpcHandle);
|
|
||||||
|
|
||||||
// NOTE: set return code to be TSDB_CODE_QRY_HAS_RSP to notify dnode to return msg to client
|
|
||||||
code = TSDB_CODE_QRY_HAS_RSP;
|
|
||||||
} else {
|
} else {
|
||||||
void* h1 = qGetResultRetrieveMsg(*qhandle);
|
bool freehandle = false;
|
||||||
assert(h1 == NULL);
|
bool buildRes = qTableQuery(*qhandle); // do execute query
|
||||||
|
|
||||||
freehandle = qQueryCompleted(*qhandle);
|
// build query rsp, the retrieve request has reached here already
|
||||||
}
|
if (buildRes) {
|
||||||
|
// update the connection info according to the retrieve connection
|
||||||
|
pRead->rpcHandle = qGetResultRetrieveMsg(*qhandle);
|
||||||
|
assert(pRead->rpcHandle != NULL);
|
||||||
|
|
||||||
// NOTE: if the qhandle is not put into vread queue or query is completed, free the qhandle.
|
vDebug("vgId:%d, QInfo:%p, start to build retrieval rsp after query paused, %p", pVnode->vgId, *qhandle,
|
||||||
// If the building of result is not required, simply free it. Otherwise, mandatorily free the qhandle
|
pRead->rpcHandle);
|
||||||
if (freehandle || (!buildRes)) {
|
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, freehandle);
|
// set the real rsp error code
|
||||||
|
pRead->code = vnodeDumpQueryResult(&pRead->rspRet, pVnode, qhandle, &freehandle, pRead->rpcHandle);
|
||||||
|
|
||||||
|
// NOTE: set return code to be TSDB_CODE_QRY_HAS_RSP to notify dnode to return msg to client
|
||||||
|
code = TSDB_CODE_QRY_HAS_RSP;
|
||||||
|
} else {
|
||||||
|
void *h1 = qGetResultRetrieveMsg(*qhandle);
|
||||||
|
assert(h1 == NULL);
|
||||||
|
freehandle = qQueryCompleted(*qhandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: if the qhandle is not put into vread queue or query is completed, free the qhandle.
|
||||||
|
// If the building of result is not required, simply free it. Otherwise, mandatorily free the qhandle
|
||||||
|
if (freehandle || (!buildRes)) {
|
||||||
|
qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, freehandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
qTableQuery(*qhandle); // do execute query
|
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, false);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -374,14 +373,16 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
|
||||||
freeHandle = true;
|
freeHandle = true;
|
||||||
} else { // result is not ready, return immediately
|
} else { // result is not ready, return immediately
|
||||||
assert(buildRes == true);
|
assert(buildRes == true);
|
||||||
#if _NON_BLOCKING_RETRIEVE
|
|
||||||
if (!buildRes) {
|
|
||||||
assert(pRead->rpcHandle != NULL);
|
|
||||||
|
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void **)&handle, false);
|
// Only effects in the non-blocking model
|
||||||
return TSDB_CODE_QRY_NOT_READY;
|
if (!tsHalfCoresForQuery) {
|
||||||
|
if (!buildRes) {
|
||||||
|
assert(pRead->rpcHandle != NULL);
|
||||||
|
|
||||||
|
qReleaseQInfo(pVnode->qMgmt, (void **)&handle, false);
|
||||||
|
return TSDB_CODE_QRY_NOT_READY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// ahandle is the sqlObj pointer
|
// ahandle is the sqlObj pointer
|
||||||
code = vnodeDumpQueryResult(pRet, pVnode, handle, &freeHandle, pRead->rpcHandle);
|
code = vnodeDumpQueryResult(pRet, pVnode, handle, &freeHandle, pRead->rpcHandle);
|
||||||
|
|
|
@ -14,9 +14,9 @@ public final class JdbcTaosdemoConfig {
|
||||||
//Destination database. Default is 'test'
|
//Destination database. Default is 'test'
|
||||||
private String dbName = "test";
|
private String dbName = "test";
|
||||||
//keep
|
//keep
|
||||||
private int keep = 3650;
|
private int keep = 36500;
|
||||||
//days
|
//days
|
||||||
private int days = 10;
|
private int days = 120;
|
||||||
|
|
||||||
//Super table Name. Default is 'meters'
|
//Super table Name. Default is 'meters'
|
||||||
private String stbName = "meters";
|
private String stbName = "meters";
|
||||||
|
|
|
@ -159,7 +159,10 @@ python3 ./test.py -f query/bug1471.py
|
||||||
python3 ./test.py -f query/bug1874.py
|
python3 ./test.py -f query/bug1874.py
|
||||||
python3 ./test.py -f query/bug1875.py
|
python3 ./test.py -f query/bug1875.py
|
||||||
python3 ./test.py -f query/bug1876.py
|
python3 ./test.py -f query/bug1876.py
|
||||||
python3 ./test.py -f query/bug2218.py
|
python3 ./test.py -f query/bug2218.py
|
||||||
|
python3 ./test.py -f query/bug2117.py
|
||||||
|
python3 ./test.py -f query/bug2143.py
|
||||||
|
python3 ./test.py -f query/sliding.py
|
||||||
|
|
||||||
#stream
|
#stream
|
||||||
python3 ./test.py -f stream/metric_1.py
|
python3 ./test.py -f stream/metric_1.py
|
||||||
|
|
|
@ -33,14 +33,29 @@ class TDTestCase:
|
||||||
for i in range(insertRows):
|
for i in range(insertRows):
|
||||||
ret = tdSql.execute(
|
ret = tdSql.execute(
|
||||||
"insert into mt0 values (%d , %d,%d,%d,%d,%d,%d,%d,'%s','%s')" %
|
"insert into mt0 values (%d , %d,%d,%d,%d,%d,%d,%d,'%s','%s')" %
|
||||||
(t0+i,i%100,i/2,i%41,i%100,i%100,i*1.0,i%2,'taos'+str(i%100),'涛思'+str(i%100)))
|
(t0+i,i%100,i/2.0,i%41,i%51,i%53,i*1.0,i%2,'taos'+str(i%43),'涛思'+str(i%41)))
|
||||||
print("==========step2")
|
print("==========step2")
|
||||||
print("test last with group by normal_col ")
|
print("test last with group by normal_col ")
|
||||||
tdSql.query('select last(c1) from mt0 group by c3')
|
tdSql.query('select last(*) from mt0 group by c3')
|
||||||
tdSql.checkData(0,0,84)
|
tdSql.checkData(0,1,84)
|
||||||
tdSql.checkData(0,1,85)
|
tdSql.checkData(0,9,'涛思0')
|
||||||
|
tdSql.checkData(1,1,85)
|
||||||
|
tdSql.checkData(1,9,'涛思1')
|
||||||
|
tdSql.query('select last(*) from mt0 group by c7')
|
||||||
|
tdSql.checkData(0,1,98)
|
||||||
|
tdSql.checkData(0,9,'涛思14')
|
||||||
|
tdSql.checkData(1,1,99)
|
||||||
|
tdSql.checkData(1,9,'涛思15')
|
||||||
|
tdSql.query('select last(*) from mt0 group by c8')
|
||||||
|
tdSql.checkData(0,3,5)
|
||||||
|
tdSql.checkData(0,4,20)
|
||||||
|
tdSql.checkData(3,1,92)
|
||||||
|
tdSql.checkData(3,9,'涛思8')
|
||||||
|
tdSql.query('select last(*) from mt0 group by c9')
|
||||||
|
tdSql.checkData(0,3,0)
|
||||||
|
tdSql.checkData(0,8,'taos38')
|
||||||
|
tdSql.checkData(40,1,83)
|
||||||
|
tdSql.checkData(40,3,40)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.dnodes import *
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
print("==========step1")
|
||||||
|
print("create table && insert data")
|
||||||
|
|
||||||
|
tdSql.execute("create table mt0 (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool,c8 binary(20),c9 nchar(20))")
|
||||||
|
insertRows = 1000
|
||||||
|
t0 = 1604298064000
|
||||||
|
tdLog.info("insert %d rows" % (insertRows))
|
||||||
|
for i in range(insertRows):
|
||||||
|
ret = tdSql.execute(
|
||||||
|
"insert into mt0 values (%d , %d,%d,%d,%d,%d,%d,%d,'%s','%s')" %
|
||||||
|
(t0+i,i%100,i/2.0,i%41,i%51,i%53,i*1.0,i%2,'taos'+str(i%43),'涛思'+str(i%41)))
|
||||||
|
print("==========step2")
|
||||||
|
print("test group by normal_col with limit offset")
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c3 limit 3 offset 2')
|
||||||
|
tdSql.checkData(0,0,99)
|
||||||
|
tdSql.checkData(0,1,2)
|
||||||
|
tdSql.checkData(0,2,2)
|
||||||
|
tdSql.checkData(0,3,86)
|
||||||
|
tdSql.checkData(1,0,95)
|
||||||
|
tdSql.checkData(2,1,1)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c3 limit 3 offset 40')
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c3 limit 3 offset 41')
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c3 limit 3 offset 99')
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c3 limit 70 offset 3')
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c8 limit 3 offset 2')
|
||||||
|
tdSql.checkData(0,0,91)
|
||||||
|
tdSql.checkData(0,1,2)
|
||||||
|
tdSql.checkData(0,2,2)
|
||||||
|
tdSql.checkData(0,3,91)
|
||||||
|
tdSql.checkData(1,0,92)
|
||||||
|
tdSql.checkData(2,1,4)
|
||||||
|
tdSql.query('select max(c1),min(c1),first(c1),last(c1) from mt0 group by c9 limit 2 offset 9')
|
||||||
|
tdSql.checkData(0,0,96)
|
||||||
|
tdSql.checkData(0,1,1)
|
||||||
|
tdSql.checkData(0,2,9)
|
||||||
|
tdSql.checkData(0,3,93)
|
||||||
|
tdSql.checkData(1,0,97)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -16,6 +16,7 @@ import taos
|
||||||
from util.log import tdLog
|
from util.log import tdLog
|
||||||
from util.cases import tdCases
|
from util.cases import tdCases
|
||||||
from util.sql import tdSql
|
from util.sql import tdSql
|
||||||
|
from util.dnodes import tdDnodes
|
||||||
|
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
|
@ -72,6 +73,19 @@ class TDTestCase:
|
||||||
tdSql.checkData(6, 0, "2020-09-16 00:00:00")
|
tdSql.checkData(6, 0, "2020-09-16 00:00:00")
|
||||||
tdSql.checkData(6, 1, 222.0)
|
tdSql.checkData(6, 1, 222.0)
|
||||||
|
|
||||||
|
# test case for https://jira.taosdata.com:18080/browse/TD-2298
|
||||||
|
tdSql.execute("create database test keep 36500")
|
||||||
|
tdSql.execute("use test")
|
||||||
|
tdSql.execute("create table t (ts timestamp, voltage int)")
|
||||||
|
for i in range(10000):
|
||||||
|
tdSql.execute("insert into t values(%d, 0)" % (1000000 + i * 6000))
|
||||||
|
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
tdSql.query("select last(*) from t interval(1s)")
|
||||||
|
tdSql.checkRows(10000)
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success("%s successfully executed" % __file__)
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
|
@ -46,7 +46,8 @@ while $i < $tbNum
|
||||||
endw
|
endw
|
||||||
|
|
||||||
$i = $i + 1
|
$i = $i + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
$ts = $ts + 60000
|
$ts = $ts + 60000
|
||||||
$tb = $tbPrefix . 0
|
$tb = $tbPrefix . 0
|
||||||
sql insert into $tb (ts) values ( $ts )
|
sql insert into $tb (ts) values ( $ts )
|
||||||
|
@ -84,4 +85,43 @@ sleep 500
|
||||||
|
|
||||||
run general/parser/first_last_query.sim
|
run general/parser/first_last_query.sim
|
||||||
|
|
||||||
|
print =================> insert data regression test
|
||||||
|
sql create database test keep 36500
|
||||||
|
sql use test
|
||||||
|
sql create table tm0 (ts timestamp, k int)
|
||||||
|
|
||||||
|
print =========================> td-2298
|
||||||
|
$ts0 = 1537146000000
|
||||||
|
$xs = 6000
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < 5000
|
||||||
|
$ts = $ts0 + $xs
|
||||||
|
$ts1 = $ts + $xs
|
||||||
|
$x1 = $x + 1
|
||||||
|
|
||||||
|
sql insert into tm0 values ( $ts , $x ) ( $ts1 , $x1 )
|
||||||
|
$x = $x1
|
||||||
|
$ts0 = $ts1
|
||||||
|
endw
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
sleep 3000
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
print ================== server restart completed
|
||||||
|
sql connect
|
||||||
|
sleep 500
|
||||||
|
|
||||||
|
sql use test
|
||||||
|
sql select count(*), last(ts) from tm0 interval(1s)
|
||||||
|
if $rows != 10000 then
|
||||||
|
print expect 10000, actual: $rows
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select last(ts) from tm0 interval(1s)
|
||||||
|
if $rows != 10000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -266,4 +266,6 @@ endi
|
||||||
if $data14 != @test2@ then
|
if $data14 != @test2@ then
|
||||||
print expect test2 , actual: $data14
|
print expect test2 , actual: $data14
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql drop table stest
|
|
@ -0,0 +1,228 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sleep 500
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
$dbPrefix = m_func_db
|
||||||
|
$tbPrefix = m_func_tb
|
||||||
|
$mtPrefix = m_func_mt
|
||||||
|
|
||||||
|
$tbNum = 10
|
||||||
|
$rowNum = 5
|
||||||
|
$totalNum = $tbNum * $rowNum
|
||||||
|
$ts0 = 1537146000000
|
||||||
|
$delta = 600000
|
||||||
|
print ========== alter.sim
|
||||||
|
$i = 0
|
||||||
|
$db = $dbPrefix . $i
|
||||||
|
$mt = $mtPrefix . $i
|
||||||
|
|
||||||
|
sql drop database if exists $db
|
||||||
|
sql create database $db
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
print =====================================> test case for twa in single block
|
||||||
|
|
||||||
|
sql create table t1 (ts timestamp, k float);
|
||||||
|
sql insert into t1 values('2015-08-18 00:00:00', 2.064);
|
||||||
|
sql insert into t1 values('2015-08-18 00:06:00', 2.116);
|
||||||
|
sql insert into t1 values('2015-08-18 00:12:00', 2.028);
|
||||||
|
sql insert into t1 values('2015-08-18 00:18:00', 2.126);
|
||||||
|
sql insert into t1 values('2015-08-18 00:24:00', 2.041);
|
||||||
|
sql insert into t1 values('2015-08-18 00:30:00', 2.051);
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:05:00'
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 2.063999891 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.063999891 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:07:00'
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 2.089999914 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.089999914 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:07:00' interval(1m) order by ts asc
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @15-08-18 00:00:00.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.068333156 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 2.063999891 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != @15-08-18 00:06:00.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 2.115999937 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data12 != 2.115999937 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data13 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:07:00' interval(1m) order by ts desc;
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @15-08-18 00:06:00.00@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.115999937 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 2.115999937 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 2.068333156 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:27:00' interval(10m) order by ts asc
|
||||||
|
if $rows != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.088666666 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 2.089999914 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 2.077099980 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data12 != 2.077000022 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data13 != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data21 != 2.069333235 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data22 != 2.040999889 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data23 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:27:00' interval(10m) order by ts desc
|
||||||
|
if $rows != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.069333235 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 2.077099980 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data21 != 2.088666666 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:30:00' order by ts asc
|
||||||
|
if $data00 != 2.073699975 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.070999980 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 6 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:30:00' order by ts desc
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 2.073699975 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2.070999980 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 6 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:30:00' interval(10m) order by ts asc
|
||||||
|
sql select twa(k),avg(k),count(1) from t1 where ts>='2015-8-18 00:00:00' and ts<='2015-8-18 00:30:00' interval(10m) order by ts desc
|
||||||
|
|
||||||
|
|
||||||
|
#todo add test case while column filte exists.
|
||||||
|
|
||||||
|
select count(*),TWA(k) from tm0 where ts>='1970-1-1 13:43:00' and ts<='1970-1-1 13:44:10' interval(9s)
|
|
@ -606,6 +606,44 @@ sql insert into t1 values ('2020-03-27 04:21:16.000', 1)('2020-03-27 04:31:17.00
|
||||||
sql insert into t2 values ('2020-03-27 04:11:16.000', 1)('2020-03-27 04:11:17.000', 2) ('2020-03-27 04:11:18.000', 3) ('2020-03-27 04:11:19.000', 4) ;
|
sql insert into t2 values ('2020-03-27 04:11:16.000', 1)('2020-03-27 04:11:17.000', 2) ('2020-03-27 04:11:18.000', 3) ('2020-03-27 04:11:19.000', 4) ;
|
||||||
sql insert into t2 values ('2020-03-27 04:21:16.000', 1)('2020-03-27 04:31:17.000', 2) ('2020-03-27 04:51:18.000', 3) ('2020-03-27 05:10:19.000', 4) ;
|
sql insert into t2 values ('2020-03-27 04:21:16.000', 1)('2020-03-27 04:31:17.000', 2) ('2020-03-27 04:51:18.000', 3) ('2020-03-27 05:10:19.000', 4) ;
|
||||||
|
|
||||||
|
print =================>TD-2236
|
||||||
|
sql select first(ts),last(ts) from t1 group by c;
|
||||||
|
if $rows != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @20-03-27 04:11:16.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != @20-03-27 04:21:16.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != @20-03-27 04:11:17.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != @20-03-27 04:31:17.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data20 != @20-03-27 04:11:18.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data21 != @20-03-27 04:51:18.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data30 != @20-03-27 04:11:19.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data31 != @20-03-27 05:10:19.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
#sql select irate(c) from st where t1="1" and ts >= '2020-03-27 04:11:17.732' and ts < '2020-03-27 05:11:17.732' interval(1m) sliding(15s) group by tbname,t1,t2;
|
#sql select irate(c) from st where t1="1" and ts >= '2020-03-27 04:11:17.732' and ts < '2020-03-27 05:11:17.732' interval(1m) sliding(15s) group by tbname,t1,t2;
|
||||||
#if $rows != 40 then
|
#if $rows != 40 then
|
||||||
# return -1
|
# return -1
|
||||||
|
|
|
@ -48,8 +48,12 @@ while $i < $halfNum
|
||||||
$binary = $binary . '
|
$binary = $binary . '
|
||||||
$nchar = 'nchar . $c
|
$nchar = 'nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar )
|
|
||||||
sql insert into $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
$ts = $ts + $i
|
||||||
|
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar )
|
||||||
|
|
||||||
|
$ts = $ts + $halfNum
|
||||||
|
sql insert into $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
|
|
|
@ -94,66 +94,66 @@ sql select * from $stb limit 2 offset $offset
|
||||||
if $rows != 2 then
|
if $rows != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-11-25 19:30:00.000@ then
|
#if $data00 != @18-11-25 19:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 9 then
|
#if $data01 != 9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data02 != 9 then
|
#if $data02 != 9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data03 != 9.00000 then
|
#if $data03 != 9.00000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data04 != 9.000000000 then
|
#if $data04 != 9.000000000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data05 != 9 then
|
#if $data05 != 9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data06 != 9 then
|
#if $data06 != 9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data07 != 1 then
|
#if $data07 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data08 != binary9 then
|
#if $data08 != binary9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data09 != nchar9 then
|
#if $data09 != nchar9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data10 != @18-09-17 09:00:00.000@ then
|
#if $data10 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data11 != 0 then
|
#if $data11 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data12 != NULL then
|
#if $data12 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data13 != 0.00000 then
|
#if $data13 != 0.00000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data14 != NULL then
|
#if $data14 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data15 != 0 then
|
#if $data15 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data16 != 0 then
|
#if $data16 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data17 != 1 then
|
#if $data17 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data18 != binary0 then
|
#if $data18 != binary0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data19 != nchar0 then
|
#if $data19 != nchar0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
|
|
||||||
### offset >= rowsInFileBlock
|
### offset >= rowsInFileBlock
|
||||||
##TBASE-352
|
##TBASE-352
|
||||||
|
@ -163,6 +163,7 @@ sql select * from $stb limit $limit offset $offset
|
||||||
if $rows != 0 then
|
if $rows != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
$offset = $offset - 1
|
$offset = $offset - 1
|
||||||
sql select * from $stb limit $limit offset $offset
|
sql select * from $stb limit $limit offset $offset
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
|
@ -255,102 +256,102 @@ sql select * from $stb where ts >= $ts0 and ts <= $tsu limit 5 offset $offset
|
||||||
if $rows != 5 then
|
if $rows != 5 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:00:00.000@ then
|
#if $data00 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 0 then
|
#if $data01 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data12 != NULL then
|
#if $data12 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data23 != 2.00000 then
|
#if $data23 != 2.00000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data34 != NULL then
|
#if $data34 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data45 != 4 then
|
#if $data45 != 4 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data06 != 0 then
|
#if $data06 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data17 != 1 then
|
#if $data17 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data28 != binary2 then
|
#if $data28 != binary2 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data39 != nchar3 then
|
#if $data39 != nchar3 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
|
|
||||||
$limit = $totalNum / 2
|
$limit = $totalNum / 2
|
||||||
sql select * from $stb where ts >= $ts0 and ts <= $tsu limit $limit offset 1
|
sql select * from $stb where ts >= $ts0 and ts <= $tsu limit $limit offset 1
|
||||||
if $rows != $limit then
|
if $rows != $limit then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:10:00.000@ then
|
#if $data00 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 1 then
|
#if $data01 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data12 != 2 then
|
#if $data12 != 2 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data23 != 3.00000 then
|
#if $data23 != 3.00000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data34 != 4.000000000 then
|
#if $data34 != 4.000000000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data45 != 5 then
|
#if $data45 != 5 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data06 != 1 then
|
#if $data06 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data17 != 1 then
|
#if $data17 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data28 != binary3 then
|
#if $data28 != binary3 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data39 != nchar4 then
|
#if $data39 != nchar4 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
|
|
||||||
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu limit 1 offset 0
|
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu limit 1 offset 0
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != 9 then
|
#if $data00 != 9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 0 then
|
#if $data01 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data02 != 4.500000000 then
|
#if $data02 != 4.500000000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
$val = 45 * $rowNum
|
#$val = 45 * $rowNum
|
||||||
if $data03 != $val then
|
#if $data03 != $val then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data04 != 9.000000000 then
|
#if $data04 != 9.000000000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data05 != 1 then
|
#if $data05 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data06 != binary9 then
|
#if $data06 != binary9 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data07 != nchar0 then
|
#if $data07 != nchar0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
|
|
||||||
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and c1 > 1 and c2 < 9 and c3 > 2 and c4 < 8 and c5 > 3 and c6 < 7 and c7 != 0 and c8 like '%5' and t1 > 3 and t1 < 6 limit 1 offset 0;
|
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and c1 > 1 and c2 < 9 and c3 > 2 and c4 < 8 and c5 > 3 and c6 < 7 and c7 != 0 and c8 like '%5' and t1 > 3 and t1 < 6 limit 1 offset 0;
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
|
|
|
@ -20,6 +20,7 @@ sql use $db
|
||||||
$tsu = $rowNum * $delta
|
$tsu = $rowNum * $delta
|
||||||
$tsu = $tsu - $delta
|
$tsu = $tsu - $delta
|
||||||
$tsu = $tsu + $ts0
|
$tsu = $tsu + $ts0
|
||||||
|
$tsu = $tsu + 9
|
||||||
|
|
||||||
##### select from supertable
|
##### select from supertable
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ if $data00 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data40 != @18-09-17 09:00:00.000@ then
|
if $data40 != @18-09-17 09:00:00.004@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -84,11 +85,11 @@ if $data01 != 0 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print data12 = $data12
|
print data12 = $data12
|
||||||
if $data12 != NULL then
|
if $data12 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data24 != NULL then
|
if $data24 != 0.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -110,11 +111,11 @@ if $data41 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data40 != @18-09-17 09:00:00.000@ then
|
if $data40 != @18-09-17 09:00:00.005@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data00 != @18-09-17 09:00:00.000@ then
|
if $data00 != @18-09-17 09:00:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -123,20 +124,13 @@ if $rows != 99 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data01 != 1 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
if $data41 != 5 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
$offset = $tbNum * $rowNum
|
$offset = $tbNum * $rowNum
|
||||||
$offset = $offset - 1
|
$offset = $offset - 1
|
||||||
sql select * from $stb limit 2 offset $offset
|
sql select * from $stb limit 2 offset $offset
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:30:00.000@ then
|
if $data00 != @18-09-17 10:30:00.009@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 9 then
|
if $data01 != 9 then
|
||||||
|
@ -174,7 +168,7 @@ sql select * from $stb limit 2 offset $offset
|
||||||
if $rows != 2 then
|
if $rows != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:30:00.000@ then
|
if $data00 != @18-09-17 10:30:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 9 then
|
if $data01 != 9 then
|
||||||
|
@ -204,36 +198,36 @@ endi
|
||||||
if $data09 != nchar9 then
|
if $data09 != nchar9 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 09:00:00.000@ then
|
#if $data10 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data11 != 0 then
|
#if $data11 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data12 != NULL then
|
#if $data12 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data13 != 0.00000 then
|
#if $data13 != 0.00000 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data14 != NULL then
|
#if $data14 != NULL then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data15 != 0 then
|
#if $data15 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data16 != 0 then
|
#if $data16 != 0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data17 != 1 then
|
#if $data17 != 1 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data18 != binary0 then
|
#if $data18 != binary0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data19 != nchar0 then
|
#if $data19 != nchar0 then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
|
|
||||||
$offset = $rowNum * $tbNum
|
$offset = $rowNum * $tbNum
|
||||||
sql select * from lm_stb0 limit 2 offset $offset
|
sql select * from lm_stb0 limit 2 offset $offset
|
||||||
|
@ -248,6 +242,7 @@ endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select ts, c1, c2, c3, c4, c5, c6, c7, c8, c9 from $stb limit 1 offset 1;
|
sql select ts, c1, c2, c3, c4, c5, c6, c7, c8, c9 from $stb limit 1 offset 1;
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
|
@ -288,52 +283,52 @@ if $data09 != nchar4 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
### select from supertable + where + limit offset
|
### select from supertable + where + limit offset
|
||||||
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:30:00.000' limit 5 offset 1
|
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:30:00.000' order by ts asc limit 5 offset 1
|
||||||
if $rows != 5 then
|
if $rows != 5 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 5 then
|
if $data01 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 6 then
|
if $data11 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 7 then
|
if $data21 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != 8 then
|
if $data31 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 4 then
|
if $data41 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:30:00.000' limit 5 offset 50
|
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:10:00.000' order by ts asc limit 5 offset 50
|
||||||
if $rows != 0 then
|
if $rows != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:30:00.000' limit 5 offset 1
|
sql select * from $stb where ts > '2018-09-17 09:30:00.000' and ts < '2018-09-17 10:30:00.000' order by ts asc limit 5 offset 1
|
||||||
if $rows != 5 then
|
if $rows != 5 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 5 then
|
if $data01 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 6 then
|
if $data11 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 7 then
|
if $data21 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != 8 then
|
if $data31 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 4 then
|
if $data41 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from lm_stb0 where ts >= '2018-09-17 09:00:00.000' and ts <= '2018-09-17 10:30:00.000' limit 1 offset 0;
|
sql select max(c1), min(c2), avg(c3), sum(c5), spread(c6), first(c7), last(c8), first(c9) from lm_stb0 where ts >= '2018-09-17 09:00:00.000' and ts <= '2018-09-17 10:30:00.009' order by ts asc limit 1 offset 0;
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -842,9 +837,6 @@ sql select top(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu order by ts desc
|
||||||
if $rows != 3 then
|
if $rows != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:30:00.000@ then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
if $data01 != 9 then
|
if $data01 != 9 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -853,9 +845,6 @@ sql select top(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu order by ts asc
|
||||||
if $rows != 3 then
|
if $rows != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:30:00.000@ then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
if $data01 != 9 then
|
if $data01 != 9 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -864,7 +853,7 @@ sql select top(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 orde
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:00:00.000@ then
|
if $data00 != @18-09-17 10:00:00.008@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 6 then
|
if $data01 != 6 then
|
||||||
|
@ -873,7 +862,7 @@ endi
|
||||||
if $data02 != 8 then
|
if $data02 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 10:10:00.000@ then
|
if $data10 != @18-09-17 10:10:00.008@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 7 then
|
if $data11 != 7 then
|
||||||
|
@ -882,7 +871,7 @@ endi
|
||||||
if $data12 != 8 then
|
if $data12 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 10:20:00.000@ then
|
if $data20 != @18-09-17 10:20:00.008@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 8 then
|
if $data21 != 8 then
|
||||||
|
@ -891,7 +880,7 @@ endi
|
||||||
if $data22 != 8 then
|
if $data22 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 10:00:00.000@ then
|
if $data30 != @18-09-17 10:00:00.007@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != 6 then
|
if $data31 != 6 then
|
||||||
|
@ -900,7 +889,7 @@ endi
|
||||||
if $data32 != 7 then
|
if $data32 != 7 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 10:10:00.000@ then
|
if $data40 != @18-09-17 10:10:00.007@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 7 then
|
if $data41 != 7 then
|
||||||
|
@ -909,7 +898,7 @@ endi
|
||||||
if $data42 != 7 then
|
if $data42 != 7 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 10:20:00.000@ then
|
if $data50 != @18-09-17 10:20:00.007@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != 8 then
|
if $data51 != 8 then
|
||||||
|
@ -923,7 +912,7 @@ sql select top(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 orde
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:00:00.000@ then
|
if $data00 != @18-09-17 10:00:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 6 then
|
if $data01 != 6 then
|
||||||
|
@ -932,7 +921,7 @@ endi
|
||||||
if $data02 != 1 then
|
if $data02 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 10:10:00.000@ then
|
if $data10 != @18-09-17 10:10:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 7 then
|
if $data11 != 7 then
|
||||||
|
@ -941,7 +930,7 @@ endi
|
||||||
if $data12 != 1 then
|
if $data12 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 10:20:00.000@ then
|
if $data20 != @18-09-17 10:20:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 8 then
|
if $data21 != 8 then
|
||||||
|
@ -950,7 +939,7 @@ endi
|
||||||
if $data22 != 1 then
|
if $data22 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 10:00:00.000@ then
|
if $data30 != @18-09-17 10:00:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != 6 then
|
if $data31 != 6 then
|
||||||
|
@ -959,7 +948,7 @@ endi
|
||||||
if $data32 != 2 then
|
if $data32 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 10:10:00.000@ then
|
if $data40 != @18-09-17 10:10:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 7 then
|
if $data41 != 7 then
|
||||||
|
@ -968,7 +957,7 @@ endi
|
||||||
if $data42 != 2 then
|
if $data42 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 10:20:00.000@ then
|
if $data50 != @18-09-17 10:20:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != 8 then
|
if $data51 != 8 then
|
||||||
|
@ -982,7 +971,7 @@ sql select top(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 orde
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 10:20:00.000@ then
|
if $data00 != @18-09-17 10:20:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data01 != 8 then
|
if $data01 != 8 then
|
||||||
|
@ -991,7 +980,7 @@ endi
|
||||||
if $data02 != 1 then
|
if $data02 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 10:10:00.000@ then
|
if $data10 != @18-09-17 10:10:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != 7 then
|
if $data11 != 7 then
|
||||||
|
@ -1000,7 +989,7 @@ endi
|
||||||
if $data12 != 1 then
|
if $data12 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 10:00:00.000@ then
|
if $data20 != @18-09-17 10:00:00.001@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 6 then
|
if $data21 != 6 then
|
||||||
|
@ -1009,7 +998,7 @@ endi
|
||||||
if $data22 != 1 then
|
if $data22 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 10:20:00.000@ then
|
if $data30 != @18-09-17 10:20:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != 8 then
|
if $data31 != 8 then
|
||||||
|
@ -1018,7 +1007,7 @@ endi
|
||||||
if $data32 != 2 then
|
if $data32 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 10:10:00.000@ then
|
if $data40 != @18-09-17 10:10:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 7 then
|
if $data41 != 7 then
|
||||||
|
@ -1027,7 +1016,7 @@ endi
|
||||||
if $data42 != 2 then
|
if $data42 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 10:00:00.000@ then
|
if $data50 != @18-09-17 10:00:00.002@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != 6 then
|
if $data51 != 6 then
|
||||||
|
@ -1052,9 +1041,9 @@ sql select bottom(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu order by ts d
|
||||||
if $rows != 3 then
|
if $rows != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:00:00.000@ then
|
#if $data00 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -1063,9 +1052,9 @@ sql select bottom(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu order by ts a
|
||||||
if $rows != 3 then
|
if $rows != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:00:00.000@ then
|
#if $data00 != @18-09-17 09:00:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -1074,54 +1063,54 @@ sql select bottom(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 o
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:30:00.000@ then
|
#if $data00 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 3 then
|
if $data01 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 8 then
|
if $data02 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 09:20:00.000@ then
|
#if $data10 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data11 != 2 then
|
if $data11 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data12 != 8 then
|
if $data12 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 09:10:00.000@ then
|
#if $data20 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data22 != 8 then
|
if $data22 != 8 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 09:30:00.000@ then
|
#if $data30 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data31 != 3 then
|
if $data31 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data32 != 7 then
|
if $data32 != 7 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 09:20:00.000@ then
|
#if $data40 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data42 != 7 then
|
if $data42 != 7 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 09:10:00.000@ then
|
#if $data50 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data51 != 1 then
|
if $data51 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -1133,54 +1122,54 @@ sql select bottom(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 o
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:30:00.000@ then
|
#if $data00 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 3 then
|
if $data01 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 1 then
|
if $data02 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 09:20:00.000@ then
|
#if $data10 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data11 != 2 then
|
if $data11 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data12 != 1 then
|
if $data12 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 09:10:00.000@ then
|
#if $data20 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data22 != 1 then
|
if $data22 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 09:30:00.000@ then
|
#if $data30 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data31 != 3 then
|
if $data31 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data32 != 2 then
|
if $data32 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 09:20:00.000@ then
|
#if $data40 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data42 != 2 then
|
if $data42 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 09:10:00.000@ then
|
#if $data50 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data51 != 1 then
|
if $data51 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -1192,54 +1181,54 @@ sql select bottom(c1, 5) from $stb where ts >= $ts0 and ts <= $tsu group by t1 o
|
||||||
if $rows != 6 then
|
if $rows != 6 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data00 != @18-09-17 09:30:00.000@ then
|
#if $data00 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data01 != 3 then
|
if $data01 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 1 then
|
if $data02 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data10 != @18-09-17 09:20:00.000@ then
|
#if $data10 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data11 != 2 then
|
if $data11 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data12 != 1 then
|
if $data12 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data20 != @18-09-17 09:10:00.000@ then
|
#if $data20 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data22 != 1 then
|
if $data22 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data30 != @18-09-17 09:30:00.000@ then
|
#if $data30 != @18-09-17 09:30:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data31 != 3 then
|
if $data31 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data32 != 2 then
|
if $data32 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data40 != @18-09-17 09:20:00.000@ then
|
#if $data40 != @18-09-17 09:20:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data42 != 2 then
|
if $data42 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data50 != @18-09-17 09:10:00.000@ then
|
#if $data50 != @18-09-17 09:10:00.000@ then
|
||||||
return -1
|
# return -1
|
||||||
endi
|
#endi
|
||||||
if $data51 != 1 then
|
if $data51 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
Loading…
Reference in New Issue