Merge remote-tracking branch 'origin/3.0' into fix/tsim
This commit is contained in:
commit
141be56075
|
@ -35,7 +35,7 @@ endif(${BUILD_TEST})
|
||||||
add_subdirectory(source)
|
add_subdirectory(source)
|
||||||
add_subdirectory(tools)
|
add_subdirectory(tools)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
add_subdirectory(example)
|
add_subdirectory(examples/c)
|
||||||
|
|
||||||
# docs
|
# docs
|
||||||
add_subdirectory(docs)
|
add_subdirectory(docs)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -93,10 +93,13 @@ title: TDengine 参数限制与保留关键字
|
||||||
`TBNAME` 可以视为超级表中一个特殊的标签,代表子表的表名。
|
`TBNAME` 可以视为超级表中一个特殊的标签,代表子表的表名。
|
||||||
|
|
||||||
获取一个超级表所有的子表名及相关的标签信息:
|
获取一个超级表所有的子表名及相关的标签信息:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
SELECT TBNAME, location FROM meters;
|
SELECT TBNAME, location FROM meters;
|
||||||
|
```
|
||||||
|
|
||||||
统计超级表下辖子表数量:
|
统计超级表下辖子表数量:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
SELECT COUNT(TBNAME) FROM meters;
|
SELECT COUNT(TBNAME) FROM meters;
|
||||||
```
|
```
|
||||||
|
|
|
@ -35,8 +35,8 @@ TDengine 支持 `UNION ALL` 和 `UNION` 操作符。UNION ALL 将查询返回的
|
||||||
| --- | :---------------: | -------------------------------------------------------------------- | -------------------- |
|
| --- | :---------------: | -------------------------------------------------------------------- | -------------------- |
|
||||||
| 1 | = | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 相等 |
|
| 1 | = | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 相等 |
|
||||||
| 2 | <\>, != | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 不相等 |
|
| 2 | <\>, != | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 不相等 |
|
||||||
| 3 | \>, \< | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于,小于 |
|
| 3 | \>, < | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于,小于 |
|
||||||
| 4 | \>=, \<= | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于等于,小于等于 |
|
| 4 | \>=, <= | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于等于,小于等于 |
|
||||||
| 5 | IS [NOT] NULL | 所有类型 | 是否为空值 |
|
| 5 | IS [NOT] NULL | 所有类型 | 是否为空值 |
|
||||||
| 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 闭区间比较 |
|
| 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 闭区间比较 |
|
||||||
| 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 |
|
| 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 |
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -56,6 +56,7 @@ There are about 200 keywords reserved by TDengine, they can't be used as the nam
|
||||||
Get the table name and tag values of all subtables in a STable.
|
Get the table name and tag values of all subtables in a STable.
|
||||||
```mysql
|
```mysql
|
||||||
SELECT TBNAME, location FROM meters;
|
SELECT TBNAME, location FROM meters;
|
||||||
|
```
|
||||||
|
|
||||||
Count the number of subtables in a STable.
|
Count the number of subtables in a STable.
|
||||||
```mysql
|
```mysql
|
||||||
|
|
|
@ -35,8 +35,8 @@ TDengine provides 2 set operators: `UNION ALL` and `UNION`. `UNION ALL` combines
|
||||||
| --- | :---------------: | ------------------------------------------------------------------- | ----------------------------------------------- |
|
| --- | :---------------: | ------------------------------------------------------------------- | ----------------------------------------------- |
|
||||||
| 1 | = | Except for BLOB, MEDIUMBLOB and JSON | Equal |
|
| 1 | = | Except for BLOB, MEDIUMBLOB and JSON | Equal |
|
||||||
| 2 | <\>, != | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | Not equal |
|
| 2 | <\>, != | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | Not equal |
|
||||||
| 3 | \>, \< | Except for BLOB, MEDIUMBLOB and JSON | Greater than, less than |
|
| 3 | \>, < | Except for BLOB, MEDIUMBLOB and JSON | Greater than, less than |
|
||||||
| 4 | \>=, \<= | Except for BLOB, MEDIUMBLOB and JSON | Greater than or equal to, less than or equal to |
|
| 4 | \>=, <= | Except for BLOB, MEDIUMBLOB and JSON | Greater than or equal to, less than or equal to |
|
||||||
| 5 | IS [NOT] NULL | Any types | Is NULL or NOT |
|
| 5 | IS [NOT] NULL | Any types | Is NULL or NOT |
|
||||||
| 6 | [NOT] BETWEEN AND | Except for BLOB, MEDIUMBLOB and JSON | In a value range or not |
|
| 6 | [NOT] BETWEEN AND | Except for BLOB, MEDIUMBLOB and JSON | In a value range or not |
|
||||||
| 7 | IN | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | In a list of values or not |
|
| 7 | IN | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | In a list of values or not |
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
add_executable(tmq "")
|
|
||||||
add_executable(tstream "")
|
|
||||||
add_executable(demoapi "")
|
|
||||||
|
|
||||||
target_sources(tmq
|
|
||||||
PRIVATE
|
|
||||||
"src/tmq.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_sources(tstream
|
|
||||||
PRIVATE
|
|
||||||
"src/tstream.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_sources(demoapi
|
|
||||||
PRIVATE
|
|
||||||
"src/demoapi.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(tmq
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(tstream
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(demoapi
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(tmq
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(tstream
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(demoapi
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
|
||||||
SET_TARGET_PROPERTIES(tstream PROPERTIES OUTPUT_NAME tstream)
|
|
||||||
SET_TARGET_PROPERTIES(demoapi PROPERTIES OUTPUT_NAME demoapi)
|
|
|
@ -3,20 +3,70 @@ PROJECT(TDengine)
|
||||||
IF (TD_LINUX)
|
IF (TD_LINUX)
|
||||||
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
||||||
AUX_SOURCE_DIRECTORY(. SRC)
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
ADD_EXECUTABLE(demo apitest.c)
|
# ADD_EXECUTABLE(demo apitest.c)
|
||||||
TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(sml schemaless.c)
|
#ADD_EXECUTABLE(sml schemaless.c)
|
||||||
TARGET_LINK_LIBRARIES(sml taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(sml taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(subscribe subscribe.c)
|
#ADD_EXECUTABLE(subscribe subscribe.c)
|
||||||
TARGET_LINK_LIBRARIES(subscribe taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(subscribe taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(epoll epoll.c)
|
#ADD_EXECUTABLE(epoll epoll.c)
|
||||||
TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
||||||
|
|
||||||
|
add_executable(tmq "")
|
||||||
|
add_executable(tstream "")
|
||||||
|
add_executable(demoapi "")
|
||||||
|
|
||||||
|
target_sources(tmq
|
||||||
|
PRIVATE
|
||||||
|
"tmq.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(tstream
|
||||||
|
PRIVATE
|
||||||
|
"tstream.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(demoapi
|
||||||
|
PRIVATE
|
||||||
|
"demoapi.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tmq
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tstream
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(demoapi
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tmq
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tstream
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(demoapi
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
||||||
|
SET_TARGET_PROPERTIES(tstream PROPERTIES OUTPUT_NAME tstream)
|
||||||
|
SET_TARGET_PROPERTIES(demoapi PROPERTIES OUTPUT_NAME demoapi)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
IF (TD_DARWIN)
|
IF (TD_DARWIN)
|
||||||
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
||||||
AUX_SOURCE_DIRECTORY(. SRC)
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
ADD_EXECUTABLE(demo demo.c)
|
#ADD_EXECUTABLE(demo demo.c)
|
||||||
TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread lua)
|
||||||
ADD_EXECUTABLE(epoll epoll.c)
|
#ADD_EXECUTABLE(epoll epoll.c)
|
||||||
TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
|
@ -165,7 +165,6 @@ tmq_t* build_consumer() {
|
||||||
tmq_conf_set(conf, "group.id", "tg2");
|
tmq_conf_set(conf, "group.id", "tg2");
|
||||||
tmq_conf_set(conf, "td.connect.user", "root");
|
tmq_conf_set(conf, "td.connect.user", "root");
|
||||||
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
||||||
/*tmq_conf_set(conf, "td.connect.db", "abc1");*/
|
|
||||||
tmq_conf_set(conf, "msg.with.table.name", "true");
|
tmq_conf_set(conf, "msg.with.table.name", "true");
|
||||||
tmq_conf_set(conf, "enable.auto.commit", "false");
|
tmq_conf_set(conf, "enable.auto.commit", "false");
|
||||||
tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
|
tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
|
||||||
|
@ -191,20 +190,18 @@ void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t cnt = 0;
|
int32_t cnt = 0;
|
||||||
/*clock_t startTime = clock();*/
|
|
||||||
while (running) {
|
while (running) {
|
||||||
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 0);
|
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 0);
|
||||||
if (tmqmessage) {
|
if (tmqmessage) {
|
||||||
cnt++;
|
cnt++;
|
||||||
|
msg_process(tmqmessage);
|
||||||
|
if (cnt >= 2) break;
|
||||||
/*printf("get data\n");*/
|
/*printf("get data\n");*/
|
||||||
/*msg_process(tmqmessage);*/
|
|
||||||
taos_free_result(tmqmessage);
|
taos_free_result(tmqmessage);
|
||||||
/*} else {*/
|
/*} else {*/
|
||||||
/*break;*/
|
/*break;*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*clock_t endTime = clock();*/
|
|
||||||
/*printf("log cnt: %d %f s\n", cnt, (double)(endTime - startTime) / CLOCKS_PER_SEC);*/
|
|
||||||
|
|
||||||
err = tmq_consumer_close(tmq);
|
err = tmq_consumer_close(tmq);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -253,39 +250,6 @@ void sync_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
fprintf(stderr, "%% Consumer closed\n");
|
fprintf(stderr, "%% Consumer closed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void perf_loop(tmq_t* tmq, tmq_list_t* topics) {
|
|
||||||
tmq_resp_err_t err;
|
|
||||||
|
|
||||||
if ((err = tmq_subscribe(tmq, topics))) {
|
|
||||||
fprintf(stderr, "%% Failed to start consuming topics: %s\n", tmq_err2str(err));
|
|
||||||
printf("subscribe err\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int32_t batchCnt = 0;
|
|
||||||
int32_t skipLogNum = 0;
|
|
||||||
clock_t startTime = clock();
|
|
||||||
while (running) {
|
|
||||||
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 500);
|
|
||||||
if (tmqmessage) {
|
|
||||||
batchCnt++;
|
|
||||||
/*skipLogNum += tmqGetSkipLogNum(tmqmessage);*/
|
|
||||||
/*msg_process(tmqmessage);*/
|
|
||||||
taos_free_result(tmqmessage);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clock_t endTime = clock();
|
|
||||||
printf("log batch cnt: %d, skip log cnt: %d, time used:%f s\n", batchCnt, skipLogNum,
|
|
||||||
(double)(endTime - startTime) / CLOCKS_PER_SEC);
|
|
||||||
|
|
||||||
err = tmq_consumer_close(tmq);
|
|
||||||
if (err)
|
|
||||||
fprintf(stderr, "%% Failed to close consumer: %s\n", tmq_err2str(err));
|
|
||||||
else
|
|
||||||
fprintf(stderr, "%% Consumer closed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
printf("env init\n");
|
printf("env init\n");
|
||||||
|
@ -296,7 +260,6 @@ int main(int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
tmq_t* tmq = build_consumer();
|
tmq_t* tmq = build_consumer();
|
||||||
tmq_list_t* topic_list = build_topic_list();
|
tmq_list_t* topic_list = build_topic_list();
|
||||||
/*perf_loop(tmq, topic_list);*/
|
basic_consume_loop(tmq, topic_list);
|
||||||
/*basic_consume_loop(tmq, topic_list);*/
|
/*sync_consume_loop(tmq, topic_list);*/
|
||||||
sync_consume_loop(tmq, topic_list);
|
|
||||||
}
|
}
|
|
@ -85,6 +85,14 @@ typedef struct taosField {
|
||||||
int32_t bytes;
|
int32_t bytes;
|
||||||
} TAOS_FIELD;
|
} TAOS_FIELD;
|
||||||
|
|
||||||
|
typedef struct TAOS_FIELD_E {
|
||||||
|
char name[65];
|
||||||
|
int8_t type;
|
||||||
|
uint8_t precision;
|
||||||
|
uint8_t scale;
|
||||||
|
int32_t bytes;
|
||||||
|
} TAOS_FIELD_E;
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
#define DLL_EXPORT __declspec(dllexport)
|
#define DLL_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
|
@ -134,7 +142,10 @@ DLL_EXPORT TAOS_STMT *taos_stmt_init(TAOS *taos);
|
||||||
DLL_EXPORT int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length);
|
DLL_EXPORT int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length);
|
||||||
DLL_EXPORT int taos_stmt_set_tbname_tags(TAOS_STMT *stmt, const char *name, TAOS_MULTI_BIND *tags);
|
DLL_EXPORT int taos_stmt_set_tbname_tags(TAOS_STMT *stmt, const char *name, TAOS_MULTI_BIND *tags);
|
||||||
DLL_EXPORT int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name);
|
DLL_EXPORT int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name);
|
||||||
|
DLL_EXPORT int taos_stmt_set_tags(TAOS_STMT *stmt, TAOS_MULTI_BIND *tags);
|
||||||
DLL_EXPORT int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name);
|
DLL_EXPORT int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name);
|
||||||
|
DLL_EXPORT int taos_stmt_get_tag_fields(TAOS_STMT *stmt, int* fieldNum, TAOS_FIELD_E** fields);
|
||||||
|
DLL_EXPORT int taos_stmt_get_col_fields(TAOS_STMT *stmt, int* fieldNum, TAOS_FIELD_E** fields);
|
||||||
|
|
||||||
DLL_EXPORT int taos_stmt_is_insert(TAOS_STMT *stmt, int *insert);
|
DLL_EXPORT int taos_stmt_is_insert(TAOS_STMT *stmt, int *insert);
|
||||||
DLL_EXPORT int taos_stmt_num_params(TAOS_STMT *stmt, int *nums);
|
DLL_EXPORT int taos_stmt_num_params(TAOS_STMT *stmt, int *nums);
|
||||||
|
@ -230,7 +241,7 @@ DLL_EXPORT const char *tmq_err2str(tmq_resp_err_t);
|
||||||
DLL_EXPORT tmq_resp_err_t tmq_subscribe(tmq_t *tmq, const tmq_list_t *topic_list);
|
DLL_EXPORT tmq_resp_err_t tmq_subscribe(tmq_t *tmq, const tmq_list_t *topic_list);
|
||||||
DLL_EXPORT tmq_resp_err_t tmq_unsubscribe(tmq_t *tmq);
|
DLL_EXPORT tmq_resp_err_t tmq_unsubscribe(tmq_t *tmq);
|
||||||
DLL_EXPORT tmq_resp_err_t tmq_subscription(tmq_t *tmq, tmq_list_t **topics);
|
DLL_EXPORT tmq_resp_err_t tmq_subscription(tmq_t *tmq, tmq_list_t **topics);
|
||||||
DLL_EXPORT TAOS_RES *tmq_consumer_poll(tmq_t *tmq, int64_t wait_time);
|
DLL_EXPORT TAOS_RES *tmq_consumer_poll(tmq_t *tmq, int64_t timeout);
|
||||||
DLL_EXPORT tmq_resp_err_t tmq_consumer_close(tmq_t *tmq);
|
DLL_EXPORT tmq_resp_err_t tmq_consumer_close(tmq_t *tmq);
|
||||||
DLL_EXPORT tmq_resp_err_t tmq_commit_sync(tmq_t *tmq, const tmq_topic_vgroup_list_t *offsets);
|
DLL_EXPORT tmq_resp_err_t tmq_commit_sync(tmq_t *tmq, const tmq_topic_vgroup_list_t *offsets);
|
||||||
DLL_EXPORT void tmq_commit_async(tmq_t *tmq, const tmq_topic_vgroup_list_t *offsets, tmq_commit_cb *cb, void *param);
|
DLL_EXPORT void tmq_commit_async(tmq_t *tmq, const tmq_topic_vgroup_list_t *offsets, tmq_commit_cb *cb, void *param);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "talgo.h"
|
#include "talgo.h"
|
||||||
|
#include "tarray.h"
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
#include "ttypes.h"
|
#include "ttypes.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
@ -29,6 +30,7 @@ extern "C" {
|
||||||
typedef struct SSchema SSchema;
|
typedef struct SSchema SSchema;
|
||||||
typedef struct STColumn STColumn;
|
typedef struct STColumn STColumn;
|
||||||
typedef struct STSchema STSchema;
|
typedef struct STSchema STSchema;
|
||||||
|
typedef struct SValue SValue;
|
||||||
typedef struct SColVal SColVal;
|
typedef struct SColVal SColVal;
|
||||||
typedef struct STSRow2 STSRow2;
|
typedef struct STSRow2 STSRow2;
|
||||||
typedef struct STSRowBuilder STSRowBuilder;
|
typedef struct STSRowBuilder STSRowBuilder;
|
||||||
|
@ -39,32 +41,36 @@ typedef struct STag STag;
|
||||||
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
||||||
void tTSchemaDestroy(STSchema *pTSchema);
|
void tTSchemaDestroy(STSchema *pTSchema);
|
||||||
|
|
||||||
// SColVal
|
|
||||||
#define ColValNONE ((SColVal){.type = COL_VAL_NONE, .nData = 0, .pData = NULL})
|
|
||||||
#define ColValNULL ((SColVal){.type = COL_VAL_NULL, .nData = 0, .pData = NULL})
|
|
||||||
#define ColValDATA(nData, pData) ((SColVal){.type = COL_VAL_DATA, .nData = (nData), .pData = (pData)})
|
|
||||||
|
|
||||||
// STSRow2
|
// STSRow2
|
||||||
|
#define COL_VAL_NONE(CID) ((SColVal){.cid = (CID), .isNone = 1})
|
||||||
|
#define COL_VAL_NULL(CID) ((SColVal){.cid = (CID), .isNull = 1})
|
||||||
|
#define COL_VAL_VALUE(CID, V) ((SColVal){.cid = (CID), .value = (V)})
|
||||||
|
|
||||||
|
int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow);
|
||||||
|
void tTSRowFree(STSRow2 *pRow);
|
||||||
|
void tTSRowGet(STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
||||||
|
int32_t tTSRowToArray(STSRow2 *pRow, STSchema *pTSchema, SArray **ppArray);
|
||||||
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow);
|
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow);
|
||||||
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow);
|
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow);
|
||||||
int32_t tTSRowDup(const STSRow2 *pRow, STSRow2 **ppRow);
|
|
||||||
void tTSRowFree(STSRow2 *pRow);
|
|
||||||
int32_t tTSRowGet(const STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
|
||||||
|
|
||||||
// STSRowBuilder
|
// STSRowBuilder
|
||||||
|
#if 0
|
||||||
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema);
|
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema);
|
||||||
void tTSRowBuilderClear(STSRowBuilder *pBuilder);
|
void tTSRowBuilderClear(STSRowBuilder *pBuilder);
|
||||||
void tTSRowBuilderReset(STSRowBuilder *pBuilder);
|
void tTSRowBuilderReset(STSRowBuilder *pBuilder);
|
||||||
int32_t tTSRowBuilderPut(STSRowBuilder *pBuilder, int32_t cid, uint8_t *pData, uint32_t nData);
|
int32_t tTSRowBuilderPut(STSRowBuilder *pBuilder, int32_t cid, uint8_t *pData, uint32_t nData);
|
||||||
int32_t tTSRowBuilderGetRow(STSRowBuilder *pBuilder, const STSRow2 **ppRow);
|
int32_t tTSRowBuilderGetRow(STSRowBuilder *pBuilder, const STSRow2 **ppRow);
|
||||||
|
#endif
|
||||||
|
|
||||||
// STag
|
// STag
|
||||||
int32_t tTagNew(STagVal *pTagVals, int16_t nTag, STag **ppTag);
|
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag);
|
||||||
void tTagFree(STag *pTag);
|
void tTagFree(STag *pTag);
|
||||||
int32_t tTagSet(STag *pTag, SSchema *pSchema, int32_t nCols, int iCol, uint8_t *pData, uint32_t nData, STag **ppTag);
|
bool tTagGet(const STag *pTag, STagVal *pTagVal);
|
||||||
void tTagGet(STag *pTag, int16_t cid, int8_t type, uint8_t **ppData, uint32_t *nData);
|
char* tTagValToData(const STagVal *pTagVal, bool isJson);
|
||||||
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag);
|
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag);
|
||||||
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag);
|
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag);
|
||||||
|
int32_t tTagToValArray(const STag *pTag, SArray **ppArray);
|
||||||
|
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln);
|
||||||
|
|
||||||
// STRUCT =================
|
// STRUCT =================
|
||||||
struct STColumn {
|
struct STColumn {
|
||||||
|
@ -87,7 +93,9 @@ struct STSchema {
|
||||||
#define TSROW_HAS_NONE ((uint8_t)0x1)
|
#define TSROW_HAS_NONE ((uint8_t)0x1)
|
||||||
#define TSROW_HAS_NULL ((uint8_t)0x2U)
|
#define TSROW_HAS_NULL ((uint8_t)0x2U)
|
||||||
#define TSROW_HAS_VAL ((uint8_t)0x4U)
|
#define TSROW_HAS_VAL ((uint8_t)0x4U)
|
||||||
#define TSROW_KV_ROW ((uint8_t)0x10U)
|
#define TSROW_KV_SMALL ((uint8_t)0x10U)
|
||||||
|
#define TSROW_KV_MID ((uint8_t)0x20U)
|
||||||
|
#define TSROW_KV_BIG ((uint8_t)0x40U)
|
||||||
struct STSRow2 {
|
struct STSRow2 {
|
||||||
TSKEY ts;
|
TSKEY ts;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
@ -110,20 +118,60 @@ struct STSRowBuilder {
|
||||||
STSRow2 row;
|
STSRow2 row;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum { COL_VAL_NONE = 0, COL_VAL_NULL = 1, COL_VAL_DATA = 2 } EColValT;
|
struct SValue {
|
||||||
struct SColVal {
|
union {
|
||||||
EColValT type;
|
int8_t i8; // TSDB_DATA_TYPE_BOOL||TSDB_DATA_TYPE_TINYINT
|
||||||
uint32_t nData;
|
uint8_t u8; // TSDB_DATA_TYPE_UTINYINT
|
||||||
uint8_t *pData;
|
int16_t i16; // TSDB_DATA_TYPE_SMALLINT
|
||||||
|
uint16_t u16; // TSDB_DATA_TYPE_USMALLINT
|
||||||
|
int32_t i32; // TSDB_DATA_TYPE_INT
|
||||||
|
uint32_t u32; // TSDB_DATA_TYPE_UINT
|
||||||
|
int64_t i64; // TSDB_DATA_TYPE_BIGINT
|
||||||
|
uint64_t u64; // TSDB_DATA_TYPE_UBIGINT
|
||||||
|
TSKEY ts; // TSDB_DATA_TYPE_TIMESTAMP
|
||||||
|
float f; // TSDB_DATA_TYPE_FLOAT
|
||||||
|
double d; // TSDB_DATA_TYPE_DOUBLE
|
||||||
|
struct {
|
||||||
|
uint32_t nData;
|
||||||
|
uint8_t *pData;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct STagVal {
|
struct SColVal {
|
||||||
int16_t cid;
|
int16_t cid;
|
||||||
int8_t type;
|
int8_t isNone;
|
||||||
uint32_t nData;
|
int8_t isNull;
|
||||||
uint8_t *pData;
|
SValue value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
struct STagVal {
|
||||||
|
union {
|
||||||
|
int16_t cid;
|
||||||
|
char *pKey;
|
||||||
|
};
|
||||||
|
int8_t type;
|
||||||
|
union {
|
||||||
|
int64_t i64;
|
||||||
|
struct {
|
||||||
|
uint32_t nData;
|
||||||
|
uint8_t *pData;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TD_TAG_JSON ((int8_t)0x40) // distinguish JSON string and JSON value with the highest bit
|
||||||
|
#define TD_TAG_LARGE ((int8_t)0x20)
|
||||||
|
struct STag {
|
||||||
|
int8_t flags;
|
||||||
|
int16_t len;
|
||||||
|
int16_t nTag;
|
||||||
|
int32_t ver;
|
||||||
|
int8_t idx[];
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#if 1 //================================================================================================================================================
|
#if 1 //================================================================================================================================================
|
||||||
// Imported since 3.0 and use bitmap to demonstrate None/Null/Norm, while use Null/Norm below 3.0 without of bitmap.
|
// Imported since 3.0 and use bitmap to demonstrate None/Null/Norm, while use Null/Norm below 3.0 without of bitmap.
|
||||||
#define TD_SUPPORT_BITMAP
|
#define TD_SUPPORT_BITMAP
|
||||||
|
@ -366,109 +414,6 @@ SDataCols *tdFreeDataCols(SDataCols *pCols);
|
||||||
int32_t tdMergeDataCols(SDataCols *target, SDataCols *source, int32_t rowsToMerge, int32_t *pOffset, bool update,
|
int32_t tdMergeDataCols(SDataCols *target, SDataCols *source, int32_t rowsToMerge, int32_t *pOffset, bool update,
|
||||||
TDRowVerT maxVer);
|
TDRowVerT maxVer);
|
||||||
|
|
||||||
// ----------------- K-V data row structure
|
|
||||||
/* |<-------------------------------------- len -------------------------------------------->|
|
|
||||||
* |<----- header ----->|<--------------------------- body -------------------------------->|
|
|
||||||
* +----------+----------+---------------------------------+---------------------------------+
|
|
||||||
* | uint16_t | int16_t | | |
|
|
||||||
* +----------+----------+---------------------------------+---------------------------------+
|
|
||||||
* | len | ncols | cols index | data part |
|
|
||||||
* +----------+----------+---------------------------------+---------------------------------+
|
|
||||||
*/
|
|
||||||
typedef void *SKVRow;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int16_t colId;
|
|
||||||
uint16_t offset;
|
|
||||||
} SColIdx;
|
|
||||||
|
|
||||||
#define TD_KV_ROW_HEAD_SIZE (sizeof(uint16_t) + sizeof(int16_t))
|
|
||||||
|
|
||||||
#define kvRowLen(r) (*(uint16_t *)(r))
|
|
||||||
#define kvRowNCols(r) (*(int16_t *)POINTER_SHIFT(r, sizeof(uint16_t)))
|
|
||||||
#define kvRowSetLen(r, len) kvRowLen(r) = (len)
|
|
||||||
#define kvRowSetNCols(r, n) kvRowNCols(r) = (n)
|
|
||||||
#define kvRowColIdx(r) (SColIdx *)POINTER_SHIFT(r, TD_KV_ROW_HEAD_SIZE)
|
|
||||||
#define kvRowValues(r) POINTER_SHIFT(r, TD_KV_ROW_HEAD_SIZE + sizeof(SColIdx) * kvRowNCols(r))
|
|
||||||
#define kvRowCpy(dst, r) memcpy((dst), (r), kvRowLen(r))
|
|
||||||
#define kvRowColVal(r, colIdx) POINTER_SHIFT(kvRowValues(r), (colIdx)->offset)
|
|
||||||
#define kvRowColIdxAt(r, i) (kvRowColIdx(r) + (i))
|
|
||||||
#define kvRowFree(r) taosMemoryFreeClear(r)
|
|
||||||
#define kvRowEnd(r) POINTER_SHIFT(r, kvRowLen(r))
|
|
||||||
#define kvRowValLen(r) (kvRowLen(r) - TD_KV_ROW_HEAD_SIZE - sizeof(SColIdx) * kvRowNCols(r))
|
|
||||||
#define kvRowTKey(r) (*(TKEY *)(kvRowValues(r)))
|
|
||||||
#define kvRowKey(r) tdGetKey(kvRowTKey(r))
|
|
||||||
#define kvRowKeys(r) POINTER_SHIFT(r, *(uint16_t *)POINTER_SHIFT(r, TD_KV_ROW_HEAD_SIZE + sizeof(int16_t)))
|
|
||||||
#define kvRowDeleted(r) TKEY_IS_DELETED(kvRowTKey(r))
|
|
||||||
|
|
||||||
SKVRow tdKVRowDup(SKVRow row);
|
|
||||||
int32_t tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value);
|
|
||||||
int32_t tdEncodeKVRow(void **buf, SKVRow row);
|
|
||||||
void *tdDecodeKVRow(void *buf, SKVRow *row);
|
|
||||||
void tdSortKVRowByColIdx(SKVRow row);
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t comparTagId(const void *key1, const void *key2) {
|
|
||||||
if (*(int16_t *)key1 > ((SColIdx *)key2)->colId) {
|
|
||||||
return 1;
|
|
||||||
} else if (*(int16_t *)key1 < ((SColIdx *)key2)->colId) {
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void *tdGetKVRowValOfCol(const SKVRow row, int16_t colId) {
|
|
||||||
void *ret = taosbsearch(&colId, kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), comparTagId, TD_EQ);
|
|
||||||
if (ret == NULL) return NULL;
|
|
||||||
return kvRowColVal(row, (SColIdx *)ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void *tdGetKVRowIdxOfCol(SKVRow row, int16_t colId) {
|
|
||||||
return taosbsearch(&colId, kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), comparTagId, TD_EQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------- K-V data row builder
|
|
||||||
typedef struct {
|
|
||||||
int16_t tCols;
|
|
||||||
int16_t nCols;
|
|
||||||
SColIdx *pColIdx;
|
|
||||||
uint16_t alloc;
|
|
||||||
uint16_t size;
|
|
||||||
void *buf;
|
|
||||||
} SKVRowBuilder;
|
|
||||||
|
|
||||||
int32_t tdInitKVRowBuilder(SKVRowBuilder *pBuilder);
|
|
||||||
void tdDestroyKVRowBuilder(SKVRowBuilder *pBuilder);
|
|
||||||
void tdResetKVRowBuilder(SKVRowBuilder *pBuilder);
|
|
||||||
SKVRow tdGetKVRowFromBuilder(SKVRowBuilder *pBuilder);
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tdAddColToKVRow(SKVRowBuilder *pBuilder, col_id_t colId, const void *value, int32_t tlen) {
|
|
||||||
if (pBuilder->nCols >= pBuilder->tCols) {
|
|
||||||
pBuilder->tCols *= 2;
|
|
||||||
SColIdx *pColIdx = (SColIdx *)taosMemoryRealloc((void *)(pBuilder->pColIdx), sizeof(SColIdx) * pBuilder->tCols);
|
|
||||||
if (pColIdx == NULL) return -1;
|
|
||||||
pBuilder->pColIdx = pColIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
pBuilder->pColIdx[pBuilder->nCols].colId = colId;
|
|
||||||
pBuilder->pColIdx[pBuilder->nCols].offset = pBuilder->size;
|
|
||||||
|
|
||||||
pBuilder->nCols++;
|
|
||||||
|
|
||||||
if (tlen > pBuilder->alloc - pBuilder->size) {
|
|
||||||
while (tlen > pBuilder->alloc - pBuilder->size) {
|
|
||||||
pBuilder->alloc *= 2;
|
|
||||||
}
|
|
||||||
void *buf = taosMemoryRealloc(pBuilder->buf, pBuilder->alloc);
|
|
||||||
if (buf == NULL) return -1;
|
|
||||||
pBuilder->buf = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(POINTER_SHIFT(pBuilder->buf, pBuilder->size), value, tlen);
|
|
||||||
pBuilder->size += tlen;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -476,3 +421,4 @@ static FORCE_INLINE int32_t tdAddColToKVRow(SKVRowBuilder *pBuilder, col_id_t co
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_COMMON_DATA_FORMAT_H_*/
|
#endif /*_TD_COMMON_DATA_FORMAT_H_*/
|
||||||
|
|
||||||
|
|
|
@ -287,7 +287,7 @@ typedef struct SSchema {
|
||||||
char name[TSDB_COL_NAME_LEN];
|
char name[TSDB_COL_NAME_LEN];
|
||||||
} SSchema;
|
} SSchema;
|
||||||
|
|
||||||
#define COL_IS_SET(FLG) ((FLG) & (COL_SET_VAL | COL_SET_NULL) != 0)
|
#define COL_IS_SET(FLG) (((FLG) & (COL_SET_VAL | COL_SET_NULL)) != 0)
|
||||||
#define COL_CLR_SET(FLG) ((FLG) &= (~(COL_SET_VAL | COL_SET_NULL)))
|
#define COL_CLR_SET(FLG) ((FLG) &= (~(COL_SET_VAL | COL_SET_NULL)))
|
||||||
|
|
||||||
#define IS_BSMA_ON(s) (((s)->flags & 0x01) == COL_SMA_ON)
|
#define IS_BSMA_ON(s) (((s)->flags & 0x01) == COL_SMA_ON)
|
||||||
|
@ -945,7 +945,6 @@ typedef struct {
|
||||||
int64_t timeInFetchQueue;
|
int64_t timeInFetchQueue;
|
||||||
} SQnodeLoad;
|
} SQnodeLoad;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver; // software version
|
int32_t sver; // software version
|
||||||
int64_t dnodeVer; // dnode table version in sdb
|
int64_t dnodeVer; // dnode table version in sdb
|
||||||
|
@ -1031,6 +1030,7 @@ typedef struct {
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
|
void* pTsma;
|
||||||
} SCreateVnodeReq;
|
} SCreateVnodeReq;
|
||||||
|
|
||||||
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
||||||
|
@ -1774,6 +1774,15 @@ typedef struct SVCreateTbReq {
|
||||||
int tEncodeSVCreateTbReq(SEncoder* pCoder, const SVCreateTbReq* pReq);
|
int tEncodeSVCreateTbReq(SEncoder* pCoder, const SVCreateTbReq* pReq);
|
||||||
int tDecodeSVCreateTbReq(SDecoder* pCoder, SVCreateTbReq* pReq);
|
int tDecodeSVCreateTbReq(SDecoder* pCoder, SVCreateTbReq* pReq);
|
||||||
|
|
||||||
|
static FORCE_INLINE void tdDestroySVCreateTbReq(SVCreateTbReq* req) {
|
||||||
|
taosMemoryFreeClear(req->name);
|
||||||
|
if (req->type == TSDB_CHILD_TABLE) {
|
||||||
|
taosMemoryFreeClear(req->ctb.pTag);
|
||||||
|
} else if (req->type == TSDB_NORMAL_TABLE) {
|
||||||
|
taosMemoryFreeClear(req->ntb.schemaRow.pSchema);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t nReqs;
|
int32_t nReqs;
|
||||||
union {
|
union {
|
||||||
|
@ -1964,7 +1973,7 @@ typedef struct {
|
||||||
int8_t killConnection;
|
int8_t killConnection;
|
||||||
int8_t align[3];
|
int8_t align[3];
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
SArray *pQnodeList;
|
SArray* pQnodeList;
|
||||||
} SQueryHbRspBasic;
|
} SQueryHbRspBasic;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -2292,6 +2301,7 @@ typedef struct {
|
||||||
int8_t intervalUnit; // MACRO: TIME_UNIT_XXX
|
int8_t intervalUnit; // MACRO: TIME_UNIT_XXX
|
||||||
int8_t slidingUnit; // MACRO: TIME_UNIT_XXX
|
int8_t slidingUnit; // MACRO: TIME_UNIT_XXX
|
||||||
int8_t timezoneInt; // sma data expired if timezone changes.
|
int8_t timezoneInt; // sma data expired if timezone changes.
|
||||||
|
int32_t dstVgId;
|
||||||
char indexName[TSDB_INDEX_NAME_LEN];
|
char indexName[TSDB_INDEX_NAME_LEN];
|
||||||
int32_t exprLen;
|
int32_t exprLen;
|
||||||
int32_t tagsFilterLen;
|
int32_t tagsFilterLen;
|
||||||
|
@ -2434,7 +2444,7 @@ typedef struct {
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
uint64_t reqId;
|
uint64_t reqId;
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int64_t waitTime;
|
int64_t timeout;
|
||||||
int64_t currentOffset;
|
int64_t currentOffset;
|
||||||
} SMqPollReq;
|
} SMqPollReq;
|
||||||
|
|
||||||
|
@ -2649,6 +2659,23 @@ typedef struct {
|
||||||
int32_t tEncodeSVSubmitReq(SEncoder* pCoder, const SVSubmitReq* pReq);
|
int32_t tEncodeSVSubmitReq(SEncoder* pCoder, const SVSubmitReq* pReq);
|
||||||
int32_t tDecodeSVSubmitReq(SDecoder* pCoder, SVSubmitReq* pReq);
|
int32_t tDecodeSVSubmitReq(SDecoder* pCoder, SVSubmitReq* pReq);
|
||||||
|
|
||||||
|
// TDMT_VND_DELETE
|
||||||
|
typedef struct {
|
||||||
|
TSKEY sKey;
|
||||||
|
TSKEY eKey;
|
||||||
|
|
||||||
|
// super table
|
||||||
|
char* stbName;
|
||||||
|
|
||||||
|
// child/normal
|
||||||
|
char* tbName;
|
||||||
|
} SVDeleteReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t code;
|
||||||
|
// TODO
|
||||||
|
} SVDeleteRsp;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -225,6 +225,8 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_REPLICA, "vnode-alter-replica", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_REPLICA, "vnode-alter-replica", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_COMPACT, "vnode-compact", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_COMPACT, "vnode-compact", NULL, NULL)
|
||||||
|
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_DELETE, "vnode-delete-data", SVDeleteReq, SVDeleteRsp)
|
||||||
|
|
||||||
// Requests handled by QNODE
|
// Requests handled by QNODE
|
||||||
TD_NEW_MSG_SEG(TDMT_QND_MSG)
|
TD_NEW_MSG_SEG(TDMT_QND_MSG)
|
||||||
|
|
||||||
|
|
|
@ -77,8 +77,8 @@ int32_t qStmtParseQuerySql(SParseContext* pCxt, SQuery* pQuery);
|
||||||
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen);
|
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen);
|
||||||
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
||||||
int32_t rowNum);
|
int32_t rowNum);
|
||||||
int32_t qBuildStmtColFields(void* pDataBlock, int32_t* fieldNum, TAOS_FIELD** fields);
|
int32_t qBuildStmtColFields(void* pDataBlock, int32_t* fieldNum, TAOS_FIELD_E** fields);
|
||||||
int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TAOS_FIELD** fields);
|
int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TAOS_FIELD_E** fields);
|
||||||
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tName, TAOS_MULTI_BIND* bind,
|
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tName, TAOS_MULTI_BIND* bind,
|
||||||
char* msgBuf, int32_t msgBufLen);
|
char* msgBuf, int32_t msgBufLen);
|
||||||
void destroyBoundColumnInfo(void* pBoundInfo);
|
void destroyBoundColumnInfo(void* pBoundInfo);
|
||||||
|
|
|
@ -33,8 +33,19 @@ extern "C" {
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
||||||
|
#define TD_CFG_DIR_PATH "C:\\TDengine\\cfg\\"
|
||||||
|
#define TD_DATA_DIR_PATH "C:\\TDengine\\data\\"
|
||||||
|
#define TD_LOG_DIR_PATH "C:\\TDengine\\log\\"
|
||||||
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
#define TD_TMP_DIR_PATH "/tmp/taosd/"
|
||||||
|
#define TD_CFG_DIR_PATH "/usr/local/etc/taos/"
|
||||||
|
#define TD_DATA_DIR_PATH "/usr/local/var/lib/taos/"
|
||||||
|
#define TD_LOG_DIR_PATH "/usr/local/var/log/taos/"
|
||||||
#else
|
#else
|
||||||
#define TD_TMP_DIR_PATH "/tmp/"
|
#define TD_TMP_DIR_PATH "/tmp/"
|
||||||
|
#define TD_CFG_DIR_PATH "/etc/taos/"
|
||||||
|
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
||||||
|
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct TdDir *TdDirPtr;
|
typedef struct TdDir *TdDirPtr;
|
||||||
|
|
|
@ -70,6 +70,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_NEED_RETRY TAOS_DEF_ERROR_CODE(0, 0x0028)
|
#define TSDB_CODE_NEED_RETRY TAOS_DEF_ERROR_CODE(0, 0x0028)
|
||||||
#define TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE TAOS_DEF_ERROR_CODE(0, 0x0029)
|
#define TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE TAOS_DEF_ERROR_CODE(0, 0x0029)
|
||||||
#define TSDB_CODE_INVALID_TIMESTAMP TAOS_DEF_ERROR_CODE(0, 0x0030)
|
#define TSDB_CODE_INVALID_TIMESTAMP TAOS_DEF_ERROR_CODE(0, 0x0030)
|
||||||
|
#define TSDB_CODE_MSG_DECODE_ERROR TAOS_DEF_ERROR_CODE(0, 0x0031)
|
||||||
|
|
||||||
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0040)
|
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0040)
|
||||||
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0041)
|
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0041)
|
||||||
|
|
|
@ -342,7 +342,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_DEFAULT_DB_SCHEMALESS TSDB_DB_SCHEMALESS_OFF
|
#define TSDB_DEFAULT_DB_SCHEMALESS TSDB_DB_SCHEMALESS_OFF
|
||||||
|
|
||||||
#define TSDB_MIN_ROLLUP_FILE_FACTOR 0
|
#define TSDB_MIN_ROLLUP_FILE_FACTOR 0
|
||||||
#define TSDB_MAX_ROLLUP_FILE_FACTOR 1
|
#define TSDB_MAX_ROLLUP_FILE_FACTOR 10
|
||||||
#define TSDB_DEFAULT_ROLLUP_FILE_FACTOR 0.1
|
#define TSDB_DEFAULT_ROLLUP_FILE_FACTOR 0.1
|
||||||
#define TSDB_MIN_TABLE_TTL 0
|
#define TSDB_MIN_TABLE_TTL 0
|
||||||
#define TSDB_DEFAULT_TABLE_TTL 0
|
#define TSDB_DEFAULT_TABLE_TTL 0
|
||||||
|
|
|
@ -378,14 +378,16 @@ static FORCE_INLINE int32_t tDecodeDouble(SDecoder* pCoder, double* val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tDecodeBinary(SDecoder* pCoder, uint8_t** val, uint32_t* len) {
|
static FORCE_INLINE int32_t tDecodeBinary(SDecoder* pCoder, uint8_t** val, uint32_t* len) {
|
||||||
if (tDecodeU32v(pCoder, len) < 0) return -1;
|
uint32_t length = 0;
|
||||||
|
if (tDecodeU32v(pCoder, &length) < 0) return -1;
|
||||||
|
if (len) *len = length;
|
||||||
|
|
||||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, *len)) return -1;
|
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, length)) return -1;
|
||||||
if (val) {
|
if (val) {
|
||||||
*val = (uint8_t*)TD_CODER_CURRENT(pCoder);
|
*val = (uint8_t*)TD_CODER_CURRENT(pCoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
TD_CODER_MOVE_POS(pCoder, *len);
|
TD_CODER_MOVE_POS(pCoder, length);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,14 +412,16 @@ static int32_t tDecodeCStrTo(SDecoder* pCoder, char* val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tDecodeBinaryAlloc(SDecoder* pCoder, void** val, uint64_t* len) {
|
static FORCE_INLINE int32_t tDecodeBinaryAlloc(SDecoder* pCoder, void** val, uint64_t* len) {
|
||||||
if (tDecodeU64v(pCoder, len) < 0) return -1;
|
uint64_t length = 0;
|
||||||
|
if (tDecodeU64v(pCoder, &length) < 0) return -1;
|
||||||
|
if (len) *len = length;
|
||||||
|
|
||||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, *len)) return -1;
|
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, length)) return -1;
|
||||||
*val = taosMemoryMalloc(*len);
|
*val = taosMemoryMalloc(length);
|
||||||
if (*val == NULL) return -1;
|
if (*val == NULL) return -1;
|
||||||
memcpy(*val, TD_CODER_CURRENT(pCoder), *len);
|
memcpy(*val, TD_CODER_CURRENT(pCoder), length);
|
||||||
|
|
||||||
TD_CODER_MOVE_POS(pCoder, *len);
|
TD_CODER_MOVE_POS(pCoder, length);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,6 +534,26 @@ static FORCE_INLINE int32_t tPutI64(uint8_t* p, int64_t v) {
|
||||||
return sizeof(int64_t);
|
return sizeof(int64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutFloat(uint8_t* p, float f) {
|
||||||
|
union {
|
||||||
|
uint32_t ui;
|
||||||
|
float f;
|
||||||
|
} v;
|
||||||
|
v.f = f;
|
||||||
|
|
||||||
|
return tPutU32(p, v.ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutDouble(uint8_t* p, double d) {
|
||||||
|
union {
|
||||||
|
uint64_t ui;
|
||||||
|
double d;
|
||||||
|
} v;
|
||||||
|
v.d = d;
|
||||||
|
|
||||||
|
return tPutU64(p, v.ui);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutU16v(uint8_t* p, uint16_t v) { tPutV(p, v); }
|
static FORCE_INLINE int32_t tPutU16v(uint8_t* p, uint16_t v) { tPutV(p, v); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutI16v(uint8_t* p, int16_t v) { return tPutU16v(p, ZIGZAGE(int16_t, v)); }
|
static FORCE_INLINE int32_t tPutI16v(uint8_t* p, int16_t v) { return tPutU16v(p, ZIGZAGE(int16_t, v)); }
|
||||||
|
@ -619,6 +643,34 @@ static FORCE_INLINE int32_t tGetI64v(uint8_t* p, int64_t* v) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetFloat(uint8_t* p, float* f) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint32_t ui;
|
||||||
|
float f;
|
||||||
|
} v;
|
||||||
|
|
||||||
|
n = tGetU32(p, &v.ui);
|
||||||
|
|
||||||
|
*f = v.f;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetDouble(uint8_t* p, double* d) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint64_t ui;
|
||||||
|
double d;
|
||||||
|
} v;
|
||||||
|
|
||||||
|
n = tGetU64(p, &v.ui);
|
||||||
|
|
||||||
|
*d = v.d;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
// =====================
|
// =====================
|
||||||
static FORCE_INLINE int32_t tPutBinary(uint8_t* p, uint8_t* pData, uint32_t nData) {
|
static FORCE_INLINE int32_t tPutBinary(uint8_t* p, uint8_t* pData, uint32_t nData) {
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
@ -642,6 +694,11 @@ static FORCE_INLINE int32_t tGetBinary(uint8_t* p, uint8_t** ppData, uint32_t* n
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutCStr(uint8_t* p, char* pData) {
|
||||||
|
return tPutBinary(p, (uint8_t*)pData, strlen(pData) + 1);
|
||||||
|
}
|
||||||
|
static FORCE_INLINE int32_t tGetCStr(uint8_t* p, char** ppData) { return tGetBinary(p, (uint8_t**)ppData, NULL); }
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -116,8 +116,11 @@ int stmtAffectedRowsOnce(TAOS_STMT *stmt);
|
||||||
int stmtPrepare(TAOS_STMT *stmt, const char *sql, unsigned long length);
|
int stmtPrepare(TAOS_STMT *stmt, const char *sql, unsigned long length);
|
||||||
int stmtSetTbName(TAOS_STMT *stmt, const char *tbName);
|
int stmtSetTbName(TAOS_STMT *stmt, const char *tbName);
|
||||||
int stmtSetTbTags(TAOS_STMT *stmt, TAOS_MULTI_BIND *tags);
|
int stmtSetTbTags(TAOS_STMT *stmt, TAOS_MULTI_BIND *tags);
|
||||||
|
int stmtGetTagFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields);
|
||||||
|
int stmtGetColFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields);
|
||||||
int stmtIsInsert(TAOS_STMT *stmt, int *insert);
|
int stmtIsInsert(TAOS_STMT *stmt, int *insert);
|
||||||
int stmtGetParamNum(TAOS_STMT *stmt, int *nums);
|
int stmtGetParamNum(TAOS_STMT *stmt, int *nums);
|
||||||
|
int stmtGetParam(TAOS_STMT *stmt, int idx, int *type, int *bytes);
|
||||||
int stmtAddBatch(TAOS_STMT *stmt);
|
int stmtAddBatch(TAOS_STMT *stmt);
|
||||||
TAOS_RES *stmtUseResult(TAOS_STMT *stmt);
|
TAOS_RES *stmtUseResult(TAOS_STMT *stmt);
|
||||||
int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx);
|
int stmtBindBatch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int32_t colIdx);
|
||||||
|
|
|
@ -1033,27 +1033,20 @@ static char* parseTagDatatoJson(void* p) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t nCols = kvRowNCols(p);
|
SArray* pTagVals = NULL;
|
||||||
|
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t nCols = taosArrayGetSize(pTagVals);
|
||||||
char tagJsonKey[256] = {0};
|
char tagJsonKey[256] = {0};
|
||||||
for (int j = 0; j < nCols; ++j) {
|
for (int j = 0; j < nCols; ++j) {
|
||||||
SColIdx* pColIdx = kvRowColIdxAt(p, j);
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
||||||
char* val = (char*)(kvRowColVal(p, pColIdx));
|
|
||||||
if (j == 0) {
|
|
||||||
if (*val == TSDB_DATA_TYPE_NULL) {
|
|
||||||
string = taosMemoryCalloc(1, 8);
|
|
||||||
sprintf(string, "%s", TSDB_DATA_NULL_STR_L);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// json key encode by binary
|
// json key encode by binary
|
||||||
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
||||||
memcpy(tagJsonKey, varDataVal(val), varDataLen(val));
|
memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
|
||||||
// json value
|
// json value
|
||||||
val += varDataTLen(val);
|
char type = pTagVal->type;
|
||||||
char* realData = POINTER_SHIFT(val, CHAR_BYTES);
|
|
||||||
char type = *val;
|
|
||||||
if (type == TSDB_DATA_TYPE_NULL) {
|
if (type == TSDB_DATA_TYPE_NULL) {
|
||||||
cJSON* value = cJSON_CreateNull();
|
cJSON* value = cJSON_CreateNull();
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
|
@ -1062,11 +1055,11 @@ static char* parseTagDatatoJson(void* p) {
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
cJSON* value = NULL;
|
cJSON* value = NULL;
|
||||||
if (varDataLen(realData) > 0) {
|
if (pTagVal->nData > 0) {
|
||||||
char* tagJsonValue = taosMemoryCalloc(varDataLen(realData), 1);
|
char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
|
||||||
int32_t length = taosUcs4ToMbs((TdUcs4*)varDataVal(realData), varDataLen(realData), tagJsonValue);
|
int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
|
||||||
if (length < 0) {
|
if (length < 0) {
|
||||||
tscError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, val);
|
tscError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, pTagVal->pData);
|
||||||
taosMemoryFree(tagJsonValue);
|
taosMemoryFree(tagJsonValue);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -1075,7 +1068,7 @@ static char* parseTagDatatoJson(void* p) {
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
} else if (varDataLen(realData) == 0) {
|
} else if (pTagVal->nData == 0) {
|
||||||
value = cJSON_CreateString("");
|
value = cJSON_CreateString("");
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1083,22 +1076,14 @@ static char* parseTagDatatoJson(void* p) {
|
||||||
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
double jsonVd = *(double*)(realData);
|
double jsonVd = *(double*)(&pTagVal->i64);
|
||||||
cJSON* value = cJSON_CreateNumber(jsonVd);
|
cJSON* value = cJSON_CreateNumber(jsonVd);
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
// }else if(type == TSDB_DATA_TYPE_BIGINT){
|
|
||||||
// int64_t jsonVd = *(int64_t*)(realData);
|
|
||||||
// cJSON* value = cJSON_CreateNumber((double)jsonVd);
|
|
||||||
// if (value == NULL)
|
|
||||||
// {
|
|
||||||
// goto end;
|
|
||||||
// }
|
|
||||||
// cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
||||||
char jsonVd = *(char*)(realData);
|
char jsonVd = *(char*)(&pTagVal->i64);
|
||||||
cJSON* value = cJSON_CreateBool(jsonVd);
|
cJSON* value = cJSON_CreateBool(jsonVd);
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1163,7 +1148,7 @@ static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int
|
||||||
if (jsonInnerType == TSDB_DATA_TYPE_NULL) {
|
if (jsonInnerType == TSDB_DATA_TYPE_NULL) {
|
||||||
sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L);
|
sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L);
|
||||||
varDataSetLen(dst, strlen(varDataVal(dst)));
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
} else if (jsonInnerType == TSDB_DATA_TYPE_JSON) {
|
} else if (jsonInnerType == TD_TAG_JSON) {
|
||||||
char* jsonString = parseTagDatatoJson(jsonInnerData);
|
char* jsonString = parseTagDatatoJson(jsonInnerData);
|
||||||
STR_TO_VARSTR(dst, jsonString);
|
STR_TO_VARSTR(dst, jsonString);
|
||||||
taosMemoryFree(jsonString);
|
taosMemoryFree(jsonString);
|
||||||
|
@ -1182,10 +1167,6 @@ static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int
|
||||||
double jsonVd = *(double*)(jsonInnerData);
|
double jsonVd = *(double*)(jsonInnerData);
|
||||||
sprintf(varDataVal(dst), "%.9lf", jsonVd);
|
sprintf(varDataVal(dst), "%.9lf", jsonVd);
|
||||||
varDataSetLen(dst, strlen(varDataVal(dst)));
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
} else if (jsonInnerType == TSDB_DATA_TYPE_BIGINT) {
|
|
||||||
int64_t jsonVd = *(int64_t*)(jsonInnerData);
|
|
||||||
sprintf(varDataVal(dst), "%" PRId64, jsonVd);
|
|
||||||
varDataSetLen(dst, strlen(varDataVal(dst)));
|
|
||||||
} else if (jsonInnerType == TSDB_DATA_TYPE_BOOL) {
|
} else if (jsonInnerType == TSDB_DATA_TYPE_BOOL) {
|
||||||
sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false");
|
sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false");
|
||||||
varDataSetLen(dst, strlen(varDataVal(dst)));
|
varDataSetLen(dst, strlen(varDataVal(dst)));
|
||||||
|
|
|
@ -666,8 +666,39 @@ int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name) {
|
||||||
return stmtSetTbName(stmt, name);
|
return stmtSetTbName(stmt, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int taos_stmt_set_tags(TAOS_STMT *stmt, TAOS_MULTI_BIND *tags) {
|
||||||
|
if (stmt == NULL || tags == NULL) {
|
||||||
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stmtSetTbTags(stmt, tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name) { return taos_stmt_set_tbname(stmt, name); }
|
int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name) { return taos_stmt_set_tbname(stmt, name); }
|
||||||
|
|
||||||
|
int taos_stmt_get_tag_fields(TAOS_STMT *stmt, int* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
|
if (stmt == NULL || NULL == fieldNum) {
|
||||||
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stmtGetTagFields(stmt, fieldNum, fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
int taos_stmt_get_col_fields(TAOS_STMT *stmt, int* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
|
if (stmt == NULL || NULL == fieldNum) {
|
||||||
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stmtGetColFields(stmt, fieldNum, fields);
|
||||||
|
}
|
||||||
|
|
||||||
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
|
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
|
||||||
if (stmt == NULL || bind == NULL) {
|
if (stmt == NULL || bind == NULL) {
|
||||||
tscError("NULL parameter for %s", __FUNCTION__);
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
@ -772,6 +803,16 @@ int taos_stmt_num_params(TAOS_STMT *stmt, int *nums) {
|
||||||
return stmtGetParamNum(stmt, nums);
|
return stmtGetParamNum(stmt, nums);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int taos_stmt_get_param(TAOS_STMT *stmt, int idx, int *type, int *bytes) {
|
||||||
|
if (stmt == NULL || type == NULL || NULL == bytes || idx < 0) {
|
||||||
|
tscError("invalid parameter for %s", __FUNCTION__);
|
||||||
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stmtGetParam(stmt, idx, type, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt) {
|
TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt) {
|
||||||
if (stmt == NULL) {
|
if (stmt == NULL) {
|
||||||
tscError("NULL parameter for %s", __FUNCTION__);
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
|
|
@ -17,7 +17,7 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STMT_SETTAGS:
|
case STMT_SETTAGS:
|
||||||
if (STMT_STATUS_NE(SETTBNAME)) {
|
if (STMT_STATUS_NE(SETTBNAME) && STMT_STATUS_NE(FETCH_FIELDS)) {
|
||||||
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
code = TSDB_CODE_TSC_STMT_API_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -540,6 +540,8 @@ int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) {
|
||||||
if (pStmt->bInfo.needParse) {
|
if (pStmt->bInfo.needParse) {
|
||||||
strncpy(pStmt->bInfo.tbName, tbName, sizeof(pStmt->bInfo.tbName) - 1);
|
strncpy(pStmt->bInfo.tbName, tbName, sizeof(pStmt->bInfo.tbName) - 1);
|
||||||
pStmt->bInfo.tbName[sizeof(pStmt->bInfo.tbName) - 1] = 0;
|
pStmt->bInfo.tbName[sizeof(pStmt->bInfo.tbName) - 1] = 0;
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtParseSql(pStmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -550,10 +552,6 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
|
||||||
|
|
||||||
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS));
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS));
|
||||||
|
|
||||||
if (pStmt->bInfo.needParse) {
|
|
||||||
STMT_ERR_RET(stmtParseSql(pStmt));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pStmt->bInfo.inExecCache) {
|
if (pStmt->bInfo.inExecCache) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -571,7 +569,7 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD** fields) {
|
int stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
tscError("invalid operation to get query tag fileds");
|
tscError("invalid operation to get query tag fileds");
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
|
@ -589,7 +587,7 @@ int32_t stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD** fiel
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD** fields) {
|
int stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
tscError("invalid operation to get query column fileds");
|
tscError("invalid operation to get query column fileds");
|
||||||
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
|
@ -852,6 +850,71 @@ int stmtIsInsert(TAOS_STMT* stmt, int* insert) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stmtGetTagFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
|
||||||
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
|
STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
|
||||||
|
STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
|
||||||
|
taos_free_result(pStmt->exec.pRequest);
|
||||||
|
pStmt->exec.pRequest = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse) {
|
||||||
|
STMT_ERR_RET(stmtParseSql(pStmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtFetchTagFields(stmt, nums, fields));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stmtGetColFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
|
||||||
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
|
STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
|
||||||
|
STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
|
||||||
|
taos_free_result(pStmt->exec.pRequest);
|
||||||
|
pStmt->exec.pRequest = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse) {
|
||||||
|
STMT_ERR_RET(stmtParseSql(pStmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtFetchColFields(stmt, nums, fields));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
@ -884,6 +947,50 @@ int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stmtGetParam(TAOS_STMT *stmt, int idx, int *type, int *bytes) {
|
||||||
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
if (STMT_TYPE_QUERY == pStmt->sql.type) {
|
||||||
|
STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
|
||||||
|
STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
|
||||||
|
pStmt->bInfo.needParse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
|
||||||
|
taos_free_result(pStmt->exec.pRequest);
|
||||||
|
pStmt->exec.pRequest = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == pStmt->exec.pRequest) {
|
||||||
|
STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStmt->bInfo.needParse) {
|
||||||
|
STMT_ERR_RET(stmtParseSql(pStmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t nums = 0;
|
||||||
|
TAOS_FIELD_E *pField = NULL;
|
||||||
|
STMT_ERR_RET(stmtFetchColFields(stmt, &nums, &pField));
|
||||||
|
if (idx >= nums) {
|
||||||
|
tscError("idx %d is too big", idx);
|
||||||
|
taosMemoryFree(pField);
|
||||||
|
STMT_ERR_RET(TSDB_CODE_INVALID_PARA);
|
||||||
|
}
|
||||||
|
|
||||||
|
*type = pField[idx].type;
|
||||||
|
*bytes = pField[idx].bytes;
|
||||||
|
|
||||||
|
taosMemoryFree(pField);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
TAOS_RES* stmtUseResult(TAOS_STMT* stmt) {
|
TAOS_RES* stmtUseResult(TAOS_STMT* stmt) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
|
|
@ -1243,7 +1243,7 @@ tmq_resp_err_t tmq_seek(tmq_t* tmq, const tmq_topic_vgroup_t* offset) {
|
||||||
return TMQ_RESP_ERR__FAIL;
|
return TMQ_RESP_ERR__FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t waitTime, SMqClientTopic* pTopic, SMqClientVg* pVg) {
|
SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t timeout, SMqClientTopic* pTopic, SMqClientVg* pVg) {
|
||||||
int64_t reqOffset;
|
int64_t reqOffset;
|
||||||
if (pVg->currentOffset >= 0) {
|
if (pVg->currentOffset >= 0) {
|
||||||
reqOffset = pVg->currentOffset;
|
reqOffset = pVg->currentOffset;
|
||||||
|
@ -1269,7 +1269,7 @@ SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t waitTime, SMqClientTopic*
|
||||||
strcpy(pReq->subKey + tlen + 1, pTopic->topicName);
|
strcpy(pReq->subKey + tlen + 1, pTopic->topicName);
|
||||||
|
|
||||||
pReq->withTbName = tmq->withTbName;
|
pReq->withTbName = tmq->withTbName;
|
||||||
pReq->waitTime = waitTime;
|
pReq->timeout = timeout;
|
||||||
pReq->consumerId = tmq->consumerId;
|
pReq->consumerId = tmq->consumerId;
|
||||||
pReq->epoch = tmq->epoch;
|
pReq->epoch = tmq->epoch;
|
||||||
pReq->currentOffset = reqOffset;
|
pReq->currentOffset = reqOffset;
|
||||||
|
@ -1297,7 +1297,7 @@ SMqRspObj* tmqBuildRspFromWrapper(SMqPollRspWrapper* pWrapper) {
|
||||||
return pRspObj;
|
return pRspObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tmqPollImpl(tmq_t* tmq, int64_t waitTime) {
|
int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
|
||||||
/*printf("call poll\n");*/
|
/*printf("call poll\n");*/
|
||||||
for (int i = 0; i < taosArrayGetSize(tmq->clientTopics); i++) {
|
for (int i = 0; i < taosArrayGetSize(tmq->clientTopics); i++) {
|
||||||
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, i);
|
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, i);
|
||||||
|
@ -1318,7 +1318,7 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t waitTime) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
atomic_store_32(&pVg->vgSkipCnt, 0);
|
atomic_store_32(&pVg->vgSkipCnt, 0);
|
||||||
SMqPollReq* pReq = tmqBuildConsumeReqImpl(tmq, waitTime, pTopic, pVg);
|
SMqPollReq* pReq = tmqBuildConsumeReqImpl(tmq, timeout, pTopic, pVg);
|
||||||
if (pReq == NULL) {
|
if (pReq == NULL) {
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
@ -1388,7 +1388,7 @@ int32_t tmqHandleNoPollRsp(tmq_t* tmq, SMqRspWrapper* rspWrapper, bool* pReset)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqRspObj* tmqHandleAllRsp(tmq_t* tmq, int64_t waitTime, bool pollIfReset) {
|
SMqRspObj* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
while (1) {
|
while (1) {
|
||||||
SMqRspWrapper* rspWrapper = NULL;
|
SMqRspWrapper* rspWrapper = NULL;
|
||||||
taosGetQitem(tmq->qall, (void**)&rspWrapper);
|
taosGetQitem(tmq->qall, (void**)&rspWrapper);
|
||||||
|
@ -1428,17 +1428,17 @@ SMqRspObj* tmqHandleAllRsp(tmq_t* tmq, int64_t waitTime, bool pollIfReset) {
|
||||||
taosFreeQitem(rspWrapper);
|
taosFreeQitem(rspWrapper);
|
||||||
if (pollIfReset && reset) {
|
if (pollIfReset && reset) {
|
||||||
tscDebug("consumer %ld reset and repoll", tmq->consumerId);
|
tscDebug("consumer %ld reset and repoll", tmq->consumerId);
|
||||||
tmqPollImpl(tmq, waitTime);
|
tmqPollImpl(tmq, timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t wait_time) {
|
TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
|
||||||
SMqRspObj* rspObj;
|
SMqRspObj* rspObj;
|
||||||
int64_t startTime = taosGetTimestampMs();
|
int64_t startTime = taosGetTimestampMs();
|
||||||
|
|
||||||
rspObj = tmqHandleAllRsp(tmq, wait_time, false);
|
rspObj = tmqHandleAllRsp(tmq, timeout, false);
|
||||||
if (rspObj) {
|
if (rspObj) {
|
||||||
return (TAOS_RES*)rspObj;
|
return (TAOS_RES*)rspObj;
|
||||||
}
|
}
|
||||||
|
@ -1450,16 +1450,16 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t wait_time) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tmqHandleAllDelayedTask(tmq);
|
tmqHandleAllDelayedTask(tmq);
|
||||||
if (tmqPollImpl(tmq, wait_time) < 0) return NULL;
|
if (tmqPollImpl(tmq, timeout) < 0) return NULL;
|
||||||
|
|
||||||
rspObj = tmqHandleAllRsp(tmq, wait_time, false);
|
rspObj = tmqHandleAllRsp(tmq, timeout, false);
|
||||||
if (rspObj) {
|
if (rspObj) {
|
||||||
return (TAOS_RES*)rspObj;
|
return (TAOS_RES*)rspObj;
|
||||||
}
|
}
|
||||||
if (wait_time != 0) {
|
if (timeout != 0) {
|
||||||
int64_t endTime = taosGetTimestampMs();
|
int64_t endTime = taosGetTimestampMs();
|
||||||
int64_t leftTime = endTime - startTime;
|
int64_t leftTime = endTime - startTime;
|
||||||
if (leftTime > wait_time) {
|
if (leftTime > timeout) {
|
||||||
tscDebug("consumer %ld (epoch %d) timeout, no rsp", tmq->consumerId, tmq->epoch);
|
tscDebug("consumer %ld (epoch %d) timeout, no rsp", tmq->consumerId, tmq->epoch);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1474,10 +1474,7 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t wait_time) {
|
||||||
tmq_resp_err_t tmq_consumer_close(tmq_t* tmq) {
|
tmq_resp_err_t tmq_consumer_close(tmq_t* tmq) {
|
||||||
if (tmq->status == TMQ_CONSUMER_STATUS__READY) {
|
if (tmq->status == TMQ_CONSUMER_STATUS__READY) {
|
||||||
tmq_resp_err_t rsp = tmq_commit_sync(tmq, NULL);
|
tmq_resp_err_t rsp = tmq_commit_sync(tmq, NULL);
|
||||||
if (rsp == TMQ_RESP_ERR__SUCCESS) {
|
if (rsp == TMQ_RESP_ERR__FAIL) {
|
||||||
// TODO: free resources
|
|
||||||
return TMQ_RESP_ERR__SUCCESS;
|
|
||||||
} else {
|
|
||||||
return TMQ_RESP_ERR__FAIL;
|
return TMQ_RESP_ERR__FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1485,10 +1482,7 @@ tmq_resp_err_t tmq_consumer_close(tmq_t* tmq) {
|
||||||
rsp = tmq_subscribe(tmq, lst);
|
rsp = tmq_subscribe(tmq, lst);
|
||||||
tmq_list_destroy(lst);
|
tmq_list_destroy(lst);
|
||||||
|
|
||||||
if (rsp == TMQ_RESP_ERR__SUCCESS) {
|
if (rsp == TMQ_RESP_ERR__FAIL) {
|
||||||
// TODO: free resources
|
|
||||||
return TMQ_RESP_ERR__SUCCESS;
|
|
||||||
} else {
|
|
||||||
return TMQ_RESP_ERR__FAIL;
|
return TMQ_RESP_ERR__FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,22 +116,23 @@ int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, con
|
||||||
|
|
||||||
int32_t type = pColumnInfoData->info.type;
|
int32_t type = pColumnInfoData->info.type;
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
int32_t dataLen = varDataTLen(pData);
|
int32_t dataLen = 0;
|
||||||
if (type == TSDB_DATA_TYPE_JSON) {
|
if (type == TSDB_DATA_TYPE_JSON) {
|
||||||
if (*pData == TSDB_DATA_TYPE_NULL) {
|
if (*pData == TSDB_DATA_TYPE_NULL) {
|
||||||
dataLen = 0;
|
|
||||||
} else if (*pData == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
dataLen = varDataTLen(pData + CHAR_BYTES);
|
|
||||||
} else if (*pData == TSDB_DATA_TYPE_DOUBLE) {
|
|
||||||
dataLen = DOUBLE_BYTES;
|
|
||||||
} else if (*pData == TSDB_DATA_TYPE_BOOL) {
|
|
||||||
dataLen = CHAR_BYTES;
|
dataLen = CHAR_BYTES;
|
||||||
} else if (*pData == TSDB_DATA_TYPE_JSON) {
|
} else if (*pData == TSDB_DATA_TYPE_NCHAR) {
|
||||||
dataLen = kvRowLen(pData + CHAR_BYTES);
|
dataLen = varDataTLen(pData + CHAR_BYTES) + CHAR_BYTES;
|
||||||
|
} else if (*pData == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
dataLen = DOUBLE_BYTES + CHAR_BYTES;
|
||||||
|
} else if (*pData == TSDB_DATA_TYPE_BOOL) {
|
||||||
|
dataLen = CHAR_BYTES + CHAR_BYTES;
|
||||||
|
} else if (*pData == TD_TAG_JSON) { // json string
|
||||||
|
dataLen = ((STag*)(pData))->len;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
dataLen += CHAR_BYTES;
|
}else {
|
||||||
|
dataLen = varDataTLen(pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
SVarColAttr* pAttr = &pColumnInfoData->varmeta;
|
SVarColAttr* pAttr = &pColumnInfoData->varmeta;
|
||||||
|
@ -1634,6 +1635,11 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks
|
||||||
SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid,
|
SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid,
|
||||||
const char* stbFullName, int32_t vgId) {
|
const char* stbFullName, int32_t vgId) {
|
||||||
SSubmitReq* ret = NULL;
|
SSubmitReq* ret = NULL;
|
||||||
|
SArray* tagArray = taosArrayInit(1, sizeof(STagVal));
|
||||||
|
if(!tagArray) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// cal size
|
// cal size
|
||||||
int32_t cap = sizeof(SSubmitReq);
|
int32_t cap = sizeof(SSubmitReq);
|
||||||
|
@ -1655,18 +1661,33 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
|
||||||
createTbReq.type = TSDB_CHILD_TABLE;
|
createTbReq.type = TSDB_CHILD_TABLE;
|
||||||
createTbReq.ctb.suid = suid;
|
createTbReq.ctb.suid = suid;
|
||||||
|
|
||||||
SKVRowBuilder kvRowBuilder = {0};
|
|
||||||
if (tdInitKVRowBuilder(&kvRowBuilder) < 0) {
|
|
||||||
ASSERT(0);
|
STagVal tagVal = {.cid = 1,
|
||||||
|
.type = TSDB_DATA_TYPE_UBIGINT,
|
||||||
|
.pData = (uint8_t*)&pDataBlock->info.groupId,
|
||||||
|
.nData = sizeof(uint64_t)};
|
||||||
|
STag* pTag = NULL;
|
||||||
|
taosArrayClear(tagArray);
|
||||||
|
taosArrayPush(tagArray, &tagVal);
|
||||||
|
tTagNew(tagArray, 1, false, &pTag);
|
||||||
|
if (!pTag) {
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
tdAddColToKVRow(&kvRowBuilder, 1, &pDataBlock->info.groupId, sizeof(uint64_t));
|
createTbReq.ctb.pTag = (uint8_t*)pTag;
|
||||||
createTbReq.ctb.pTag = tdGetKVRowFromBuilder(&kvRowBuilder);
|
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
|
||||||
|
|
||||||
int32_t code;
|
int32_t code;
|
||||||
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
||||||
if (code < 0) return NULL;
|
|
||||||
taosMemoryFree(cname);
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
|
||||||
|
if (code < 0) {
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cap += sizeof(SSubmitBlk) + schemaLen + rows * maxLen;
|
cap += sizeof(SSubmitBlk) + schemaLen + rows * maxLen;
|
||||||
|
@ -1709,22 +1730,42 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
|
||||||
createTbReq.type = TSDB_CHILD_TABLE;
|
createTbReq.type = TSDB_CHILD_TABLE;
|
||||||
createTbReq.ctb.suid = suid;
|
createTbReq.ctb.suid = suid;
|
||||||
|
|
||||||
SKVRowBuilder kvRowBuilder = {0};
|
STagVal tagVal = {.cid = 1,
|
||||||
if (tdInitKVRowBuilder(&kvRowBuilder) < 0) {
|
.type = TSDB_DATA_TYPE_UBIGINT,
|
||||||
ASSERT(0);
|
.pData = (uint8_t*)&pDataBlock->info.groupId,
|
||||||
|
.nData = sizeof(uint64_t)};
|
||||||
|
taosArrayClear(tagArray);
|
||||||
|
taosArrayPush(tagArray, &tagVal);
|
||||||
|
STag* pTag = NULL;
|
||||||
|
tTagNew(tagArray, 1, false, &pTag);
|
||||||
|
if (!pTag) {
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
taosMemoryFreeClear(ret);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
tdAddColToKVRow(&kvRowBuilder, 1, &pDataBlock->info.groupId, sizeof(uint64_t));
|
createTbReq.ctb.pTag = (uint8_t*)pTag;
|
||||||
createTbReq.ctb.pTag = tdGetKVRowFromBuilder(&kvRowBuilder);
|
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
|
||||||
|
|
||||||
int32_t code;
|
int32_t code;
|
||||||
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
||||||
if (code < 0) return NULL;
|
if (code < 0) {
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
taosMemoryFreeClear(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, blockData, schemaLen);
|
tEncoderInit(&encoder, blockData, schemaLen);
|
||||||
if (tEncodeSVCreateTbReq(&encoder, &createTbReq) < 0) return NULL;
|
code = tEncodeSVCreateTbReq(&encoder, &createTbReq);
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
|
||||||
|
if (code < 0) {
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
taosMemoryFreeClear(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
blkHead->schemaLen = htonl(schemaLen);
|
blkHead->schemaLen = htonl(schemaLen);
|
||||||
|
|
||||||
|
@ -1759,5 +1800,6 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
ret->length = htonl(ret->length);
|
ret->length = htonl(ret->length);
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2956,7 +2956,6 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->isTsma) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pReq->standby) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->standby) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
||||||
|
@ -2973,6 +2972,12 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
if (tEncodeI8(&encoder, pRetension->keepUnit) < 0) return -1;
|
if (tEncodeI8(&encoder, pRetension->keepUnit) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tEncodeI8(&encoder, pReq->isTsma) < 0) return -1;
|
||||||
|
if (pReq->isTsma) {
|
||||||
|
uint32_t tsmaLen = (uint32_t)(htonl(((SMsgHead *)pReq->pTsma)->contLen));
|
||||||
|
if (tEncodeBinary(&encoder, (const uint8_t *)pReq->pTsma, tsmaLen) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -3008,7 +3013,6 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->isTsma) < 0) return -1;
|
|
||||||
if (tDecodeI8(&decoder, &pReq->standby) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->standby) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
||||||
|
@ -3036,6 +3040,11 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tDecodeI8(&decoder, &pReq->isTsma) < 0) return -1;
|
||||||
|
if (pReq->isTsma) {
|
||||||
|
if (tDecodeBinaryAlloc(&decoder, &pReq->pTsma, NULL) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3044,6 +3053,9 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
||||||
taosArrayDestroy(pReq->pRetensions);
|
taosArrayDestroy(pReq->pRetensions);
|
||||||
pReq->pRetensions = NULL;
|
pReq->pRetensions = NULL;
|
||||||
|
if(pReq->isTsma) {
|
||||||
|
taosMemoryFreeClear(pReq->pTsma);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3642,6 +3654,7 @@ int32_t tEncodeTSma(SEncoder *pCoder, const STSma *pSma) {
|
||||||
if (tEncodeI8(pCoder, pSma->intervalUnit) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->intervalUnit) < 0) return -1;
|
||||||
if (tEncodeI8(pCoder, pSma->slidingUnit) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->slidingUnit) < 0) return -1;
|
||||||
if (tEncodeI8(pCoder, pSma->timezoneInt) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->timezoneInt) < 0) return -1;
|
||||||
|
if (tEncodeI32(pCoder, pSma->dstVgId) < 0) return -1;
|
||||||
if (tEncodeCStr(pCoder, pSma->indexName) < 0) return -1;
|
if (tEncodeCStr(pCoder, pSma->indexName) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pSma->exprLen) < 0) return -1;
|
if (tEncodeI32(pCoder, pSma->exprLen) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pSma->tagsFilterLen) < 0) return -1;
|
if (tEncodeI32(pCoder, pSma->tagsFilterLen) < 0) return -1;
|
||||||
|
@ -3664,6 +3677,7 @@ int32_t tDecodeTSma(SDecoder *pCoder, STSma *pSma) {
|
||||||
if (tDecodeI8(pCoder, &pSma->version) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->version) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->intervalUnit) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->intervalUnit) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->slidingUnit) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->slidingUnit) < 0) return -1;
|
||||||
|
if (tDecodeI32(pCoder, &pSma->dstVgId) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->timezoneInt) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->timezoneInt) < 0) return -1;
|
||||||
if (tDecodeCStrTo(pCoder, pSma->indexName) < 0) return -1;
|
if (tDecodeCStrTo(pCoder, pSma->indexName) < 0) return -1;
|
||||||
if (tDecodeI32(pCoder, &pSma->exprLen) < 0) return -1;
|
if (tDecodeI32(pCoder, &pSma->exprLen) < 0) return -1;
|
||||||
|
@ -3897,7 +3911,7 @@ int tEncodeSVCreateTbReq(SEncoder *pCoder, const SVCreateTbReq *pReq) {
|
||||||
|
|
||||||
if (pReq->type == TSDB_CHILD_TABLE) {
|
if (pReq->type == TSDB_CHILD_TABLE) {
|
||||||
if (tEncodeI64(pCoder, pReq->ctb.suid) < 0) return -1;
|
if (tEncodeI64(pCoder, pReq->ctb.suid) < 0) return -1;
|
||||||
if (tEncodeBinary(pCoder, pReq->ctb.pTag, kvRowLen(pReq->ctb.pTag)) < 0) return -1;
|
if (tEncodeTag(pCoder, (const STag *)pReq->ctb.pTag) < 0) return -1;
|
||||||
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tEncodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
if (tEncodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3909,8 +3923,6 @@ int tEncodeSVCreateTbReq(SEncoder *pCoder, const SVCreateTbReq *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) {
|
int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) {
|
||||||
uint32_t len;
|
|
||||||
|
|
||||||
if (tStartDecode(pCoder) < 0) return -1;
|
if (tStartDecode(pCoder) < 0) return -1;
|
||||||
|
|
||||||
if (tDecodeI32v(pCoder, &pReq->flags) < 0) return -1;
|
if (tDecodeI32v(pCoder, &pReq->flags) < 0) return -1;
|
||||||
|
@ -3922,7 +3934,7 @@ int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) {
|
||||||
|
|
||||||
if (pReq->type == TSDB_CHILD_TABLE) {
|
if (pReq->type == TSDB_CHILD_TABLE) {
|
||||||
if (tDecodeI64(pCoder, &pReq->ctb.suid) < 0) return -1;
|
if (tDecodeI64(pCoder, &pReq->ctb.suid) < 0) return -1;
|
||||||
if (tDecodeBinary(pCoder, &pReq->ctb.pTag, &len) < 0) return -1;
|
if (tDecodeTag(pCoder, (STag **)&pReq->ctb.pTag) < 0) return -1;
|
||||||
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
} else if (pReq->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tDecodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
if (tDecodeSSchemaWrapper(pCoder, &pReq->ntb.schemaRow) < 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -140,6 +140,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
pCfg->szCache = pCreate->pages;
|
pCfg->szCache = pCreate->pages;
|
||||||
pCfg->szBuf = (uint64_t)pCreate->buffer * 1024 * 1024;
|
pCfg->szBuf = (uint64_t)pCreate->buffer * 1024 * 1024;
|
||||||
pCfg->isWeak = true;
|
pCfg->isWeak = true;
|
||||||
|
pCfg->isTsma = pCreate->isTsma;
|
||||||
pCfg->tsdbCfg.compression = pCreate->compression;
|
pCfg->tsdbCfg.compression = pCreate->compression;
|
||||||
pCfg->tsdbCfg.precision = pCreate->precision;
|
pCfg->tsdbCfg.precision = pCreate->precision;
|
||||||
pCfg->tsdbCfg.days = pCreate->daysPerFile;
|
pCfg->tsdbCfg.days = pCreate->daysPerFile;
|
||||||
|
@ -149,8 +150,13 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
pCfg->tsdbCfg.minRows = pCreate->minRows;
|
pCfg->tsdbCfg.minRows = pCreate->minRows;
|
||||||
pCfg->tsdbCfg.maxRows = pCreate->maxRows;
|
pCfg->tsdbCfg.maxRows = pCreate->maxRows;
|
||||||
for (size_t i = 0; i < taosArrayGetSize(pCreate->pRetensions); ++i) {
|
for (size_t i = 0; i < taosArrayGetSize(pCreate->pRetensions); ++i) {
|
||||||
memcpy(&pCfg->tsdbCfg.retentions[i], taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
SRetention *pRetention = &pCfg->tsdbCfg.retentions[i];
|
||||||
|
memcpy(pRetention, taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
||||||
|
if (i == 0) {
|
||||||
|
if ((pRetention->freq > 0 && pRetention->keep > 0)) pCfg->isRsma = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pCfg->walCfg.vgId = pCreate->vgId;
|
pCfg->walCfg.vgId = pCreate->vgId;
|
||||||
pCfg->hashBegin = pCreate->hashBegin;
|
pCfg->hashBegin = pCreate->hashBegin;
|
||||||
pCfg->hashEnd = pCreate->hashEnd;
|
pCfg->hashEnd = pCreate->hashEnd;
|
||||||
|
@ -209,7 +215,7 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
SVnode *pImpl = vnodeOpen(path, pMgmt->pTfs, pMgmt->msgCb);
|
SVnode *pImpl = vnodeOpen(path, pMgmt->pTfs, pMgmt->msgCb);
|
||||||
if (pImpl == NULL) {
|
if (pImpl == NULL) {
|
||||||
dError("vgId:%d, failed to create vnode since %s", createReq.vgId, terrstr());
|
dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr());
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
@ -217,9 +223,20 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
code = vmOpenVnode(pMgmt, &wrapperCfg, pImpl);
|
code = vmOpenVnode(pMgmt, &wrapperCfg, pImpl);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr());
|
dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr());
|
||||||
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (createReq.isTsma) {
|
||||||
|
SMsgHead *smaMsg = createReq.pTsma;
|
||||||
|
uint32_t contLen = (uint32_t)(htonl(smaMsg->contLen) - sizeof(SMsgHead));
|
||||||
|
if (vnodeProcessCreateTSma(pImpl, POINTER_SHIFT(smaMsg, sizeof(SMsgHead)), contLen) < 0) {
|
||||||
|
dError("vgId:%d, failed to create tsma since %s", createReq.vgId, terrstr());
|
||||||
|
code = terrno;
|
||||||
|
goto _OVER;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
code = vnodeStart(pImpl);
|
code = vnodeStart(pImpl);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("vgId:%d, failed to start sync since %s", createReq.vgId, terrstr());
|
dError("vgId:%d, failed to start sync since %s", createReq.vgId, terrstr());
|
||||||
|
@ -227,7 +244,10 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
code = vmWriteVnodeListToFile(pMgmt);
|
code = vmWriteVnodeListToFile(pMgmt);
|
||||||
if (code != 0) goto _OVER;
|
if (code != 0) {
|
||||||
|
code = terrno;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
|
|
|
@ -293,6 +293,7 @@ typedef struct {
|
||||||
int8_t isTsma;
|
int8_t isTsma;
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
SVnodeGid vnodeGid[TSDB_MAX_REPLICA];
|
SVnodeGid vnodeGid[TSDB_MAX_REPLICA];
|
||||||
|
void* pTsma;
|
||||||
} SVgObj;
|
} SVgObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -472,7 +472,7 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
||||||
} else if (code == 0) {
|
} else if (code == 0) {
|
||||||
mTrace("msg:%p, successfully processed and response", pMsg);
|
mTrace("msg:%p, successfully processed and response", pMsg);
|
||||||
} else {
|
} else {
|
||||||
mDebug("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
mError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
||||||
TMSG_INFO(pMsg->msgType));
|
TMSG_INFO(pMsg->msgType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -409,7 +409,8 @@ static int32_t mndSetCreateSmaRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
|
static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup,
|
||||||
|
SSmaObj *pSma) {
|
||||||
SVnodeGid *pVgid = pVgroup->vnodeGid + 0;
|
SVnodeGid *pVgid = pVgroup->vnodeGid + 0;
|
||||||
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
||||||
if (pDnode == NULL) return -1;
|
if (pDnode == NULL) return -1;
|
||||||
|
@ -419,9 +420,14 @@ static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans,
|
||||||
mndReleaseDnode(pMnode, pDnode);
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
|
||||||
// todo add sma info here
|
// todo add sma info here
|
||||||
|
int32_t smaContLen = 0;
|
||||||
|
void *pSmaReq = mndBuildVCreateSmaReq(pMnode, pVgroup, pSma, &smaContLen);
|
||||||
|
if (pSmaReq == NULL) return -1;
|
||||||
|
pVgroup->pTsma = pSmaReq;
|
||||||
|
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen, false);
|
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen, false);
|
||||||
|
taosMemoryFreeClear(pSmaReq);
|
||||||
if (pReq == NULL) return -1;
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
action.pCont = pReq;
|
action.pCont = pReq;
|
||||||
|
@ -514,7 +520,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
if (mndSetCreateSmaCommitLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaCommitLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaVgroupCommitLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
if (mndSetCreateSmaVgroupCommitLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaRedoActions(pMnode, pTrans, pDb, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaRedoActions(pMnode, pTrans, pDb, &smaObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaVgroupRedoActions(pMnode, pTrans, pDb, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
if (mndSetCreateSmaVgroupRedoActions(pMnode, pTrans, pDb, &streamObj.fixedSinkVg, &smaObj) != 0) goto _OVER;
|
||||||
if (mndAddStreamToTrans(pMnode, &streamObj, pCreate->ast, STREAM_TRIGGER_AT_ONCE, 0, pTrans) != 0) goto _OVER;
|
if (mndAddStreamToTrans(pMnode, &streamObj, pCreate->ast, STREAM_TRIGGER_AT_ONCE, 0, pTrans) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,8 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg
|
||||||
createReq.numOfRetensions = pDb->cfg.numOfRetensions;
|
createReq.numOfRetensions = pDb->cfg.numOfRetensions;
|
||||||
createReq.pRetensions = pDb->cfg.pRetensions;
|
createReq.pRetensions = pDb->cfg.pRetensions;
|
||||||
createReq.standby = standby;
|
createReq.standby = standby;
|
||||||
|
createReq.isTsma = pVgroup->isTsma;
|
||||||
|
createReq.pTsma = pVgroup->pTsma;
|
||||||
|
|
||||||
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
||||||
SReplica *pReplica = &createReq.replicas[v];
|
SReplica *pReplica = &createReq.replicas[v];
|
||||||
|
|
|
@ -5,7 +5,9 @@ target_link_libraries(
|
||||||
PUBLIC sut
|
PUBLIC sut
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(
|
if(NOT TD_WINDOWS)
|
||||||
NAME userTest
|
add_test(
|
||||||
COMMAND userTest
|
NAME userTest
|
||||||
)
|
COMMAND userTest
|
||||||
|
)
|
||||||
|
endif(NOT TD_WINDOWS)
|
||||||
|
|
|
@ -35,7 +35,6 @@ target_sources(
|
||||||
"src/sma/smaTimeRange.c"
|
"src/sma/smaTimeRange.c"
|
||||||
|
|
||||||
# tsdb
|
# tsdb
|
||||||
# "src/tsdb/tsdbTDBImpl.c"
|
|
||||||
"src/tsdb/tsdbCommit.c"
|
"src/tsdb/tsdbCommit.c"
|
||||||
"src/tsdb/tsdbCommit2.c"
|
"src/tsdb/tsdbCommit2.c"
|
||||||
"src/tsdb/tsdbFile.c"
|
"src/tsdb/tsdbFile.c"
|
||||||
|
@ -45,17 +44,17 @@ target_sources(
|
||||||
"src/tsdb/tsdbMemTable2.c"
|
"src/tsdb/tsdbMemTable2.c"
|
||||||
"src/tsdb/tsdbRead.c"
|
"src/tsdb/tsdbRead.c"
|
||||||
"src/tsdb/tsdbReadImpl.c"
|
"src/tsdb/tsdbReadImpl.c"
|
||||||
# "src/tsdb/tsdbSma.c"
|
|
||||||
"src/tsdb/tsdbWrite.c"
|
"src/tsdb/tsdbWrite.c"
|
||||||
"src/tsdb/tsdbSnapshot.c"
|
"src/tsdb/tsdbSnapshot.c"
|
||||||
|
|
||||||
# tq
|
# tq
|
||||||
"src/tq/tq.c"
|
"src/tq/tq.c"
|
||||||
"src/tq/tqExec.c"
|
"src/tq/tqExec.c"
|
||||||
"src/tq/tqCommit.c"
|
"src/tq/tqMeta.c"
|
||||||
"src/tq/tqOffset.c"
|
|
||||||
"src/tq/tqPush.c"
|
|
||||||
"src/tq/tqRead.c"
|
"src/tq/tqRead.c"
|
||||||
|
"src/tq/tqOffset.c"
|
||||||
|
#"src/tq/tqPush.c"
|
||||||
|
#"src/tq/tqCommit.c"
|
||||||
)
|
)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
vnode
|
vnode
|
||||||
|
|
|
@ -68,6 +68,7 @@ void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId);
|
||||||
int32_t vnodeSnapshotReaderOpen(SVnode *pVnode, SVSnapshotReader **ppReader, int64_t sver, int64_t ever);
|
int32_t vnodeSnapshotReaderOpen(SVnode *pVnode, SVSnapshotReader **ppReader, int64_t sver, int64_t ever);
|
||||||
int32_t vnodeSnapshotReaderClose(SVSnapshotReader *pReader);
|
int32_t vnodeSnapshotReaderClose(SVSnapshotReader *pReader);
|
||||||
int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32_t *nData);
|
int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32_t *nData);
|
||||||
|
int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen);
|
||||||
|
|
||||||
// meta
|
// meta
|
||||||
typedef struct SMeta SMeta; // todo: remove
|
typedef struct SMeta SMeta; // todo: remove
|
||||||
|
@ -78,7 +79,7 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags);
|
||||||
void metaReaderClear(SMetaReader *pReader);
|
void metaReaderClear(SMetaReader *pReader);
|
||||||
int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
||||||
int32_t metaReadNext(SMetaReader *pReader);
|
int32_t metaReadNext(SMetaReader *pReader);
|
||||||
const void *metaGetTableTagVal(SMetaEntry *pEntry, int16_t cid);
|
const void *metaGetTableTagVal(SMetaEntry *pEntry, int16_t type, STagVal *tagVal);
|
||||||
|
|
||||||
typedef struct SMetaFltParam {
|
typedef struct SMetaFltParam {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
|
@ -171,13 +172,15 @@ struct SVnodeCfg {
|
||||||
uint64_t szBuf;
|
uint64_t szBuf;
|
||||||
bool isHeap;
|
bool isHeap;
|
||||||
bool isWeak;
|
bool isWeak;
|
||||||
|
int8_t isTsma;
|
||||||
|
int8_t isRsma;
|
||||||
|
int8_t hashMethod;
|
||||||
|
int8_t standby;
|
||||||
STsdbCfg tsdbCfg;
|
STsdbCfg tsdbCfg;
|
||||||
SWalCfg walCfg;
|
SWalCfg walCfg;
|
||||||
SSyncCfg syncCfg;
|
SSyncCfg syncCfg;
|
||||||
uint32_t hashBegin;
|
uint32_t hashBegin;
|
||||||
uint32_t hashEnd;
|
uint32_t hashEnd;
|
||||||
int8_t hashMethod;
|
|
||||||
int8_t standby;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -117,7 +117,7 @@ typedef struct {
|
||||||
} SSmaIdxKey;
|
} SSmaIdxKey;
|
||||||
|
|
||||||
// metaTable ==================
|
// metaTable ==================
|
||||||
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void* pTagData, int8_t type, tb_uid_t uid,
|
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void* pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
||||||
STagIdxKey** ppTagIdxKey, int32_t* nTagIdxKey);
|
STagIdxKey** ppTagIdxKey, int32_t* nTagIdxKey);
|
||||||
|
|
||||||
#ifndef META_REFACT
|
#ifndef META_REFACT
|
||||||
|
|
|
@ -66,12 +66,12 @@ struct STqReadHandle {
|
||||||
// tqPush
|
// tqPush
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
int32_t skipLogNum;
|
int32_t skipLogNum;
|
||||||
int64_t reqOffset;
|
int64_t reqOffset;
|
||||||
SRWLatch lock;
|
SRpcHandleInfo info;
|
||||||
SRpcMsg* handle;
|
SRWLatch lock;
|
||||||
} STqPushHandle;
|
} STqPushHandle;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -168,6 +168,13 @@ int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalHead*
|
||||||
|
|
||||||
int32_t tqDataExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataBlkRsp* pRsp, int32_t workerId);
|
int32_t tqDataExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataBlkRsp* pRsp, int32_t workerId);
|
||||||
|
|
||||||
|
// tqMeta
|
||||||
|
|
||||||
|
int32_t tqMetaOpen(STQ* pTq);
|
||||||
|
int32_t tqMetaClose(STQ* pTq);
|
||||||
|
int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle);
|
||||||
|
int32_t tqMetaDeleteHandle(STQ* pTq, const char* key);
|
||||||
|
|
||||||
// tqOffset
|
// tqOffset
|
||||||
STqOffsetStore* STqOffsetOpen(STqOffsetCfg*);
|
STqOffsetStore* STqOffsetOpen(STqOffsetCfg*);
|
||||||
void STqOffsetClose(STqOffsetStore*);
|
void STqOffsetClose(STqOffsetStore*);
|
||||||
|
|
|
@ -32,14 +32,27 @@ extern "C" {
|
||||||
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
typedef struct TSDBROW TSDBROW;
|
||||||
|
typedef struct TSDBKEY TSDBKEY;
|
||||||
|
typedef struct SDelOp SDelOp;
|
||||||
|
|
||||||
|
static int tsdbKeyCmprFn(const void *p1, const void *p2);
|
||||||
|
|
||||||
|
// tsdbMemTable2.c ==============================================================================================
|
||||||
|
typedef struct SMemTable SMemTable;
|
||||||
|
|
||||||
|
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTable);
|
||||||
|
void tsdbMemTableDestroy2(SMemTable *pMemTable);
|
||||||
|
|
||||||
// tsdbMemTable ================
|
// tsdbMemTable ================
|
||||||
|
typedef struct STsdbRow STsdbRow;
|
||||||
typedef struct STbData STbData;
|
typedef struct STbData STbData;
|
||||||
typedef struct STsdbMemTable STsdbMemTable;
|
typedef struct STsdbMemTable STsdbMemTable;
|
||||||
typedef struct SMergeInfo SMergeInfo;
|
typedef struct SMergeInfo SMergeInfo;
|
||||||
typedef struct STable STable;
|
typedef struct STable STable;
|
||||||
|
|
||||||
int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable);
|
int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable);
|
||||||
void tsdbMemTableDestroy(STsdb *pTsdb, STsdbMemTable *pMemTable);
|
void tsdbMemTableDestroy(STsdbMemTable *pMemTable);
|
||||||
int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead,
|
int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead,
|
||||||
SDataCols *pCols, TKEY *filterKeys, int nFilterKeys, bool keepDup, SMergeInfo *pMergeInfo);
|
SDataCols *pCols, TKEY *filterKeys, int nFilterKeys, bool keepDup, SMergeInfo *pMergeInfo);
|
||||||
|
|
||||||
|
@ -845,6 +858,42 @@ static FORCE_INLINE int tsdbUnLockFS(STsdbFS *pFs) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TSDBROW {
|
||||||
|
int64_t version;
|
||||||
|
STSRow2 tsRow;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TSDBKEY {
|
||||||
|
int64_t version;
|
||||||
|
TSKEY ts;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SDelOp {
|
||||||
|
int64_t version;
|
||||||
|
TSKEY sKey; // included
|
||||||
|
TSKEY eKey; // included
|
||||||
|
SDelOp *pNext;
|
||||||
|
};
|
||||||
|
|
||||||
|
static FORCE_INLINE int tsdbKeyCmprFn(const void *p1, const void *p2) {
|
||||||
|
TSDBKEY *pKey1 = (TSDBKEY *)p1;
|
||||||
|
TSDBKEY *pKey2 = (TSDBKEY *)p2;
|
||||||
|
|
||||||
|
if (pKey1->ts < pKey2->ts) {
|
||||||
|
return -1;
|
||||||
|
} else if (pKey1->ts > pKey2->ts) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pKey1->version < pKey2->version) {
|
||||||
|
return -1;
|
||||||
|
} else if (pKey1->version > pKey2->version) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -239,6 +239,8 @@ struct SVnode {
|
||||||
#define VND_RSMA1(vnd) ((vnd)->pSma->pRSmaTsdb1)
|
#define VND_RSMA1(vnd) ((vnd)->pSma->pRSmaTsdb1)
|
||||||
#define VND_RSMA2(vnd) ((vnd)->pSma->pRSmaTsdb2)
|
#define VND_RSMA2(vnd) ((vnd)->pSma->pRSmaTsdb2)
|
||||||
#define VND_RETENTIONS(vnd) (&(vnd)->config.tsdbCfg.retentions)
|
#define VND_RETENTIONS(vnd) (&(vnd)->config.tsdbCfg.retentions)
|
||||||
|
#define VND_IS_RSMA(v) ((v)->config.isRsma == 1)
|
||||||
|
#define VND_IS_TSMA(v) ((v)->config.isTsma == 1)
|
||||||
|
|
||||||
struct STbUidStore {
|
struct STbUidStore {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
|
@ -271,11 +273,6 @@ struct SSma {
|
||||||
#define SMA_RSMA_TSDB1(s) ((s)->pRSmaTsdb1)
|
#define SMA_RSMA_TSDB1(s) ((s)->pRSmaTsdb1)
|
||||||
#define SMA_RSMA_TSDB2(s) ((s)->pRSmaTsdb2)
|
#define SMA_RSMA_TSDB2(s) ((s)->pRSmaTsdb2)
|
||||||
|
|
||||||
static FORCE_INLINE bool vnodeIsRollup(SVnode* pVnode) {
|
|
||||||
SRetention* pRetention = &(pVnode->config.tsdbCfg.retentions[0]);
|
|
||||||
return (pRetention->freq > 0 && pRetention->keep > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// sma
|
// sma
|
||||||
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
|
||||||
if (tEncodeI64(pCoder, pME->ctbEntry.ctime) < 0) return -1;
|
if (tEncodeI64(pCoder, pME->ctbEntry.ctime) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pME->ctbEntry.ttlDays) < 0) return -1;
|
if (tEncodeI32(pCoder, pME->ctbEntry.ttlDays) < 0) return -1;
|
||||||
if (tEncodeI64(pCoder, pME->ctbEntry.suid) < 0) return -1;
|
if (tEncodeI64(pCoder, pME->ctbEntry.suid) < 0) return -1;
|
||||||
if (tEncodeBinary(pCoder, pME->ctbEntry.pTags, kvRowLen(pME->ctbEntry.pTags)) < 0) return -1;
|
if (tEncodeTag(pCoder, (const STag *)pME->ctbEntry.pTags) < 0) return -1;
|
||||||
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tEncodeI64(pCoder, pME->ntbEntry.ctime) < 0) return -1;
|
if (tEncodeI64(pCoder, pME->ntbEntry.ctime) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pME->ntbEntry.ttlDays) < 0) return -1;
|
if (tEncodeI32(pCoder, pME->ntbEntry.ttlDays) < 0) return -1;
|
||||||
|
@ -47,7 +47,6 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
|
int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
|
||||||
uint32_t len;
|
|
||||||
if (tStartDecode(pCoder) < 0) return -1;
|
if (tStartDecode(pCoder) < 0) return -1;
|
||||||
|
|
||||||
if (tDecodeI64(pCoder, &pME->version) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->version) < 0) return -1;
|
||||||
|
@ -62,7 +61,7 @@ int metaDecodeEntry(SDecoder *pCoder, SMetaEntry *pME) {
|
||||||
if (tDecodeI64(pCoder, &pME->ctbEntry.ctime) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->ctbEntry.ctime) < 0) return -1;
|
||||||
if (tDecodeI32(pCoder, &pME->ctbEntry.ttlDays) < 0) return -1;
|
if (tDecodeI32(pCoder, &pME->ctbEntry.ttlDays) < 0) return -1;
|
||||||
if (tDecodeI64(pCoder, &pME->ctbEntry.suid) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->ctbEntry.suid) < 0) return -1;
|
||||||
if (tDecodeBinary(pCoder, &pME->ctbEntry.pTags, &len) < 0) return -1; // (TODO)
|
if (tDecodeTag(pCoder, (STag **)&pME->ctbEntry.pTags) < 0) return -1; // (TODO)
|
||||||
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
} else if (pME->type == TSDB_NORMAL_TABLE) {
|
||||||
if (tDecodeI64(pCoder, &pME->ntbEntry.ctime) < 0) return -1;
|
if (tDecodeI64(pCoder, &pME->ntbEntry.ctime) < 0) return -1;
|
||||||
if (tDecodeI32(pCoder, &pME->ntbEntry.ttlDays) < 0) return -1;
|
if (tDecodeI32(pCoder, &pME->ntbEntry.ttlDays) < 0) return -1;
|
||||||
|
|
|
@ -573,10 +573,23 @@ SArray *metaGetSmaTbUids(SMeta *pMeta) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const void *metaGetTableTagVal(SMetaEntry *pEntry, int16_t cid) {
|
const void *metaGetTableTagVal(SMetaEntry *pEntry, int16_t type, STagVal *val) {
|
||||||
ASSERT(pEntry->type == TSDB_CHILD_TABLE);
|
ASSERT(pEntry->type == TSDB_CHILD_TABLE);
|
||||||
return tdGetKVRowValOfCol((const SKVRow)pEntry->ctbEntry.pTags, cid);
|
STag *tag = (STag *)pEntry->ctbEntry.pTags;
|
||||||
|
if (type == TSDB_DATA_TYPE_JSON){
|
||||||
|
if(tag->nTag == 0){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
bool find = tTagGet(tag, val);
|
||||||
|
|
||||||
|
if(!find){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMeta * pMeta;
|
SMeta * pMeta;
|
||||||
TBC * pCur;
|
TBC * pCur;
|
||||||
|
@ -609,7 +622,13 @@ int32_t metaFilteTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) {
|
||||||
STagIdxKey *pKey = NULL;
|
STagIdxKey *pKey = NULL;
|
||||||
int32_t nKey = 0;
|
int32_t nKey = 0;
|
||||||
|
|
||||||
ret = metaCreateTagIdxKey(pCursor->suid, pCursor->cid, param->val, pCursor->type,
|
int32_t nTagData = 0;
|
||||||
|
if(IS_VAR_DATA_TYPE(param->type)){
|
||||||
|
nTagData = strlen(param->val);
|
||||||
|
}else{
|
||||||
|
nTagData = tDataTypes[param->type].bytes;
|
||||||
|
}
|
||||||
|
ret = metaCreateTagIdxKey(pCursor->suid, pCursor->cid, param->val, nTagData, pCursor->type,
|
||||||
param->reverse ? INT64_MAX : INT64_MIN, &pKey, &nKey);
|
param->reverse ? INT64_MAX : INT64_MIN, &pKey, &nKey);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
goto END;
|
goto END;
|
||||||
|
|
|
@ -31,9 +31,9 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
const void *pKey = NULL;
|
const void *pKey = NULL;
|
||||||
const void *pVal = NULL;
|
const void *pVal = NULL;
|
||||||
void * pBuf = NULL;
|
void *pBuf = NULL;
|
||||||
int32_t szBuf = 0;
|
int32_t szBuf = 0;
|
||||||
void * p = NULL;
|
void *p = NULL;
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
|
|
||||||
// validate req
|
// validate req
|
||||||
|
@ -87,7 +87,7 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// drop all child tables
|
// drop all child tables
|
||||||
TBC * pCtbIdxc = NULL;
|
TBC *pCtbIdxc = NULL;
|
||||||
SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
|
SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
|
||||||
|
|
||||||
tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
|
tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
|
||||||
|
@ -142,8 +142,8 @@ _exit:
|
||||||
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
SMetaEntry oStbEntry = {0};
|
SMetaEntry oStbEntry = {0};
|
||||||
SMetaEntry nStbEntry = {0};
|
SMetaEntry nStbEntry = {0};
|
||||||
TBC * pUidIdxc = NULL;
|
TBC *pUidIdxc = NULL;
|
||||||
TBC * pTbDbc = NULL;
|
TBC *pTbDbc = NULL;
|
||||||
const void *pData;
|
const void *pData;
|
||||||
int nData;
|
int nData;
|
||||||
int64_t oversion;
|
int64_t oversion;
|
||||||
|
@ -262,7 +262,7 @@ _err:
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
|
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
|
@ -288,7 +288,7 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int64_t version;
|
int64_t version;
|
||||||
|
@ -324,14 +324,14 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int nVal = 0;
|
int nVal = 0;
|
||||||
const void * pData = NULL;
|
const void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
int64_t oversion;
|
int64_t oversion;
|
||||||
SSchema * pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
SMetaEntry entry = {0};
|
SMetaEntry entry = {0};
|
||||||
SSchemaWrapper *pSchema;
|
SSchemaWrapper *pSchema;
|
||||||
int c;
|
int c;
|
||||||
|
@ -479,7 +479,7 @@ _err:
|
||||||
static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
||||||
SMetaEntry ctbEntry = {0};
|
SMetaEntry ctbEntry = {0};
|
||||||
SMetaEntry stbEntry = {0};
|
SMetaEntry stbEntry = {0};
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int nVal = 0;
|
int nVal = 0;
|
||||||
int ret;
|
int ret;
|
||||||
int c;
|
int c;
|
||||||
|
@ -510,7 +510,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
oversion = *(int64_t *)pData;
|
oversion = *(int64_t *)pData;
|
||||||
|
|
||||||
// search table.db
|
// search table.db
|
||||||
TBC * pTbDbc = NULL;
|
TBC *pTbDbc = NULL;
|
||||||
SDecoder dc1 = {0};
|
SDecoder dc1 = {0};
|
||||||
SDecoder dc2 = {0};
|
SDecoder dc2 = {0};
|
||||||
|
|
||||||
|
@ -534,7 +534,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
metaDecodeEntry(&dc2, &stbEntry);
|
metaDecodeEntry(&dc2, &stbEntry);
|
||||||
|
|
||||||
SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
|
SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
|
||||||
SSchema * pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
int32_t iCol = 0;
|
int32_t iCol = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
pColumn = NULL;
|
pColumn = NULL;
|
||||||
|
@ -563,29 +563,39 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
}
|
}
|
||||||
memcpy((void *)ctbEntry.ctbEntry.pTags, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
memcpy((void *)ctbEntry.ctbEntry.pTags, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
||||||
} else {
|
} else {
|
||||||
SKVRowBuilder kvrb = {0};
|
const STag *pOldTag = (const STag *)ctbEntry.ctbEntry.pTags;
|
||||||
const SKVRow pOldTag = (const SKVRow)ctbEntry.ctbEntry.pTags;
|
STag *pNewTag = NULL;
|
||||||
SKVRow pNewTag = NULL;
|
SArray *pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal));
|
||||||
|
if (!pTagArray) {
|
||||||
tdInitKVRowBuilder(&kvrb);
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
for (int32_t i = 0; i < pTagSchema->nCols; i++) {
|
for (int32_t i = 0; i < pTagSchema->nCols; i++) {
|
||||||
SSchema *pCol = &pTagSchema->pSchema[i];
|
SSchema *pCol = &pTagSchema->pSchema[i];
|
||||||
if (iCol == i) {
|
if (iCol == i) {
|
||||||
tdAddColToKVRow(&kvrb, pCol->colId, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
STagVal val = {0};
|
||||||
|
val.type = pCol->type;
|
||||||
|
val.cid = pCol->colId;
|
||||||
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
|
val.pData = pAlterTbReq->pTagVal;
|
||||||
|
val.nData = pAlterTbReq->nTagVal;
|
||||||
|
} else {
|
||||||
|
memcpy(&val.i64, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
||||||
|
}
|
||||||
|
taosArrayPush(pTagArray, &val);
|
||||||
} else {
|
} else {
|
||||||
void *p = tdGetKVRowValOfCol(pOldTag, pCol->colId);
|
STagVal val = {0};
|
||||||
if (p) {
|
if (tTagGet(pOldTag, &val)) {
|
||||||
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
taosArrayPush(pTagArray, &val);
|
||||||
tdAddColToKVRow(&kvrb, pCol->colId, p, varDataTLen(p));
|
|
||||||
} else {
|
|
||||||
tdAddColToKVRow(&kvrb, pCol->colId, p, pCol->bytes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((terrno = tTagNew(pTagArray, pTagSchema->version, false, &pNewTag)) < 0) {
|
||||||
ctbEntry.ctbEntry.pTags = tdGetKVRowFromBuilder(&kvrb);
|
taosArrayDestroy(pTagArray);
|
||||||
tdDestroyKVRowBuilder(&kvrb);
|
goto _err;
|
||||||
|
}
|
||||||
|
ctbEntry.ctbEntry.pTags = (uint8_t *)pNewTag;
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save to table.db
|
// save to table.db
|
||||||
|
@ -639,8 +649,8 @@ int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) {
|
||||||
|
|
||||||
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
STbDbKey tbDbKey;
|
STbDbKey tbDbKey;
|
||||||
void * pKey = NULL;
|
void *pKey = NULL;
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int kLen = 0;
|
int kLen = 0;
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
SEncoder coder = {0};
|
SEncoder coder = {0};
|
||||||
|
@ -721,17 +731,17 @@ static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), NULL, 0, &pMeta->txn);
|
return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), NULL, 0, &pMeta->txn);
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int8_t type, tb_uid_t uid,
|
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
||||||
STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
|
STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
|
||||||
int32_t nTagData = 0;
|
// int32_t nTagData = 0;
|
||||||
|
|
||||||
if (pTagData) {
|
// if (pTagData) {
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
// if (IS_VAR_DATA_TYPE(type)) {
|
||||||
nTagData = varDataTLen(pTagData);
|
// nTagData = varDataTLen(pTagData);
|
||||||
} else {
|
// } else {
|
||||||
nTagData = tDataTypes[type].bytes;
|
// nTagData = tDataTypes[type].bytes;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
*nTagIdxKey = sizeof(STagIdxKey) + nTagData + sizeof(tb_uid_t);
|
*nTagIdxKey = sizeof(STagIdxKey) + nTagData + sizeof(tb_uid_t);
|
||||||
|
|
||||||
*ppTagIdxKey = (STagIdxKey *)taosMemoryMalloc(*nTagIdxKey);
|
*ppTagIdxKey = (STagIdxKey *)taosMemoryMalloc(*nTagIdxKey);
|
||||||
|
@ -755,14 +765,15 @@ static void metaDestroyTagIdxKey(STagIdxKey *pTagIdxKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
STbDbKey tbDbKey = {0};
|
STbDbKey tbDbKey = {0};
|
||||||
SMetaEntry stbEntry = {0};
|
SMetaEntry stbEntry = {0};
|
||||||
STagIdxKey * pTagIdxKey = NULL;
|
STagIdxKey *pTagIdxKey = NULL;
|
||||||
int32_t nTagIdxKey;
|
int32_t nTagIdxKey;
|
||||||
const SSchema *pTagColumn; // = &stbEntry.stbEntry.schema.pSchema[0];
|
const SSchema *pTagColumn; // = &stbEntry.stbEntry.schema.pSchema[0];
|
||||||
const void * pTagData = NULL; //
|
const void *pTagData = NULL; //
|
||||||
|
int32_t nTagData = 0;
|
||||||
SDecoder dc = {0};
|
SDecoder dc = {0};
|
||||||
|
|
||||||
// get super table
|
// get super table
|
||||||
|
@ -775,7 +786,21 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
metaDecodeEntry(&dc, &stbEntry);
|
metaDecodeEntry(&dc, &stbEntry);
|
||||||
|
|
||||||
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
|
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
|
||||||
pTagData = tdGetKVRowValOfCol((const SKVRow)pCtbEntry->ctbEntry.pTags, pTagColumn->colId);
|
|
||||||
|
STagVal tagVal = {.cid = pTagColumn->colId};
|
||||||
|
if (pTagColumn->type != TSDB_DATA_TYPE_JSON) {
|
||||||
|
tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
|
||||||
|
if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
|
||||||
|
pTagData = tagVal.pData;
|
||||||
|
nTagData = (int32_t)tagVal.nData;
|
||||||
|
} else {
|
||||||
|
pTagData = &(tagVal.i64);
|
||||||
|
nTagData = tDataTypes[pTagColumn->type].bytes;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// pTagData = pCtbEntry->ctbEntry.pTags;
|
||||||
|
// nTagData = ((const STag *)pCtbEntry->ctbEntry.pTags)->len;
|
||||||
|
}
|
||||||
|
|
||||||
// update tag index
|
// update tag index
|
||||||
#ifdef USE_INVERTED_INDEX
|
#ifdef USE_INVERTED_INDEX
|
||||||
|
@ -790,8 +815,8 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
int ret = indexPut((SIndex *)pMeta->pTagIvtIdx, tmGroup, tuid);
|
int ret = indexPut((SIndex *)pMeta->pTagIvtIdx, tmGroup, tuid);
|
||||||
indexMultiTermDestroy(tmGroup);
|
indexMultiTermDestroy(tmGroup);
|
||||||
#else
|
#else
|
||||||
if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, pTagColumn->type, pCtbEntry->uid,
|
if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type,
|
||||||
&pTagIdxKey, &nTagIdxKey) < 0) {
|
pCtbEntry->uid, &pTagIdxKey, &nTagIdxKey) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
|
tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
|
||||||
|
@ -804,7 +829,7 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
|
|
||||||
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
SEncoder coder = {0};
|
SEncoder coder = {0};
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
int rcode = 0;
|
int rcode = 0;
|
||||||
SSkmDbKey skmDbKey = {0};
|
SSkmDbKey skmDbKey = {0};
|
||||||
|
|
|
@ -104,7 +104,7 @@ int32_t smaOpen(SVnode *pVnode) {
|
||||||
taosThreadMutexInit(&pSma->mutex, NULL);
|
taosThreadMutexInit(&pSma->mutex, NULL);
|
||||||
pSma->locked = false;
|
pSma->locked = false;
|
||||||
|
|
||||||
if (vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
STsdbKeepCfg keepCfg = {0};
|
STsdbKeepCfg keepCfg = {0};
|
||||||
for (int i = 0; i < TSDB_RETENTION_MAX; ++i) {
|
for (int i = 0; i < TSDB_RETENTION_MAX; ++i) {
|
||||||
if (i == TSDB_RETENTION_L0) {
|
if (i == TSDB_RETENTION_L0) {
|
||||||
|
|
|
@ -414,7 +414,7 @@ static FORCE_INLINE int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int3
|
||||||
}
|
}
|
||||||
taosMemoryFreeClear(pReq);
|
taosMemoryFreeClear(pReq);
|
||||||
} else {
|
} else {
|
||||||
smaWarn("vgId:%d no rsma % " PRIi8 " data generated since %s", SMA_VID(pSma), level, tstrerror(terrno));
|
smaDebug("vgId:%d no rsma % " PRIi8 " data generated since %s", SMA_VID(pSma), level, tstrerror(terrno));
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pResult);
|
taosArrayDestroy(pResult);
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
#include "tdbInt.h"
|
|
||||||
|
|
||||||
int32_t tqInit() {
|
int32_t tqInit() {
|
||||||
int8_t old;
|
int8_t old;
|
||||||
|
@ -47,51 +46,6 @@ void tqCleanUp() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int tqExecKeyCompare(const void* pKey1, int32_t kLen1, const void* pKey2, int32_t kLen2) {
|
|
||||||
return strcmp(pKey1, pKey2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqStoreHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
|
|
||||||
int32_t code;
|
|
||||||
int32_t vlen;
|
|
||||||
tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code);
|
|
||||||
ASSERT(code == 0);
|
|
||||||
|
|
||||||
void* buf = taosMemoryCalloc(1, vlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
SEncoder encoder;
|
|
||||||
tEncoderInit(&encoder, buf, vlen);
|
|
||||||
|
|
||||||
if (tEncodeSTqHandle(&encoder, pHandle) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TXN txn;
|
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
tEncoderClear(&encoder);
|
|
||||||
taosMemoryFree(buf);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
||||||
STQ* pTq = taosMemoryMalloc(sizeof(STQ));
|
STQ* pTq = taosMemoryMalloc(sizeof(STQ));
|
||||||
if (pTq == NULL) {
|
if (pTq == NULL) {
|
||||||
|
@ -108,60 +62,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
||||||
|
|
||||||
pTq->pushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK);
|
pTq->pushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK);
|
||||||
|
|
||||||
if (tdbOpen(path, 16 * 1024, 1, &pTq->pMetaStore) < 0) {
|
if (tqMetaOpen(pTq) < 0) {
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbOpen("handles", -1, -1, tqExecKeyCompare, pTq->pMetaStore, &pTq->pExecStore) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TXN txn;
|
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TBC* pCur;
|
|
||||||
if (tdbTbcOpen(pTq->pExecStore, &pCur, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pKey;
|
|
||||||
int kLen;
|
|
||||||
void* pVal;
|
|
||||||
int vLen;
|
|
||||||
|
|
||||||
tdbTbcMoveToFirst(pCur);
|
|
||||||
SDecoder decoder;
|
|
||||||
|
|
||||||
while (tdbTbcNext(pCur, &pKey, &kLen, &pVal, &vLen) == 0) {
|
|
||||||
STqHandle handle;
|
|
||||||
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
|
|
||||||
tDecodeSTqHandle(&decoder, &handle);
|
|
||||||
handle.pWalReader = walOpenReadHandle(pTq->pVnode->pWal);
|
|
||||||
for (int32_t i = 0; i < 5; i++) {
|
|
||||||
handle.execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta);
|
|
||||||
}
|
|
||||||
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
for (int32_t i = 0; i < 5; i++) {
|
|
||||||
SReadHandle reader = {
|
|
||||||
.reader = handle.execHandle.pExecReader[i],
|
|
||||||
.meta = pTq->pVnode->pMeta,
|
|
||||||
.pMsgCb = &pTq->pVnode->msgCb,
|
|
||||||
};
|
|
||||||
handle.execHandle.exec.execCol.task[i] =
|
|
||||||
qCreateStreamExecTaskInfo(handle.execHandle.exec.execCol.qmsg, &reader);
|
|
||||||
ASSERT(handle.execHandle.exec.execCol.task[i]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
handle.execHandle.exec.execDb.pFilterOutTbUid =
|
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
|
||||||
}
|
|
||||||
taosHashPut(pTq->handles, pKey, kLen, &handle, sizeof(STqHandle));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTxnClose(&txn) < 0) {
|
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,46 +75,12 @@ void tqClose(STQ* pTq) {
|
||||||
taosHashCleanup(pTq->handles);
|
taosHashCleanup(pTq->handles);
|
||||||
taosHashCleanup(pTq->pStreamTasks);
|
taosHashCleanup(pTq->pStreamTasks);
|
||||||
taosHashCleanup(pTq->pushMgr);
|
taosHashCleanup(pTq->pushMgr);
|
||||||
tdbClose(pTq->pMetaStore);
|
tqMetaClose(pTq);
|
||||||
taosMemoryFree(pTq);
|
taosMemoryFree(pTq);
|
||||||
}
|
}
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int32_t tEncodeSTqExec(SEncoder* pEncoder, const STqExec* pExec) {
|
|
||||||
if (tStartEncode(pEncoder) < 0) return -1;
|
|
||||||
if (tEncodeCStr(pEncoder, pExec->subKey) < 0) return -1;
|
|
||||||
if (tEncodeI64(pEncoder, pExec->consumerId) < 0) return -1;
|
|
||||||
if (tEncodeI32(pEncoder, pExec->epoch) < 0) return -1;
|
|
||||||
if (tEncodeI8(pEncoder, pExec->subType) < 0) return -1;
|
|
||||||
/*if (tEncodeI8(pEncoder, pExec->withTbName) < 0) return -1;*/
|
|
||||||
/*if (tEncodeI8(pEncoder, pExec->withSchema) < 0) return -1;*/
|
|
||||||
/*if (tEncodeI8(pEncoder, pExec->withTag) < 0) return -1;*/
|
|
||||||
if (pExec->subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
if (tEncodeCStr(pEncoder, pExec->qmsg) < 0) return -1;
|
|
||||||
}
|
|
||||||
tEndEncode(pEncoder);
|
|
||||||
return pEncoder->pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tDecodeSTqExec(SDecoder* pDecoder, STqExec* pExec) {
|
|
||||||
if (tStartDecode(pDecoder) < 0) return -1;
|
|
||||||
if (tDecodeCStrTo(pDecoder, pExec->subKey) < 0) return -1;
|
|
||||||
if (tDecodeI64(pDecoder, &pExec->consumerId) < 0) return -1;
|
|
||||||
if (tDecodeI32(pDecoder, &pExec->epoch) < 0) return -1;
|
|
||||||
if (tDecodeI8(pDecoder, &pExec->subType) < 0) return -1;
|
|
||||||
/*if (tDecodeI8(pDecoder, &pExec->withTbName) < 0) return -1;*/
|
|
||||||
/*if (tDecodeI8(pDecoder, &pExec->withSchema) < 0) return -1;*/
|
|
||||||
/*if (tDecodeI8(pDecoder, &pExec->withTag) < 0) return -1;*/
|
|
||||||
if (pExec->subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
if (tDecodeCStrAlloc(pDecoder, &pExec->qmsg) < 0) return -1;
|
|
||||||
}
|
|
||||||
tEndDecode(pDecoder);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) {
|
int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) {
|
||||||
if (tStartEncode(pEncoder) < 0) return -1;
|
if (tStartEncode(pEncoder) < 0) return -1;
|
||||||
if (tEncodeCStr(pEncoder, pHandle->subKey) < 0) return -1;
|
if (tEncodeCStr(pEncoder, pHandle->subKey) < 0) return -1;
|
||||||
|
@ -290,9 +157,6 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_
|
||||||
|
|
||||||
taosWLockLatch(&pHandle->pushHandle.lock);
|
taosWLockLatch(&pHandle->pushHandle.lock);
|
||||||
|
|
||||||
SRpcMsg* pMsg = atomic_load_ptr(&pHandle->pushHandle.handle);
|
|
||||||
ASSERT(pMsg);
|
|
||||||
|
|
||||||
SMqDataBlkRsp rsp = {0};
|
SMqDataBlkRsp rsp = {0};
|
||||||
rsp.reqOffset = pHandle->pushHandle.reqOffset;
|
rsp.reqOffset = pHandle->pushHandle.reqOffset;
|
||||||
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
||||||
|
@ -318,7 +182,7 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_
|
||||||
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqDataBlkRsp(NULL, &rsp);
|
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqDataBlkRsp(NULL, &rsp);
|
||||||
void* buf = rpcMallocCont(tlen);
|
void* buf = rpcMallocCont(tlen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
pMsg->code = -1;
|
// todo free
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,10 +193,15 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
||||||
tEncodeSMqDataBlkRsp(&abuf, &rsp);
|
tEncodeSMqDataBlkRsp(&abuf, &rsp);
|
||||||
|
|
||||||
SRpcMsg resp = {.info = handleInfo, .pCont = buf, .contLen = tlen, .code = 0};
|
SRpcMsg resp = {
|
||||||
|
.info = pHandle->pushHandle.info,
|
||||||
|
.pCont = buf,
|
||||||
|
.contLen = tlen,
|
||||||
|
.code = 0,
|
||||||
|
};
|
||||||
tmsgSendRsp(&resp);
|
tmsgSendRsp(&resp);
|
||||||
|
|
||||||
atomic_store_ptr(&pHandle->pushHandle.handle, NULL);
|
memset(&pHandle->pushHandle.info, 0, sizeof(SRpcHandleInfo));
|
||||||
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
||||||
|
|
||||||
tqDebug("vg %d offset %ld from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %ld, rspOffset: %ld",
|
tqDebug("vg %d offset %ld from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %ld, rspOffset: %ld",
|
||||||
|
@ -374,7 +243,7 @@ int tqCommit(STQ* pTq) {
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
SMqPollReq* pReq = pMsg->pCont;
|
SMqPollReq* pReq = pMsg->pCont;
|
||||||
int64_t consumerId = pReq->consumerId;
|
int64_t consumerId = pReq->consumerId;
|
||||||
int64_t waitTime = pReq->waitTime;
|
int64_t waitTime = pReq->timeout;
|
||||||
int32_t reqEpoch = pReq->epoch;
|
int32_t reqEpoch = pReq->epoch;
|
||||||
int64_t fetchOffset;
|
int64_t fetchOffset;
|
||||||
|
|
||||||
|
@ -410,24 +279,22 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
|
|
||||||
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
||||||
rsp.blockDataLen = taosArrayInit(0, sizeof(int32_t));
|
rsp.blockDataLen = taosArrayInit(0, sizeof(int32_t));
|
||||||
rsp.blockSchema = taosArrayInit(0, sizeof(void*));
|
|
||||||
rsp.blockTbName = taosArrayInit(0, sizeof(void*));
|
|
||||||
|
|
||||||
rsp.withTbName = pReq->withTbName;
|
rsp.withTbName = pReq->withTbName;
|
||||||
|
if (rsp.withTbName) {
|
||||||
|
rsp.blockTbName = taosArrayInit(0, sizeof(void*));
|
||||||
|
}
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
rsp.withSchema = false;
|
rsp.withSchema = false;
|
||||||
|
|
||||||
rsp.withTag = false;
|
rsp.withTag = false;
|
||||||
} else {
|
} else {
|
||||||
rsp.withSchema = true;
|
rsp.withSchema = true;
|
||||||
|
rsp.blockSchema = taosArrayInit(0, sizeof(void*));
|
||||||
|
|
||||||
rsp.withTag = false;
|
rsp.withTag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*int8_t withTbName = pExec->withTbName;*/
|
|
||||||
/*if (pReq->withTbName != -1) {*/
|
|
||||||
/*withTbName = pReq->withTbName;*/
|
|
||||||
/*}*/
|
|
||||||
/*rsp.withTbName = withTbName;*/
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
||||||
if (consumerEpoch > reqEpoch) {
|
if (consumerEpoch > reqEpoch) {
|
||||||
|
@ -443,15 +310,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
|
|
||||||
SWalReadHead* pHead = &pHeadWithCkSum->head;
|
SWalReadHead* pHead = &pHeadWithCkSum->head;
|
||||||
|
|
||||||
#if 0
|
|
||||||
SWalReadHead* pHead;
|
|
||||||
if (walReadWithHandle_s(pExec->pWalReader, fetchOffset, &pHead) < 0) {
|
|
||||||
// TODO: no more log, set timer to wait blocking time
|
|
||||||
// if data inserted during waiting, launch query and
|
|
||||||
// response to user
|
|
||||||
tqDebug("tmq poll: consumer %ld (epoch %d) vg %d offset %ld, no more log to return", consumerId, pReq->epoch,
|
|
||||||
TD_VID(pTq->pVnode), fetchOffset);
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// add to pushMgr
|
// add to pushMgr
|
||||||
taosWLockLatch(&pExec->pushHandle.lock);
|
taosWLockLatch(&pExec->pushHandle.lock);
|
||||||
|
@ -473,10 +331,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tqDebug("tmq poll: consumer %ld (epoch %d) iter log, vg %d offset %ld msgType %d", consumerId, pReq->epoch,
|
tqDebug("tmq poll: consumer %ld (epoch %d) iter log, vg %d offset %ld msgType %d", consumerId, pReq->epoch,
|
||||||
TD_VID(pTq->pVnode), fetchOffset, pHead->msgType);
|
TD_VID(pTq->pVnode), fetchOffset, pHead->msgType);
|
||||||
|
|
||||||
|
@ -533,8 +387,14 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
// TODO wrap in destroy func
|
// TODO wrap in destroy func
|
||||||
taosArrayDestroy(rsp.blockData);
|
taosArrayDestroy(rsp.blockData);
|
||||||
taosArrayDestroy(rsp.blockDataLen);
|
taosArrayDestroy(rsp.blockDataLen);
|
||||||
taosArrayDestroyP(rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
|
||||||
taosArrayDestroyP(rsp.blockTbName, (FDelete)taosMemoryFree);
|
if (rsp.withSchema) {
|
||||||
|
taosArrayDestroyP(rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsp.withTbName) {
|
||||||
|
taosArrayDestroyP(rsp.blockTbName, (FDelete)taosMemoryFree);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -545,24 +405,9 @@ int32_t tqProcessVgDeleteReq(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
int32_t code = taosHashRemove(pTq->handles, pReq->subKey, strlen(pReq->subKey));
|
int32_t code = taosHashRemove(pTq->handles, pReq->subKey, strlen(pReq->subKey));
|
||||||
ASSERT(code == 0);
|
ASSERT(code == 0);
|
||||||
|
|
||||||
TXN txn;
|
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbDelete(pTq->pExecStore, pReq->subKey, (int)strlen(pReq->subKey), &txn) < 0) {
|
|
||||||
/*ASSERT(0);*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,7 +465,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
atomic_add_fetch_32(&pHandle->epoch, 1);
|
atomic_add_fetch_32(&pHandle->epoch, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tqStoreHandle(pTq, req.subKey, pHandle) < 0) {
|
if (tqMetaSaveHandle(pTq, req.subKey, pHandle) < 0) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -12,3 +12,137 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#include "tdbInt.h"
|
||||||
|
#include "tq.h"
|
||||||
|
|
||||||
|
int tqExecKeyCompare(const void* pKey1, int32_t kLen1, const void* pKey2, int32_t kLen2) {
|
||||||
|
return strcmp(pKey1, pKey2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaOpen(STQ* pTq) {
|
||||||
|
if (tdbOpen(pTq->path, 16 * 1024, 1, &pTq->pMetaStore) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbOpen("handles", -1, -1, tqExecKeyCompare, pTq->pMetaStore, &pTq->pExecStore) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TBC* pCur;
|
||||||
|
if (tdbTbcOpen(pTq->pExecStore, &pCur, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* pKey;
|
||||||
|
int kLen;
|
||||||
|
void* pVal;
|
||||||
|
int vLen;
|
||||||
|
|
||||||
|
tdbTbcMoveToFirst(pCur);
|
||||||
|
SDecoder decoder;
|
||||||
|
|
||||||
|
while (tdbTbcNext(pCur, &pKey, &kLen, &pVal, &vLen) == 0) {
|
||||||
|
STqHandle handle;
|
||||||
|
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
|
||||||
|
tDecodeSTqHandle(&decoder, &handle);
|
||||||
|
handle.pWalReader = walOpenReadHandle(pTq->pVnode->pWal);
|
||||||
|
for (int32_t i = 0; i < 5; i++) {
|
||||||
|
handle.execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta);
|
||||||
|
}
|
||||||
|
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
for (int32_t i = 0; i < 5; i++) {
|
||||||
|
SReadHandle reader = {
|
||||||
|
.reader = handle.execHandle.pExecReader[i],
|
||||||
|
.meta = pTq->pVnode->pMeta,
|
||||||
|
.pMsgCb = &pTq->pVnode->msgCb,
|
||||||
|
};
|
||||||
|
handle.execHandle.exec.execCol.task[i] =
|
||||||
|
qCreateStreamExecTaskInfo(handle.execHandle.exec.execCol.qmsg, &reader);
|
||||||
|
ASSERT(handle.execHandle.exec.execCol.task[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
handle.execHandle.exec.execDb.pFilterOutTbUid =
|
||||||
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
|
}
|
||||||
|
taosHashPut(pTq->handles, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTxnClose(&txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaClose(STQ* pTq) {
|
||||||
|
tdbClose(pTq->pMetaStore);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
|
||||||
|
int32_t code;
|
||||||
|
int32_t vlen;
|
||||||
|
tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
|
||||||
|
void* buf = taosMemoryCalloc(1, vlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SEncoder encoder;
|
||||||
|
tEncoderInit(&encoder, buf, vlen);
|
||||||
|
|
||||||
|
if (tEncodeSTqHandle(&encoder, pHandle) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaDeleteHandle(STQ* pTq, const char* key) {
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbDelete(pTq->pExecStore, key, (int)strlen(key), &txn) < 0) {
|
||||||
|
/*ASSERT(0);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,5 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "tq.h"
|
||||||
|
|
|
@ -238,7 +238,7 @@ static void tsdbStartCommit(STsdb *pRepo) {
|
||||||
|
|
||||||
static void tsdbEndCommit(STsdb *pTsdb, int eno) {
|
static void tsdbEndCommit(STsdb *pTsdb, int eno) {
|
||||||
tsdbEndFSTxn(pTsdb);
|
tsdbEndFSTxn(pTsdb);
|
||||||
tsdbMemTableDestroy(pTsdb, pTsdb->imem);
|
tsdbMemTableDestroy(pTsdb->imem);
|
||||||
pTsdb->imem = NULL;
|
pTsdb->imem = NULL;
|
||||||
tsdbInfo("vgId:%d commit over, %s", REPO_ID(pTsdb), (eno == TSDB_CODE_SUCCESS) ? "succeed" : "failed");
|
tsdbInfo("vgId:%d commit over, %s", REPO_ID(pTsdb), (eno == TSDB_CODE_SUCCESS) ? "succeed" : "failed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
|
@ -60,7 +60,7 @@ int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbMemTableDestroy(STsdb *pTsdb, STsdbMemTable *pMemTable) {
|
void tsdbMemTableDestroy(STsdbMemTable *pMemTable) {
|
||||||
if (pMemTable) {
|
if (pMemTable) {
|
||||||
taosHashCleanup(pMemTable->pHashIdx);
|
taosHashCleanup(pMemTable->pHashIdx);
|
||||||
SSkipListIterator *pIter = tSkipListCreateIter(pMemTable->pSlIdx);
|
SSkipListIterator *pIter = tSkipListCreateIter(pMemTable->pSlIdx);
|
||||||
|
@ -142,69 +142,6 @@ int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter
|
||||||
} else {
|
} else {
|
||||||
fKey = tdGetKey(filterKeys[filterIter]);
|
fKey = tdGetKey(filterKeys[filterIter]);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
} else if (fKey > rowKey) {
|
|
||||||
if (isRowDel) {
|
|
||||||
pMergeInfo->rowsDeleteFailed++;
|
|
||||||
} else {
|
|
||||||
if (pMergeInfo->rowsInserted - pMergeInfo->rowsDeleteSucceed >= maxRowsToRead) break;
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
|
|
||||||
pMergeInfo->rowsInserted++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
}
|
|
||||||
|
|
||||||
tSkipListIterNext(pIter);
|
|
||||||
row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL || TD_ROW_KEY(row) > maxKey) {
|
|
||||||
rowKey = INT64_MAX;
|
|
||||||
isRowDel = false;
|
|
||||||
} else {
|
|
||||||
rowKey = TD_ROW_KEY(row);
|
|
||||||
isRowDel = TD_ROW_IS_DELETED(row);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isRowDel) {
|
|
||||||
ASSERT(!keepDup);
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
pMergeInfo->rowsDeleteSucceed++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
} else {
|
|
||||||
if (keepDup) {
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
pMergeInfo->rowsUpdated++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
} else {
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tSkipListIterNext(pIter);
|
|
||||||
row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL || TD_ROW_KEY(row) > maxKey) {
|
|
||||||
rowKey = INT64_MAX;
|
|
||||||
isRowDel = false;
|
|
||||||
} else {
|
|
||||||
rowKey = TD_ROW_KEY(row);
|
|
||||||
isRowDel = TD_ROW_IS_DELETED(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
filterIter++;
|
|
||||||
if (filterIter >= nFilterKeys) {
|
|
||||||
fKey = INT64_MAX;
|
|
||||||
} else {
|
|
||||||
fKey = tdGetKey(filterKeys[filterIter]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if 1
|
#if 1
|
||||||
} else if (fKey > rowKey) {
|
} else if (fKey > rowKey) {
|
||||||
if (isRowDel) {
|
if (isRowDel) {
|
||||||
|
@ -321,7 +258,7 @@ int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlo
|
||||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(pRsp->tblFName) strcat(pRsp->tblFName, mr.me.name);
|
if (pRsp->tblFName) strcat(pRsp->tblFName, mr.me.name);
|
||||||
|
|
||||||
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
||||||
sverNew = mr.me.ntbEntry.schemaRow.version;
|
sverNew = mr.me.ntbEntry.schemaRow.version;
|
||||||
|
|
|
@ -15,52 +15,308 @@
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
typedef struct SMemTable SMemTable;
|
typedef struct SMemData SMemData;
|
||||||
typedef struct SMemData SMemData;
|
typedef struct SMemSkipList SMemSkipList;
|
||||||
typedef struct SMemSkipList SMemSkipList;
|
typedef struct SMemSkipListNode SMemSkipListNode;
|
||||||
typedef struct SMemSkipListNode SMemSkipListNode;
|
|
||||||
typedef struct SMemSkipListCurosr SMemSkipListCurosr;
|
|
||||||
|
|
||||||
#define SL_MAX_LEVEL 5
|
|
||||||
|
|
||||||
struct SMemTable {
|
|
||||||
STsdb *pTsdb;
|
|
||||||
TSKEY minKey;
|
|
||||||
TSKEY maxKey;
|
|
||||||
int64_t minVer;
|
|
||||||
int64_t maxVer;
|
|
||||||
int64_t nRows;
|
|
||||||
int32_t nHash;
|
|
||||||
int32_t nBucket;
|
|
||||||
SMemData **pBuckets;
|
|
||||||
SMemSkipListCurosr *pSlc;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SMemSkipListNode {
|
struct SMemSkipListNode {
|
||||||
int8_t level;
|
int8_t level;
|
||||||
SMemSkipListNode *forwards[1]; // Windows does not allow 0
|
SMemSkipListNode *forwards[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemSkipList {
|
struct SMemSkipList {
|
||||||
uint32_t seed;
|
uint32_t seed;
|
||||||
int8_t maxLevel;
|
int32_t size;
|
||||||
int8_t level;
|
int8_t maxLevel;
|
||||||
int32_t size;
|
int8_t level;
|
||||||
SMemSkipListNode pHead[1]; // Windows does not allow 0
|
SMemSkipListNode *pHead;
|
||||||
|
SMemSkipListNode *pTail;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemData {
|
struct SMemData {
|
||||||
SMemData *pHashNext;
|
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
TSKEY minKey;
|
TSDBKEY minKey;
|
||||||
TSKEY maxKey;
|
TSDBKEY maxKey;
|
||||||
int64_t minVer;
|
SDelOp *delOpHead;
|
||||||
int64_t maxVer;
|
SDelOp *delOpTail;
|
||||||
int64_t nRows;
|
|
||||||
SMemSkipList sl;
|
SMemSkipList sl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SMemTable {
|
||||||
|
STsdb *pTsdb;
|
||||||
|
int32_t nRef;
|
||||||
|
TSDBKEY minKey;
|
||||||
|
TSDBKEY maxKey;
|
||||||
|
int64_t nRows;
|
||||||
|
SArray *pArray; // SArray<SMemData>
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
||||||
|
#define SL_NODE_HALF_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l))
|
||||||
|
#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
||||||
|
#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
||||||
|
#define SL_NODE_DATA(n) (&SL_NODE_BACKWARD(n, (n)->level))
|
||||||
|
|
||||||
|
#define SL_HEAD_FORWARD(sl, l) SL_NODE_FORWARD((sl)->pHead, l)
|
||||||
|
#define SL_TAIL_BACKWARD(sl, l) SL_NODE_FORWARD((sl)->pTail, l)
|
||||||
|
|
||||||
|
static int32_t tsdbGetOrCreateMemData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, SMemData **ppMemData);
|
||||||
|
static int memDataPCmprFn(const void *p1, const void *p2);
|
||||||
|
static int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
|
||||||
|
static int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow);
|
||||||
|
static int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl);
|
||||||
|
|
||||||
|
// SMemTable ==============================================
|
||||||
|
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTable) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = NULL;
|
||||||
|
|
||||||
|
pMemTable = (SMemTable *)taosMemoryCalloc(1, sizeof(*pMemTable));
|
||||||
|
if (pMemTable == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pMemTable->pTsdb = pTsdb;
|
||||||
|
pMemTable->nRef = 1;
|
||||||
|
pMemTable->minKey = (TSDBKEY){.version = INT64_MAX, .ts = TSKEY_MAX};
|
||||||
|
pMemTable->maxKey = (TSDBKEY){.version = -1, .ts = TSKEY_MIN};
|
||||||
|
pMemTable->nRows = 0;
|
||||||
|
pMemTable->pArray = taosArrayInit(512, sizeof(SMemData *));
|
||||||
|
if (pMemTable->pArray == NULL) {
|
||||||
|
taosMemoryFree(pMemTable);
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppMemTable = pMemTable;
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
*ppMemTable = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsdbMemTableDestroy2(SMemTable *pMemTable) {
|
||||||
|
taosArrayDestroyEx(pMemTable->pArray, NULL /*TODO*/);
|
||||||
|
taosMemoryFree(pMemTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbInsertTableData2(STsdb *pTsdb, int64_t version, SVSubmitBlk *pSubmitBlk) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = (SMemTable *)pTsdb->mem; // TODO
|
||||||
|
SMemData *pMemData;
|
||||||
|
TSDBROW row = {.version = version};
|
||||||
|
|
||||||
|
ASSERT(pMemTable);
|
||||||
|
|
||||||
|
{
|
||||||
|
// check if table exists (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbGetOrCreateMemData(pMemTable, pSubmitBlk->suid, pSubmitBlk->uid, &pMemData);
|
||||||
|
if (code) {
|
||||||
|
tsdbError("vgId:%d failed to create/get table data since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do insert
|
||||||
|
int32_t nt;
|
||||||
|
uint8_t *pt;
|
||||||
|
int32_t n = 0;
|
||||||
|
uint8_t *p = pSubmitBlk->pData;
|
||||||
|
SVBufPool *pPool = pTsdb->pVnode->inUse;
|
||||||
|
int8_t level;
|
||||||
|
SMemSkipListNode *pNode;
|
||||||
|
while (n < pSubmitBlk->nData) {
|
||||||
|
nt = tGetTSRow(p + n, &row.tsRow);
|
||||||
|
n += nt;
|
||||||
|
|
||||||
|
ASSERT(n <= pSubmitBlk->nData);
|
||||||
|
|
||||||
|
// build the node
|
||||||
|
level = tsdbMemSkipListRandLevel(&pMemData->sl);
|
||||||
|
pNode = (SMemSkipListNode *)vnodeBufPoolMalloc(pPool, SL_NODE_SIZE(level) + nt + sizeof(version));
|
||||||
|
if (pNode == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pNode->level = level;
|
||||||
|
tPutTSDBRow((uint8_t *)SL_NODE_DATA(pNode), &row);
|
||||||
|
|
||||||
|
// put the node (todo)
|
||||||
|
|
||||||
|
// set info
|
||||||
|
if (tsdbKeyCmprFn(&row, &pMemData->minKey) < 0) pMemData->minKey = *(TSDBKEY *)&row;
|
||||||
|
if (tsdbKeyCmprFn(&row, &pMemData->maxKey) > 0) pMemData->maxKey = *(TSDBKEY *)&row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tsdbKeyCmprFn(&pMemTable->minKey, &pMemData->minKey) < 0) pMemTable->minKey = pMemData->minKey;
|
||||||
|
if (tsdbKeyCmprFn(&pMemTable->maxKey, &pMemData->maxKey) > 0) pMemTable->maxKey = pMemData->maxKey;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbDeleteTableData2(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = (SMemTable *)pTsdb->mem; // TODO
|
||||||
|
SMemData *pMemData;
|
||||||
|
SVBufPool *pPool = pTsdb->pVnode->inUse;
|
||||||
|
|
||||||
|
ASSERT(pMemTable);
|
||||||
|
|
||||||
|
{
|
||||||
|
// check if table exists (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbGetOrCreateMemData(pMemTable, suid, uid, &pMemData);
|
||||||
|
if (code) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do delete
|
||||||
|
SDelOp *pDelOp = (SDelOp *)vnodeBufPoolMalloc(pPool, sizeof(*pDelOp));
|
||||||
|
if (pDelOp == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pDelOp->version = version;
|
||||||
|
pDelOp->sKey = sKey;
|
||||||
|
pDelOp->eKey = eKey;
|
||||||
|
pDelOp->pNext = NULL;
|
||||||
|
if (pMemData->delOpHead == NULL) {
|
||||||
|
ASSERT(pMemData->delOpTail == NULL);
|
||||||
|
pMemData->delOpHead = pMemData->delOpTail = pDelOp;
|
||||||
|
} else {
|
||||||
|
pMemData->delOpTail->pNext = pDelOp;
|
||||||
|
pMemData->delOpTail = pDelOp;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// update the state of pMemTable, pMemData, last and lastrow (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbDebug("vgId:%d delete data from table suid:%" PRId64 " uid:%" PRId64 " sKey:%" PRId64 " eKey:%" PRId64
|
||||||
|
" since %s",
|
||||||
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbError("vgId:%d failed to delete data from table suid:%" PRId64 " uid:%" PRId64 " sKey:%" PRId64 " eKey:%" PRId64
|
||||||
|
" since %s",
|
||||||
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tsdbGetOrCreateMemData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, SMemData **ppMemData) {
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t idx = 0;
|
||||||
|
SMemData *pMemDataT = &(SMemData){.suid = suid, .uid = uid};
|
||||||
|
SMemData *pMemData = NULL;
|
||||||
|
SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse;
|
||||||
|
int8_t maxLevel = pMemTable->pTsdb->pVnode->config.tsdbCfg.slLevel;
|
||||||
|
|
||||||
|
// get
|
||||||
|
idx = taosArraySearchIdx(pMemTable->pArray, &pMemDataT, memDataPCmprFn, TD_GE);
|
||||||
|
if (idx >= 0) {
|
||||||
|
pMemData = (SMemData *)taosArrayGet(pMemTable->pArray, idx);
|
||||||
|
if (memDataPCmprFn(&pMemDataT, &pMemData) == 0) goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create
|
||||||
|
pMemData = vnodeBufPoolMalloc(pPool, sizeof(*pMemData) + SL_NODE_HALF_SIZE(maxLevel) * 2);
|
||||||
|
if (pMemData == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pMemData->suid = suid;
|
||||||
|
pMemData->uid = uid;
|
||||||
|
pMemData->minKey = (TSDBKEY){.version = INT64_MAX, .ts = TSKEY_MAX};
|
||||||
|
pMemData->maxKey = (TSDBKEY){.version = -1, .ts = TSKEY_MIN};
|
||||||
|
pMemData->delOpHead = pMemData->delOpTail = NULL;
|
||||||
|
pMemData->sl.seed = taosRand();
|
||||||
|
pMemData->sl.size = 0;
|
||||||
|
pMemData->sl.maxLevel = maxLevel;
|
||||||
|
pMemData->sl.level = 0;
|
||||||
|
pMemData->sl.pHead = (SMemSkipListNode *)&pMemData[1];
|
||||||
|
pMemData->sl.pTail = (SMemSkipListNode *)POINTER_SHIFT(pMemData->sl.pHead, SL_NODE_HALF_SIZE(maxLevel));
|
||||||
|
|
||||||
|
for (int8_t iLevel = 0; iLevel < pMemData->sl.maxLevel; iLevel++) {
|
||||||
|
SL_HEAD_FORWARD(&pMemData->sl, iLevel) = pMemData->sl.pTail;
|
||||||
|
SL_TAIL_BACKWARD(&pMemData->sl, iLevel) = pMemData->sl.pHead;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idx < 0) idx = 0;
|
||||||
|
if (taosArrayInsert(pMemTable->pArray, idx, &pMemData) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
*ppMemData = pMemData;
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
*ppMemData = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int memDataPCmprFn(const void *p1, const void *p2) {
|
||||||
|
SMemData *pMemData1 = *(SMemData **)p1;
|
||||||
|
SMemData *pMemData2 = *(SMemData **)p2;
|
||||||
|
|
||||||
|
if (pMemData1->suid < pMemData2->suid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pMemData1->suid > pMemData2->suid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMemData1->uid < pMemData2->uid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pMemData1->uid > pMemData2->uid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
n += tPutI64(p ? p + n : p, pRow->version);
|
||||||
|
n += tPutTSRow(p ? p + n : p, &pRow->tsRow);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
n += tGetI64(p + n, &pRow->version);
|
||||||
|
n += tGetTSRow(p + n, &pRow->tsRow);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) {
|
||||||
|
int8_t level = 1;
|
||||||
|
int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
|
||||||
|
const uint32_t factor = 4;
|
||||||
|
|
||||||
|
while ((taosRandR(&pSl->seed) % factor) == 0 && level < tlevel) {
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 //====================================================================================
|
||||||
|
|
||||||
|
#define SL_MAX_LEVEL 5
|
||||||
|
|
||||||
struct SMemSkipListCurosr {
|
struct SMemSkipListCurosr {
|
||||||
SMemSkipList *pSl;
|
SMemSkipList *pSl;
|
||||||
SMemSkipListNode *pNodes[SL_MAX_LEVEL];
|
SMemSkipListNode *pNodes[SL_MAX_LEVEL];
|
||||||
|
@ -74,12 +330,6 @@ typedef struct {
|
||||||
|
|
||||||
#define HASH_BUCKET(SUID, UID, NBUCKET) (TABS((SUID) + (UID)) % (NBUCKET))
|
#define HASH_BUCKET(SUID, UID, NBUCKET) (TABS((SUID) + (UID)) % (NBUCKET))
|
||||||
|
|
||||||
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
|
||||||
#define SL_NODE_HALF_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l))
|
|
||||||
#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
|
||||||
#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
|
||||||
#define SL_NODE_DATA(n) (&SL_NODE_BACKWARD(n, (n)->level))
|
|
||||||
|
|
||||||
#define SL_HEAD_NODE(sl) ((sl)->pHead)
|
#define SL_HEAD_NODE(sl) ((sl)->pHead)
|
||||||
#define SL_TAIL_NODE(sl) ((SMemSkipListNode *)&SL_NODE_FORWARD(SL_HEAD_NODE(sl), (sl)->maxLevel))
|
#define SL_TAIL_NODE(sl) ((SMemSkipListNode *)&SL_NODE_FORWARD(SL_HEAD_NODE(sl), (sl)->maxLevel))
|
||||||
#define SL_HEAD_NODE_FORWARD(n, l) SL_NODE_FORWARD(n, l)
|
#define SL_HEAD_NODE_FORWARD(n, l) SL_NODE_FORWARD(n, l)
|
||||||
|
@ -99,50 +349,7 @@ static int32_t tsdbMemSkipListCursorMoveToNext(SMemSkipListCurosr *pSlc);
|
||||||
static int32_t tsdbMemSkipListCursorMoveToPrev(SMemSkipListCurosr *pSlc);
|
static int32_t tsdbMemSkipListCursorMoveToPrev(SMemSkipListCurosr *pSlc);
|
||||||
static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipList *pSl, const STsdbRow *pTRow);
|
static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipList *pSl, const STsdbRow *pTRow);
|
||||||
|
|
||||||
// SMemTable
|
// SMemTable ========================
|
||||||
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTb) {
|
|
||||||
SMemTable *pMemTb = NULL;
|
|
||||||
|
|
||||||
pMemTb = taosMemoryCalloc(1, sizeof(*pMemTb));
|
|
||||||
if (pMemTb == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pMemTb->pTsdb = pTsdb;
|
|
||||||
pMemTb->minKey = TSKEY_MAX;
|
|
||||||
pMemTb->maxKey = TSKEY_MIN;
|
|
||||||
pMemTb->minVer = -1;
|
|
||||||
pMemTb->maxVer = -1;
|
|
||||||
pMemTb->nRows = 0;
|
|
||||||
pMemTb->nHash = 0;
|
|
||||||
pMemTb->nBucket = 1024;
|
|
||||||
pMemTb->pBuckets = taosMemoryCalloc(pMemTb->nBucket, sizeof(*pMemTb->pBuckets));
|
|
||||||
if (pMemTb->pBuckets == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (tsdbMemSkipListCursorCreate(pTsdb->pVnode->config.tsdbCfg.slLevel, &pMemTb->pSlc) < 0) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
taosMemoryFree(pMemTb->pBuckets);
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppMemTb = pMemTb;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbMemTableDestroy2(STsdb *pTsdb, SMemTable *pMemTb) {
|
|
||||||
if (pMemTb) {
|
|
||||||
// loop to destroy the contents (todo)
|
|
||||||
tsdbMemSkipListCursorDestroy(pMemTb->pSlc);
|
|
||||||
taosMemoryFree(pMemTb->pBuckets);
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *pSubmitBlk) {
|
int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *pSubmitBlk) {
|
||||||
SMemData *pMemData;
|
SMemData *pMemData;
|
||||||
STsdb *pTsdb = pMemTb->pTsdb;
|
STsdb *pTsdb = pMemTb->pTsdb;
|
||||||
|
@ -253,18 +460,6 @@ int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *p
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) {
|
|
||||||
int8_t level = 1;
|
|
||||||
int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
|
|
||||||
const uint32_t factor = 4;
|
|
||||||
|
|
||||||
while ((taosRandR(&pSl->seed) % factor) == 0 && level < tlevel) {
|
|
||||||
level++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return level;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tsdbEncodeRow(SEncoder *pEncoder, const STsdbRow *pRow) {
|
static FORCE_INLINE int32_t tsdbEncodeRow(SEncoder *pEncoder, const STsdbRow *pRow) {
|
||||||
if (tEncodeI64(pEncoder, pRow->version) < 0) return -1;
|
if (tEncodeI64(pEncoder, pRow->version) < 0) return -1;
|
||||||
if (tEncodeBinary(pEncoder, (const uint8_t *)pRow->pRow, pRow->szRow) < 0) return -1;
|
if (tEncodeBinary(pEncoder, (const uint8_t *)pRow->pRow, pRow->szRow) < 0) return -1;
|
||||||
|
@ -378,3 +573,4 @@ static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipLis
|
||||||
|
|
||||||
return pNode;
|
return pNode;
|
||||||
}
|
}
|
||||||
|
#endif
|
|
@ -333,7 +333,7 @@ static void setQueryTimewindow(STsdbReadHandle* pTsdbReadHandle, SQueryTableData
|
||||||
}
|
}
|
||||||
|
|
||||||
static STsdb* getTsdbByRetentions(SVnode* pVnode, STsdbReadHandle* pReadHandle, TSKEY winSKey, SRetention* retentions) {
|
static STsdb* getTsdbByRetentions(SVnode* pVnode, STsdbReadHandle* pReadHandle, TSKEY winSKey, SRetention* retentions) {
|
||||||
if (vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
int level = 0;
|
int level = 0;
|
||||||
int64_t now = taosGetTimestamp(pVnode->config.tsdbCfg.precision);
|
int64_t now = taosGetTimestamp(pVnode->config.tsdbCfg.precision);
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,128 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ALLOW_FORBID_FUNC
|
|
||||||
|
|
||||||
#include "tsdb.h"
|
|
||||||
|
|
||||||
int32_t tsdbOpenDBEnv(TDB **ppEnv, const char *path) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (path == NULL) return -1;
|
|
||||||
|
|
||||||
ret = tdbOpen(path, 4096, 256, ppEnv); // use as param
|
|
||||||
|
|
||||||
if (ret != 0) {
|
|
||||||
tsdbError("Failed to create tsdb db env, ret = %d", ret);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbCloseDBEnv(TDB *pEnv) { return tdbClose(pEnv); }
|
|
||||||
|
|
||||||
static inline int tsdbSmaKeyCmpr(const void *arg1, int len1, const void *arg2, int len2) {
|
|
||||||
const SSmaKey *pKey1 = (const SSmaKey *)arg1;
|
|
||||||
const SSmaKey *pKey2 = (const SSmaKey *)arg2;
|
|
||||||
|
|
||||||
ASSERT(len1 == len2 && len1 == sizeof(SSmaKey));
|
|
||||||
|
|
||||||
if (pKey1->skey < pKey2->skey) {
|
|
||||||
return -1;
|
|
||||||
} else if (pKey1->skey > pKey2->skey) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (pKey1->groupId < pKey2->groupId) {
|
|
||||||
return -1;
|
|
||||||
} else if (pKey1->groupId > pKey2->groupId) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbOpenDBDb(TTB **ppDB, TDB *pEnv, const char *pFName) {
|
|
||||||
int ret;
|
|
||||||
tdb_cmpr_fn_t compFunc;
|
|
||||||
|
|
||||||
// Create a database
|
|
||||||
compFunc = tsdbSmaKeyCmpr;
|
|
||||||
ret = tdbTbOpen(pFName, -1, -1, compFunc, pEnv, ppDB);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbCloseDBDb(TTB *pDB) { return tdbTbClose(pDB); }
|
|
||||||
|
|
||||||
int32_t tsdbOpenDBF(TDB *pEnv, SDBFile *pDBF) {
|
|
||||||
// TEnv is shared by a group of SDBFile
|
|
||||||
if (!pEnv || !pDBF) {
|
|
||||||
terrno = TSDB_CODE_INVALID_PTR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open DBF
|
|
||||||
if (tsdbOpenDBDb(&(pDBF->pDB), pEnv, pDBF->path) < 0) {
|
|
||||||
terrno = TSDB_CODE_TDB_INIT_FAILED;
|
|
||||||
tsdbCloseDBDb(pDBF->pDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbCloseDBF(SDBFile *pDBF) {
|
|
||||||
int32_t ret = 0;
|
|
||||||
if (pDBF->pDB) {
|
|
||||||
ret = tsdbCloseDBDb(pDBF->pDB);
|
|
||||||
pDBF->pDB = NULL;
|
|
||||||
}
|
|
||||||
taosMemoryFreeClear(pDBF->path);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbSaveSmaToDB(SDBFile *pDBF, void *pKey, int32_t keyLen, void *pVal, int32_t valLen, TXN *txn) {
|
|
||||||
int32_t ret;
|
|
||||||
|
|
||||||
ret = tdbTbInsert(pDBF->pDB, pKey, keyLen, pVal, valLen, txn);
|
|
||||||
if (ret < 0) {
|
|
||||||
tsdbError("Failed to create insert sma data into db, ret = %d", ret);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *tsdbGetSmaDataByKey(SDBFile *pDBF, const void *pKey, int32_t keyLen, int32_t *valLen) {
|
|
||||||
void *pVal = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = tdbTbGet(pDBF->pDB, pKey, keyLen, &pVal, valLen);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
tsdbError("Failed to get sma data from db, ret = %d", ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(*valLen >= 0);
|
|
||||||
|
|
||||||
// TODO: lock?
|
|
||||||
// TODO: Would the key/value be destoryed during return the data?
|
|
||||||
// TODO: How about the key is updated while value length is changed? The original value buffer would be freed
|
|
||||||
// automatically?
|
|
||||||
|
|
||||||
return pVal;
|
|
||||||
}
|
|
|
@ -56,6 +56,8 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) {
|
||||||
if (tjsonAddIntegerToObject(pJson, "szBuf", pCfg->szBuf) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "szBuf", pCfg->szBuf) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "isHeap", pCfg->isHeap) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "isHeap", pCfg->isHeap) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "isWeak", pCfg->isWeak) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "isWeak", pCfg->isWeak) < 0) return -1;
|
||||||
|
if (tjsonAddIntegerToObject(pJson, "isTsma", pCfg->isTsma) < 0) return -1;
|
||||||
|
if (tjsonAddIntegerToObject(pJson, "isRsma", pCfg->isRsma) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "precision", pCfg->tsdbCfg.precision) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "precision", pCfg->tsdbCfg.precision) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "update", pCfg->tsdbCfg.update) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "update", pCfg->tsdbCfg.update) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "compression", pCfg->tsdbCfg.compression) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "compression", pCfg->tsdbCfg.compression) < 0) return -1;
|
||||||
|
@ -130,6 +132,10 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "isWeak", pCfg->isWeak, code);
|
tjsonGetNumberValue(pJson, "isWeak", pCfg->isWeak, code);
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
|
tjsonGetNumberValue(pJson, "isTsma", pCfg->isTsma, code);
|
||||||
|
if(code < 0) return -1;
|
||||||
|
tjsonGetNumberValue(pJson, "isRsma", pCfg->isRsma, code);
|
||||||
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "precision", pCfg->tsdbCfg.precision, code);
|
tjsonGetNumberValue(pJson, "precision", pCfg->tsdbCfg.precision, code);
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "update", pCfg->tsdbCfg.update, code);
|
tjsonGetNumberValue(pJson, "update", pCfg->tsdbCfg.update, code);
|
||||||
|
|
|
@ -230,7 +230,7 @@ int vnodeCommit(SVnode *pVnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
if (tsdbCommit(VND_RSMA0(pVnode)) < 0) {
|
if (tsdbCommit(VND_RSMA0(pVnode)) < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -250,7 +250,6 @@ int vnodeCommit(SVnode *pVnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (tqCommit(pVnode->pTq) < 0) {
|
if (tqCommit(pVnode->pTq) < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -97,7 +97,7 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// open tsdb
|
// open tsdb
|
||||||
if (!vnodeIsRollup(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, TSDB_TYPE_TSDB) < 0) {
|
if (!VND_IS_RSMA(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, NULL) < 0) {
|
||||||
vError("vgId:%d failed to open vnode tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
|
vError("vgId:%d failed to open vnode tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -779,8 +779,7 @@ _exit:
|
||||||
|
|
||||||
// TODO: the partial success scenario and the error case
|
// TODO: the partial success scenario and the error case
|
||||||
// TODO: refactor
|
// TODO: refactor
|
||||||
if ((terrno == TSDB_CODE_SUCCESS || terrno == TSDB_CODE_TDB_TABLE_ALREADY_EXIST) &&
|
if ((terrno == TSDB_CODE_SUCCESS) && (pRsp->code == TSDB_CODE_SUCCESS)) {
|
||||||
(pRsp->code == TSDB_CODE_SUCCESS)) {
|
|
||||||
tdProcessRSmaSubmit(pVnode->pSma, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
tdProcessRSmaSubmit(pVnode->pSma, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -791,16 +790,19 @@ static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq
|
||||||
SVCreateTSmaReq req = {0};
|
SVCreateTSmaReq req = {0};
|
||||||
SDecoder coder;
|
SDecoder coder;
|
||||||
|
|
||||||
pRsp->msgType = TDMT_VND_CREATE_SMA_RSP;
|
if (pRsp) {
|
||||||
pRsp->code = TSDB_CODE_SUCCESS;
|
pRsp->msgType = TDMT_VND_CREATE_SMA_RSP;
|
||||||
pRsp->pCont = NULL;
|
pRsp->code = TSDB_CODE_SUCCESS;
|
||||||
pRsp->contLen = 0;
|
pRsp->pCont = NULL;
|
||||||
|
pRsp->contLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// decode and process req
|
// decode and process req
|
||||||
tDecoderInit(&coder, pReq, len);
|
tDecoderInit(&coder, pReq, len);
|
||||||
|
|
||||||
if (tDecodeSVCreateTSmaReq(&coder, &req) < 0) {
|
if (tDecodeSVCreateTSmaReq(&coder, &req) < 0) {
|
||||||
pRsp->code = terrno;
|
terrno = TSDB_CODE_MSG_DECODE_ERROR;
|
||||||
|
if (pRsp) pRsp->code = terrno;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,18 +810,30 @@ static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq
|
||||||
req.timezoneInt = tsTimezone;
|
req.timezoneInt = tsTimezone;
|
||||||
|
|
||||||
if (tdProcessTSmaCreate(pVnode->pSma, version, (const char *)&req) < 0) {
|
if (tdProcessTSmaCreate(pVnode->pSma, version, (const char *)&req) < 0) {
|
||||||
pRsp->code = terrno;
|
if (pRsp) pRsp->code = terrno;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
vDebug("vgId:%d success to create tsma %s:%" PRIi64 " for table %" PRIi64, TD_VID(pVnode), req.indexName,
|
vDebug("vgId:%d success to create tsma %s:%" PRIi64 " version %" PRIi64 " for table %" PRIi64, TD_VID(pVnode),
|
||||||
req.indexUid, req.tableUid);
|
req.indexName, req.indexUid, version, req.tableUid);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
vError("vgId:%d failed to create tsma %s:%" PRIi64 " for table %" PRIi64 " since %s", TD_VID(pVnode), req.indexName,
|
vError("vgId:%d failed to create tsma %s:%" PRIi64 " version %" PRIi64 "for table %" PRIi64 " since %s",
|
||||||
req.indexUid, req.tableUid, terrstr(terrno));
|
TD_VID(pVnode), req.indexName, req.indexUid, version, req.tableUid, terrstr(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief specific for smaDstVnode
|
||||||
|
*
|
||||||
|
* @param pVnode
|
||||||
|
* @param pCont
|
||||||
|
* @param contLen
|
||||||
|
* @return int32_t
|
||||||
|
*/
|
||||||
|
int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen) {
|
||||||
|
return vnodeProcessCreateTSmaReq(pVnode, 1, pCont, contLen, NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -368,7 +368,7 @@ TEST(testCase, tSma_Data_Insert_Query_Test) {
|
||||||
SDiskCfg pDisks = {0};
|
SDiskCfg pDisks = {0};
|
||||||
pDisks.level = 0;
|
pDisks.level = 0;
|
||||||
pDisks.primary = 1;
|
pDisks.primary = 1;
|
||||||
strncpy(pDisks.dir, "/var/lib/taos", TSDB_FILENAME_LEN);
|
strncpy(pDisks.dir, TD_DATA_DIR_PATH, TSDB_FILENAME_LEN);
|
||||||
int32_t numOfDisks = 1;
|
int32_t numOfDisks = 1;
|
||||||
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
||||||
EXPECT_NE(pTsdb->pTfs, nullptr);
|
EXPECT_NE(pTsdb->pTfs, nullptr);
|
||||||
|
|
|
@ -137,7 +137,7 @@ void ctgTestInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
ctgdEnableDebug("api");
|
ctgdEnableDebug("api");
|
||||||
ctgdEnableDebug("meta");
|
ctgdEnableDebug("meta");
|
||||||
|
|
|
@ -313,29 +313,23 @@ void addTagPseudoColumnData(SReadHandle *pHandle, SExprInfo* pPseudoExpr, int32_
|
||||||
if (fmIsScanPseudoColumnFunc(functionId)) {
|
if (fmIsScanPseudoColumnFunc(functionId)) {
|
||||||
setTbNameColData(pHandle->meta, pBlock, pColInfoData, functionId);
|
setTbNameColData(pHandle->meta, pBlock, pColInfoData, functionId);
|
||||||
} else { // these are tags
|
} else { // these are tags
|
||||||
const char* p = NULL;
|
STagVal tagVal = {0};
|
||||||
if (pColInfoData->info.type == TSDB_DATA_TYPE_JSON) {
|
tagVal.cid = pExpr->base.pParam[0].pCol->colId;
|
||||||
const uint8_t* tmp = mr.me.ctbEntry.pTags;
|
const char *p = metaGetTableTagVal(&mr.me, pColInfoData->info.type, &tagVal);
|
||||||
|
|
||||||
char* data = taosMemoryCalloc(kvRowLen(tmp) + 1, 1);
|
char *data = NULL;
|
||||||
if (data == NULL) {
|
if(pColInfoData->info.type != TSDB_DATA_TYPE_JSON && p != NULL){
|
||||||
metaReaderClear(&mr);
|
data = tTagValToData((const STagVal *)p, false);
|
||||||
qError("doTagScan calloc error:%d", kvRowLen(tmp) + 1);
|
}else {
|
||||||
return;
|
data = (char*)p;
|
||||||
}
|
|
||||||
|
|
||||||
*data = TSDB_DATA_TYPE_JSON;
|
|
||||||
memcpy(data + 1, tmp, kvRowLen(tmp));
|
|
||||||
p = data;
|
|
||||||
} else {
|
|
||||||
p = metaGetTableTagVal(&mr.me, pExpr->base.pParam[0].pCol->colId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
||||||
colDataAppend(pColInfoData, i, p, (p == NULL));
|
colDataAppend(pColInfoData, i, data, (data == NULL));
|
||||||
}
|
}
|
||||||
if (pColInfoData->info.type == TSDB_DATA_TYPE_JSON) {
|
if(pColInfoData->info.type != TSDB_DATA_TYPE_JSON && p != NULL &&
|
||||||
taosMemoryFree((void*)p);
|
IS_VAR_DATA_TYPE(((const STagVal *)p)->type) && data){
|
||||||
|
taosMemoryFree(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1589,22 +1583,21 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
|
||||||
STR_TO_VARSTR(str, mr.me.name);
|
STR_TO_VARSTR(str, mr.me.name);
|
||||||
colDataAppend(pDst, count, str, false);
|
colDataAppend(pDst, count, str, false);
|
||||||
} else { // it is a tag value
|
} else { // it is a tag value
|
||||||
if (pDst->info.type == TSDB_DATA_TYPE_JSON) {
|
STagVal val = {0};
|
||||||
const uint8_t* tmp = mr.me.ctbEntry.pTags;
|
val.cid = pExprInfo[j].base.pParam[0].pCol->colId;
|
||||||
// TODO opt perf by realloc memory
|
const char* p = metaGetTableTagVal(&mr.me, pDst->info.type, &val);
|
||||||
char* data = taosMemoryCalloc(kvRowLen(tmp) + 1, 1);
|
|
||||||
if (data == NULL) {
|
|
||||||
qError("%s failed to malloc memory, size:%d", GET_TASKID(pTaskInfo), kvRowLen(tmp) + 1);
|
|
||||||
longjmp(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
*data = TSDB_DATA_TYPE_JSON;
|
char *data = NULL;
|
||||||
memcpy(data + 1, tmp, kvRowLen(tmp));
|
if(pDst->info.type != TSDB_DATA_TYPE_JSON && p != NULL){
|
||||||
colDataAppend(pDst, count, data, false);
|
data = tTagValToData((const STagVal *)p, false);
|
||||||
|
}else {
|
||||||
|
data = (char*)p;
|
||||||
|
}
|
||||||
|
colDataAppend(pDst, count, data, (data == NULL));
|
||||||
|
|
||||||
|
if(pDst->info.type != TSDB_DATA_TYPE_JSON && p != NULL
|
||||||
|
&& IS_VAR_DATA_TYPE(((const STagVal *)p)->type) && data != NULL){
|
||||||
taosMemoryFree(data);
|
taosMemoryFree(data);
|
||||||
} else {
|
|
||||||
const char* p = metaGetTableTagVal(&mr.me, pExprInfo[j].base.pParam[0].pCol->colId);
|
|
||||||
colDataAppend(pDst, count, p, (p == NULL));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1634,8 +1627,8 @@ static void destroyTagScanOperatorInfo(void* param, int32_t numOfOutput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, SExprInfo* pExpr, int32_t numOfOutput,
|
SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, SExprInfo* pExpr, int32_t numOfOutput,
|
||||||
SSDataBlock* pResBlock, SArray* pColMatchInfo,
|
SSDataBlock* pResBlock, SArray* pColMatchInfo, STableListInfo* pTableListInfo,
|
||||||
STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo) {
|
SExecTaskInfo* pTaskInfo) {
|
||||||
STagScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STagScanInfo));
|
STagScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STagScanInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
|
|
@ -1646,8 +1646,8 @@ bool leastSQRFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInf
|
||||||
|
|
||||||
pInfo->startVal = IS_FLOAT_TYPE(pCtx->param[1].param.nType) ? pCtx->param[1].param.d :
|
pInfo->startVal = IS_FLOAT_TYPE(pCtx->param[1].param.nType) ? pCtx->param[1].param.d :
|
||||||
(double)pCtx->param[1].param.i;
|
(double)pCtx->param[1].param.i;
|
||||||
pInfo->stepVal = IS_FLOAT_TYPE(pCtx->param[1].param.nType) ? pCtx->param[2].param.d :
|
pInfo->stepVal = IS_FLOAT_TYPE(pCtx->param[2].param.nType) ? pCtx->param[2].param.d :
|
||||||
(double)pCtx->param[1].param.i;
|
(double)pCtx->param[2].param.i;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ int32_t getNumOfColumns(const STableMeta* pTableMeta);
|
||||||
int32_t getNumOfTags(const STableMeta* pTableMeta);
|
int32_t getNumOfTags(const STableMeta* pTableMeta);
|
||||||
STableComInfo getTableInfo(const STableMeta* pTableMeta);
|
STableComInfo getTableInfo(const STableMeta* pTableMeta);
|
||||||
STableMeta* tableMetaDup(const STableMeta* pTableMeta);
|
STableMeta* tableMetaDup(const STableMeta* pTableMeta);
|
||||||
int32_t parseJsontoTagData(const char* json, SKVRowBuilder* kvRowBuilder, SMsgBuf* errMsg, int16_t startColId);
|
int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag **ppTag, SMsgBuf* pMsgBuf);
|
||||||
|
|
||||||
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
|
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,15 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define ALLOW_FORBID_FUNC
|
||||||
|
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "parToken.h"
|
#include "parToken.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
#include "parAst.h"
|
#include "parAst.h"
|
||||||
|
|
||||||
|
#define YYSTACKDEPTH 0
|
||||||
}
|
}
|
||||||
|
|
||||||
%syntax_error {
|
%syntax_error {
|
||||||
|
|
|
@ -54,7 +54,6 @@ typedef struct SInsertParseContext {
|
||||||
SMsgBuf msg; // input
|
SMsgBuf msg; // input
|
||||||
STableMeta* pTableMeta; // each table
|
STableMeta* pTableMeta; // each table
|
||||||
SParsedDataColInfo tags; // each table
|
SParsedDataColInfo tags; // each table
|
||||||
SKVRowBuilder tagsBuilder; // each table
|
|
||||||
SVCreateTbReq createTblReq; // each table
|
SVCreateTbReq createTblReq; // each table
|
||||||
SHashObj* pVgroupsHashObj; // global
|
SHashObj* pVgroupsHashObj; // global
|
||||||
SHashObj* pTableBlockHashObj; // global
|
SHashObj* pTableBlockHashObj; // global
|
||||||
|
@ -73,9 +72,10 @@ static uint8_t TRUE_VALUE = (uint8_t)TSDB_TRUE;
|
||||||
static uint8_t FALSE_VALUE = (uint8_t)TSDB_FALSE;
|
static uint8_t FALSE_VALUE = (uint8_t)TSDB_FALSE;
|
||||||
|
|
||||||
typedef struct SKvParam {
|
typedef struct SKvParam {
|
||||||
SKVRowBuilder* builder;
|
int16_t pos;
|
||||||
SSchema* schema;
|
SArray* pTagVals;
|
||||||
char buf[TSDB_MAX_TAGS_LEN];
|
SSchema* schema;
|
||||||
|
char buf[TSDB_MAX_TAGS_LEN];
|
||||||
} SKvParam;
|
} SKvParam;
|
||||||
|
|
||||||
typedef struct SMemParam {
|
typedef struct SMemParam {
|
||||||
|
@ -446,7 +446,7 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t checkAndTrimValue(SToken* pToken, uint32_t type, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
|
static FORCE_INLINE int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
|
||||||
if ((pToken->type != TK_NOW && pToken->type != TK_TODAY && pToken->type != TK_NK_INTEGER &&
|
if ((pToken->type != TK_NOW && pToken->type != TK_TODAY && pToken->type != TK_NK_INTEGER &&
|
||||||
pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT && pToken->type != TK_NK_BOOL &&
|
pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT && pToken->type != TK_NK_BOOL &&
|
||||||
pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT &&
|
pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT &&
|
||||||
|
@ -492,7 +492,7 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
uint64_t uv;
|
uint64_t uv;
|
||||||
char* endptr = NULL;
|
char* endptr = NULL;
|
||||||
|
|
||||||
int32_t code = checkAndTrimValue(pToken, pSchema->type, tmpTokenBuf, pMsgBuf);
|
int32_t code = checkAndTrimValue(pToken, tmpTokenBuf, pMsgBuf);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -641,14 +641,12 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
return func(pMsgBuf, pToken->z, pToken->n, param);
|
return func(pMsgBuf, pToken->z, pToken->n, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_JSON: {
|
case TSDB_DATA_TYPE_JSON: {
|
||||||
if (pToken->n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
if (pToken->n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "json string too long than 4095", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "json string too long than 4095", pToken->z);
|
||||||
}
|
}
|
||||||
return func(pMsgBuf, pToken->z, pToken->n, param);
|
return func(pMsgBuf, pToken->z, pToken->n, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
int64_t tmpVal;
|
int64_t tmpVal;
|
||||||
if (parseTime(end, pToken, timePrec, &tmpVal, pMsgBuf) != TSDB_CODE_SUCCESS) {
|
if (parseTime(end, pToken, timePrec, &tmpVal, pMsgBuf) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -773,99 +771,282 @@ static int32_t parseBoundColumns(SInsertParseContext* pCxt, SParsedDataColInfo*
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t KvRowAppend(SMsgBuf* pMsgBuf, const void* value, int32_t len, void* param) {
|
static void buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTag, int64_t suid) {
|
||||||
SKvParam* pa = (SKvParam*)param;
|
|
||||||
|
|
||||||
int8_t type = pa->schema->type;
|
|
||||||
int16_t colId = pa->schema->colId;
|
|
||||||
|
|
||||||
if (TSDB_DATA_TYPE_JSON == type) {
|
|
||||||
return parseJsontoTagData(value, pa->builder, pMsgBuf, colId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value == NULL) { // it is a null data
|
|
||||||
// tdAppendColValToRow(rb, pa->schema->colId, pa->schema->type, TD_VTYPE_NULL, value, false, pa->toffset,
|
|
||||||
// pa->colIdx);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TSDB_DATA_TYPE_BINARY == type) {
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(pa->buf, value, len);
|
|
||||||
tdAddColToKVRow(pa->builder, colId, pa->buf, varDataTLen(pa->buf));
|
|
||||||
} else if (TSDB_DATA_TYPE_NCHAR == type) {
|
|
||||||
// if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long'
|
|
||||||
int32_t output = 0;
|
|
||||||
if (!taosMbsToUcs4(value, len, (TdUcs4*)varDataVal(pa->buf), pa->schema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
|
||||||
if (errno == E2BIG) {
|
|
||||||
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pa->schema->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
char buf[512] = {0};
|
|
||||||
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
|
||||||
return buildSyntaxErrMsg(pMsgBuf, buf, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
varDataSetLen(pa->buf, output);
|
|
||||||
tdAddColToKVRow(pa->builder, colId, pa->buf, varDataTLen(pa->buf));
|
|
||||||
} else {
|
|
||||||
tdAddColToKVRow(pa->builder, colId, value, TYPE_BYTES[type]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, SKVRow row, int64_t suid) {
|
|
||||||
pTbReq->type = TD_CHILD_TABLE;
|
pTbReq->type = TD_CHILD_TABLE;
|
||||||
pTbReq->name = strdup(tname);
|
pTbReq->name = strdup(tname);
|
||||||
pTbReq->ctb.suid = suid;
|
pTbReq->ctb.suid = suid;
|
||||||
pTbReq->ctb.pTag = row;
|
pTbReq->ctb.pTag = (uint8_t*)pTag;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, STagVal* val,
|
||||||
|
SMsgBuf* pMsgBuf) {
|
||||||
|
int64_t iv;
|
||||||
|
uint64_t uv;
|
||||||
|
char* endptr = NULL;
|
||||||
|
|
||||||
|
if (isNullStr(pToken)) {
|
||||||
|
if (TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && PRIMARYKEY_TIMESTAMP_COL_ID == pSchema->colId) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "primary timestamp should not be null", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
val->cid = pSchema->colId;
|
||||||
|
val->type = pSchema->type;
|
||||||
|
|
||||||
|
switch (pSchema->type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL: {
|
||||||
|
if ((pToken->type == TK_NK_BOOL || pToken->type == TK_NK_STRING) && (pToken->n != 0)) {
|
||||||
|
if (strncmp(pToken->z, "true", pToken->n) == 0) {
|
||||||
|
*(int8_t*)(&val->i64) = TRUE_VALUE;
|
||||||
|
} else if (strncmp(pToken->z, "false", pToken->n) == 0) {
|
||||||
|
*(int8_t*)(&val->i64) = FALSE_VALUE;
|
||||||
|
} else {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
|
||||||
|
}
|
||||||
|
} else if (pToken->type == TK_NK_INTEGER) {
|
||||||
|
*(int8_t*)(&val->i64) = ((taosStr2Int64(pToken->z, NULL, 10) == 0) ? FALSE_VALUE : TRUE_VALUE);
|
||||||
|
} else if (pToken->type == TK_NK_FLOAT) {
|
||||||
|
*(int8_t*)(&val->i64) = ((taosStr2Double(pToken->z, NULL) == 0) ? FALSE_VALUE : TRUE_VALUE);
|
||||||
|
} else {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid tinyint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_TINYINT(iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "tinyint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*(int8_t*)(&val->i64) = iv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned tinyint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UTINYINT(uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned tinyint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(uint8_t*)(&val->i64) = uv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid smallint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_SMALLINT(iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "smallint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(int16_t*)(&val->i64) = iv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned smallint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_USMALLINT(uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned smallint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(uint16_t*)(&val->i64) = uv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_INT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid int data", pToken->z);
|
||||||
|
} else if (!IS_VALID_INT(iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "int data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(int32_t*)(&val->i64) = iv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned int data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UINT(uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned int data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(uint32_t*)(&val->i64) = uv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_BIGINT(iv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "bigint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
val->i64 = iv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned bigint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UBIGINT(uv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "unsigned bigint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
*(uint64_t*)(&val->i64) = uv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
|
double dv;
|
||||||
|
if (TK_NK_ILLEGAL == toDouble(pToken, &dv, &endptr)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "illegal float data", pToken->z);
|
||||||
|
}
|
||||||
|
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || dv > FLT_MAX || dv < -FLT_MAX || isinf(dv) ||
|
||||||
|
isnan(dv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "illegal float data", pToken->z);
|
||||||
|
}
|
||||||
|
*(float*)(&val->i64) = dv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
double dv;
|
||||||
|
if (TK_NK_ILLEGAL == toDouble(pToken, &dv, &endptr)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "illegal double data", pToken->z);
|
||||||
|
}
|
||||||
|
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || isinf(dv) || isnan(dv)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "illegal double data", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*(double*)(&val->i64) = dv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
|
// Too long values will raise the invalid sql error message
|
||||||
|
if (pToken->n + VARSTR_HEADER_SIZE > pSchema->bytes) {
|
||||||
|
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
|
||||||
|
}
|
||||||
|
val->pData = pToken->z;
|
||||||
|
val->nData = pToken->n;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
|
int32_t output = 0;
|
||||||
|
void* p = taosMemoryCalloc(1, pToken->n * TSDB_NCHAR_SIZE);
|
||||||
|
if (p == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (!taosMbsToUcs4(pToken->z, pToken->n, (TdUcs4*)(p), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
|
if (errno == E2BIG) {
|
||||||
|
taosMemoryFree(p);
|
||||||
|
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
|
||||||
|
}
|
||||||
|
char buf[512] = {0};
|
||||||
|
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
||||||
|
taosMemoryFree(p);
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, buf, pToken->z);
|
||||||
|
}
|
||||||
|
val->pData = p;
|
||||||
|
val->nData = output;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
|
if (parseTime(end, pToken, timePrec, &iv, pMsgBuf) != TSDB_CODE_SUCCESS) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
val->i64 = iv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pSql -> tag1_value, ...)
|
// pSql -> tag1_value, ...)
|
||||||
static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint8_t precision, const char* tName) {
|
static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint8_t precision, const char* tName) {
|
||||||
if (tdInitKVRowBuilder(&pCxt->tagsBuilder) < 0) {
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
SArray* pTagVals = taosArrayInit(pCxt->tags.numOfBound, sizeof(STagVal));
|
||||||
}
|
SToken sToken;
|
||||||
|
bool isParseBindParam = false;
|
||||||
SKvParam param = {.builder = &pCxt->tagsBuilder};
|
bool isJson = false;
|
||||||
SToken sToken;
|
STag* pTag = NULL;
|
||||||
bool isParseBindParam = false;
|
|
||||||
char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // used for deleting Escape character: \\, \', \"
|
|
||||||
for (int i = 0; i < pCxt->tags.numOfBound; ++i) {
|
for (int i = 0; i < pCxt->tags.numOfBound; ++i) {
|
||||||
NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
|
NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
|
||||||
|
|
||||||
if (sToken.type == TK_NK_QUESTION) {
|
if (sToken.type == TK_NK_QUESTION) {
|
||||||
isParseBindParam = true;
|
isParseBindParam = true;
|
||||||
if (NULL == pCxt->pStmtCb) {
|
if (NULL == pCxt->pStmtCb) {
|
||||||
return buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", sToken.z);
|
code = buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", sToken.z);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isParseBindParam) {
|
if (isParseBindParam) {
|
||||||
return buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and tag values");
|
code = buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and tag values");
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
|
SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
|
||||||
param.schema = pTagSchema;
|
char* tmpTokenBuf = taosMemoryCalloc(1, sToken.n); // this can be optimize with parse column
|
||||||
CHECK_CODE(
|
code = checkAndTrimValue(&sToken, tmpTokenBuf, &pCxt->msg);
|
||||||
parseValueToken(&pCxt->pSql, &sToken, pTagSchema, precision, tmpTokenBuf, KvRowAppend, ¶m, &pCxt->msg));
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
if (sToken.n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
code = buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", sToken.z);
|
||||||
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
code = parseJsontoTagData(sToken.z, pTagVals, &pTag, &pCxt->msg);
|
||||||
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
isJson = true;
|
||||||
|
} else {
|
||||||
|
STagVal val = {0};
|
||||||
|
code = parseTagToken(&pCxt->pSql, &sToken, pTagSchema, precision, &val, &pCxt->msg);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (pTagSchema->type != TSDB_DATA_TYPE_BINARY) {
|
||||||
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
}
|
||||||
|
taosArrayPush(pTagVals, &val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isParseBindParam) {
|
if (isParseBindParam) {
|
||||||
return TSDB_CODE_SUCCESS;
|
code = TSDB_CODE_SUCCESS;
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&pCxt->tagsBuilder);
|
if (!isJson && (code = tTagNew(pTagVals, 1, false, &pTag)) != TSDB_CODE_SUCCESS) {
|
||||||
if (NULL == row) {
|
goto end;
|
||||||
return buildInvalidOperationMsg(&pCxt->msg, "out of memory");
|
|
||||||
}
|
}
|
||||||
tdSortKVRowByColIdx(row);
|
|
||||||
|
|
||||||
return buildCreateTbReq(&pCxt->createTblReq, tName, row, pCxt->pTableMeta->suid);
|
buildCreateTbReq(&pCxt->createTblReq, tName, pTag, pCxt->pTableMeta->suid);
|
||||||
|
|
||||||
|
end:
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
|
||||||
|
STagVal* p = (STagVal*)taosArrayGet(pTagVals, i);
|
||||||
|
if (IS_VAR_DATA_TYPE(p->type)) {
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
|
static int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
|
||||||
|
@ -1082,7 +1263,6 @@ void destroyCreateSubTbReq(SVCreateTbReq* pReq) {
|
||||||
static void destroyInsertParseContextForTable(SInsertParseContext* pCxt) {
|
static void destroyInsertParseContextForTable(SInsertParseContext* pCxt) {
|
||||||
taosMemoryFreeClear(pCxt->pTableMeta);
|
taosMemoryFreeClear(pCxt->pTableMeta);
|
||||||
destroyBoundColumnInfo(&pCxt->tags);
|
destroyBoundColumnInfo(&pCxt->tags);
|
||||||
tdDestroyKVRowBuilder(&pCxt->tagsBuilder);
|
|
||||||
destroyCreateSubTbReq(&pCxt->createTblReq);
|
destroyCreateSubTbReq(&pCxt->createTblReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1516,46 +1696,93 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SKVRowBuilder tagBuilder;
|
SArray* pTagArray = taosArrayInit(tags->numOfBound, sizeof(STagVal));
|
||||||
if (tdInitKVRowBuilder(&tagBuilder) < 0) {
|
if (!pTagArray) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return buildInvalidOperationMsg(&pBuf, "out of memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SSchema* pSchema = pDataBlock->pTableMeta->schema;
|
SSchema* pSchema = pDataBlock->pTableMeta->schema;
|
||||||
SKvParam param = {.builder = &tagBuilder};
|
|
||||||
|
bool isJson = false;
|
||||||
|
STag* pTag = NULL;
|
||||||
|
|
||||||
for (int c = 0; c < tags->numOfBound; ++c) {
|
for (int c = 0; c < tags->numOfBound; ++c) {
|
||||||
if (bind[c].is_null && bind[c].is_null[0]) {
|
if (bind[c].is_null && bind[c].is_null[0]) {
|
||||||
KvRowAppend(&pBuf, NULL, 0, ¶m);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = &pSchema[tags->boundColumns[c]];
|
SSchema* pTagSchema = &pSchema[tags->boundColumns[c]];
|
||||||
param.schema = pTagSchema;
|
int32_t colLen = pTagSchema->bytes;
|
||||||
|
|
||||||
int32_t colLen = pTagSchema->bytes;
|
|
||||||
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
||||||
colLen = bind[c].length[0];
|
colLen = bind[c].length[0];
|
||||||
}
|
}
|
||||||
|
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
if (colLen > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
code = buildSyntaxErrMsg(&pBuf, "json string too long than 4095", bind[c].buffer);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
CHECK_CODE(KvRowAppend(&pBuf, (char*)bind[c].buffer, colLen, ¶m));
|
isJson = true;
|
||||||
|
char* tmp = taosMemoryCalloc(1, colLen + 1);
|
||||||
|
memcpy(tmp, bind[c].buffer, colLen);
|
||||||
|
code = parseJsontoTagData(tmp, pTagArray, &pTag, &pBuf);
|
||||||
|
taosMemoryFree(tmp);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
|
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
val.pData = (uint8_t*)bind[c].buffer;
|
||||||
|
val.nData = colLen;
|
||||||
|
} else if (pTagSchema->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
int32_t output = 0;
|
||||||
|
void* p = taosMemoryCalloc(1, colLen * TSDB_NCHAR_SIZE);
|
||||||
|
if (p == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (!taosMbsToUcs4(bind[c].buffer, colLen, (TdUcs4*)(p), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
|
if (errno == E2BIG) {
|
||||||
|
taosMemoryFree(p);
|
||||||
|
code = generateSyntaxErrMsg(&pBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
char buf[512] = {0};
|
||||||
|
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
||||||
|
taosMemoryFree(p);
|
||||||
|
code = buildSyntaxErrMsg(&pBuf, buf, bind[c].buffer);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
val.pData = p;
|
||||||
|
val.nData = output;
|
||||||
|
} else {
|
||||||
|
memcpy(&val.i64, bind[c].buffer, colLen);
|
||||||
|
}
|
||||||
|
taosArrayPush(pTagArray, &val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&tagBuilder);
|
if (!isJson && (code = tTagNew(pTagArray, 1, false, &pTag)) != TSDB_CODE_SUCCESS) {
|
||||||
if (NULL == row) {
|
goto end;
|
||||||
tdDestroyKVRowBuilder(&tagBuilder);
|
|
||||||
return buildInvalidOperationMsg(&pBuf, "out of memory");
|
|
||||||
}
|
}
|
||||||
tdSortKVRowByColIdx(row);
|
|
||||||
|
|
||||||
SVCreateTbReq tbReq = {0};
|
SVCreateTbReq tbReq = {0};
|
||||||
CHECK_CODE(buildCreateTbReq(&tbReq, tName, row, suid));
|
buildCreateTbReq(&tbReq, tName, pTag, suid);
|
||||||
CHECK_CODE(buildCreateTbMsg(pDataBlock, &tbReq));
|
code = buildCreateTbMsg(pDataBlock, &tbReq);
|
||||||
|
|
||||||
destroyCreateSubTbReq(&tbReq);
|
destroyCreateSubTbReq(&tbReq);
|
||||||
tdDestroyKVRowBuilder(&tagBuilder);
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
end:
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
|
STagVal* p = (STagVal*)taosArrayGet(pTagArray, i);
|
||||||
|
if (p->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen) {
|
int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen) {
|
||||||
|
@ -1724,18 +1951,24 @@ int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBu
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_t* fieldNum, TAOS_FIELD** fields) {
|
int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_t* fieldNum, TAOS_FIELD_E** fields,
|
||||||
|
uint8_t timePrec) {
|
||||||
if (fields) {
|
if (fields) {
|
||||||
*fields = taosMemoryCalloc(boundInfo->numOfBound, sizeof(TAOS_FIELD));
|
*fields = taosMemoryCalloc(boundInfo->numOfBound, sizeof(TAOS_FIELD));
|
||||||
if (NULL == *fields) {
|
if (NULL == *fields) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSchema* schema = &pSchema[boundInfo->boundColumns[0]];
|
||||||
|
if (TSDB_DATA_TYPE_TIMESTAMP == schema->type) {
|
||||||
|
(*fields)[0].precision = timePrec;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < boundInfo->numOfBound; ++i) {
|
for (int32_t i = 0; i < boundInfo->numOfBound; ++i) {
|
||||||
SSchema* pTagSchema = &pSchema[boundInfo->boundColumns[i]];
|
schema = &pSchema[boundInfo->boundColumns[i]];
|
||||||
strcpy((*fields)[i].name, pTagSchema->name);
|
strcpy((*fields)[i].name, schema->name);
|
||||||
(*fields)[i].type = pTagSchema->type;
|
(*fields)[i].type = schema->type;
|
||||||
(*fields)[i].bytes = pTagSchema->bytes;
|
(*fields)[i].bytes = schema->bytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1744,7 +1977,7 @@ int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TAOS_FIELD** fields) {
|
int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
|
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
|
||||||
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
|
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
|
||||||
if (NULL == tags) {
|
if (NULL == tags) {
|
||||||
|
@ -1759,12 +1992,12 @@ int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TA
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_CODE(buildBoundFields(tags, pSchema, fieldNum, fields));
|
CHECK_CODE(buildBoundFields(tags, pSchema, fieldNum, fields, 0));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD** fields) {
|
int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD_E** fields) {
|
||||||
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
|
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
|
||||||
SSchema* pSchema = getTableColumnSchema(pDataBlock->pTableMeta);
|
SSchema* pSchema = getTableColumnSchema(pDataBlock->pTableMeta);
|
||||||
if (pDataBlock->boundColumnInfo.numOfBound <= 0) {
|
if (pDataBlock->boundColumnInfo.numOfBound <= 0) {
|
||||||
|
@ -1776,7 +2009,8 @@ int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD** fields
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_CODE(buildBoundFields(&pDataBlock->boundColumnInfo, pSchema, fieldNum, fields));
|
CHECK_CODE(buildBoundFields(&pDataBlock->boundColumnInfo, pSchema, fieldNum, fields,
|
||||||
|
pDataBlock->pTableMeta->tableInfo.precision));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1785,7 +2019,6 @@ int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD** fields
|
||||||
|
|
||||||
typedef struct SmlExecTableHandle {
|
typedef struct SmlExecTableHandle {
|
||||||
SParsedDataColInfo tags; // each table
|
SParsedDataColInfo tags; // each table
|
||||||
SKVRowBuilder tagsBuilder; // each table
|
|
||||||
SVCreateTbReq createTblReq; // each table
|
SVCreateTbReq createTblReq; // each table
|
||||||
} SmlExecTableHandle;
|
} SmlExecTableHandle;
|
||||||
|
|
||||||
|
@ -1797,7 +2030,6 @@ typedef struct SmlExecHandle {
|
||||||
|
|
||||||
static void smlDestroyTableHandle(void* pHandle) {
|
static void smlDestroyTableHandle(void* pHandle) {
|
||||||
SmlExecTableHandle* handle = (SmlExecTableHandle*)pHandle;
|
SmlExecTableHandle* handle = (SmlExecTableHandle*)pHandle;
|
||||||
tdDestroyKVRowBuilder(&handle->tagsBuilder);
|
|
||||||
destroyBoundColumnInfo(&handle->tags);
|
destroyBoundColumnInfo(&handle->tags);
|
||||||
destroyCreateSubTbReq(&handle->createTblReq);
|
destroyCreateSubTbReq(&handle->createTblReq);
|
||||||
}
|
}
|
||||||
|
@ -1873,30 +2105,68 @@ static int32_t smlBoundColumnData(SArray* cols, SParsedDataColInfo* pColList, SS
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlBuildTagRow(SArray* cols, SKVRowBuilder* tagsBuilder, SParsedDataColInfo* tags, SSchema* pSchema,
|
/**
|
||||||
SKVRow* row, SMsgBuf* msg) {
|
* @brief No json tag for schemaless
|
||||||
if (tdInitKVRowBuilder(tagsBuilder) < 0) {
|
*
|
||||||
|
* @param cols
|
||||||
|
* @param tags
|
||||||
|
* @param pSchema
|
||||||
|
* @param ppTag
|
||||||
|
* @param msg
|
||||||
|
* @return int32_t
|
||||||
|
*/
|
||||||
|
static int32_t smlBuildTagRow(SArray* cols, SParsedDataColInfo* tags, SSchema* pSchema, STag** ppTag, SMsgBuf* msg) {
|
||||||
|
SArray* pTagArray = taosArrayInit(tags->numOfBound, sizeof(STagVal));
|
||||||
|
if (!pTagArray) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
SKvParam param = {.builder = tagsBuilder};
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
for (int i = 0; i < tags->numOfBound; ++i) {
|
for (int i = 0; i < tags->numOfBound; ++i) {
|
||||||
SSchema* pTagSchema = &pSchema[tags->boundColumns[i]];
|
SSchema* pTagSchema = &pSchema[tags->boundColumns[i]];
|
||||||
param.schema = pTagSchema;
|
SSmlKv* kv = taosArrayGetP(cols, i);
|
||||||
SSmlKv* kv = taosArrayGetP(cols, i);
|
|
||||||
if (IS_VAR_DATA_TYPE(kv->type)) {
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
KvRowAppend(msg, kv->value, kv->length, ¶m);
|
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
val.pData = (uint8_t*)kv->value;
|
||||||
|
val.nData = kv->length;
|
||||||
|
} else if (pTagSchema->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
int32_t output = 0;
|
||||||
|
void* p = taosMemoryCalloc(1, pTagSchema->bytes - VARSTR_HEADER_SIZE);
|
||||||
|
if (p == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (!taosMbsToUcs4(kv->value, kv->length, (TdUcs4*)(p), pTagSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
|
if (errno == E2BIG) {
|
||||||
|
taosMemoryFree(p);
|
||||||
|
code = generateSyntaxErrMsg(msg, TSDB_CODE_PAR_VALUE_TOO_LONG, pTagSchema->name);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
char buf[512] = {0};
|
||||||
|
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
||||||
|
taosMemoryFree(p);
|
||||||
|
code = buildSyntaxErrMsg(msg, buf, kv->value);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
val.pData = p;
|
||||||
|
val.nData = output;
|
||||||
} else {
|
} else {
|
||||||
KvRowAppend(msg, &(kv->value), kv->length, ¶m);
|
memcpy(&val.i64, &(kv->value), kv->length);
|
||||||
}
|
}
|
||||||
|
taosArrayPush(pTagArray, &val);
|
||||||
}
|
}
|
||||||
|
|
||||||
*row = tdGetKVRowFromBuilder(tagsBuilder);
|
code = tTagNew(pTagArray, 1, false, ppTag);
|
||||||
if (*row == NULL) {
|
end:
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
|
STagVal* p = (STagVal*)taosArrayGet(pTagArray, i);
|
||||||
|
if (p->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tdSortKVRowByColIdx(*row);
|
taosArrayDestroy(pTagArray);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols, bool format, STableMeta* pTableMeta,
|
int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols, bool format, STableMeta* pTableMeta,
|
||||||
|
@ -1912,14 +2182,13 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
|
||||||
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SKVRow row = NULL;
|
STag* pTag = NULL;
|
||||||
ret = smlBuildTagRow(tags, &smlHandle->tableExecHandle.tagsBuilder, &smlHandle->tableExecHandle.tags, pTagsSchema,
|
ret = smlBuildTagRow(tags, &smlHandle->tableExecHandle.tags, pTagsSchema, &pTag, &pBuf);
|
||||||
&row, &pBuf);
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildCreateTbReq(&smlHandle->tableExecHandle.createTblReq, tableName, row, pTableMeta->suid);
|
buildCreateTbReq(&smlHandle->tableExecHandle.createTblReq, tableName, pTag, pTableMeta->suid);
|
||||||
|
|
||||||
STableDataBlocks* pDataBlock = NULL;
|
STableDataBlocks* pDataBlock = NULL;
|
||||||
ret = getDataBlockFromList(smlHandle->pBlockHash, &pTableMeta->uid, sizeof(pTableMeta->uid),
|
ret = getDataBlockFromList(smlHandle->pBlockHash, &pTableMeta->uid, sizeof(pTableMeta->uid),
|
||||||
|
|
|
@ -830,7 +830,8 @@ static EDealRes translateComparisonOperator(STranslateContext* pCxt, SOperatorNo
|
||||||
if (!IS_VAR_DATA_TYPE(((SExprNode*)(pOp->pLeft))->resType.type)) {
|
if (!IS_VAR_DATA_TYPE(((SExprNode*)(pOp->pLeft))->resType.type)) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pLeft))->aliasName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pLeft))->aliasName);
|
||||||
}
|
}
|
||||||
if (QUERY_NODE_VALUE != nodeType(pOp->pRight) || !IS_STR_DATA_TYPE(((SExprNode*)(pOp->pRight))->resType.type)) {
|
if (QUERY_NODE_VALUE != nodeType(pOp->pRight) ||
|
||||||
|
((!IS_STR_DATA_TYPE(((SExprNode*)(pOp->pRight))->resType.type)) && (((SExprNode*)(pOp->pRight))->resType.type != TSDB_DATA_TYPE_NULL))) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pRight))->aliasName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4161,8 +4162,8 @@ static int32_t rewriteCreateTable(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, SCreateSubTableClause* pStmt, SKVRow row,
|
static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, SCreateSubTableClause* pStmt,
|
||||||
uint64_t suid, SVgroupInfo* pVgInfo) {
|
const STag* pTag, uint64_t suid, SVgroupInfo* pVgInfo) {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN] = {0};
|
char dbFName[TSDB_DB_FNAME_LEN] = {0};
|
||||||
SName name = {.type = TSDB_DB_NAME_T, .acctId = acctId};
|
SName name = {.type = TSDB_DB_NAME_T, .acctId = acctId};
|
||||||
strcpy(name.dbname, pStmt->dbName);
|
strcpy(name.dbname, pStmt->dbName);
|
||||||
|
@ -4172,7 +4173,7 @@ static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, S
|
||||||
req.type = TD_CHILD_TABLE;
|
req.type = TD_CHILD_TABLE;
|
||||||
req.name = strdup(pStmt->tableName);
|
req.name = strdup(pStmt->tableName);
|
||||||
req.ctb.suid = suid;
|
req.ctb.suid = suid;
|
||||||
req.ctb.pTag = row;
|
req.ctb.pTag = (uint8_t*)pTag;
|
||||||
if (pStmt->ignoreExists) {
|
if (pStmt->ignoreExists) {
|
||||||
req.flags |= TD_CREATE_IF_NOT_EXISTS;
|
req.flags |= TD_CREATE_IF_NOT_EXISTS;
|
||||||
}
|
}
|
||||||
|
@ -4192,24 +4193,6 @@ static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, S
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t addValToKVRow(STranslateContext* pCxt, SValueNode* pVal, const SSchema* pSchema,
|
|
||||||
SKVRowBuilder* pBuilder) {
|
|
||||||
if (pSchema->type == TSDB_DATA_TYPE_JSON) {
|
|
||||||
if (pVal->literal && strlen(pVal->literal) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
|
||||||
return buildSyntaxErrMsg(&pCxt->msgBuf, "json string too long than 4095", pVal->literal);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parseJsontoTagData(pVal->literal, pBuilder, &pCxt->msgBuf, pSchema->colId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pVal->node.resType.type != TSDB_DATA_TYPE_NULL) {
|
|
||||||
tdAddColToKVRow(pBuilder, pSchema->colId, nodesGetValueFromNode(pVal),
|
|
||||||
IS_VAR_DATA_TYPE(pSchema->type) ? varDataTLen(pVal->datum.p) : TYPE_BYTES[pSchema->type]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t createValueFromFunction(STranslateContext* pCxt, SFunctionNode* pFunc, SValueNode** pVal) {
|
static int32_t createValueFromFunction(STranslateContext* pCxt, SFunctionNode* pFunc, SValueNode** pVal) {
|
||||||
int32_t code = getFuncInfo(pCxt, pFunc);
|
int32_t code = getFuncInfo(pCxt, pFunc);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -4237,15 +4220,22 @@ static int32_t translateTagVal(STranslateContext* pCxt, uint8_t precision, SSche
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta,
|
static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta,
|
||||||
SKVRowBuilder* pBuilder) {
|
STag** ppTag) {
|
||||||
int32_t numOfTags = getNumOfTags(pSuperTableMeta);
|
int32_t numOfTags = getNumOfTags(pSuperTableMeta);
|
||||||
if (LIST_LENGTH(pStmt->pValsOfTags) != LIST_LENGTH(pStmt->pSpecificTags) ||
|
if (LIST_LENGTH(pStmt->pValsOfTags) != LIST_LENGTH(pStmt->pSpecificTags) ||
|
||||||
numOfTags < LIST_LENGTH(pStmt->pValsOfTags)) {
|
numOfTags < LIST_LENGTH(pStmt->pValsOfTags)) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SArray* pTagArray = taosArrayInit(LIST_LENGTH(pStmt->pValsOfTags), sizeof(STagVal));
|
||||||
|
if (!pTagArray) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_TSC_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int16_t nTags = 0, nBufPos = 0;
|
||||||
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
||||||
SNode * pTag, *pNode;
|
SNode * pTag = NULL, *pNode = NULL;
|
||||||
|
bool isJson = false;
|
||||||
FORBOTH(pTag, pStmt->pSpecificTags, pNode, pStmt->pValsOfTags) {
|
FORBOTH(pTag, pStmt->pSpecificTags, pNode, pStmt->pValsOfTags) {
|
||||||
SColumnNode* pCol = (SColumnNode*)pTag;
|
SColumnNode* pCol = (SColumnNode*)pTag;
|
||||||
SSchema* pSchema = NULL;
|
SSchema* pSchema = NULL;
|
||||||
|
@ -4256,56 +4246,125 @@ static int32_t buildKVRowForBindTags(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (NULL == pSchema) {
|
if (NULL == pSchema) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAG_NAME, pCol->colName);
|
code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAG_NAME, pCol->colName);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
SValueNode* pVal = NULL;
|
SValueNode* pVal = NULL;
|
||||||
int32_t code = translateTagVal(pCxt, pSuperTableMeta->tableInfo.precision, pSchema, pNode, &pVal);
|
code = translateTagVal(pCxt, pSuperTableMeta->tableInfo.precision, pSchema, pNode, &pVal);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
if (NULL == pVal) {
|
|
||||||
pVal = (SValueNode*)pNode;
|
|
||||||
} else {
|
|
||||||
REPLACE_LIST2_NODE(pVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = addValToKVRow(pCxt, pVal, pSchema, pBuilder);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == pVal) {
|
||||||
|
pVal = (SValueNode*)pNode;
|
||||||
|
} else {
|
||||||
|
REPLACE_LIST2_NODE(pVal);
|
||||||
|
}
|
||||||
|
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
if (pVal->literal && strlen(pVal->literal) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
code = buildSyntaxErrMsg(&pCxt->msgBuf, "json string too long than 4095", pVal->literal);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
isJson = true;
|
||||||
|
code = parseJsontoTagData(pVal->literal, pTagArray, ppTag, &pCxt->msgBuf);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}else if (pVal->node.resType.type != TSDB_DATA_TYPE_NULL) {
|
||||||
|
void* nodeVal = nodesGetValueFromNode(pVal);
|
||||||
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
|
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
||||||
|
val.pData = varDataVal(nodeVal);
|
||||||
|
val.nData = varDataLen(nodeVal);
|
||||||
|
} else {
|
||||||
|
memcpy(&val.i64, nodeVal, pTagSchema->bytes);
|
||||||
|
}
|
||||||
|
taosArrayPush(pTagArray, &val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!isJson) code = tTagNew(pTagArray, 1, false, ppTag);
|
||||||
|
|
||||||
|
end:
|
||||||
|
if(isJson){
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
|
STagVal *p = (STagVal *)taosArrayGet(pTagArray, i);
|
||||||
|
if(IS_VAR_DATA_TYPE(p->type)){
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pTagArray);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta,
|
static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClause* pStmt, STableMeta* pSuperTableMeta,
|
||||||
SKVRowBuilder* pBuilder) {
|
STag** ppTag) {
|
||||||
if (getNumOfTags(pSuperTableMeta) != LIST_LENGTH(pStmt->pValsOfTags)) {
|
if (getNumOfTags(pSuperTableMeta) != LIST_LENGTH(pStmt->pValsOfTags)) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = getTableTagSchema(pSuperTableMeta);
|
SSchema* pTagSchemas = getTableTagSchema(pSuperTableMeta);
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
SArray* pTagArray = taosArrayInit(LIST_LENGTH(pStmt->pValsOfTags), sizeof(STagVal));
|
||||||
|
if (!pTagArray) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_TSC_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isJson = false;
|
||||||
FOREACH(pNode, pStmt->pValsOfTags) {
|
FOREACH(pNode, pStmt->pValsOfTags) {
|
||||||
SValueNode* pVal = NULL;
|
SValueNode* pVal = NULL;
|
||||||
int32_t code = translateTagVal(pCxt, pSuperTableMeta->tableInfo.precision, pTagSchema + index, pNode, &pVal);
|
SSchema* pTagSchema = pTagSchemas + index;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
code = translateTagVal(pCxt, pSuperTableMeta->tableInfo.precision, pTagSchema, pNode, &pVal);
|
||||||
if (NULL == pVal) {
|
|
||||||
pVal = (SValueNode*)pNode;
|
|
||||||
} else {
|
|
||||||
REPLACE_NODE(pVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = addValToKVRow(pCxt, pVal, pTagSchema + index++, pBuilder);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
goto end;
|
||||||
|
}
|
||||||
|
if (NULL == pVal) {
|
||||||
|
pVal = (SValueNode*)pNode;
|
||||||
|
} else {
|
||||||
|
REPLACE_NODE(pVal);
|
||||||
|
}
|
||||||
|
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
if (pVal->literal && strlen(pVal->literal) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
code = buildSyntaxErrMsg(&pCxt->msgBuf, "json string too long than 4095", pVal->literal);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
isJson = true;
|
||||||
|
code = parseJsontoTagData(pVal->literal, pTagArray, ppTag, &pCxt->msgBuf);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}else if (pVal->node.resType.type != TSDB_DATA_TYPE_NULL) {
|
||||||
|
char* tmpVal = nodesGetValueFromNode(pVal);
|
||||||
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
|
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
||||||
|
val.pData = varDataVal(tmpVal);
|
||||||
|
val.nData = varDataLen(tmpVal);
|
||||||
|
} else {
|
||||||
|
memcpy(&val.i64, tmpVal, pTagSchema->bytes);
|
||||||
|
}
|
||||||
|
taosArrayPush(pTagArray, &val);
|
||||||
|
}
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
if(!isJson) code = tTagNew(pTagArray, 1, false, ppTag);
|
||||||
|
|
||||||
|
end:
|
||||||
|
if(isJson){
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
|
STagVal *p = (STagVal *)taosArrayGet(pTagArray, i);
|
||||||
|
if(IS_VAR_DATA_TYPE(p->type)){
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
taosArrayDestroy(pTagArray);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkCreateSubTable(STranslateContext* pCxt, SCreateSubTableClause* pStmt) {
|
static int32_t checkCreateSubTable(STranslateContext* pCxt, SCreateSubTableClause* pStmt) {
|
||||||
|
@ -4322,26 +4381,13 @@ static int32_t rewriteCreateSubTable(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
code = getTableMeta(pCxt, pStmt->useDbName, pStmt->useTableName, &pSuperTableMeta);
|
code = getTableMeta(pCxt, pStmt->useDbName, pStmt->useTableName, &pSuperTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
SKVRowBuilder kvRowBuilder = {0};
|
STag* pTag = NULL;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = tdInitKVRowBuilder(&kvRowBuilder);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (NULL != pStmt->pSpecificTags) {
|
if (NULL != pStmt->pSpecificTags) {
|
||||||
code = buildKVRowForBindTags(pCxt, pStmt, pSuperTableMeta, &kvRowBuilder);
|
code = buildKVRowForBindTags(pCxt, pStmt, pSuperTableMeta, &pTag);
|
||||||
} else {
|
} else {
|
||||||
code = buildKVRowForAllTags(pCxt, pStmt, pSuperTableMeta, &kvRowBuilder);
|
code = buildKVRowForAllTags(pCxt, pStmt, pSuperTableMeta, &pTag);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SKVRow row = NULL;
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
|
||||||
if (NULL == row) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
} else {
|
|
||||||
tdSortKVRowByColIdx(row);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4350,11 +4396,10 @@ static int32_t rewriteCreateSubTable(STranslateContext* pCxt, SCreateSubTableCla
|
||||||
code = getTableHashVgroup(pCxt, pStmt->dbName, pStmt->tableName, &info);
|
code = getTableHashVgroup(pCxt, pStmt->dbName, pStmt->tableName, &info);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
addCreateTbReqIntoVgroup(pCxt->pParseCxt->acctId, pVgroupHashmap, pStmt, row, pSuperTableMeta->uid, &info);
|
addCreateTbReqIntoVgroup(pCxt->pParseCxt->acctId, pVgroupHashmap, pStmt, pTag, pSuperTableMeta->uid, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(pSuperTableMeta);
|
taosMemoryFreeClear(pSuperTableMeta);
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4576,37 +4621,41 @@ static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pS
|
||||||
|
|
||||||
pReq->isNull = (TSDB_DATA_TYPE_NULL == pStmt->pVal->node.resType.type);
|
pReq->isNull = (TSDB_DATA_TYPE_NULL == pStmt->pVal->node.resType.type);
|
||||||
if (pStmt->pVal->node.resType.type == TSDB_DATA_TYPE_JSON) {
|
if (pStmt->pVal->node.resType.type == TSDB_DATA_TYPE_JSON) {
|
||||||
SKVRowBuilder kvRowBuilder = {0};
|
|
||||||
int32_t code = tdInitKVRowBuilder(&kvRowBuilder);
|
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (pStmt->pVal->literal &&
|
if (pStmt->pVal->literal &&
|
||||||
strlen(pStmt->pVal->literal) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
strlen(pStmt->pVal->literal) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
return buildSyntaxErrMsg(&pCxt->msgBuf, "json string too long than 4095", pStmt->pVal->literal);
|
return buildSyntaxErrMsg(&pCxt->msgBuf, "json string too long than 4095", pStmt->pVal->literal);
|
||||||
}
|
}
|
||||||
|
SArray *pTagVals = taosArrayInit(1, sizeof(STagVal));
|
||||||
code = parseJsontoTagData(pStmt->pVal->literal, &kvRowBuilder, &pCxt->msgBuf, pSchema->colId);
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
STag* pTag = NULL;
|
||||||
|
do{
|
||||||
|
code = parseJsontoTagData(pStmt->pVal->literal, pTagVals, &pTag, &pCxt->msgBuf);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}while(0);
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
|
||||||
|
STagVal *p = (STagVal *)taosArrayGet(pTagVals, i);
|
||||||
|
if(IS_VAR_DATA_TYPE(p->type)){
|
||||||
|
taosMemoryFree(p->pData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
if (code != TSDB_CODE_SUCCESS){
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
pReq->nTagVal = pTag->len;
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
pReq->pTagVal = (uint8_t *)pTag;
|
||||||
if (NULL == row) {
|
pStmt->pVal->datum.p = (char*)pTag; // for free
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
pReq->nTagVal = kvRowLen(row);
|
|
||||||
pReq->pTagVal = row;
|
|
||||||
pStmt->pVal->datum.p = row; // for free
|
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
|
||||||
} else {
|
} else {
|
||||||
pReq->nTagVal = pStmt->pVal->node.resType.bytes;
|
pReq->nTagVal = pStmt->pVal->node.resType.bytes;
|
||||||
if (TSDB_DATA_TYPE_NCHAR == pStmt->pVal->node.resType.type) {
|
|
||||||
pReq->nTagVal = pReq->nTagVal * TSDB_NCHAR_SIZE;
|
|
||||||
}
|
|
||||||
pReq->pTagVal = nodesGetValueFromNode(pStmt->pVal);
|
pReq->pTagVal = nodesGetValueFromNode(pStmt->pVal);
|
||||||
|
|
||||||
|
// data and length are seperated for new tag format STagVal
|
||||||
|
if (IS_VAR_DATA_TYPE(pStmt->pVal->node.resType.type)) {
|
||||||
|
pReq->nTagVal = varDataLen(pReq->pTagVal);
|
||||||
|
pReq->pTagVal = varDataVal(pReq->pTagVal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -322,33 +322,35 @@ static bool isValidateTag(char* input) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t parseJsontoTagData(const char* json, SKVRowBuilder* kvRowBuilder, SMsgBuf* pMsgBuf, int16_t startColId) {
|
int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag **ppTag, SMsgBuf* pMsgBuf) {
|
||||||
|
int32_t retCode = TSDB_CODE_SUCCESS;
|
||||||
|
cJSON* root = NULL;
|
||||||
|
SHashObj* keyHash = NULL;
|
||||||
|
int32_t size = 0;
|
||||||
// set json NULL data
|
// set json NULL data
|
||||||
uint8_t jsonNULL = TSDB_DATA_TYPE_NULL;
|
|
||||||
int32_t jsonIndex = startColId + 1;
|
|
||||||
if (!json || strtrim((char*)json) == 0 || strcasecmp(json, TSDB_DATA_NULL_STR_L) == 0) {
|
if (!json || strtrim((char*)json) == 0 || strcasecmp(json, TSDB_DATA_NULL_STR_L) == 0) {
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex, &jsonNULL, CHAR_BYTES);
|
retCode = TSDB_CODE_SUCCESS;
|
||||||
return TSDB_CODE_SUCCESS;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set json real data
|
// set json real data
|
||||||
cJSON* root = cJSON_Parse(json);
|
root = cJSON_Parse(json);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "json parse error", json);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json parse error", json);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t size = cJSON_GetArraySize(root);
|
size = cJSON_GetArraySize(root);
|
||||||
if (!cJSON_IsObject(root)) {
|
if (!cJSON_IsObject(root)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "json error invalide value", json);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json error invalide value", json);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t retCode = 0;
|
keyHash = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
|
||||||
char* tagKV = NULL;
|
|
||||||
SHashObj* keyHash = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
|
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
cJSON* item = cJSON_GetArrayItem(root, i);
|
cJSON* item = cJSON_GetArrayItem(root, i);
|
||||||
if (!item) {
|
if (!item) {
|
||||||
qError("json inner error:%d", i);
|
uError("json inner error:%d", i);
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "json inner error", json);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json inner error", json);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -360,85 +362,60 @@ int32_t parseJsontoTagData(const char* json, SKVRowBuilder* kvRowBuilder, SMsgBu
|
||||||
}
|
}
|
||||||
size_t keyLen = strlen(jsonKey);
|
size_t keyLen = strlen(jsonKey);
|
||||||
if (keyLen > TSDB_MAX_JSON_KEY_LEN) {
|
if (keyLen > TSDB_MAX_JSON_KEY_LEN) {
|
||||||
qError("json key too long error");
|
uError("json key too long error");
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "json key too long, more than 256", jsonKey);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json key too long, more than 256", jsonKey);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (keyLen == 0 || taosHashGet(keyHash, jsonKey, keyLen) != NULL) {
|
if (keyLen == 0 || taosHashGet(keyHash, jsonKey, keyLen) != NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// key: keyLen + VARSTR_HEADER_SIZE, value type: CHAR_BYTES, value reserved: DOUBLE_BYTES
|
STagVal val = {0};
|
||||||
tagKV = taosMemoryCalloc(keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + DOUBLE_BYTES, 1);
|
val.pKey = jsonKey;
|
||||||
if (!tagKV) {
|
taosHashPut(keyHash, jsonKey, keyLen, &keyLen, CHAR_BYTES); // add key to hash to remove dumplicate, value is useless
|
||||||
retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
strncpy(varDataVal(tagKV), jsonKey, keyLen);
|
|
||||||
varDataSetLen(tagKV, keyLen);
|
|
||||||
if (taosHashGetSize(keyHash) == 0) {
|
|
||||||
uint8_t jsonNotNULL = TSDB_DATA_TYPE_JSON;
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, &jsonNotNULL, CHAR_BYTES); // add json type
|
|
||||||
}
|
|
||||||
taosHashPut(keyHash, jsonKey, keyLen, &keyLen,
|
|
||||||
CHAR_BYTES); // add key to hash to remove dumplicate, value is useless
|
|
||||||
|
|
||||||
if (item->type == cJSON_String) { // add json value format: type|data
|
if (item->type == cJSON_String) { // add json value format: type|data
|
||||||
char* jsonValue = item->valuestring;
|
char* jsonValue = item->valuestring;
|
||||||
int32_t valLen = (int32_t)strlen(jsonValue);
|
int32_t valLen = (int32_t)strlen(jsonValue);
|
||||||
int32_t totalLen = keyLen + VARSTR_HEADER_SIZE + valLen * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE + CHAR_BYTES;
|
char* tmp = taosMemoryCalloc(1, valLen * TSDB_NCHAR_SIZE);
|
||||||
char* tmp = taosMemoryRealloc(tagKV, totalLen);
|
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
tagKV = tmp;
|
val.type = TSDB_DATA_TYPE_NCHAR;
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
if (valLen > 0 && !taosMbsToUcs4(jsonValue, valLen, (TdUcs4*)tmp,
|
||||||
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
|
||||||
*valueType = TSDB_DATA_TYPE_NCHAR;
|
|
||||||
if (valLen > 0 && !taosMbsToUcs4(jsonValue, valLen, (TdUcs4*)varDataVal(valueData),
|
|
||||||
(int32_t)(valLen * TSDB_NCHAR_SIZE), &valLen)) {
|
(int32_t)(valLen * TSDB_NCHAR_SIZE), &valLen)) {
|
||||||
qError("charset:%s to %s. val:%s, errno:%s, convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, jsonValue,
|
uError("charset:%s to %s. val:%s, errno:%s, convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, jsonValue,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "charset convert json error", jsonValue);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "charset convert json error", jsonValue);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
val.nData = valLen;
|
||||||
varDataSetLen(valueData, valLen);
|
val.pData = tmp;
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, totalLen);
|
|
||||||
} else if (item->type == cJSON_Number) {
|
} else if (item->type == cJSON_Number) {
|
||||||
if (!isfinite(item->valuedouble)) {
|
if (!isfinite(item->valuedouble)) {
|
||||||
qError("json value is invalidate");
|
uError("json value is invalidate");
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "json value number is illegal", json);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json value number is illegal", json);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
val.type = TSDB_DATA_TYPE_DOUBLE;
|
||||||
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
*((double*)&(val.i64)) = item->valuedouble;
|
||||||
*valueType = TSDB_DATA_TYPE_DOUBLE;
|
|
||||||
*((double*)valueData) = item->valuedouble;
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + DOUBLE_BYTES);
|
|
||||||
} else if (item->type == cJSON_True || item->type == cJSON_False) {
|
} else if (item->type == cJSON_True || item->type == cJSON_False) {
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
val.type = TSDB_DATA_TYPE_BOOL;
|
||||||
char* valueData = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
*((char*)&(val.i64)) = (char)(item->valueint);
|
||||||
*valueType = TSDB_DATA_TYPE_BOOL;
|
|
||||||
*valueData = (char)(item->valueint);
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES + CHAR_BYTES);
|
|
||||||
} else if (item->type == cJSON_NULL) {
|
} else if (item->type == cJSON_NULL) {
|
||||||
char* valueType = POINTER_SHIFT(tagKV, keyLen + VARSTR_HEADER_SIZE);
|
val.type = TSDB_DATA_TYPE_NULL;
|
||||||
*valueType = TSDB_DATA_TYPE_NULL;
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex++, tagKV, keyLen + VARSTR_HEADER_SIZE + CHAR_BYTES);
|
|
||||||
} else {
|
} else {
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "invalidate json value", json);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "invalidate json value", json);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
taosArrayPush(pTagVals, &val);
|
||||||
|
|
||||||
if (taosHashGetSize(keyHash) == 0) { // set json NULL true
|
|
||||||
tdAddColToKVRow(kvRowBuilder, jsonIndex, &jsonNULL, CHAR_BYTES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
taosMemoryFree(tagKV);
|
|
||||||
taosHashCleanup(keyHash);
|
taosHashCleanup(keyHash);
|
||||||
|
if(retCode == TSDB_CODE_SUCCESS){
|
||||||
|
tTagNew(pTagVals, 1, true, ppTag);
|
||||||
|
}
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return retCode;
|
return retCode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,28 +76,8 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
|
int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
|
||||||
pVal->node.resType.type = pParam->buffer_type;
|
pVal->node.resType.type = pParam->buffer_type;
|
||||||
pVal->node.resType.bytes = inputSize;
|
pVal->node.resType.bytes = inputSize;
|
||||||
|
|
||||||
switch (pParam->buffer_type) {
|
switch (pParam->buffer_type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
pVal->datum.b = *((bool*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
pVal->datum.i = *((int8_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
pVal->datum.i = *((int16_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
pVal->datum.i = *((int32_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
pVal->datum.i = *((int64_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
|
||||||
pVal->datum.d = *((float*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
pVal->datum.d = *((double*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
|
pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
|
||||||
|
@ -124,28 +104,13 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
|
pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
default: {
|
||||||
pVal->datum.i = *((int64_t*)pParam->buffer);
|
int32_t code = nodesSetValueNodeValue(pVal, pParam->buffer);
|
||||||
break;
|
if (code) {
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
return code;
|
||||||
pVal->datum.u = *((uint8_t*)pParam->buffer);
|
}
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
pVal->datum.u = *((uint16_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_UINT:
|
|
||||||
pVal->datum.u = *((uint32_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
pVal->datum.u = *((uint64_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_JSON:
|
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
|
||||||
case TSDB_DATA_TYPE_MEDIUMBLOB:
|
|
||||||
// todo
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pVal->translate = true;
|
pVal->translate = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -108,7 +108,7 @@ void qwtInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -922,23 +922,13 @@ static void doReleaseVec(SColumnInfoData* pCol, int32_t type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *getJsonValue(char *json, char *key){ //todo
|
STagVal getJsonValue(char *json, char *key, bool *isExist) {
|
||||||
json++; // jump type
|
STagVal val = {.pKey = key};
|
||||||
int16_t cols = kvRowNCols(json);
|
bool find = tTagGet(((const STag *)json), &val); // json value is null and not exist is different
|
||||||
for (int i = 0; i < cols; ++i) {
|
if(isExist){
|
||||||
SColIdx *pColIdx = kvRowColIdxAt(json, i);
|
*isExist = find;
|
||||||
char *data = kvRowColVal(json, pColIdx);
|
|
||||||
if(i == 0){
|
|
||||||
if(*data == TSDB_DATA_TYPE_NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(memcmp(key, data, varDataTLen(data)) == 0){
|
|
||||||
return data + varDataTLen(data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorJsonArrow(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord) {
|
void vectorJsonArrow(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord) {
|
||||||
|
@ -950,6 +940,8 @@ void vectorJsonArrow(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pO
|
||||||
pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
|
pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
|
||||||
|
|
||||||
char *pRightData = colDataGetVarData(pRight->columnData, 0);
|
char *pRightData = colDataGetVarData(pRight->columnData, 0);
|
||||||
|
char *jsonKey = taosMemoryCalloc(1, varDataLen(pRightData) + 1);
|
||||||
|
memcpy(jsonKey, varDataVal(pRightData), varDataLen(pRightData));
|
||||||
for (; i >= 0 && i < pLeft->numOfRows; i += step) {
|
for (; i >= 0 && i < pLeft->numOfRows; i += step) {
|
||||||
if (colDataIsNull_var(pLeft->columnData, i)) {
|
if (colDataIsNull_var(pLeft->columnData, i)) {
|
||||||
colDataSetNull_var(pOutputCol, i);
|
colDataSetNull_var(pOutputCol, i);
|
||||||
|
@ -957,14 +949,15 @@ void vectorJsonArrow(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pO
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
char *pLeftData = colDataGetVarData(pLeft->columnData, i);
|
char *pLeftData = colDataGetVarData(pLeft->columnData, i);
|
||||||
char *value = getJsonValue(pLeftData, pRightData);
|
bool isExist = false;
|
||||||
if (!value) {
|
STagVal value = getJsonValue(pLeftData, jsonKey, &isExist);
|
||||||
colDataSetNull_var(pOutputCol, i);
|
char *data = isExist ? tTagValToData(&value, true) : NULL;
|
||||||
pOutputCol->hasNull = true;
|
colDataAppend(pOutputCol, i, data, data == NULL);
|
||||||
continue;
|
if(isExist && IS_VAR_DATA_TYPE(value.type) && data){
|
||||||
|
taosMemoryFree(data);
|
||||||
}
|
}
|
||||||
colDataAppend(pOutputCol, i, value, false);
|
|
||||||
}
|
}
|
||||||
|
taosMemoryFree(jsonKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorMathAdd(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord) {
|
void vectorMathAdd(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord) {
|
||||||
|
|
|
@ -60,7 +60,7 @@ void flttInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -74,7 +74,7 @@ void scltInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
@ -1035,7 +1035,7 @@ void makeJsonArrow(SSDataBlock **src, SNode **opNode, void *json, char *key){
|
||||||
|
|
||||||
SNode *pLeft = NULL, *pRight = NULL;
|
SNode *pLeft = NULL, *pRight = NULL;
|
||||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, keyVar);
|
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, keyVar);
|
||||||
scltMakeColumnNode(&pLeft, src, TSDB_DATA_TYPE_JSON, kvRowLen(json), 1, json);
|
scltMakeColumnNode(&pLeft, src, TSDB_DATA_TYPE_JSON, ((STag*)json)->len, 1, json);
|
||||||
scltMakeOpNode(opNode, OP_TYPE_JSON_GET_VALUE, TSDB_DATA_TYPE_JSON, pLeft, pRight);
|
scltMakeOpNode(opNode, OP_TYPE_JSON_GET_VALUE, TSDB_DATA_TYPE_JSON, pLeft, pRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1111,17 +1111,9 @@ TEST(columnTest, json_column_arith_op) {
|
||||||
|
|
||||||
char rightv[256] = {0};
|
char rightv[256] = {0};
|
||||||
memcpy(rightv, rightvTmp, strlen(rightvTmp));
|
memcpy(rightv, rightvTmp, strlen(rightvTmp));
|
||||||
SKVRowBuilder kvRowBuilder;
|
SArray *tags = taosArrayInit(1, sizeof(STagVal));
|
||||||
tdInitKVRowBuilder(&kvRowBuilder);
|
STag* row = NULL;
|
||||||
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
parseJsontoTagData(rightv, tags, &row, NULL);
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
|
||||||
char *tmp = (char *)taosMemoryRealloc(row, kvRowLen(row)+1);
|
|
||||||
if(tmp == NULL){
|
|
||||||
ASSERT_TRUE(0);
|
|
||||||
}
|
|
||||||
memmove(tmp+1, tmp, kvRowLen(tmp));
|
|
||||||
*tmp = TSDB_DATA_TYPE_JSON;
|
|
||||||
row = tmp;
|
|
||||||
|
|
||||||
const int32_t len = 8;
|
const int32_t len = 8;
|
||||||
EOperatorType op[len] = {OP_TYPE_ADD, OP_TYPE_SUB, OP_TYPE_MULTI, OP_TYPE_DIV,
|
EOperatorType op[len] = {OP_TYPE_ADD, OP_TYPE_SUB, OP_TYPE_MULTI, OP_TYPE_DIV,
|
||||||
|
@ -1175,7 +1167,7 @@ TEST(columnTest, json_column_arith_op) {
|
||||||
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]);
|
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
taosArrayDestroy(tags);
|
||||||
taosMemoryFree(row);
|
taosMemoryFree(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1195,17 +1187,9 @@ TEST(columnTest, json_column_logic_op) {
|
||||||
|
|
||||||
char rightv[256] = {0};
|
char rightv[256] = {0};
|
||||||
memcpy(rightv, rightvTmp, strlen(rightvTmp));
|
memcpy(rightv, rightvTmp, strlen(rightvTmp));
|
||||||
SKVRowBuilder kvRowBuilder;
|
SArray *tags = taosArrayInit(1, sizeof(STagVal));
|
||||||
tdInitKVRowBuilder(&kvRowBuilder);
|
STag* row = NULL;
|
||||||
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
parseJsontoTagData(rightv, tags, &row, NULL);
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
|
||||||
char *tmp = (char *)taosMemoryRealloc(row, kvRowLen(row)+1);
|
|
||||||
if(tmp == NULL){
|
|
||||||
ASSERT_TRUE(0);
|
|
||||||
}
|
|
||||||
memmove(tmp+1, tmp, kvRowLen(tmp));
|
|
||||||
*tmp = TSDB_DATA_TYPE_JSON;
|
|
||||||
row = tmp;
|
|
||||||
|
|
||||||
const int32_t len = 9;
|
const int32_t len = 9;
|
||||||
const int32_t len1 = 4;
|
const int32_t len1 = 4;
|
||||||
|
@ -1305,7 +1289,7 @@ TEST(columnTest, json_column_logic_op) {
|
||||||
taosMemoryFree(rightData);
|
taosMemoryFree(rightData);
|
||||||
}
|
}
|
||||||
|
|
||||||
tdDestroyKVRowBuilder(&kvRowBuilder);
|
taosArrayDestroy(tags);
|
||||||
taosMemoryFree(row);
|
taosMemoryFree(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ void schtInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -10,7 +10,11 @@ target_include_directories(
|
||||||
PUBLIC "${TD_SOURCE_DIR}/contrib/msvcregex"
|
PUBLIC "${TD_SOURCE_DIR}/contrib/msvcregex"
|
||||||
)
|
)
|
||||||
# iconv
|
# iconv
|
||||||
find_path(IconvApiIncludes iconv.h PATHS)
|
if(TD_WINDOWS)
|
||||||
|
find_path(IconvApiIncludes iconv.h "${TD_SOURCE_DIR}/contrib/iconv")
|
||||||
|
else()
|
||||||
|
find_path(IconvApiIncludes iconv.h PATHS)
|
||||||
|
endif(TD_WINDOWS)
|
||||||
if(NOT IconvApiIncludes)
|
if(NOT IconvApiIncludes)
|
||||||
add_definitions(-DDISALLOW_NCHAR_WITHOUT_ICONV)
|
add_definitions(-DDISALLOW_NCHAR_WITHOUT_ICONV)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
|
@ -70,11 +70,11 @@ void osDefaultInit() {
|
||||||
|
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
if (configDir[0] == 0) {
|
if (configDir[0] == 0) {
|
||||||
strcpy(configDir, "/tmp/taosd");
|
strcpy(configDir, "/usr/local/etc/taos");
|
||||||
}
|
}
|
||||||
strcpy(tsDataDir, "/usr/local/var/lib/taos");
|
strcpy(tsDataDir, "/usr/local/var/lib/taos");
|
||||||
strcpy(tsLogDir, "/usr/local/var/log/taos");
|
strcpy(tsLogDir, "/usr/local/var/log/taos");
|
||||||
strcpy(tsTempDir, "/usr/local/etc/taos");
|
strcpy(tsTempDir, "/tmp/taosd");
|
||||||
strcpy(tsOsName, "Darwin");
|
strcpy(tsOsName, "Darwin");
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -75,6 +75,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_DUP_KEY, "Cannot add duplicate
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NEED_RETRY, "Retry needed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NEED_RETRY, "Retry needed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE, "Out of memory in rpc queue")
|
TAOS_DEFINE_ERROR(TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE, "Out of memory in rpc queue")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIMESTAMP, "Invalid timestamp format")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIMESTAMP, "Invalid timestamp format")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_DECODE_ERROR, "Msg decode error")
|
||||||
|
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_REF_NO_MEMORY, "Ref out of memory")
|
TAOS_DEFINE_ERROR(TSDB_CODE_REF_NO_MEMORY, "Ref out of memory")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_REF_FULL, "too many Ref Objs")
|
TAOS_DEFINE_ERROR(TSDB_CODE_REF_FULL, "too many Ref Objs")
|
||||||
|
|
|
@ -397,6 +397,7 @@ class TDDnode:
|
||||||
def stop(self):
|
def stop(self):
|
||||||
if (not self.remoteIP == ""):
|
if (not self.remoteIP == ""):
|
||||||
self.remoteExec(self.cfgDict, "tdDnodes.stop(%d)"%self.index)
|
self.remoteExec(self.cfgDict, "tdDnodes.stop(%d)"%self.index)
|
||||||
|
tdLog.info("stop dnode%d"%self.index)
|
||||||
return
|
return
|
||||||
if self.valgrind == 0:
|
if self.valgrind == 0:
|
||||||
toBeKilled = "taosd"
|
toBeKilled = "taosd"
|
||||||
|
|
|
@ -10,6 +10,9 @@
|
||||||
#include "../../../include/client/taos.h"
|
#include "../../../include/client/taos.h"
|
||||||
|
|
||||||
#define FUNCTION_TEST_IDX 1
|
#define FUNCTION_TEST_IDX 1
|
||||||
|
#define TIME_PRECISION_MILLI 0
|
||||||
|
#define TIME_PRECISION_MICRO 1
|
||||||
|
#define TIME_PRECISION_NANO 2
|
||||||
|
|
||||||
int32_t shortColList[] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_INT};
|
int32_t shortColList[] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_INT};
|
||||||
int32_t fullColList[] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_BOOL, TSDB_DATA_TYPE_TINYINT, TSDB_DATA_TYPE_UTINYINT, TSDB_DATA_TYPE_SMALLINT, TSDB_DATA_TYPE_USMALLINT, TSDB_DATA_TYPE_INT, TSDB_DATA_TYPE_UINT, TSDB_DATA_TYPE_BIGINT, TSDB_DATA_TYPE_UBIGINT, TSDB_DATA_TYPE_FLOAT, TSDB_DATA_TYPE_DOUBLE, TSDB_DATA_TYPE_BINARY, TSDB_DATA_TYPE_NCHAR};
|
int32_t fullColList[] = {TSDB_DATA_TYPE_TIMESTAMP, TSDB_DATA_TYPE_BOOL, TSDB_DATA_TYPE_TINYINT, TSDB_DATA_TYPE_UTINYINT, TSDB_DATA_TYPE_SMALLINT, TSDB_DATA_TYPE_USMALLINT, TSDB_DATA_TYPE_INT, TSDB_DATA_TYPE_UINT, TSDB_DATA_TYPE_BIGINT, TSDB_DATA_TYPE_UBIGINT, TSDB_DATA_TYPE_FLOAT, TSDB_DATA_TYPE_DOUBLE, TSDB_DATA_TYPE_BINARY, TSDB_DATA_TYPE_NCHAR};
|
||||||
|
@ -32,6 +35,8 @@ typedef enum {
|
||||||
BP_BIND_COL,
|
BP_BIND_COL,
|
||||||
} BP_BIND_TYPE;
|
} BP_BIND_TYPE;
|
||||||
|
|
||||||
|
#define BP_BIND_TYPE_STR(t) (((t) == BP_BIND_COL) ? "column" : "tag")
|
||||||
|
|
||||||
OperInfo operInfo[] = {
|
OperInfo operInfo[] = {
|
||||||
{">", 2, false},
|
{">", 2, false},
|
||||||
{">=", 2, false},
|
{">=", 2, false},
|
||||||
|
@ -57,11 +62,12 @@ FuncInfo funcInfo[] = {
|
||||||
{"min", 1},
|
{"min", 1},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define BP_STARTUP_TS 1591060628000
|
||||||
|
|
||||||
char *bpStbPrefix = "st";
|
char *bpStbPrefix = "st";
|
||||||
char *bpTbPrefix = "t";
|
char *bpTbPrefix = "t";
|
||||||
int32_t bpDefaultStbId = 1;
|
int32_t bpDefaultStbId = 1;
|
||||||
|
int64_t bpTs;
|
||||||
|
|
||||||
|
|
||||||
//char *operatorList[] = {">", ">=", "<", "<=", "=", "<>", "in", "not in"};
|
//char *operatorList[] = {">", ">=", "<", "<=", "=", "<>", "in", "not in"};
|
||||||
//char *varoperatorList[] = {">", ">=", "<", "<=", "=", "<>", "in", "not in", "like", "not like", "match", "nmatch"};
|
//char *varoperatorList[] = {">", ">=", "<", "<=", "=", "<>", "in", "not in", "like", "not like", "match", "nmatch"};
|
||||||
|
@ -188,8 +194,10 @@ typedef struct {
|
||||||
bool printCreateTblSql;
|
bool printCreateTblSql;
|
||||||
bool printQuerySql;
|
bool printQuerySql;
|
||||||
bool printStmtSql;
|
bool printStmtSql;
|
||||||
|
bool printVerbose;
|
||||||
bool autoCreateTbl;
|
bool autoCreateTbl;
|
||||||
bool numericParam;
|
bool numericParam;
|
||||||
|
uint8_t precision;
|
||||||
int32_t rowNum; //row num for one table
|
int32_t rowNum; //row num for one table
|
||||||
int32_t bindColNum;
|
int32_t bindColNum;
|
||||||
int32_t bindTagNum;
|
int32_t bindTagNum;
|
||||||
|
@ -209,12 +217,15 @@ typedef struct {
|
||||||
int32_t caseRunNum; // total run case num
|
int32_t caseRunNum; // total run case num
|
||||||
} CaseCtrl;
|
} CaseCtrl;
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
CaseCtrl gCaseCtrl = { // default
|
CaseCtrl gCaseCtrl = { // default
|
||||||
|
.precision = TIME_PRECISION_MICRO,
|
||||||
.bindNullNum = 0,
|
.bindNullNum = 0,
|
||||||
.printCreateTblSql = false,
|
.printCreateTblSql = false,
|
||||||
.printQuerySql = true,
|
.printQuerySql = true,
|
||||||
.printStmtSql = true,
|
.printStmtSql = true,
|
||||||
|
.printVerbose = false,
|
||||||
|
.printRes = false,
|
||||||
.autoCreateTbl = false,
|
.autoCreateTbl = false,
|
||||||
.numericParam = false,
|
.numericParam = false,
|
||||||
.rowNum = 0,
|
.rowNum = 0,
|
||||||
|
@ -230,7 +241,6 @@ CaseCtrl gCaseCtrl = { // default
|
||||||
.funcIdxListNum = 0,
|
.funcIdxListNum = 0,
|
||||||
.funcIdxList = NULL,
|
.funcIdxList = NULL,
|
||||||
.checkParamNum = false,
|
.checkParamNum = false,
|
||||||
.printRes = false,
|
|
||||||
.runTimes = 0,
|
.runTimes = 0,
|
||||||
.caseIdx = -1,
|
.caseIdx = -1,
|
||||||
.caseNum = -1,
|
.caseNum = -1,
|
||||||
|
@ -240,26 +250,35 @@ CaseCtrl gCaseCtrl = { // default
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
CaseCtrl gCaseCtrl = {
|
CaseCtrl gCaseCtrl = {
|
||||||
|
.precision = TIME_PRECISION_MILLI,
|
||||||
.bindNullNum = 0,
|
.bindNullNum = 0,
|
||||||
.printCreateTblSql = true,
|
.printCreateTblSql = false,
|
||||||
.printQuerySql = true,
|
.printQuerySql = true,
|
||||||
.printStmtSql = true,
|
.printStmtSql = true,
|
||||||
|
.printVerbose = false,
|
||||||
|
.printRes = true,
|
||||||
.autoCreateTbl = false,
|
.autoCreateTbl = false,
|
||||||
|
.numericParam = false,
|
||||||
.rowNum = 0,
|
.rowNum = 0,
|
||||||
.bindColNum = 0,
|
.bindColNum = 0,
|
||||||
.bindTagNum = 0,
|
.bindTagNum = 0,
|
||||||
.bindRowNum = 0,
|
.bindRowNum = 0,
|
||||||
|
.bindColTypeNum = 0,
|
||||||
|
.bindColTypeList = NULL,
|
||||||
.bindTagTypeNum = 0,
|
.bindTagTypeNum = 0,
|
||||||
.bindTagTypeList = NULL,
|
.bindTagTypeList = NULL,
|
||||||
|
.optrIdxListNum = 0,
|
||||||
|
.optrIdxList = NULL,
|
||||||
|
.funcIdxListNum = 0,
|
||||||
|
.funcIdxList = NULL,
|
||||||
.checkParamNum = false,
|
.checkParamNum = false,
|
||||||
.printRes = false,
|
|
||||||
.runTimes = 0,
|
.runTimes = 0,
|
||||||
.caseIdx = 1,
|
.caseIdx = -1,
|
||||||
.caseNum = 1,
|
.caseNum = -1,
|
||||||
.caseRunIdx = -1,
|
.caseRunIdx = -1,
|
||||||
.caseRunNum = 1,
|
.caseRunNum = -1,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -891,7 +910,6 @@ int32_t prepareColData(BP_BIND_TYPE bType, BindData *data, int32_t bindIdx, int3
|
||||||
|
|
||||||
|
|
||||||
int32_t prepareInsertData(BindData *data) {
|
int32_t prepareInsertData(BindData *data) {
|
||||||
static int64_t tsData = 1591060628000;
|
|
||||||
uint64_t allRowNum = gCurCase->rowNum * gCurCase->tblNum;
|
uint64_t allRowNum = gCurCase->rowNum * gCurCase->tblNum;
|
||||||
|
|
||||||
data->colNum = 0;
|
data->colNum = 0;
|
||||||
|
@ -918,7 +936,7 @@ int32_t prepareInsertData(BindData *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < allRowNum; ++i) {
|
for (int32_t i = 0; i < allRowNum; ++i) {
|
||||||
data->tsData[i] = tsData++;
|
data->tsData[i] = bpTs++;
|
||||||
data->boolData[i] = (bool)(i % 2);
|
data->boolData[i] = (bool)(i % 2);
|
||||||
data->tinyData[i] = (int8_t)i;
|
data->tinyData[i] = (int8_t)i;
|
||||||
data->utinyData[i] = (uint8_t)(i+1);
|
data->utinyData[i] = (uint8_t)(i+1);
|
||||||
|
@ -956,7 +974,6 @@ int32_t prepareInsertData(BindData *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t prepareQueryCondData(BindData *data, int32_t tblIdx) {
|
int32_t prepareQueryCondData(BindData *data, int32_t tblIdx) {
|
||||||
static int64_t tsData = 1591060628000;
|
|
||||||
uint64_t bindNum = gCurCase->rowNum / gCurCase->bindRowNum;
|
uint64_t bindNum = gCurCase->rowNum / gCurCase->bindRowNum;
|
||||||
|
|
||||||
data->colNum = 0;
|
data->colNum = 0;
|
||||||
|
@ -982,7 +999,7 @@ int32_t prepareQueryCondData(BindData *data, int32_t tblIdx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < bindNum; ++i) {
|
for (int32_t i = 0; i < bindNum; ++i) {
|
||||||
data->tsData[i] = tsData + tblIdx*gCurCase->rowNum + rand()%gCurCase->rowNum;
|
data->tsData[i] = bpTs + tblIdx*gCurCase->rowNum + rand()%gCurCase->rowNum;
|
||||||
data->boolData[i] = (bool)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->boolData[i] = (bool)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
data->tinyData[i] = (int8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->tinyData[i] = (int8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
data->utinyData[i] = (uint8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->utinyData[i] = (uint8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
|
@ -1014,7 +1031,6 @@ int32_t prepareQueryCondData(BindData *data, int32_t tblIdx) {
|
||||||
|
|
||||||
|
|
||||||
int32_t prepareQueryMiscData(BindData *data, int32_t tblIdx) {
|
int32_t prepareQueryMiscData(BindData *data, int32_t tblIdx) {
|
||||||
static int64_t tsData = 1591060628000;
|
|
||||||
uint64_t bindNum = gCurCase->rowNum / gCurCase->bindRowNum;
|
uint64_t bindNum = gCurCase->rowNum / gCurCase->bindRowNum;
|
||||||
|
|
||||||
data->colNum = 0;
|
data->colNum = 0;
|
||||||
|
@ -1040,7 +1056,7 @@ int32_t prepareQueryMiscData(BindData *data, int32_t tblIdx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < bindNum; ++i) {
|
for (int32_t i = 0; i < bindNum; ++i) {
|
||||||
data->tsData[i] = tsData + tblIdx*gCurCase->rowNum + rand()%gCurCase->rowNum;
|
data->tsData[i] = bpTs + tblIdx*gCurCase->rowNum + rand()%gCurCase->rowNum;
|
||||||
data->boolData[i] = (bool)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->boolData[i] = (bool)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
data->tinyData[i] = (int8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->tinyData[i] = (int8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
data->utinyData[i] = (uint8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
data->utinyData[i] = (uint8_t)(tblIdx*gCurCase->rowNum + rand() % gCurCase->rowNum);
|
||||||
|
@ -1202,39 +1218,7 @@ int32_t bpAppendValueString(char *buf, int type, void *value, int32_t valueLen,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t bpBindParam(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
|
|
||||||
static int32_t n = 0;
|
|
||||||
|
|
||||||
if (gCurCase->bindRowNum > 1) {
|
|
||||||
if (0 == (n++%2)) {
|
|
||||||
if (taos_stmt_bind_param_batch(stmt, bind)) {
|
|
||||||
printf("!!!taos_stmt_bind_param_batch error:%s\n", taos_stmt_errstr(stmt));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int32_t i = 0; i < gCurCase->bindColNum; ++i) {
|
|
||||||
if (taos_stmt_bind_single_param_batch(stmt, bind++, i)) {
|
|
||||||
printf("!!!taos_stmt_bind_single_param_batch error:%s\n", taos_stmt_errstr(stmt));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (0 == (n++%2)) {
|
|
||||||
if (taos_stmt_bind_param_batch(stmt, bind)) {
|
|
||||||
printf("!!!taos_stmt_bind_param_batch error:%s\n", taos_stmt_errstr(stmt));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (taos_stmt_bind_param(stmt, bind)) {
|
|
||||||
printf("!!!taos_stmt_bind_param error:%s\n", taos_stmt_errstr(stmt));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void bpCheckIsInsert(TAOS_STMT *stmt, int32_t insert) {
|
void bpCheckIsInsert(TAOS_STMT *stmt, int32_t insert) {
|
||||||
int32_t isInsert = 0;
|
int32_t isInsert = 0;
|
||||||
|
@ -1280,15 +1264,12 @@ void bpCheckAffectedRowsOnce(TAOS_STMT *stmt, int32_t expectedNum) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bpCheckQueryResult(TAOS_STMT *stmt, TAOS *taos, char *stmtSql, TAOS_MULTI_BIND* bind) {
|
void bpCheckQueryResult(TAOS_STMT *stmt, TAOS *taos, char *stmtSql, TAOS_MULTI_BIND* bind) {
|
||||||
TAOS_RES* res = taos_stmt_use_result(stmt);
|
// query using sql
|
||||||
int32_t sqlResNum = 0;
|
|
||||||
int32_t stmtResNum = 0;
|
|
||||||
bpFetchRows(res, gCaseCtrl.printRes, &stmtResNum);
|
|
||||||
|
|
||||||
char sql[1024];
|
char sql[1024];
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
char* p = stmtSql;
|
char* p = stmtSql;
|
||||||
char* s = NULL;
|
char* s = NULL;
|
||||||
|
int32_t sqlResNum = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; true; ++i, p=s+1) {
|
for (int32_t i = 0; true; ++i, p=s+1) {
|
||||||
s = strchr(p, '?');
|
s = strchr(p, '?');
|
||||||
|
@ -1313,6 +1294,12 @@ void bpCheckQueryResult(TAOS_STMT *stmt, TAOS *taos, char *stmtSql, TAOS_MULTI_B
|
||||||
}
|
}
|
||||||
|
|
||||||
bpExecQuery(taos, sql, gCaseCtrl.printRes, &sqlResNum);
|
bpExecQuery(taos, sql, gCaseCtrl.printRes, &sqlResNum);
|
||||||
|
|
||||||
|
// query using stmt
|
||||||
|
TAOS_RES* res = taos_stmt_use_result(stmt);
|
||||||
|
int32_t stmtResNum = 0;
|
||||||
|
bpFetchRows(res, gCaseCtrl.printRes, &stmtResNum);
|
||||||
|
|
||||||
if (sqlResNum != stmtResNum) {
|
if (sqlResNum != stmtResNum) {
|
||||||
printf("!!!sql res num %d mis-match stmt res num %d\n", sqlResNum, stmtResNum);
|
printf("!!!sql res num %d mis-match stmt res num %d\n", sqlResNum, stmtResNum);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -1321,9 +1308,165 @@ void bpCheckQueryResult(TAOS_STMT *stmt, TAOS *taos, char *stmtSql, TAOS_MULTI_B
|
||||||
printf("***sql res num match stmt res num %d\n", stmtResNum);
|
printf("***sql res num match stmt res num %d\n", stmtResNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bpCheckColTagFields(TAOS_STMT *stmt, int32_t fieldNum, TAOS_FIELD_E* pFields, int32_t expecteNum, TAOS_MULTI_BIND* pBind, BP_BIND_TYPE type) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (fieldNum != expecteNum) {
|
||||||
|
printf("!!!%s field num %d mis-match expect num %d\n", BP_BIND_TYPE_STR(type), fieldNum, expecteNum);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == BP_BIND_COL) {
|
||||||
|
if (pFields[0].precision != gCaseCtrl.precision) {
|
||||||
|
printf("!!!db precision %d mis-match expect %d\n", pFields[0].precision, gCaseCtrl.precision);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < fieldNum; ++i) {
|
||||||
|
if (pFields[i].type != pBind[i].buffer_type) {
|
||||||
|
printf("!!!%s %dth field type %d mis-match expect type %d\n", BP_BIND_TYPE_STR(type), i, pFields[i].type, pBind[i].buffer_type);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFields[i].type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
if (pFields[i].bytes != (pBind[i].buffer_length + 2)) {
|
||||||
|
printf("!!!%s %dth field len %d mis-match expect len %d\n", BP_BIND_TYPE_STR(type), i, pFields[i].bytes, (pBind[i].buffer_length + 2));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else if (pFields[i].type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (pFields[i].bytes != (pBind[i].buffer_length * 4 + 2)) {
|
||||||
|
printf("!!!%s %dth field len %d mis-match expect len %d\n", BP_BIND_TYPE_STR(type), i, pFields[i].bytes, (pBind[i].buffer_length + 2));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else if (pFields[i].bytes != pBind[i].buffer_length) {
|
||||||
|
printf("!!!%s %dth field len %d mis-match expect len %d\n", BP_BIND_TYPE_STR(type), i, pFields[i].bytes, pBind[i].buffer_length);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == BP_BIND_COL) {
|
||||||
|
int fieldType = 0;
|
||||||
|
int fieldBytes = 0;
|
||||||
|
for (int32_t i = 0; i < fieldNum; ++i) {
|
||||||
|
code = taos_stmt_get_param(stmt, i, &fieldType, &fieldBytes);
|
||||||
|
if (code) {
|
||||||
|
printf("!!!taos_stmt_get_param error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFields[i].type != fieldType) {
|
||||||
|
printf("!!!%s %dth field type %d mis-match expect type %d\n", BP_BIND_TYPE_STR(type), i, fieldType, pFields[i].type);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFields[i].bytes != fieldBytes) {
|
||||||
|
printf("!!!%s %dth field len %d mis-match expect len %d\n", BP_BIND_TYPE_STR(type), i, fieldBytes, pFields[i].bytes);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gCaseCtrl.printVerbose) {
|
||||||
|
printf("%s fields check passed\n", BP_BIND_TYPE_STR(type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void bpCheckTagFields(TAOS_STMT *stmt, TAOS_MULTI_BIND* pBind) {
|
||||||
|
int32_t code = 0;
|
||||||
|
int fieldNum = 0;
|
||||||
|
TAOS_FIELD_E* pFields = NULL;
|
||||||
|
code = taos_stmt_get_tag_fields(stmt, &fieldNum, &pFields);
|
||||||
|
if (code != 0){
|
||||||
|
printf("!!!taos_stmt_get_tag_fields error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bpCheckColTagFields(stmt, fieldNum, pFields, gCurCase->bindTagNum, pBind, BP_BIND_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bpCheckColFields(TAOS_STMT *stmt, TAOS_MULTI_BIND* pBind) {
|
||||||
|
if (gCurCase->testType == TTYPE_QUERY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
int fieldNum = 0;
|
||||||
|
TAOS_FIELD_E* pFields = NULL;
|
||||||
|
code = taos_stmt_get_col_fields(stmt, &fieldNum, &pFields);
|
||||||
|
if (code != 0){
|
||||||
|
printf("!!!taos_stmt_get_col_fields error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bpCheckColTagFields(stmt, fieldNum, pFields, gCurCase->bindColNum, pBind, BP_BIND_COL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bpShowBindParam(TAOS_MULTI_BIND *bind, int32_t num) {
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
TAOS_MULTI_BIND* b = &bind[i];
|
||||||
|
printf("Bind %d: type[%d],buf[%p],buflen[%d],len[%],null[%d],num[%d]\n",
|
||||||
|
i, b->buffer_type, b->buffer, b->buffer_length, b->length ? *b->length : 0, b->is_null ? *b->is_null : 0, b->num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t bpBindParam(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
|
||||||
|
static int32_t n = 0;
|
||||||
|
|
||||||
|
bpCheckColFields(stmt, bind);
|
||||||
|
|
||||||
|
if (gCurCase->bindRowNum > 1) {
|
||||||
|
if (0 == (n++%2)) {
|
||||||
|
if (taos_stmt_bind_param_batch(stmt, bind)) {
|
||||||
|
printf("!!!taos_stmt_bind_param_batch error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
bpShowBindParam(bind, gCurCase->bindColNum);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t i = 0; i < gCurCase->bindColNum; ++i) {
|
||||||
|
if (taos_stmt_bind_single_param_batch(stmt, bind+i, i)) {
|
||||||
|
printf("!!!taos_stmt_bind_single_param_batch %d error:%s\n", taos_stmt_errstr(stmt), i);
|
||||||
|
bpShowBindParam(bind, gCurCase->bindColNum);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (0 == (n++%2)) {
|
||||||
|
if (taos_stmt_bind_param_batch(stmt, bind)) {
|
||||||
|
printf("!!!taos_stmt_bind_param_batch error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
bpShowBindParam(bind, gCurCase->bindColNum);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (taos_stmt_bind_param(stmt, bind)) {
|
||||||
|
printf("!!!taos_stmt_bind_param error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
bpShowBindParam(bind, gCurCase->bindColNum);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t bpSetTableNameTags(BindData *data, int32_t tblIdx, char *tblName, TAOS_STMT *stmt) {
|
int32_t bpSetTableNameTags(BindData *data, int32_t tblIdx, char *tblName, TAOS_STMT *stmt) {
|
||||||
|
int32_t code = 0;
|
||||||
if (gCurCase->bindTagNum > 0) {
|
if (gCurCase->bindTagNum > 0) {
|
||||||
return taos_stmt_set_tbname_tags(stmt, tblName, data->pTags + tblIdx * gCurCase->bindTagNum);
|
if ((rand() % 2) == 0) {
|
||||||
|
code = taos_stmt_set_tbname(stmt, tblName);
|
||||||
|
if (code != 0){
|
||||||
|
printf("!!!taos_stmt_set_tbname error:%s\n", taos_stmt_errstr(stmt));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bpCheckTagFields(stmt, data->pTags + tblIdx * gCurCase->bindTagNum);
|
||||||
|
|
||||||
|
return taos_stmt_set_tags(stmt, data->pTags + tblIdx * gCurCase->bindTagNum);
|
||||||
|
} else {
|
||||||
|
return taos_stmt_set_tbname_tags(stmt, tblName, data->pTags + tblIdx * gCurCase->bindTagNum);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return taos_stmt_set_tbname(stmt, tblName);
|
return taos_stmt_set_tbname(stmt, tblName);
|
||||||
}
|
}
|
||||||
|
@ -1755,7 +1898,7 @@ int insertAUTOTest1(TAOS_STMT *stmt, TAOS *taos) {
|
||||||
if (gCurCase->tblNum > 1) {
|
if (gCurCase->tblNum > 1) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
sprintf(buf, "t%d", t);
|
sprintf(buf, "t%d", t);
|
||||||
code = taos_stmt_set_tbname_tags(stmt, buf, data.pTags + t * gCurCase->bindTagNum);
|
code = bpSetTableNameTags(&data, t, buf, stmt);
|
||||||
if (code != 0){
|
if (code != 0){
|
||||||
printf("!!!taos_stmt_set_tbname_tags error:%s\n", taos_stmt_errstr(stmt));
|
printf("!!!taos_stmt_set_tbname_tags error:%s\n", taos_stmt_errstr(stmt));
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -2223,14 +2366,48 @@ void generateCreateTableSQL(char *buf, int32_t tblIdx, int32_t colNum, int32_t *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *bpPrecisionStr(uint8_t precision) {
|
||||||
|
switch (precision) {
|
||||||
|
case TIME_PRECISION_MILLI:
|
||||||
|
return "ms";
|
||||||
|
case TIME_PRECISION_MICRO:
|
||||||
|
return "us";
|
||||||
|
case TIME_PRECISION_NANO:
|
||||||
|
return "ns";
|
||||||
|
default:
|
||||||
|
return "unknwon";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bpSetStartupTs() {
|
||||||
|
switch (gCaseCtrl.precision) {
|
||||||
|
case TIME_PRECISION_MILLI:
|
||||||
|
bpTs = BP_STARTUP_TS;
|
||||||
|
break;
|
||||||
|
case TIME_PRECISION_MICRO:
|
||||||
|
bpTs = BP_STARTUP_TS * 1000;
|
||||||
|
break;
|
||||||
|
case TIME_PRECISION_NANO:
|
||||||
|
bpTs = BP_STARTUP_TS * 1000000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bpTs = BP_STARTUP_TS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void prepare(TAOS *taos, int32_t colNum, int32_t *colList, int prepareStb) {
|
void prepare(TAOS *taos, int32_t colNum, int32_t *colList, int prepareStb) {
|
||||||
TAOS_RES *result;
|
TAOS_RES *result;
|
||||||
int code;
|
int code;
|
||||||
|
char createDbSql[128] = {0};
|
||||||
|
|
||||||
result = taos_query(taos, "drop database demo");
|
result = taos_query(taos, "drop database demo");
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
|
|
||||||
result = taos_query(taos, "create database demo keep 36500");
|
sprintf(createDbSql, "create database demo keep 36500 precision \"%s\"", bpPrecisionStr(gCaseCtrl.precision));
|
||||||
|
printf("\tCreate Database SQL:%s\n", createDbSql);
|
||||||
|
|
||||||
|
result = taos_query(taos, createDbSql);
|
||||||
code = taos_errno(result);
|
code = taos_errno(result);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
printf("!!!failed to create database, reason:%s\n", taos_errstr(result));
|
printf("!!!failed to create database, reason:%s\n", taos_errstr(result));
|
||||||
|
@ -2279,6 +2456,8 @@ int32_t runCase(TAOS *taos, int32_t caseIdx, int32_t caseRunIdx, bool silent) {
|
||||||
CaseCfg cfgBk;
|
CaseCfg cfgBk;
|
||||||
gCurCase = &cfg;
|
gCurCase = &cfg;
|
||||||
|
|
||||||
|
bpSetStartupTs();
|
||||||
|
|
||||||
if ((gCaseCtrl.bindColTypeNum || gCaseCtrl.bindColNum) && (gCurCase->colNum != gFullColNum)) {
|
if ((gCaseCtrl.bindColTypeNum || gCaseCtrl.bindColNum) && (gCurCase->colNum != gFullColNum)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -2413,12 +2592,21 @@ void* runCaseList(TAOS *taos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void runAll(TAOS *taos) {
|
void runAll(TAOS *taos) {
|
||||||
#if 1
|
strcpy(gCaseCtrl.caseCatalog, "Default Test");
|
||||||
|
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Normal Test");
|
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
|
|
||||||
|
strcpy(gCaseCtrl.caseCatalog, "Micro DB precision Test");
|
||||||
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
|
gCaseCtrl.precision = TIME_PRECISION_MICRO;
|
||||||
|
runCaseList(taos);
|
||||||
|
gCaseCtrl.precision = TIME_PRECISION_MILLI;
|
||||||
|
|
||||||
|
strcpy(gCaseCtrl.caseCatalog, "Nano DB precision Test");
|
||||||
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
|
gCaseCtrl.precision = TIME_PRECISION_NANO;
|
||||||
|
runCaseList(taos);
|
||||||
|
gCaseCtrl.precision = TIME_PRECISION_MILLI;
|
||||||
|
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Auto Create Table Test");
|
strcpy(gCaseCtrl.caseCatalog, "Auto Create Table Test");
|
||||||
gCaseCtrl.autoCreateTbl = true;
|
gCaseCtrl.autoCreateTbl = true;
|
||||||
|
@ -2426,9 +2614,6 @@ void runAll(TAOS *taos) {
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
gCaseCtrl.autoCreateTbl = false;
|
gCaseCtrl.autoCreateTbl = false;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Null Test");
|
strcpy(gCaseCtrl.caseCatalog, "Null Test");
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
gCaseCtrl.bindNullNum = 1;
|
gCaseCtrl.bindNullNum = 1;
|
||||||
|
@ -2441,6 +2626,7 @@ void runAll(TAOS *taos) {
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
gCaseCtrl.bindRowNum = 0;
|
gCaseCtrl.bindRowNum = 0;
|
||||||
|
|
||||||
|
#if 0
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Row Num Test");
|
strcpy(gCaseCtrl.caseCatalog, "Row Num Test");
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
gCaseCtrl.rowNum = 1000;
|
gCaseCtrl.rowNum = 1000;
|
||||||
|
@ -2448,23 +2634,21 @@ void runAll(TAOS *taos) {
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
gCaseCtrl.rowNum = 0;
|
gCaseCtrl.rowNum = 0;
|
||||||
gCaseCtrl.printRes = true;
|
gCaseCtrl.printRes = true;
|
||||||
*/
|
|
||||||
|
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Runtimes Test");
|
strcpy(gCaseCtrl.caseCatalog, "Runtimes Test");
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
gCaseCtrl.runTimes = 2;
|
gCaseCtrl.runTimes = 2;
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
gCaseCtrl.runTimes = 0;
|
gCaseCtrl.runTimes = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 1
|
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Check Param Test");
|
strcpy(gCaseCtrl.caseCatalog, "Check Param Test");
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
gCaseCtrl.checkParamNum = true;
|
gCaseCtrl.checkParamNum = true;
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
gCaseCtrl.checkParamNum = false;
|
gCaseCtrl.checkParamNum = false;
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
#if 0
|
||||||
strcpy(gCaseCtrl.caseCatalog, "Bind Col Num Test");
|
strcpy(gCaseCtrl.caseCatalog, "Bind Col Num Test");
|
||||||
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
printf("%s Begin\n", gCaseCtrl.caseCatalog);
|
||||||
gCaseCtrl.bindColNum = 6;
|
gCaseCtrl.bindColNum = 6;
|
||||||
|
@ -2476,7 +2660,7 @@ void runAll(TAOS *taos) {
|
||||||
gCaseCtrl.bindColTypeNum = tListLen(bindColTypeList);
|
gCaseCtrl.bindColTypeNum = tListLen(bindColTypeList);
|
||||||
gCaseCtrl.bindColTypeList = bindColTypeList;
|
gCaseCtrl.bindColTypeList = bindColTypeList;
|
||||||
runCaseList(taos);
|
runCaseList(taos);
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
printf("All Test End\n");
|
printf("All Test End\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,6 +84,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP)
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
|
|
@ -86,6 +86,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP)
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
|
|
@ -86,6 +86,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP )
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
@ -196,7 +202,7 @@ class TDTestCase:
|
||||||
pktNum = '10'
|
pktNum = '10'
|
||||||
role = 'client'
|
role = 'client'
|
||||||
if platform.system().lower() == 'windows':
|
if platform.system().lower() == 'windows':
|
||||||
taosCmd = buildPath + '\\build\\bin\\taos.exe -c ' + keyDict['c']
|
taosCmd = buildPath + '\\build\\bin\\taos.exe -h 127.0.0.1 -c ' + keyDict['c']
|
||||||
taosCmd = taosCmd.replace('\\','\\\\')
|
taosCmd = taosCmd.replace('\\','\\\\')
|
||||||
else:
|
else:
|
||||||
taosCmd = buildPath + '/build/bin/taos -c ' + keyDict['c']
|
taosCmd = buildPath + '/build/bin/taos -c ' + keyDict['c']
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 4d83d8c62973506f760bcaa3a33f4665ed9046d0
|
Subproject commit 717f5aaa5f0a1b4d92bb2ae68858fec554fb5eda
|
Loading…
Reference in New Issue