Merge branch '3.0' of https://github.com/taosdata/TDengine into fix/TD-30837
This commit is contained in:
commit
95ba57c139
|
@ -109,9 +109,37 @@ s3migrate database <db_name>;
|
|||
| # | 参数 | 默认值 | 最小值 | 最大值 | 描述 |
|
||||
| :--- | :----------- | :----- | :----- | :------ | :----------------------------------------------------------- |
|
||||
| 1 | s3_keeplocal | 365 | 1 | 365000 | 数据在本地保留的天数,即 data 文件在本地磁盘保留多长时间后可以上传到 S3。默认单位:天,支持 m(分钟)、h(小时)和 d(天)三个单位 |
|
||||
| 2 | s3_chunksize | 262144 | 131072 | 1048576 | 上传对象的大小阈值,与 TSDB_PAGESIZE 参数一样,不可修改,单位为 TSDB 页 |
|
||||
| 2 | s3_chunkpages | 131072 | 131072 | 1048576 | 上传对象的大小阈值,与 tsdb_pagesize 参数一样,不可修改,单位为 TSDB 页 |
|
||||
| 3 | s3_compact | 1 | 0 | 1 | TSDB 文件组首次上传 S3 时,是否自动进行 compact 操作。 |
|
||||
|
||||
### 对象存储读写次数估算
|
||||
|
||||
对象存储服务的使用成本与存储的数据量及请求次数相关,下面分别介绍数据的上传及下载过程。
|
||||
|
||||
#### 数据上传
|
||||
|
||||
当 TSDB 时序数据超过 `s3_keeplocal` 参数指定的时间,相关的数据文件会被切分成多个文件块,每个文件块的默认大小是 512M 字节 (`s3_chunkpages * tsdb_pagesize`)。除了最后一个文件块保留在本地文件系统外,其余的文件块会被上传到对象存储服务。
|
||||
|
||||
```math
|
||||
上传次数 = 数据文件大小 / (s3_chunkpages * tsdb_pagesize) - 1
|
||||
```
|
||||
|
||||
在创建数据库时,可以通过 `s3_chunkpages` 参数调整每个文件块的大小,从而控制每个数据文件的上传次数。
|
||||
|
||||
其它类型的文件如 head, stt, sma 等,保留在本地文件系统,以加速预计算相关查询。
|
||||
|
||||
#### 数据下载
|
||||
|
||||
在查询操作中,如果需要访问对象存储中的数据,TSDB 不会下载整个数据文件,而是计算所需数据在文件中的位置,只下载相应的数据到 TSDB 页缓存中,然后将数据返回给查询执行引擎。后续查询首先检查页缓存,查看数据是否已被缓存。如果数据已缓存,则直接使用缓存中的数据,而无需重复从对象存储下载,从而有效降低从对象存储下载数据的次数。
|
||||
|
||||
相邻的多个数据页会作为一个数据块从对象存储下载一次,以减少从对象存储下载的次数。每个数据页的大小,在创建数据库时,通过 `tsdb_pagesize` 参数指定,默认 4K 字节。
|
||||
|
||||
```math
|
||||
下载次数 = 查询需要的数据块数量 - 已缓存的数据块数量
|
||||
```
|
||||
|
||||
页缓存是内存缓存,节点重启后,再次查询需要重新下载数据。缓存采用 LRU (Least Recently Used) 策略,当缓存空间不足时,最近最少使用的数据将被淘汰。缓存的大小可以通过 `s3PageCacheSize` 参数进行调整,通常来说,缓存越大,下载次数越少。
|
||||
|
||||
## Azure Blob 存储
|
||||
本节介绍在 TDengine Enterprise 如何使用微软 Azure Blob 对象存储。本功能是上一小节‘对象存储’功能的扩展,需额外依赖 Flexify 服务提供的 S3 网关。通过适当的参数配置,可以把大部分较冷的时序数据存储到 Azure Blob 服务中。
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
#define TK_STT_TRIGGER 104
|
||||
#define TK_TABLE_PREFIX 105
|
||||
#define TK_TABLE_SUFFIX 106
|
||||
#define TK_S3_CHUNKSIZE 107
|
||||
#define TK_S3_CHUNKPAGES 107
|
||||
#define TK_S3_KEEPLOCAL 108
|
||||
#define TK_S3_COMPACT 109
|
||||
#define TK_KEEP_TIME_OFFSET 110
|
||||
|
@ -407,7 +407,6 @@
|
|||
#define TK_WAL 389
|
||||
|
||||
|
||||
|
||||
#define TK_NK_SPACE 600
|
||||
#define TK_NK_COMMENT 601
|
||||
#define TK_NK_ILLEGAL 602
|
||||
|
|
|
@ -450,7 +450,7 @@ typedef enum ELogicConditionType {
|
|||
|
||||
#define TSDB_MIN_S3_CHUNK_SIZE (128 * 1024)
|
||||
#define TSDB_MAX_S3_CHUNK_SIZE (1024 * 1024)
|
||||
#define TSDB_DEFAULT_S3_CHUNK_SIZE (256 * 1024)
|
||||
#define TSDB_DEFAULT_S3_CHUNK_SIZE (128 * 1024)
|
||||
#define TSDB_MIN_S3_KEEP_LOCAL (1 * 1440) // unit minute
|
||||
#define TSDB_MAX_S3_KEEP_LOCAL (365000 * 1440)
|
||||
#define TSDB_DEFAULT_S3_KEEP_LOCAL (365 * 1440)
|
||||
|
|
|
@ -118,7 +118,7 @@ static const SSysDbTableSchema userDBSchema[] = {
|
|||
{.name = "table_suffix", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
|
||||
{.name = "tsdb_pagesize", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||
{.name = "keep_time_offset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "s3_chunksize", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||
{.name = "s3_chunkpages", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||
{.name = "s3_keeplocal", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
|
||||
{.name = "s3_compact", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true},
|
||||
{.name = "with_arbitrator", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true},
|
||||
|
|
|
@ -50,7 +50,7 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe
|
|||
(*pRsp)->numOfCols = htonl(numOfCols);
|
||||
|
||||
int32_t len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, numOfCols);
|
||||
if(len < 0) {
|
||||
if (len < 0) {
|
||||
taosMemoryFree(*pRsp);
|
||||
return terrno;
|
||||
}
|
||||
|
@ -292,7 +292,7 @@ static int32_t buildRetension(SArray* pRetension, char** ppRetentions) {
|
|||
}
|
||||
|
||||
const int lMaxLen = 128;
|
||||
char* p1 = taosMemoryCalloc(1, lMaxLen);
|
||||
char* p1 = taosMemoryCalloc(1, lMaxLen);
|
||||
if (NULL == p1) {
|
||||
return terrno;
|
||||
}
|
||||
|
@ -346,20 +346,20 @@ static const char* encryptAlgorithmStr(int8_t encryptAlgorithm) {
|
|||
}
|
||||
|
||||
int32_t formatDurationOrKeep(char* buffer, int64_t bufSize, int32_t timeInMinutes) {
|
||||
if (buffer == NULL || bufSize <= 0) {
|
||||
return 0;
|
||||
}
|
||||
int32_t len = 0;
|
||||
if (timeInMinutes % 1440 == 0) {
|
||||
int32_t days = timeInMinutes / 1440;
|
||||
len = tsnprintf(buffer, bufSize, "%dd", days);
|
||||
} else if (timeInMinutes % 60 == 0) {
|
||||
int32_t hours = timeInMinutes / 60;
|
||||
len = tsnprintf(buffer, bufSize, "%dh", hours);
|
||||
} else {
|
||||
len = tsnprintf(buffer, bufSize, "%dm", timeInMinutes);
|
||||
}
|
||||
return len;
|
||||
if (buffer == NULL || bufSize <= 0) {
|
||||
return 0;
|
||||
}
|
||||
int32_t len = 0;
|
||||
if (timeInMinutes % 1440 == 0) {
|
||||
int32_t days = timeInMinutes / 1440;
|
||||
len = tsnprintf(buffer, bufSize, "%dd", days);
|
||||
} else if (timeInMinutes % 60 == 0) {
|
||||
int32_t hours = timeInMinutes / 60;
|
||||
len = tsnprintf(buffer, bufSize, "%dh", hours);
|
||||
} else {
|
||||
len = tsnprintf(buffer, bufSize, "%dm", timeInMinutes);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, char* dbFName, SDbCfgInfo* pCfg) {
|
||||
|
@ -410,27 +410,27 @@ static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName,
|
|||
int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pCfg->daysToKeep2);
|
||||
|
||||
if (IS_SYS_DBNAME(dbName)) {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, "CREATE DATABASE `%s`", dbName);
|
||||
} else {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
"CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %s "
|
||||
"WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d STT_TRIGGER %d KEEP %s,%s,%s PAGES %d PAGESIZE %d "
|
||||
"PRECISION '%s' REPLICA %d "
|
||||
"WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d "
|
||||
"WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE %" PRId64
|
||||
" KEEP_TIME_OFFSET %d ENCRYPT_ALGORITHM '%s' S3_CHUNKSIZE %d S3_KEEPLOCAL %dm S3_COMPACT %d",
|
||||
dbName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression,
|
||||
durationStr,
|
||||
pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->sstTrigger,
|
||||
keep0Str, keep1Str, keep2Str,
|
||||
pCfg->pages, pCfg->pageSize, prec,
|
||||
pCfg->replications, pCfg->walLevel, pCfg->numOfVgroups, 1 == pCfg->numOfStables, hashPrefix,
|
||||
pCfg->hashSuffix, pCfg->tsdbPageSize, pCfg->walRetentionPeriod, pCfg->walRetentionSize,
|
||||
pCfg->keepTimeOffset, encryptAlgorithmStr(pCfg->encryptAlgorithm), pCfg->s3ChunkSize,
|
||||
pCfg->s3KeepLocal, pCfg->s3Compact);
|
||||
"CREATE DATABASE `%s`", dbName);
|
||||
} else {
|
||||
len +=
|
||||
tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
"CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %s "
|
||||
"WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d STT_TRIGGER %d KEEP %s,%s,%s PAGES %d PAGESIZE %d "
|
||||
"PRECISION '%s' REPLICA %d "
|
||||
"WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d "
|
||||
"WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE %" PRId64
|
||||
" KEEP_TIME_OFFSET %d ENCRYPT_ALGORITHM '%s' S3_CHUNKPAGES %d S3_KEEPLOCAL %dm S3_COMPACT %d",
|
||||
dbName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, durationStr,
|
||||
pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->sstTrigger, keep0Str, keep1Str, keep2Str,
|
||||
pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->walLevel, pCfg->numOfVgroups,
|
||||
1 == pCfg->numOfStables, hashPrefix, pCfg->hashSuffix, pCfg->tsdbPageSize, pCfg->walRetentionPeriod,
|
||||
pCfg->walRetentionSize, pCfg->keepTimeOffset, encryptAlgorithmStr(pCfg->encryptAlgorithm),
|
||||
pCfg->s3ChunkSize, pCfg->s3KeepLocal, pCfg->s3Compact);
|
||||
|
||||
if (pRetentions) {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, " RETENTIONS %s", pRetentions);
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
" RETENTIONS %s", pRetentions);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -510,30 +510,30 @@ void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
#define LTYPE_LEN (32 + 60) // 60 byte for compress info
|
||||
char type[LTYPE_LEN];
|
||||
snprintf(type, LTYPE_LEN, "%s", tDataTypes[pSchema->type].name);
|
||||
int typeLen = strlen(type);
|
||||
int typeLen = strlen(type);
|
||||
if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
|
||||
TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
|
||||
typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
|
||||
} else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
|
||||
typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, "(%d)",
|
||||
(int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
||||
(int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
||||
}
|
||||
|
||||
if (useCompress(pCfg->tableType) && pCfg->pSchemaExt) {
|
||||
typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " ENCODE \'%s\'",
|
||||
columnEncodeStr(COMPRESS_L1_TYPE_U32(pCfg->pSchemaExt[i].compress)));
|
||||
columnEncodeStr(COMPRESS_L1_TYPE_U32(pCfg->pSchemaExt[i].compress)));
|
||||
typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " COMPRESS \'%s\'",
|
||||
columnCompressStr(COMPRESS_L2_TYPE_U32(pCfg->pSchemaExt[i].compress)));
|
||||
columnCompressStr(COMPRESS_L2_TYPE_U32(pCfg->pSchemaExt[i].compress)));
|
||||
typeLen += tsnprintf(type + typeLen, LTYPE_LEN - typeLen, " LEVEL \'%s\'",
|
||||
columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pCfg->pSchemaExt[i].compress)));
|
||||
columnLevelStr(COMPRESS_L2_TYPE_LEVEL_U32(pCfg->pSchemaExt[i].compress)));
|
||||
}
|
||||
if (!(pSchema->flags & COL_IS_KEY)) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "%s`%s` %s",
|
||||
((i > 0) ? ", " : ""), pSchema->name, type);
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
|
||||
} else {
|
||||
char* pk = "PRIMARY KEY";
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "%s`%s` %s %s",
|
||||
((i > 0) ? ", " : ""), pSchema->name, type, pk);
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s`%s` %s %s", ((i > 0) ? ", " : ""), pSchema->name, type, pk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -545,14 +545,15 @@ void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
snprintf(type, sizeof(type), "%s", tDataTypes[pSchema->type].name);
|
||||
if (TSDB_DATA_TYPE_VARCHAR == pSchema->type || TSDB_DATA_TYPE_VARBINARY == pSchema->type ||
|
||||
TSDB_DATA_TYPE_GEOMETRY == pSchema->type) {
|
||||
snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
|
||||
snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
|
||||
(int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
|
||||
} else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
|
||||
snprintf(type + strlen(type), sizeof(type) - strlen(type), "(%d)",
|
||||
(int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
||||
}
|
||||
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "%s`%s` %s",
|
||||
((i > 0) ? ", " : ""), pSchema->name, type);
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -560,7 +561,7 @@ void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
|
||||
"%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -582,7 +583,7 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
return terrno;
|
||||
}
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s", pJson);
|
||||
"%s", pJson);
|
||||
taosMemoryFree(pJson);
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
@ -596,12 +597,12 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||
if (i > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
", ");
|
||||
", ");
|
||||
}
|
||||
|
||||
if (j >= valueNum) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"NULL");
|
||||
"NULL");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -624,14 +625,15 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, pTagVal->pData, pTagVal->nData, &tlen);
|
||||
TAOS_CHECK_ERRNO(code);
|
||||
} else {
|
||||
code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, &pTagVal->i64, tDataTypes[type].bytes, &tlen);
|
||||
code = dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, leftSize, type, &pTagVal->i64, tDataTypes[type].bytes,
|
||||
&tlen);
|
||||
TAOS_CHECK_ERRNO(code);
|
||||
}
|
||||
*len += tlen;
|
||||
j++;
|
||||
} else {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"NULL");
|
||||
"NULL");
|
||||
}
|
||||
}
|
||||
_exit:
|
||||
|
@ -643,38 +645,38 @@ _exit:
|
|||
void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg* pCfg) {
|
||||
if (pCfg->commentLen > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" COMMENT '%s'", pCfg->pComment);
|
||||
" COMMENT '%s'", pCfg->pComment);
|
||||
} else if (0 == pCfg->commentLen) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" COMMENT ''");
|
||||
" COMMENT ''");
|
||||
}
|
||||
|
||||
if (NULL != pDbCfg->pRetensions && pCfg->watermark1 > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" WATERMARK %" PRId64 "a", pCfg->watermark1);
|
||||
" WATERMARK %" PRId64 "a", pCfg->watermark1);
|
||||
if (pCfg->watermark2 > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
", %" PRId64 "a", pCfg->watermark2);
|
||||
", %" PRId64 "a", pCfg->watermark2);
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL != pDbCfg->pRetensions && pCfg->delay1 > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" MAX_DELAY %" PRId64 "a", pCfg->delay1);
|
||||
" MAX_DELAY %" PRId64 "a", pCfg->delay1);
|
||||
if (pCfg->delay2 > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
", %" PRId64 "a", pCfg->delay2);
|
||||
", %" PRId64 "a", pCfg->delay2);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
|
||||
if (NULL != pDbCfg->pRetensions && funcNum > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" ROLLUP(");
|
||||
" ROLLUP(");
|
||||
for (int32_t i = 0; i < funcNum; ++i) {
|
||||
char* pFunc = taosArrayGet(pCfg->pFuncs, i);
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
"%s%s", ((i > 0) ? ", " : ""), pFunc);
|
||||
"%s%s", ((i > 0) ? ", " : ""), pFunc);
|
||||
}
|
||||
*len +=
|
||||
snprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ")");
|
||||
|
@ -682,7 +684,7 @@ void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg*
|
|||
|
||||
if (pCfg->ttl > 0) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" TTL %d", pCfg->ttl);
|
||||
" TTL %d", pCfg->ttl);
|
||||
}
|
||||
|
||||
if (TSDB_SUPER_TABLE == pCfg->tableType || TSDB_NORMAL_TABLE == pCfg->tableType) {
|
||||
|
@ -696,18 +698,18 @@ void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg*
|
|||
if (nSma < pCfg->numOfColumns && nSma > 0) {
|
||||
bool smaOn = false;
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len),
|
||||
" SMA(");
|
||||
" SMA(");
|
||||
for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
|
||||
if (IS_BSMA_ON(pCfg->pSchemas + i)) {
|
||||
if (smaOn) {
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
|
||||
SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ",`%s`",
|
||||
(pCfg->pSchemas + i)->name);
|
||||
SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), ",`%s`",
|
||||
(pCfg->pSchemas + i)->name);
|
||||
} else {
|
||||
smaOn = true;
|
||||
*len += tsnprintf(buf + VARSTR_HEADER_SIZE + *len,
|
||||
SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "`%s`",
|
||||
(pCfg->pSchemas + i)->name);
|
||||
SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + *len), "`%s`",
|
||||
(pCfg->pSchemas + i)->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -736,20 +738,20 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* p
|
|||
|
||||
if (TSDB_SUPER_TABLE == pCfg->tableType) {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
"CREATE STABLE `%s` (", tbName);
|
||||
"CREATE STABLE `%s` (", tbName);
|
||||
appendColumnFields(buf2, &len, pCfg);
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
|
||||
") TAGS (");
|
||||
") TAGS (");
|
||||
appendTagFields(buf2, &len, pCfg);
|
||||
len +=
|
||||
snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
|
||||
appendTableOptions(buf2, &len, pDbCfg, pCfg);
|
||||
} else if (TSDB_CHILD_TABLE == pCfg->tableType) {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
"CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
|
||||
"CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
|
||||
appendTagNameFields(buf2, &len, pCfg);
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len),
|
||||
") TAGS (");
|
||||
") TAGS (");
|
||||
code = appendTagValues(buf2, &len, pCfg);
|
||||
TAOS_CHECK_ERRNO(code);
|
||||
len +=
|
||||
|
@ -757,7 +759,7 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* p
|
|||
appendTableOptions(buf2, &len, pDbCfg, pCfg);
|
||||
} else {
|
||||
len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_TB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE,
|
||||
"CREATE TABLE `%s` (", tbName);
|
||||
"CREATE TABLE `%s` (", tbName);
|
||||
appendColumnFields(buf2, &len, pCfg);
|
||||
len +=
|
||||
snprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_TB_RESULT_FIELD2_LEN - (VARSTR_HEADER_SIZE + len), ")");
|
||||
|
@ -793,7 +795,7 @@ static int32_t setCreateViewResultIntoDataBlock(SSDataBlock* pBlock, SShowCreate
|
|||
}
|
||||
|
||||
SViewMeta* pMeta = pStmt->pViewMeta;
|
||||
if(NULL == pMeta) {
|
||||
if (NULL == pMeta) {
|
||||
qError("exception: view meta is null");
|
||||
return TSDB_CODE_APP_ERROR;
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ typedef enum EDatabaseOptionType {
|
|||
DB_OPTION_STT_TRIGGER,
|
||||
DB_OPTION_TABLE_PREFIX,
|
||||
DB_OPTION_TABLE_SUFFIX,
|
||||
DB_OPTION_S3_CHUNKSIZE,
|
||||
DB_OPTION_S3_CHUNKPAGES,
|
||||
DB_OPTION_S3_KEEPLOCAL,
|
||||
DB_OPTION_S3_COMPACT,
|
||||
DB_OPTION_KEEP_TIME_OFFSET,
|
||||
|
@ -244,7 +244,7 @@ SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable
|
|||
SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pLikePattern);
|
||||
SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDnodeEndpoint);
|
||||
SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* pDbName, SNodeList* pTags);
|
||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo,
|
||||
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo,
|
||||
int8_t createdb, int8_t is_import);
|
||||
SNode* addCreateUserStmtWhiteList(SAstCreateContext* pCxt, SNode* pStmt, SNodeList* pIpRangesNodeList);
|
||||
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, void* pAlterInfo);
|
||||
|
|
|
@ -280,7 +280,7 @@ db_options(A) ::= db_options(B) WAL_SEGMENT_SIZE NK_INTEGER(C).
|
|||
db_options(A) ::= db_options(B) STT_TRIGGER NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_STT_TRIGGER, &C); }
|
||||
db_options(A) ::= db_options(B) TABLE_PREFIX signed(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_TABLE_PREFIX, C); }
|
||||
db_options(A) ::= db_options(B) TABLE_SUFFIX signed(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_TABLE_SUFFIX, C); }
|
||||
db_options(A) ::= db_options(B) S3_CHUNKSIZE NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_S3_CHUNKSIZE, &C); }
|
||||
db_options(A) ::= db_options(B) S3_CHUNKPAGES NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_S3_CHUNKPAGES, &C); }
|
||||
db_options(A) ::= db_options(B) S3_KEEPLOCAL NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_S3_KEEPLOCAL, &C); }
|
||||
db_options(A) ::= db_options(B) S3_KEEPLOCAL NK_VARIABLE(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_S3_KEEPLOCAL, &C); }
|
||||
db_options(A) ::= db_options(B) S3_COMPACT NK_INTEGER(C). { A = setDatabaseOption(pCxt, B, DB_OPTION_S3_COMPACT, &C); }
|
||||
|
|
|
@ -43,11 +43,11 @@
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define CHECK_NAME(p) \
|
||||
do { \
|
||||
if (!p) { \
|
||||
goto _err; \
|
||||
} \
|
||||
#define CHECK_NAME(p) \
|
||||
do { \
|
||||
if (!p) { \
|
||||
goto _err; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define COPY_STRING_FORM_ID_TOKEN(buf, pToken) strncpy(buf, (pToken)->z, TMIN((pToken)->n, sizeof(buf) - 1))
|
||||
|
@ -333,7 +333,7 @@ SNode* releaseRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
|
|||
// Len of pRawExpr->p could be larger than len of aliasName[TSDB_COL_NAME_LEN].
|
||||
// If aliasName is truncated, hash value of aliasName could be the same.
|
||||
uint64_t hashVal = MurmurHash3_64(pRawExpr->p, pRawExpr->n);
|
||||
sprintf(pExpr->aliasName, "%"PRIu64, hashVal);
|
||||
sprintf(pExpr->aliasName, "%" PRIu64, hashVal);
|
||||
strncpy(pExpr->userAlias, pRawExpr->p, len);
|
||||
pExpr->userAlias[len] = '\0';
|
||||
}
|
||||
|
@ -405,7 +405,7 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken*
|
|||
pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val);
|
||||
CHECK_MAKE_NODE(val);
|
||||
val->literal = taosStrndup(pLiteral->z, pLiteral->n);
|
||||
if(!val->literal) {
|
||||
if (!val->literal) {
|
||||
pCxt->errCode = terrno;
|
||||
nodesDestroyNode((SNode*)val);
|
||||
return NULL;
|
||||
|
@ -586,8 +586,8 @@ SNodeList* createHintNodeList(SAstCreateContext* pCxt, const SToken* pLiteral) {
|
|||
if (NULL == pLiteral || pLiteral->n <= 5) {
|
||||
return NULL;
|
||||
}
|
||||
SNodeList* pHintList = NULL;
|
||||
char* hint = taosStrndup(pLiteral->z + 3, pLiteral->n - 5);
|
||||
SNodeList* pHintList = NULL;
|
||||
char* hint = taosStrndup(pLiteral->z + 3, pLiteral->n - 5);
|
||||
if (!hint) return NULL;
|
||||
int32_t i = 0;
|
||||
bool quit = false;
|
||||
|
@ -971,7 +971,7 @@ _err:
|
|||
}
|
||||
|
||||
SNode* createBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight) {
|
||||
SNode* pNew = NULL, *pGE = NULL, *pLE = NULL;
|
||||
SNode *pNew = NULL, *pGE = NULL, *pLE = NULL;
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
pCxt->errCode = nodesCloneNode(pExpr, &pNew);
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
|
@ -993,7 +993,7 @@ _err:
|
|||
}
|
||||
|
||||
SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight) {
|
||||
SNode* pNew = NULL, *pLT = NULL, *pGT = NULL;
|
||||
SNode *pNew = NULL, *pLT = NULL, *pGT = NULL;
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
pCxt->errCode = nodesCloneNode(pExpr, &pNew);
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
|
@ -1959,7 +1959,7 @@ static SNode* setDatabaseOptionImpl(SAstCreateContext* pCxt, SNode* pOptions, ED
|
|||
nodesDestroyNode((SNode*)pNode);
|
||||
break;
|
||||
}
|
||||
case DB_OPTION_S3_CHUNKSIZE:
|
||||
case DB_OPTION_S3_CHUNKPAGES:
|
||||
pDbOptions->s3ChunkSize = taosStr2Int32(((SToken*)pVal)->z, NULL, 10);
|
||||
break;
|
||||
case DB_OPTION_S3_KEEPLOCAL: {
|
||||
|
@ -2210,7 +2210,7 @@ _err:
|
|||
|
||||
SNode* setColumnOptions(SAstCreateContext* pCxt, SNode* pOptions, const SToken* pVal1, void* pVal2) {
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
char optionType[TSDB_CL_OPTION_LEN];
|
||||
char optionType[TSDB_CL_OPTION_LEN];
|
||||
|
||||
memset(optionType, 0, TSDB_CL_OPTION_LEN);
|
||||
strncpy(optionType, pVal1->z, TMIN(pVal1->n, TSDB_CL_OPTION_LEN));
|
||||
|
@ -2807,7 +2807,7 @@ static int32_t getIpV4RangeFromWhitelistItem(char* ipRange, SIpV4Range* pIpRange
|
|||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
char* ipCopy = taosStrdup(ipRange);
|
||||
if (!ipCopy) return terrno;
|
||||
char* slash = strchr(ipCopy, '/');
|
||||
char* slash = strchr(ipCopy, '/');
|
||||
if (slash) {
|
||||
*slash = '\0';
|
||||
struct in_addr addr;
|
||||
|
|
|
@ -340,7 +340,7 @@ static SKeyword keywordTable[] = {
|
|||
{"_FROWTS", TK_FROWTS},
|
||||
{"ALIVE", TK_ALIVE},
|
||||
{"VARBINARY", TK_VARBINARY},
|
||||
{"S3_CHUNKSIZE", TK_S3_CHUNKSIZE},
|
||||
{"S3_CHUNKPAGES", TK_S3_CHUNKPAGES},
|
||||
{"S3_KEEPLOCAL", TK_S3_KEEPLOCAL},
|
||||
{"S3_COMPACT", TK_S3_COMPACT},
|
||||
{"S3MIGRATE", TK_S3MIGRATE},
|
||||
|
@ -371,7 +371,7 @@ static int32_t doInitKeywordsTable(void) {
|
|||
keywordHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, false);
|
||||
for (int32_t i = 0; i < numOfEntries; i++) {
|
||||
keywordTable[i].len = (uint8_t)strlen(keywordTable[i].name);
|
||||
void* ptr = &keywordTable[i];
|
||||
void* ptr = &keywordTable[i];
|
||||
int32_t code = taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
taosHashCleanup(keywordHashTable);
|
||||
|
@ -699,7 +699,7 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
|||
}
|
||||
}
|
||||
if (hasNonAsciiChars) {
|
||||
*tokenId = TK_NK_ALIAS; // must be alias
|
||||
*tokenId = TK_NK_ALIAS; // must be alias
|
||||
return i;
|
||||
}
|
||||
if (IS_TRUE_STR(z, i) || IS_FALSE_STR(z, i)) {
|
||||
|
@ -714,10 +714,10 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
|||
break;
|
||||
}
|
||||
bool hasNonAsciiChars = false;
|
||||
for (i = 1; ; i++) {
|
||||
for (i = 1;; i++) {
|
||||
if ((z[i] & 0x80) != 0) {
|
||||
hasNonAsciiChars = true;
|
||||
} else if (isIdChar[(uint8_t)z[i]]){
|
||||
} else if (isIdChar[(uint8_t)z[i]]) {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -835,9 +835,7 @@ SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr, bool* pIgnoreC
|
|||
|
||||
bool taosIsKeyWordToken(const char* z, int32_t len) { return (tKeywordCode((char*)z, len) != TK_NK_ID); }
|
||||
|
||||
int32_t taosInitKeywordsTable() {
|
||||
return doInitKeywordsTable();
|
||||
}
|
||||
int32_t taosInitKeywordsTable() { return doInitKeywordsTable(); }
|
||||
|
||||
void taosCleanupKeywordsTable() {
|
||||
void* m = keywordHashTable;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -150,7 +150,7 @@
|
|||
#define TK_STT_TRIGGER 104
|
||||
#define TK_TABLE_PREFIX 105
|
||||
#define TK_TABLE_SUFFIX 106
|
||||
#define TK_S3_CHUNKSIZE 107
|
||||
#define TK_S3_CHUNKPAGES 107
|
||||
#define TK_S3_KEEPLOCAL 108
|
||||
#define TK_S3_COMPACT 109
|
||||
#define TK_KEEP_TIME_OFFSET 110
|
||||
|
@ -1982,7 +1982,7 @@ static const YYCODETYPE yyFallback[] = {
|
|||
0, /* STT_TRIGGER => nothing */
|
||||
0, /* TABLE_PREFIX => nothing */
|
||||
0, /* TABLE_SUFFIX => nothing */
|
||||
0, /* S3_CHUNKSIZE => nothing */
|
||||
0, /* S3_CHUNKPAGES => nothing */
|
||||
0, /* S3_KEEPLOCAL => nothing */
|
||||
0, /* S3_COMPACT => nothing */
|
||||
0, /* KEEP_TIME_OFFSET => nothing */
|
||||
|
@ -2460,7 +2460,7 @@ static const char *const yyTokenName[] = {
|
|||
/* 104 */ "STT_TRIGGER",
|
||||
/* 105 */ "TABLE_PREFIX",
|
||||
/* 106 */ "TABLE_SUFFIX",
|
||||
/* 107 */ "S3_CHUNKSIZE",
|
||||
/* 107 */ "S3_CHUNKPAGES",
|
||||
/* 108 */ "S3_KEEPLOCAL",
|
||||
/* 109 */ "S3_COMPACT",
|
||||
/* 110 */ "KEEP_TIME_OFFSET",
|
||||
|
@ -3073,7 +3073,7 @@ static const char *const yyRuleName[] = {
|
|||
/* 136 */ "db_options ::= db_options STT_TRIGGER NK_INTEGER",
|
||||
/* 137 */ "db_options ::= db_options TABLE_PREFIX signed",
|
||||
/* 138 */ "db_options ::= db_options TABLE_SUFFIX signed",
|
||||
/* 139 */ "db_options ::= db_options S3_CHUNKSIZE NK_INTEGER",
|
||||
/* 139 */ "db_options ::= db_options S3_CHUNKPAGES NK_INTEGER",
|
||||
/* 140 */ "db_options ::= db_options S3_KEEPLOCAL NK_INTEGER",
|
||||
/* 141 */ "db_options ::= db_options S3_KEEPLOCAL NK_VARIABLE",
|
||||
/* 142 */ "db_options ::= db_options S3_COMPACT NK_INTEGER",
|
||||
|
@ -4534,7 +4534,7 @@ static const YYCODETYPE yyRuleInfoLhs[] = {
|
|||
415, /* (136) db_options ::= db_options STT_TRIGGER NK_INTEGER */
|
||||
415, /* (137) db_options ::= db_options TABLE_PREFIX signed */
|
||||
415, /* (138) db_options ::= db_options TABLE_SUFFIX signed */
|
||||
415, /* (139) db_options ::= db_options S3_CHUNKSIZE NK_INTEGER */
|
||||
415, /* (139) db_options ::= db_options S3_CHUNKPAGES NK_INTEGER */
|
||||
415, /* (140) db_options ::= db_options S3_KEEPLOCAL NK_INTEGER */
|
||||
415, /* (141) db_options ::= db_options S3_KEEPLOCAL NK_VARIABLE */
|
||||
415, /* (142) db_options ::= db_options S3_COMPACT NK_INTEGER */
|
||||
|
@ -5324,7 +5324,7 @@ static const signed char yyRuleInfoNRhs[] = {
|
|||
-3, /* (136) db_options ::= db_options STT_TRIGGER NK_INTEGER */
|
||||
-3, /* (137) db_options ::= db_options TABLE_PREFIX signed */
|
||||
-3, /* (138) db_options ::= db_options TABLE_SUFFIX signed */
|
||||
-3, /* (139) db_options ::= db_options S3_CHUNKSIZE NK_INTEGER */
|
||||
-3, /* (139) db_options ::= db_options S3_CHUNKPAGES NK_INTEGER */
|
||||
-3, /* (140) db_options ::= db_options S3_KEEPLOCAL NK_INTEGER */
|
||||
-3, /* (141) db_options ::= db_options S3_KEEPLOCAL NK_VARIABLE */
|
||||
-3, /* (142) db_options ::= db_options S3_COMPACT NK_INTEGER */
|
||||
|
@ -6513,8 +6513,8 @@ static YYACTIONTYPE yy_reduce(
|
|||
{ yylhsminor.yy980 = setDatabaseOption(pCxt, yymsp[-2].minor.yy980, DB_OPTION_TABLE_SUFFIX, yymsp[0].minor.yy980); }
|
||||
yymsp[-2].minor.yy980 = yylhsminor.yy980;
|
||||
break;
|
||||
case 139: /* db_options ::= db_options S3_CHUNKSIZE NK_INTEGER */
|
||||
{ yylhsminor.yy980 = setDatabaseOption(pCxt, yymsp[-2].minor.yy980, DB_OPTION_S3_CHUNKSIZE, &yymsp[0].minor.yy0); }
|
||||
case 139: /* db_options ::= db_options S3_CHUNKPAGES NK_INTEGER */
|
||||
{ yylhsminor.yy980 = setDatabaseOption(pCxt, yymsp[-2].minor.yy980, DB_OPTION_S3_CHUNKPAGES, &yymsp[0].minor.yy0); }
|
||||
yymsp[-2].minor.yy980 = yylhsminor.yy980;
|
||||
break;
|
||||
case 140: /* db_options ::= db_options S3_KEEPLOCAL NK_INTEGER */
|
||||
|
|
|
@ -4133,7 +4133,7 @@ int32_t fltSclBuildDatumFromValueNode(SFltSclDatum *datum, SValueNode *valNode)
|
|||
}
|
||||
case TSDB_DATA_TYPE_BOOL: {
|
||||
datum->kind = FLT_SCL_DATUM_KIND_INT64;
|
||||
datum->i = (valNode->datum.b) ? 0 : 1;
|
||||
datum->i = (valNode->datum.b) ? 1 : 0;
|
||||
break;
|
||||
}
|
||||
case TSDB_DATA_TYPE_TINYINT:
|
||||
|
@ -4541,6 +4541,7 @@ int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
|
|||
|
||||
if (info->scalarMode) {
|
||||
SArray *colRanges = info->sclCtx.fltSclRange;
|
||||
SOperatorNode *optNode = (SOperatorNode *) pNode;
|
||||
if (taosArrayGetSize(colRanges) == 1) {
|
||||
SFltSclColumnRange *colRange = taosArrayGet(colRanges, 0);
|
||||
if (NULL == colRange) {
|
||||
|
@ -4560,7 +4561,8 @@ int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
|
|||
FLT_ERR_JRET(fltSclGetTimeStampDatum(endPt, &end));
|
||||
win->skey = start.i;
|
||||
win->ekey = end.i;
|
||||
*isStrict = true;
|
||||
if(optNode->opType == OP_TYPE_IN) *isStrict = false;
|
||||
else *isStrict = true;
|
||||
goto _return;
|
||||
} else if (taosArrayGetSize(points) == 0) {
|
||||
*win = TSWINDOW_DESC_INITIALIZER;
|
||||
|
@ -5023,6 +5025,34 @@ int32_t fltSclBuildRangePoints(SFltSclOperator *oper, SArray *points) {
|
|||
}
|
||||
break;
|
||||
}
|
||||
case OP_TYPE_IN: {
|
||||
SNodeListNode *listNode = (SNodeListNode *)oper->valNode;
|
||||
SListCell *cell = listNode->pNodeList->pHead;
|
||||
SFltSclDatum minDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MAX, .type = oper->colNode->node.resType};
|
||||
SFltSclDatum maxDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MIN, .type = oper->colNode->node.resType};
|
||||
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
|
||||
SValueNode *valueNode = (SValueNode *)cell->pNode;
|
||||
SFltSclDatum valDatum;
|
||||
FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, valueNode));
|
||||
if(valueNode->node.resType.type == TSDB_DATA_TYPE_FLOAT || valueNode->node.resType.type == TSDB_DATA_TYPE_DOUBLE) {
|
||||
minDatum.i = TMIN(minDatum.i, valDatum.d);
|
||||
maxDatum.i = TMAX(maxDatum.i, valDatum.d);
|
||||
} else {
|
||||
minDatum.i = TMIN(minDatum.i, valDatum.i);
|
||||
maxDatum.i = TMAX(maxDatum.i, valDatum.i);
|
||||
}
|
||||
cell = cell->pNext;
|
||||
}
|
||||
SFltSclPoint startPt = {.start = true, .excl = false, .val = minDatum};
|
||||
SFltSclPoint endPt = {.start = false, .excl = false, .val = maxDatum};
|
||||
if (NULL == taosArrayPush(points, &startPt)) {
|
||||
FLT_ERR_RET(terrno);
|
||||
}
|
||||
if (NULL == taosArrayPush(points, &endPt)) {
|
||||
FLT_ERR_RET(terrno);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
qError("not supported operator type : %d when build range points", oper->type);
|
||||
break;
|
||||
|
@ -5075,11 +5105,13 @@ static bool fltSclIsCollectableNode(SNode *pNode) {
|
|||
|
||||
if (!(pOper->opType == OP_TYPE_GREATER_THAN || pOper->opType == OP_TYPE_GREATER_EQUAL ||
|
||||
pOper->opType == OP_TYPE_LOWER_THAN || pOper->opType == OP_TYPE_LOWER_EQUAL ||
|
||||
pOper->opType == OP_TYPE_NOT_EQUAL || pOper->opType == OP_TYPE_EQUAL)) {
|
||||
pOper->opType == OP_TYPE_NOT_EQUAL || pOper->opType == OP_TYPE_EQUAL ||
|
||||
pOper->opType == OP_TYPE_IN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_VALUE)) {
|
||||
if (!((nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_VALUE) ||
|
||||
(nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_NODE_LIST))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
"replica": 1,
|
||||
"duration":"10d",
|
||||
"s3_keeplocal":"30d",
|
||||
"s3_chunksize":"131072",
|
||||
"s3_chunkpages":"131072",
|
||||
"tsdb_pagesize":"1",
|
||||
"s3_compact":"1",
|
||||
"wal_retention_size":"1",
|
||||
|
|
|
@ -168,13 +168,13 @@ class TDTestCase(TBase):
|
|||
if keepLocal is not None:
|
||||
kw1 = f"s3_keeplocal {keepLocal}"
|
||||
if chunkSize is not None:
|
||||
kw2 = f"s3_chunksize {chunkSize}"
|
||||
kw2 = f"s3_chunkpages {chunkSize}"
|
||||
if compact is not None:
|
||||
kw3 = f"s3_compact {compact}"
|
||||
|
||||
sql = f" create database db1 vgroups 1 duration 1h {kw1} {kw2} {kw3}"
|
||||
tdSql.execute(sql, show=True)
|
||||
#sql = f"select name,s3_keeplocal,s3_chunksize,s3_compact from information_schema.ins_databases where name='db1';"
|
||||
#sql = f"select name,s3_keeplocal,s3_chunkpages,s3_compact from information_schema.ins_databases where name='db1';"
|
||||
sql = f"select * from information_schema.ins_databases where name='db1';"
|
||||
tdSql.query(sql)
|
||||
# 29 30 31 -> chunksize keeplocal compact
|
||||
|
@ -194,9 +194,9 @@ class TDTestCase(TBase):
|
|||
f"create database db2 s3_keeplocal -1",
|
||||
f"create database db2 s3_keeplocal 0",
|
||||
f"create database db2 s3_keeplocal 365001",
|
||||
f"create database db2 s3_chunksize -1",
|
||||
f"create database db2 s3_chunksize 0",
|
||||
f"create database db2 s3_chunksize 900000000",
|
||||
f"create database db2 s3_chunkpages -1",
|
||||
f"create database db2 s3_chunkpages 0",
|
||||
f"create database db2 s3_chunkpages 900000000",
|
||||
f"create database db2 s3_compact -1",
|
||||
f"create database db2 s3_compact 100",
|
||||
f"create database db2 duration 1d s3_keeplocal 1d"
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
"replica": 1,
|
||||
"duration":"10d",
|
||||
"s3_keeplocal":"30d",
|
||||
"s3_chunksize":"131072",
|
||||
"s3_chunkpages":"131072",
|
||||
"tsdb_pagesize":"1",
|
||||
"s3_compact":"1",
|
||||
"wal_retention_size":"1",
|
||||
|
|
|
@ -202,13 +202,13 @@ class TDTestCase(TBase):
|
|||
if keepLocal is not None:
|
||||
kw1 = f"s3_keeplocal {keepLocal}"
|
||||
if chunkSize is not None:
|
||||
kw2 = f"s3_chunksize {chunkSize}"
|
||||
kw2 = f"s3_chunkpages {chunkSize}"
|
||||
if compact is not None:
|
||||
kw3 = f"s3_compact {compact}"
|
||||
|
||||
sql = f" create database db1 vgroups 1 duration 1h {kw1} {kw2} {kw3}"
|
||||
tdSql.execute(sql, show=True)
|
||||
# sql = f"select name,s3_keeplocal,s3_chunksize,s3_compact from information_schema.ins_databases where name='db1';"
|
||||
# sql = f"select name,s3_keeplocal,s3_chunkpages,s3_compact from information_schema.ins_databases where name='db1';"
|
||||
sql = f"select * from information_schema.ins_databases where name='db1';"
|
||||
tdSql.query(sql)
|
||||
# 29 30 31 -> chunksize keeplocal compact
|
||||
|
@ -228,9 +228,9 @@ class TDTestCase(TBase):
|
|||
f"create database db2 s3_keeplocal -1",
|
||||
f"create database db2 s3_keeplocal 0",
|
||||
f"create database db2 s3_keeplocal 365001",
|
||||
f"create database db2 s3_chunksize -1",
|
||||
f"create database db2 s3_chunksize 0",
|
||||
f"create database db2 s3_chunksize 900000000",
|
||||
f"create database db2 s3_chunkpages -1",
|
||||
f"create database db2 s3_chunkpages 0",
|
||||
f"create database db2 s3_chunkpages 900000000",
|
||||
f"create database db2 s3_compact -1",
|
||||
f"create database db2 s3_compact 100",
|
||||
f"create database db2 duration 1d s3_keeplocal 1d"
|
||||
|
|
|
@ -42,17 +42,17 @@ class TDTestCase:
|
|||
tdSql.query('show create database scd;')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
|
||||
tdSql.query('show create database scd2;')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd2')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
|
||||
tdSql.query('show create database scd4')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd4')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
|
||||
|
||||
self.restartTaosd(1, dbname='scd')
|
||||
|
@ -60,16 +60,16 @@ class TDTestCase:
|
|||
tdSql.query('show create database scd;')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
|
||||
tdSql.query('show create database scd2;')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd2')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd2` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 3 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.query('show create database scd4')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 'scd4')
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
tdSql.checkData(0, 1, "CREATE DATABASE `scd4` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 10d WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 13 KEEP 3650d,3650d,3650d PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKPAGES 131072 S3_KEEPLOCAL 525600m S3_COMPACT 1")
|
||||
|
||||
|
||||
tdSql.execute('drop database scd')
|
||||
|
|
|
@ -35,6 +35,14 @@ if $rows != 3 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where tts in ('2022-07-10 16:31:01', '2022-07-10 16:31:03', 1657441865000);
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [-9223372036854775808, 9223372036854775807]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select * from tb1 where fbool in (0, 3);
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
|
@ -80,4 +88,45 @@ if $rows != 0 then
|
|||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000);
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [1657441840000, 1657441980000]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000, true);
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [1, 1657441980000]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000, false);
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [0, 1657441980000]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000, 1.02);
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [1, 1657441980000]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000, -1.02);
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @ Time Range: [-1, 1657441980000]@ then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql_error explain verbose true select * from tb1 where fts in ('2022-07-10 16:31:00', '2022-07-10 16:33:00', 1657441840000, 'abc');
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
|
|
|
@ -35,10 +35,11 @@ class TDTestCase:
|
|||
|
||||
def balance_vnode(self):
|
||||
leader_before = self.get_leader()
|
||||
tdSql.query("balance vgroup leader")
|
||||
|
||||
while True:
|
||||
leader_after = -1
|
||||
tdLog.debug("balancing vgroup leader")
|
||||
tdSql.execute("balance vgroup leader")
|
||||
while True:
|
||||
tdLog.debug("get new vgroup leader")
|
||||
leader_after = self.get_leader()
|
||||
|
@ -51,6 +52,7 @@ class TDTestCase:
|
|||
break
|
||||
else :
|
||||
time.sleep(1)
|
||||
tdLog.debug("leader not changed")
|
||||
|
||||
|
||||
def consume_TS_4674_Test(self):
|
||||
|
|
|
@ -49,3 +49,32 @@ target_include_directories(
|
|||
)
|
||||
|
||||
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME taos)
|
||||
|
||||
#
|
||||
# generator library shell_ut for uint test
|
||||
#
|
||||
|
||||
IF(TD_LINUX)
|
||||
# include
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
|
||||
# shell_ut library
|
||||
add_library(shell_ut STATIC ${SHELL_SRC})
|
||||
|
||||
IF(TD_WEBSOCKET)
|
||||
ADD_DEPENDENCIES(shell_ut taosws-rs)
|
||||
ENDIF()
|
||||
target_link_libraries(shell_ut PUBLIC taos ${LINK_WEBSOCKET} ${LINK_JEMALLOC} ${LINK_ARGP})
|
||||
target_link_libraries(shell_ut PRIVATE os common transport geometry util)
|
||||
|
||||
# util depends
|
||||
target_link_directories(
|
||||
shell_ut
|
||||
PUBLIC "${TD_SOURCE_DIR}/contrib/lzma2"
|
||||
PUBLIC "${TD_SOURCE_DIR}/contrib/pcre2"
|
||||
)
|
||||
|
||||
# unit test
|
||||
IF(${BUILD_TEST})
|
||||
ADD_SUBDIRECTORY(test)
|
||||
ENDIF(${BUILD_TEST})
|
||||
ENDIF()
|
||||
|
|
|
@ -16,6 +16,10 @@
|
|||
#ifndef __SHELL_AUTO__
|
||||
#define __SHELL_AUTO__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "shellInt.h"
|
||||
|
||||
#define TAB_KEY 0x09
|
||||
|
@ -47,4 +51,15 @@ void showAD(bool end);
|
|||
// show all commands help
|
||||
void showHelp();
|
||||
|
||||
|
||||
//
|
||||
// for unit test
|
||||
//
|
||||
bool fieldOptionsArea(char* p);
|
||||
bool isCreateFieldsArea(char* p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -46,6 +46,7 @@ typedef struct SWord {
|
|||
int32_t len;
|
||||
struct SWord* next;
|
||||
bool free; // if true need free
|
||||
bool end; // if true is last keyword
|
||||
} SWord;
|
||||
|
||||
typedef struct {
|
||||
|
@ -95,59 +96,62 @@ SWords shellCommands[] = {
|
|||
"<db_options> <anyword> <db_options> <anyword> ;", 0, 0, NULL},
|
||||
{"create dnode <anyword>", 0, 0, NULL},
|
||||
{"create index <anyword> on <stb_name> ()", 0, 0, NULL},
|
||||
{"create mnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"create qnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"create mnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"create qnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"create stream <anyword> into <anyword> as select", 0, 0, NULL}, // 26 append sub sql
|
||||
{"create topic <anyword> as select", 0, 0, NULL}, // 27 append sub sql
|
||||
{"create function <anyword> as <anyword> outputtype <data_types> language <udf_language>", 0, 0, NULL},
|
||||
{"create or replace <anyword> as <anyword> outputtype <data_types> language <udf_language>", 0, 0, NULL},
|
||||
{"create aggregate function <anyword> as <anyword> outputtype <data_types> bufsize <anyword> language <udf_language>", 0, 0, NULL},
|
||||
{"create or replace aggregate function <anyword> as <anyword> outputtype <data_types> bufsize <anyword> language <udf_language>", 0, 0, NULL},
|
||||
{"create tsma <anyword> on <all_table> function", 0, 0, NULL},
|
||||
{"create recursive tsma <anyword> on <tsma_name> interval(", 0, 0, NULL},
|
||||
{"create function <anyword> as <anyword> outputtype <data_types> language <udf_language>;", 0, 0, NULL},
|
||||
{"create or replace <anyword> as <anyword> outputtype <data_types> language <udf_language>;", 0, 0, NULL},
|
||||
{"create aggregate function <anyword> as <anyword> outputtype <data_types> bufsize <anyword> language <udf_language>;", 0, 0, NULL},
|
||||
{"create or replace aggregate function <anyword> as <anyword> outputtype <data_types> bufsize <anyword> language <udf_language>;", 0, 0, NULL},
|
||||
{"create user <anyword> pass <anyword> sysinfo 0;", 0, 0, NULL},
|
||||
{"create user <anyword> pass <anyword> sysinfo 1;", 0, 0, NULL},
|
||||
#ifdef TD_ENTERPRISE
|
||||
{"create view <anyword> as select", 0, 0, NULL},
|
||||
{"compact database <db_name>", 0, 0, NULL},
|
||||
#endif
|
||||
{"describe <all_table>", 0, 0, NULL},
|
||||
{"describe <all_table>;", 0, 0, NULL},
|
||||
{"delete from <all_table> where ", 0, 0, NULL},
|
||||
{"drop database <db_name>", 0, 0, NULL},
|
||||
{"drop index <anyword>", 0, 0, NULL},
|
||||
{"drop table <all_table>", 0, 0, NULL},
|
||||
{"drop dnode <dnode_id>", 0, 0, NULL},
|
||||
{"drop mnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"drop qnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"drop user <user_name> ;", 0, 0, NULL},
|
||||
{"drop database <db_name>;", 0, 0, NULL},
|
||||
{"drop index <anyword>;", 0, 0, NULL},
|
||||
{"drop table <all_table>;", 0, 0, NULL},
|
||||
{"drop dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"drop mnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"drop qnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"drop user <user_name>;", 0, 0, NULL},
|
||||
// 40
|
||||
{"drop function <udf_name> ;", 0, 0, NULL},
|
||||
{"drop function <udf_name>;", 0, 0, NULL},
|
||||
{"drop consumer group <anyword> on ", 0, 0, NULL},
|
||||
{"drop topic <topic_name> ;", 0, 0, NULL},
|
||||
{"drop stream <stream_name> ;", 0, 0, NULL},
|
||||
{"explain select", 0, 0, NULL}, // 44 append sub sql
|
||||
{"flush database <db_name> ;", 0, 0, NULL},
|
||||
{"drop topic <topic_name>;", 0, 0, NULL},
|
||||
{"drop stream <stream_name>;", 0, 0, NULL},
|
||||
{"drop tsma <tsma_name>;", 0, 0, NULL},
|
||||
{"explain select ", 0, 0, NULL}, // 44 append sub sql
|
||||
{"flush database <db_name>;", 0, 0, NULL},
|
||||
{"help;", 0, 0, NULL},
|
||||
{"grant all on <anyword> to <user_name> ;", 0, 0, NULL},
|
||||
{"grant read on <anyword> to <user_name> ;", 0, 0, NULL},
|
||||
{"grant write on <anyword> to <user_name> ;", 0, 0, NULL},
|
||||
{"kill connection <anyword> ;", 0, 0, NULL},
|
||||
{"grant all on <anyword> to <user_name>;", 0, 0, NULL},
|
||||
{"grant read on <anyword> to <user_name>;", 0, 0, NULL},
|
||||
{"grant write on <anyword> to <user_name>;", 0, 0, NULL},
|
||||
{"kill connection <anyword>;", 0, 0, NULL},
|
||||
{"kill query ", 0, 0, NULL},
|
||||
{"kill transaction ", 0, 0, NULL},
|
||||
#ifdef TD_ENTERPRISE
|
||||
{"merge vgroup <vgroup_id> <vgroup_id>", 0, 0, NULL},
|
||||
{"merge vgroup <vgroup_id> <vgroup_id>;", 0, 0, NULL},
|
||||
#endif
|
||||
{"pause stream <stream_name> ;", 0, 0, NULL},
|
||||
{"pause stream <stream_name>;", 0, 0, NULL},
|
||||
#ifdef TD_ENTERPRISE
|
||||
{"redistribute vgroup <vgroup_id> dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"redistribute vgroup <vgroup_id> dnode <dnode_id>;", 0, 0, NULL},
|
||||
#endif
|
||||
{"resume stream <stream_name> ;", 0, 0, NULL},
|
||||
{"resume stream <stream_name>;", 0, 0, NULL},
|
||||
{"reset query cache;", 0, 0, NULL},
|
||||
{"restore dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"restore vnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"restore mnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"restore qnode on dnode <dnode_id> ;", 0, 0, NULL},
|
||||
{"revoke all on <anyword> from <user_name> ;", 0, 0, NULL},
|
||||
{"revoke read on <anyword> from <user_name> ;", 0, 0, NULL},
|
||||
{"revoke write on <anyword> from <user_name> ;", 0, 0, NULL},
|
||||
{"restore dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"restore vnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"restore mnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"restore qnode on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"revoke all on <anyword> from <user_name>;", 0, 0, NULL},
|
||||
{"revoke read on <anyword> from <user_name>;", 0, 0, NULL},
|
||||
{"revoke write on <anyword> from <user_name>;", 0, 0, NULL},
|
||||
{"select * from <all_table>", 0, 0, NULL},
|
||||
{"select client_version();", 0, 0, NULL},
|
||||
// 60
|
||||
|
@ -160,15 +164,17 @@ SWords shellCommands[] = {
|
|||
{"select timezone();", 0, 0, NULL},
|
||||
{"set max_binary_display_width ", 0, 0, NULL},
|
||||
{"show apps;", 0, 0, NULL},
|
||||
{"show alive;", 0, 0, NULL},
|
||||
{"show create database <db_name> \\G;", 0, 0, NULL},
|
||||
{"show create stable <stb_name> \\G;", 0, 0, NULL},
|
||||
{"show create table <tb_name> \\G;", 0, 0, NULL},
|
||||
#ifdef TD_ENTERPRISE
|
||||
{"show create view <all_table> \\G;", 0, 0, NULL},
|
||||
#endif
|
||||
{"show connections;", 0, 0, NULL},
|
||||
{"show compact", 0, 0, NULL},
|
||||
{"show compacts;", 0, 0, NULL},
|
||||
|
||||
#endif
|
||||
{"show connections;", 0, 0, NULL},
|
||||
{"show cluster;", 0, 0, NULL},
|
||||
{"show cluster alive;", 0, 0, NULL},
|
||||
{"show cluster machines;", 0, 0, NULL},
|
||||
|
@ -190,16 +196,17 @@ SWords shellCommands[] = {
|
|||
{"show subscriptions;", 0, 0, NULL},
|
||||
{"show tables;", 0, 0, NULL},
|
||||
{"show tables like", 0, 0, NULL},
|
||||
{"show table distributed <all_table>", 0, 0, NULL},
|
||||
{"show tags from <tb_name>", 0, 0, NULL},
|
||||
{"show tags from <db_name>", 0, 0, NULL},
|
||||
{"show table tags from <all_table>", 0, 0, NULL},
|
||||
{"show table distributed <all_table>;", 0, 0, NULL},
|
||||
{"show tags from <tb_name>;", 0, 0, NULL},
|
||||
{"show table tags from <all_table>;", 0, 0, NULL},
|
||||
{"show topics;", 0, 0, NULL},
|
||||
{"show transactions;", 0, 0, NULL},
|
||||
{"show tsmas;", 0, 0, NULL},
|
||||
{"show users;", 0, 0, NULL},
|
||||
{"show variables;", 0, 0, NULL},
|
||||
{"show local variables;", 0, 0, NULL},
|
||||
{"show vnodes <dnode_id>", 0, 0, NULL},
|
||||
{"show vnodes;", 0, 0, NULL},
|
||||
{"show vnodes on dnode <dnode_id>;", 0, 0, NULL},
|
||||
{"show vgroups;", 0, 0, NULL},
|
||||
{"show consumers;", 0, 0, NULL},
|
||||
{"show grants;", 0, 0, NULL},
|
||||
|
@ -207,22 +214,26 @@ SWords shellCommands[] = {
|
|||
{"show grants logs;", 0, 0, NULL},
|
||||
#ifdef TD_ENTERPRISE
|
||||
{"show views;", 0, 0, NULL},
|
||||
{"split vgroup <vgroup_id>", 0, 0, NULL},
|
||||
{"show arbgroups;", 0, 0, NULL},
|
||||
{"split vgroup <vgroup_id>;", 0, 0, NULL},
|
||||
{"s3migrate database <db_name>;", 0, 0, NULL},
|
||||
#endif
|
||||
{"insert into <tb_name> values(", 0, 0, NULL},
|
||||
{"insert into <tb_name> using <stb_name> tags(", 0, 0, NULL},
|
||||
{"insert into <tb_name> using <stb_name> <anyword> values(", 0, 0, NULL},
|
||||
{"insert into <tb_name> file ", 0, 0, NULL},
|
||||
{"trim database <db_name>", 0, 0, NULL},
|
||||
{"s3migrate database <db_name>", 0, 0, NULL},
|
||||
{"use <db_name>", 0, 0, NULL},
|
||||
{"trim database <db_name>;", 0, 0, NULL},
|
||||
{"use <db_name>;", 0, 0, NULL},
|
||||
{"quit", 0, 0, NULL}};
|
||||
|
||||
// where keyword
|
||||
char* keywords[] = {
|
||||
"and ", "asc ", "desc ", "from ", "fill(", "limit ", "where ",
|
||||
"where ", "and ", "asc ", "desc ", "from ", "fill(", "limit ",
|
||||
"interval(", "order by ", "order by ", "offset ", "or ", "group by ", "now()",
|
||||
"session(", "sliding ", "slimit ", "soffset ", "state_window(", "today() ", "union all select ",
|
||||
"partition by "};
|
||||
"partition by ", "match", "nmatch ", "between ", "like ", "is null ", "is not null ",
|
||||
"event_window ", "count_window("
|
||||
};
|
||||
|
||||
char* functions[] = {
|
||||
"count(", "sum(",
|
||||
|
@ -255,6 +266,20 @@ char* functions[] = {
|
|||
"timezone(", "timetruncate(",
|
||||
"twa(", "to_unixtimestamp(",
|
||||
"unique(", "upper(",
|
||||
"pi(", "round(",
|
||||
"truncate(", "exp(",
|
||||
"ln(", "mod(",
|
||||
"rand(", "sign(",
|
||||
"degrees(", "radians(",
|
||||
"greatest(", "least(",
|
||||
"char_length(", "char(",
|
||||
"ascii(", "position(",
|
||||
"trim(", "replace(",
|
||||
"repeat(", "substring(",
|
||||
"substring_index(","timediff(",
|
||||
"week(", "weekday(",
|
||||
"weekofyear(", "dayofweek(",
|
||||
"stddev_pop(", "var_pop("
|
||||
};
|
||||
|
||||
char* tb_actions[] = {
|
||||
|
@ -275,7 +300,7 @@ char* db_options[] = {"keep ",
|
|||
"cachesize ",
|
||||
"comp ",
|
||||
"duration ",
|
||||
"wal_fsync_period",
|
||||
"wal_fsync_period ",
|
||||
"maxrows ",
|
||||
"minrows ",
|
||||
"pages ",
|
||||
|
@ -284,17 +309,22 @@ char* db_options[] = {"keep ",
|
|||
"wal_level ",
|
||||
"vgroups ",
|
||||
"single_stable ",
|
||||
"s3_chunksize ",
|
||||
"s3_keeplocal ",
|
||||
"s3_compact ",
|
||||
"s3_chunksize ",
|
||||
"s3_keeplocal ",
|
||||
"s3_compact ",
|
||||
"wal_retention_period ",
|
||||
"wal_roll_period ",
|
||||
"wal_retention_size ",
|
||||
"wal_segment_size "};
|
||||
#ifdef TD_ENTERPRISE
|
||||
"encrypt_algorithm "
|
||||
#endif
|
||||
"keep_time_offset ",
|
||||
"wal_segment_size "
|
||||
};
|
||||
|
||||
char* alter_db_options[] = {"cachemodel ", "replica ", "keep ", "stt_trigger ",
|
||||
"wal_retention_period ", "wal_retention_size ", "cachesize ",
|
||||
"s3_keeplocal ", "s3_compact ",
|
||||
"s3_keeplocal ", "s3_compact ",
|
||||
"wal_fsync_period ", "buffer ", "pages " ,"wal_level "};
|
||||
|
||||
char* data_types[] = {"timestamp", "int",
|
||||
|
@ -304,6 +334,7 @@ char* data_types[] = {"timestamp", "int",
|
|||
"bigint", "bigint unsigned",
|
||||
"smallint", "smallint unsigned",
|
||||
"tinyint", "tinyint unsigned",
|
||||
"geometry(64)", "varbinary(16)",
|
||||
"bool", "json"};
|
||||
|
||||
char* key_tags[] = {"tags("};
|
||||
|
@ -319,10 +350,20 @@ char* key_systable[] = {
|
|||
|
||||
char* udf_language[] = {"\'Python\'", "\'C\'"};
|
||||
|
||||
char* field_options[] = {
|
||||
"encode ", "compress ", "level ",
|
||||
"\'lz4\' ", "\'zlib\' ", "\'zstd\' ", "\'xz\' ", "\'tsz\' ", "\'disabled\' ", // compress
|
||||
"\'simple8b\' ", "\'delta-i\' ", "\'delta-d\' ", "\'bit-packing\' ",
|
||||
"\'high\' ", "\'medium\' ", "\'low\' ",
|
||||
"comment ",
|
||||
"primary key "
|
||||
};
|
||||
|
||||
// global keys can tips on anywhere
|
||||
char* global_keys[] = {
|
||||
"tbname",
|
||||
"now",
|
||||
"now",
|
||||
"vgroups",
|
||||
"_wstart",
|
||||
"_wend",
|
||||
"_wduration",
|
||||
|
@ -354,27 +395,29 @@ bool waitAutoFill = false;
|
|||
#define WT_VAR_STREAM 6
|
||||
#define WT_VAR_UDFNAME 7
|
||||
#define WT_VAR_VGROUPID 8
|
||||
#define WT_VAR_TSMA 9
|
||||
|
||||
#define WT_FROM_DB_MAX 8 // max get content from db
|
||||
#define WT_FROM_DB_MAX 9 // max get content from db
|
||||
#define WT_FROM_DB_CNT (WT_FROM_DB_MAX + 1)
|
||||
|
||||
#define WT_VAR_ALLTABLE 9
|
||||
#define WT_VAR_FUNC 10
|
||||
#define WT_VAR_KEYWORD 11
|
||||
#define WT_VAR_TBACTION 12
|
||||
#define WT_VAR_DBOPTION 13
|
||||
#define WT_VAR_ALTER_DBOPTION 14
|
||||
#define WT_VAR_DATATYPE 15
|
||||
#define WT_VAR_KEYTAGS 16
|
||||
#define WT_VAR_ANYWORD 17
|
||||
#define WT_VAR_TBOPTION 18
|
||||
#define WT_VAR_USERACTION 19
|
||||
#define WT_VAR_KEYSELECT 20
|
||||
#define WT_VAR_SYSTABLE 21
|
||||
#define WT_VAR_LANGUAGE 22
|
||||
#define WT_VAR_GLOBALKEYS 23
|
||||
#define WT_VAR_ALLTABLE 10
|
||||
#define WT_VAR_FUNC 11
|
||||
#define WT_VAR_KEYWORD 12
|
||||
#define WT_VAR_TBACTION 13
|
||||
#define WT_VAR_DBOPTION 14
|
||||
#define WT_VAR_ALTER_DBOPTION 15
|
||||
#define WT_VAR_DATATYPE 16
|
||||
#define WT_VAR_KEYTAGS 17
|
||||
#define WT_VAR_ANYWORD 18
|
||||
#define WT_VAR_TBOPTION 19
|
||||
#define WT_VAR_USERACTION 20
|
||||
#define WT_VAR_KEYSELECT 21
|
||||
#define WT_VAR_SYSTABLE 22
|
||||
#define WT_VAR_LANGUAGE 23
|
||||
#define WT_VAR_GLOBALKEYS 24
|
||||
#define WT_VAR_FIELD_OPTIONS 25
|
||||
|
||||
#define WT_VAR_CNT 24
|
||||
#define WT_VAR_CNT 26
|
||||
|
||||
|
||||
#define WT_TEXT 0xFF
|
||||
|
@ -387,12 +430,17 @@ TdThreadMutex tiresMutex;
|
|||
TdThread* threads[WT_FROM_DB_CNT];
|
||||
// obtain var name with sql from server
|
||||
char varTypes[WT_VAR_CNT][64] = {
|
||||
// get from db
|
||||
"<db_name>", "<stb_name>", "<tb_name>", "<dnode_id>", "<user_name>", "<topic_name>", "<stream_name>",
|
||||
"<udf_name>", "<vgroup_id>", "<all_table>", "<function>", "<keyword>", "<tb_actions>", "<db_options>", "<alter_db_options>",
|
||||
"<data_types>", "<key_tags>", "<anyword>", "<tb_options>", "<user_actions>", "<key_select>", "<sys_table>", "<udf_language>"};
|
||||
"<udf_name>", "<vgroup_id>", "<tsma_name>",
|
||||
// get from code
|
||||
"<all_table>", "<function>", "<keyword>", "<tb_actions>", "<db_options>", "<alter_db_options>",
|
||||
"<data_types>", "<key_tags>", "<anyword>", "<tb_options>", "<user_actions>", "<key_select>", "<sys_table>",
|
||||
"<udf_language>", "<global_keys>", "<field_options>"};
|
||||
|
||||
char varSqls[WT_FROM_DB_CNT][64] = {"show databases;", "show stables;", "show tables;", "show dnodes;",
|
||||
"show users;", "show topics;", "show streams;", "show functions;", "show vgroups;"};
|
||||
"show users;", "show topics;", "show streams;", "show functions;",
|
||||
"show vgroups;", "show tsmas;"};
|
||||
|
||||
// var words current cursor, if user press any one key except tab, cursorVar can be reset to -1
|
||||
int cursorVar = -1;
|
||||
|
@ -534,6 +582,7 @@ void showHelp() {
|
|||
select timezone();\n\
|
||||
set max_binary_display_width ...\n\
|
||||
show apps;\n\
|
||||
show alive;\n\
|
||||
show create database <db_name>;\n\
|
||||
show create stable <stb_name>;\n\
|
||||
show create table <tb_name>;\n\
|
||||
|
@ -567,7 +616,8 @@ void showHelp() {
|
|||
show users;\n\
|
||||
show variables;\n\
|
||||
show local variables;\n\
|
||||
show vnodes <dnode_id>\n\
|
||||
show vnodes;\n\
|
||||
show vnodes on dnode <dnode_id>;\n\
|
||||
show vgroups;\n\
|
||||
show consumers;\n\
|
||||
show grants;\n\
|
||||
|
@ -588,8 +638,10 @@ void showHelp() {
|
|||
create view <view_name> as select ...\n\
|
||||
redistribute vgroup <vgroup_id> dnode <dnode_id> ;\n\
|
||||
split vgroup <vgroup_id>;\n\
|
||||
s3migrate database <db_name>;\n\
|
||||
show compacts;\n\
|
||||
show compact \n\
|
||||
show arbgroups;\n\
|
||||
show views;\n\
|
||||
show create view <all_table>;");
|
||||
#endif
|
||||
|
@ -648,7 +700,12 @@ SWord* addWord(const char* p, int32_t len, bool pattern) {
|
|||
|
||||
// check format
|
||||
if (pattern && len > 0) {
|
||||
word->type = wordType(p, len);
|
||||
if (p[len - 1] == ';') {
|
||||
word->type = wordType(p, len - 1);
|
||||
word->end = true;
|
||||
} else {
|
||||
word->type = wordType(p, len);
|
||||
}
|
||||
} else {
|
||||
word->type = WT_TEXT;
|
||||
}
|
||||
|
@ -756,6 +813,7 @@ bool shellAutoInit() {
|
|||
GenerateVarType(WT_VAR_SYSTABLE, key_systable, sizeof(key_systable) / sizeof(char*));
|
||||
GenerateVarType(WT_VAR_LANGUAGE, udf_language, sizeof(udf_language) / sizeof(char*));
|
||||
GenerateVarType(WT_VAR_GLOBALKEYS, global_keys, sizeof(global_keys) / sizeof(char*));
|
||||
GenerateVarType(WT_VAR_FIELD_OPTIONS, field_options, sizeof(field_options) / sizeof(char*));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1254,9 +1312,9 @@ void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) {
|
|||
const char* str = NULL;
|
||||
int strLen = 0;
|
||||
|
||||
SWord* word = MATCH_WORD(match);
|
||||
if (firstMatchIndex == curMatchIndex && lastWordBytes == -1) {
|
||||
// first press tab
|
||||
SWord* word = MATCH_WORD(match);
|
||||
str = word->word + match->matchLen;
|
||||
strLen = word->len - match->matchLen;
|
||||
lastMatchIndex = firstMatchIndex;
|
||||
|
@ -1264,8 +1322,6 @@ void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) {
|
|||
} else {
|
||||
if (lastWordBytes == -1) return;
|
||||
deleteCount(cmd, lastWordBytes);
|
||||
|
||||
SWord* word = MATCH_WORD(match);
|
||||
str = word->word;
|
||||
strLen = word->len;
|
||||
// set current to last
|
||||
|
@ -1273,8 +1329,22 @@ void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) {
|
|||
lastWordBytes = word->len;
|
||||
}
|
||||
|
||||
// insert new
|
||||
shellInsertStr(cmd, (char*)str, strLen);
|
||||
if (word->end && str[strLen - 1] != ';') {
|
||||
// append end ';'
|
||||
char* p = taosMemoryCalloc(strLen + 8, 1);
|
||||
if (p) {
|
||||
tstrncpy(p, str, strLen + 1);
|
||||
tstrncpy(p + strLen, ";", 1 + 1);
|
||||
lastWordBytes += 1;
|
||||
shellInsertStr(cmd, (char*)p, strLen + 1);
|
||||
taosMemoryFree(p);
|
||||
} else {
|
||||
shellInsertStr(cmd, (char*)str, strLen);
|
||||
}
|
||||
} else {
|
||||
// insert new
|
||||
shellInsertStr(cmd, (char*)str, strLen);
|
||||
}
|
||||
}
|
||||
|
||||
// main key press tab , matched return true else false
|
||||
|
@ -1648,38 +1718,69 @@ bool matchSelectQuery(TAOS* con, SShellCmd* cmd) {
|
|||
return appendAfterSelect(con, cmd, p, len);
|
||||
}
|
||||
|
||||
// is fields option area
|
||||
bool fieldOptionsArea(char* p) {
|
||||
char* p1 = strrchr(p, '(');
|
||||
char* p2 = strrchr(p, ',');
|
||||
if (p1 == NULL && p2 == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// find tags
|
||||
if (strstr(p, " tags") != NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (p2 == NULL) {
|
||||
// first field area
|
||||
p2 = p1;
|
||||
}
|
||||
|
||||
// find blank count
|
||||
int32_t cnt = 0;
|
||||
while (p2) {
|
||||
p2 = strchr(p2, ' ');
|
||||
if (p2) {
|
||||
// get prev char
|
||||
char prec = *(p2 - 1);
|
||||
if (prec != ',' && prec != '(') {
|
||||
// blank if before comma, not calc count. like st(ts timestamp, age int + BLANK + TAB only two blank
|
||||
cnt++;
|
||||
}
|
||||
|
||||
// continue blank is one blank
|
||||
while (p2[1] != 0 && p2[1] == ' ') {
|
||||
// move next if blank again
|
||||
p2 += 1;
|
||||
}
|
||||
p2 += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// like create table st(ts timestamp TAB-KEY or st(ts timestamp , age int TAB-KEY
|
||||
return cnt >= 2;
|
||||
}
|
||||
|
||||
// if is input create fields or tags area, return true
|
||||
bool isCreateFieldsArea(char* p) {
|
||||
// put to while, support like create table st(ts timestamp, bin1 binary(16), bin2 + blank + TAB
|
||||
char* p1 = taosStrdup(p);
|
||||
bool ret = false;
|
||||
while (1) {
|
||||
char* left = strrchr(p1, '(');
|
||||
if (left == NULL) {
|
||||
// like 'create table st'
|
||||
ret = false;
|
||||
break;
|
||||
int32_t n = 0; // count
|
||||
char* p1 = p;
|
||||
while (*p1 != 0) {
|
||||
switch (*p1) {
|
||||
case '(':
|
||||
++n;
|
||||
break;
|
||||
case ')':
|
||||
--n;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
char* right = strrchr(p1, ')');
|
||||
if (right == NULL) {
|
||||
// like 'create table st( '
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (left > right) {
|
||||
// like 'create table st( ts timestamp, age int) tags(area '
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// set string end by small for next strrchr search
|
||||
*left = 0;
|
||||
// move next
|
||||
++p1;
|
||||
}
|
||||
taosMemoryFree(p1);
|
||||
|
||||
return ret;
|
||||
return n > 0;
|
||||
}
|
||||
|
||||
bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
|
||||
|
@ -1718,7 +1819,13 @@ bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
|
|||
|
||||
// check in create fields or tags input area
|
||||
if (isCreateFieldsArea(ps)) {
|
||||
ret = fillWithType(con, cmd, last, WT_VAR_DATATYPE);
|
||||
if (fieldOptionsArea(ps)) {
|
||||
// fill field options
|
||||
ret = fillWithType(con, cmd, last, WT_VAR_FIELD_OPTIONS);
|
||||
} else {
|
||||
// fill field
|
||||
ret = fillWithType(con, cmd, last, WT_VAR_DATATYPE);
|
||||
}
|
||||
}
|
||||
|
||||
// tags
|
||||
|
@ -1726,7 +1833,7 @@ bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
|
|||
// find only one ')' , can insert tags
|
||||
char* p1 = strchr(ps, ')');
|
||||
if (p1) {
|
||||
if (strchr(p1 + 1, ')') == NULL && strstr(p1 + 1, "tags") == NULL) {
|
||||
if (strstr(p1 + 1, "tags") == NULL) {
|
||||
// can insert tags keyword
|
||||
ret = fillWithType(con, cmd, last, WT_VAR_KEYTAGS);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
#include "shellAuto.h"
|
||||
#include "shellInt.h"
|
||||
|
||||
SShellObj shell = {0};
|
||||
|
||||
typedef struct {
|
||||
const char *sql;
|
||||
bool vertical;
|
||||
|
|
|
@ -17,8 +17,7 @@
|
|||
#include "shellInt.h"
|
||||
#include "shellAuto.h"
|
||||
|
||||
SShellObj shell = {0};
|
||||
|
||||
extern SShellObj shell;
|
||||
|
||||
void shellCrashHandler(int signum, void *sigInfo, void *context) {
|
||||
taosIgnSignal(SIGTERM);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
MESSAGE(STATUS "build taos-CLI unit test")
|
||||
|
||||
IF(NOT TD_DARWIN)
|
||||
# GoogleTest requires at least C++11
|
||||
SET(CMAKE_CXX_STANDARD 11)
|
||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
|
||||
ADD_EXECUTABLE(shellTest ${SOURCE_LIST})
|
||||
TARGET_LINK_LIBRARIES(
|
||||
shellTest
|
||||
PRIVATE shell_ut gtest os common transport geometry util
|
||||
)
|
||||
|
||||
target_include_directories(
|
||||
shell_ut
|
||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
|
||||
add_test(
|
||||
NAME shellTest
|
||||
COMMAND shellTest
|
||||
)
|
||||
ENDIF()
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <iostream>
|
||||
#include "shellAuto.h"
|
||||
|
||||
TEST(fieldOptionsArea, autoTabTest) {
|
||||
printf("hellow world SHELL tab test\n");
|
||||
|
||||
// str false
|
||||
const char *s0[] = {
|
||||
"create table st(ts ",
|
||||
"create table st(ts timestamp, age ",
|
||||
"create table st(ts timestamp, age",
|
||||
"create table st(ts timestamp, age int , name ",
|
||||
"create table st(ts timestamp, age int , name binary(16)",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int, addr ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int,addr varbinary",
|
||||
"create table st(ts timestamp, age int, name binary(16)) tags(area int , addr varbinary(32)",
|
||||
"create table st( ts timestamp, age int, name binary(16)) tags( area int, addr",
|
||||
"create table st (ts timestamp , age int, name binary(16) , area int,",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int ,addr varbinary",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) level "
|
||||
"'high' , no i",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) encode "
|
||||
"'simple8b' level 'high', no in",
|
||||
};
|
||||
|
||||
// str true
|
||||
const char *s1[] = {
|
||||
"create table st(ts timestamp ",
|
||||
"create table st(ts timestamp, age int ",
|
||||
"create table st(ts timestamp, age int ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ",
|
||||
"create table st(ts timestamp, age int , name binary(16) , addr varbinary( 32 ) ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ,area int, addr varbinary(32) ",
|
||||
"create table st(ts timestamp, age int , name binary(16), area int,addr varbinary(32) ",
|
||||
"create table st(ts timestamp, age int, name binary(16) , area int,addr varbinary(32) ",
|
||||
"create table st( ts timestamp, age int, name binary(16) ,area int,addr varbinary(32) ",
|
||||
"create table st (ts timestamp , age int, name binary(16), area int,addr varbinary(32) ",
|
||||
"create table st (ts timestamp , age int, name binary(16), area int , addr varbinary(32) compress 'zlib' ",
|
||||
"create table st (ts timestamp , age int, name binary(16), area int , addr varbinary(32) level 'high' ",
|
||||
"create table st (ts timestamp , age int, name binary(16) , area int , addr varbinary(32) encode 'simple8b' "
|
||||
"level 'high' ",
|
||||
};
|
||||
|
||||
// s0 is false
|
||||
for (int32_t i = 0; i < sizeof(s0) / sizeof(char *); i++) {
|
||||
printf("s0 i=%d fieldOptionsArea %s expect false \n", i, s0[i]);
|
||||
ASSERT(fieldOptionsArea((char *)s0[i]) == false);
|
||||
}
|
||||
|
||||
// s1 is true
|
||||
for (int32_t i = 0; i < sizeof(s1) / sizeof(char *); i++) {
|
||||
printf("s1 i=%d fieldOptionsArea %s expect true \n", i, s1[i]);
|
||||
ASSERT(fieldOptionsArea((char *)s1[i]) == true);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(isCreateFieldsArea, autoTabTest) {
|
||||
printf("hellow world SHELL tab test\n");
|
||||
|
||||
// str false
|
||||
const char *s0[] = {
|
||||
"create table st(ts )",
|
||||
"create table st(ts timestamp, age) ",
|
||||
"create table st(ts timestamp, age)",
|
||||
"create table st(ts timestamp, age int , name binary(16) )",
|
||||
"create table st(ts timestamp, age int , name binary(16))",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( )",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int, addr )",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int,addr varbinary)",
|
||||
"create table st(ts timestamp, age int, name binary(16)) tags(area int , addr varbinary(32))",
|
||||
"create table st( ts timestamp, age int, name binary(16)) tags( area int, addr int)",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int,addr varbinary(32) )",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int ,addr varbinary(14))",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) level "
|
||||
"'high' )",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) encode "
|
||||
"'simple8b' level 'high' ) ",
|
||||
};
|
||||
|
||||
// str true
|
||||
const char *s1[] = {
|
||||
"create table st(ts timestamp ",
|
||||
"create table st(ts timestamp, age int ",
|
||||
"create table st(ts timestamp, age int ,",
|
||||
"create table st(ts timestamp, age int , name binary(16), ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int, addr varbinary(32) ",
|
||||
"create table st(ts timestamp, age int , name binary(16) ) tags( area int,addr varbinary(32)",
|
||||
"create table st(ts timestamp, age int, name binary(16)) tags(area int,addr varbinary(32) ",
|
||||
"create table st( ts timestamp, age int, name binary(16)) tags(area int,addr varbinary(32) ",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int, addr varbinary(32) ",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) compress "
|
||||
"'zlib' ",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) level "
|
||||
"'high' ",
|
||||
"create table st (ts timestamp , age int, name binary(16) ) tags ( area int , addr varbinary(32) encode "
|
||||
"'simple8b' level 'high' ",
|
||||
};
|
||||
|
||||
// s0 is false
|
||||
for (int32_t i = 0; i < sizeof(s0) / sizeof(char *); i++) {
|
||||
printf("s0 i=%d isCreateFieldsArea %s expect false. \n", i, s0[i]);
|
||||
ASSERT(isCreateFieldsArea((char *)s0[i]) == false);
|
||||
}
|
||||
|
||||
// s1 is true
|
||||
for (int32_t i = 0; i < sizeof(s1) / sizeof(char *); i++) {
|
||||
printf("s1 i=%d isCreateFieldsArea %s expect true. \n", i, s1[i]);
|
||||
ASSERT(isCreateFieldsArea((char *)s1[i]) == true);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
Loading…
Reference in New Issue