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},
|
||||
|
|
|
@ -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`", 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);
|
||||
" 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -528,12 +528,12 @@ void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -624,7 +625,8 @@ 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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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},
|
||||
|
@ -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;
|
||||
|
|
|
@ -1019,8 +1019,7 @@ static uint8_t getPrecisionFromCurrStmt(SNode* pCurrStmt, uint8_t defaultVal) {
|
|||
if (isDeleteStmt(pCurrStmt)) {
|
||||
return ((SDeleteStmt*)pCurrStmt)->precision;
|
||||
}
|
||||
if (pCurrStmt && nodeType(pCurrStmt) == QUERY_NODE_CREATE_TSMA_STMT)
|
||||
return ((SCreateTSMAStmt*)pCurrStmt)->precision;
|
||||
if (pCurrStmt && nodeType(pCurrStmt) == QUERY_NODE_CREATE_TSMA_STMT) return ((SCreateTSMAStmt*)pCurrStmt)->precision;
|
||||
return defaultVal;
|
||||
}
|
||||
|
||||
|
@ -1194,8 +1193,7 @@ int32_t buildPartitionListFromOrderList(SNodeList* pOrderList, int32_t nodesNum,
|
|||
break;
|
||||
}
|
||||
}
|
||||
if(TSDB_CODE_SUCCESS == code)
|
||||
*ppOut = pPartitionList;
|
||||
if (TSDB_CODE_SUCCESS == code) *ppOut = pPartitionList;
|
||||
|
||||
return code;
|
||||
}
|
||||
|
@ -1229,7 +1227,8 @@ static int32_t isTimeLineAlignedQuery(SNode* pStmt, bool* pRes) {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_SET_OPERATOR == nodeType(((STempTableNode*)pSelect->pFromTable)->pSubquery)) {
|
||||
if (TSDB_CODE_SUCCESS == code &&
|
||||
QUERY_NODE_SET_OPERATOR == nodeType(((STempTableNode*)pSelect->pFromTable)->pSubquery)) {
|
||||
SSetOperator* pSub = (SSetOperator*)((STempTableNode*)pSelect->pFromTable)->pSubquery;
|
||||
if (pSelect->pPartitionByList && pSub->timeLineFromOrderBy && pSub->pOrderByList->length > 1) {
|
||||
SNodeList* pPartitionList = NULL;
|
||||
|
@ -1397,12 +1396,16 @@ static void setColumnPrimTs(STranslateContext* pCxt, SColumnNode* pCol, const ST
|
|||
}
|
||||
}
|
||||
|
||||
static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList, bool skipProjRef) {
|
||||
static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList,
|
||||
bool skipProjRef) {
|
||||
int32_t code = 0;
|
||||
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||
const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta;
|
||||
int32_t nums = pMeta->tableInfo.numOfColumns +
|
||||
(igTags ? 0 : ((TSDB_SUPER_TABLE == pMeta->tableType || ((SRealTableNode*)pTable)->stbRewrite) ? pMeta->tableInfo.numOfTags : 0));
|
||||
(igTags ? 0
|
||||
: ((TSDB_SUPER_TABLE == pMeta->tableType || ((SRealTableNode*)pTable)->stbRewrite)
|
||||
? pMeta->tableInfo.numOfTags
|
||||
: 0));
|
||||
for (int32_t i = 0; i < nums; ++i) {
|
||||
if (invisibleColumn(pCxt->pParseCxt->enableSysInfo, pMeta->tableType, pMeta->schema[i].flags)) {
|
||||
pCxt->pParseCxt->hasInvisibleCol = true;
|
||||
|
@ -1433,7 +1436,8 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p
|
|||
code = setColumnInfoByExpr(pTempTable, (SExprNode*)pNode, (SColumnNode**)&pCell->pNode);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
if (!skipProjRef) pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; // only set proj ref when select * from (select ...)
|
||||
if (!skipProjRef)
|
||||
pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; // only set proj ref when select * from (select ...)
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -1603,7 +1607,8 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p
|
|||
}
|
||||
}
|
||||
if (*pFound) {
|
||||
if (QUERY_NODE_FUNCTION == nodeType(pFoundNode) && (SQL_CLAUSE_GROUP_BY == pCxt->currClause || SQL_CLAUSE_PARTITION_BY == pCxt->currClause)) {
|
||||
if (QUERY_NODE_FUNCTION == nodeType(pFoundNode) &&
|
||||
(SQL_CLAUSE_GROUP_BY == pCxt->currClause || SQL_CLAUSE_PARTITION_BY == pCxt->currClause)) {
|
||||
pCxt->errCode = getFuncInfo(pCxt, (SFunctionNode*)pFoundNode);
|
||||
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
||||
if (fmIsVectorFunc(((SFunctionNode*)pFoundNode)->funcId)) {
|
||||
|
@ -1744,8 +1749,7 @@ static int32_t biRewriteSelectFuncParamStar(STranslateContext* pCxt, SSelectStmt
|
|||
((SRealTableNode*)pTable)->pMeta->tableType == TSDB_SUPER_TABLE) {
|
||||
SNode* pTbnameNode = NULL;
|
||||
code = biMakeTbnameProjectAstNode(pFunc->functionName, NULL, &pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
}
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pTbnameNodeList) > 0) {
|
||||
|
@ -1761,8 +1765,7 @@ static int32_t biRewriteSelectFuncParamStar(STranslateContext* pCxt, SSelectStmt
|
|||
((SRealTableNode*)pTable)->pMeta->tableType == TSDB_SUPER_TABLE) {
|
||||
SNode* pTbnameNode = NULL;
|
||||
code = biMakeTbnameProjectAstNode(pFunc->functionName, pTableAlias, &pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pTbnameNodeList) > 0) {
|
||||
nodesListInsertListAfterPos(pSelect->pProjectionList, pSelectListCell, pTbnameNodeList);
|
||||
|
@ -1794,8 +1797,7 @@ int32_t biRewriteSelectStar(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
|||
((SRealTableNode*)pTable)->pMeta->tableType == TSDB_SUPER_TABLE) {
|
||||
SNode* pTbnameNode = NULL;
|
||||
code = biMakeTbnameProjectAstNode(NULL, NULL, &pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
}
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pTbnameNodeList) > 0) {
|
||||
|
@ -1810,8 +1812,7 @@ int32_t biRewriteSelectStar(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
|||
((SRealTableNode*)pTable)->pMeta != NULL && ((SRealTableNode*)pTable)->pMeta->tableType == TSDB_SUPER_TABLE) {
|
||||
SNode* pTbnameNode = NULL;
|
||||
code = biMakeTbnameProjectAstNode(NULL, pTableAlias, &pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS ==code)
|
||||
code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTbnameNodeList, pTbnameNode);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code && LIST_LENGTH(pTbnameNodeList) > 0) {
|
||||
nodesListInsertListAfterPos(pSelect->pProjectionList, cell, pTbnameNodeList);
|
||||
|
@ -1877,9 +1878,7 @@ int32_t biCheckCreateTableTbnameCol(STranslateContext* pCxt, SCreateTableStmt* p
|
|||
}
|
||||
|
||||
static bool clauseSupportAlias(ESqlClause clause) {
|
||||
return SQL_CLAUSE_GROUP_BY == clause ||
|
||||
SQL_CLAUSE_PARTITION_BY == clause ||
|
||||
SQL_CLAUSE_ORDER_BY == clause;
|
||||
return SQL_CLAUSE_GROUP_BY == clause || SQL_CLAUSE_PARTITION_BY == clause || SQL_CLAUSE_ORDER_BY == clause;
|
||||
}
|
||||
|
||||
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||
|
@ -1908,8 +1907,7 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
|||
res = translateColumnWithPrefix(pCxt, pCol);
|
||||
} else {
|
||||
bool found = false;
|
||||
if ((pCxt->currClause == SQL_CLAUSE_ORDER_BY) &&
|
||||
!(*pCol)->node.asParam) {
|
||||
if ((pCxt->currClause == SQL_CLAUSE_ORDER_BY) && !(*pCol)->node.asParam) {
|
||||
res = translateColumnUseAlias(pCxt, pCol, &found);
|
||||
}
|
||||
if (DEAL_RES_ERROR != res && !found) {
|
||||
|
@ -1919,9 +1917,7 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
|||
res = translateColumnWithoutPrefix(pCxt, pCol);
|
||||
}
|
||||
}
|
||||
if (clauseSupportAlias(pCxt->currClause) &&
|
||||
!(*pCol)->node.asParam &&
|
||||
res != DEAL_RES_CONTINUE &&
|
||||
if (clauseSupportAlias(pCxt->currClause) && !(*pCol)->node.asParam && res != DEAL_RES_CONTINUE &&
|
||||
res != DEAL_RES_END) {
|
||||
res = translateColumnUseAlias(pCxt, pCol, &found);
|
||||
}
|
||||
|
@ -2750,7 +2746,8 @@ static int32_t translateRepeatScanFunc(STranslateContext* pCxt, SFunctionNode* p
|
|||
}
|
||||
|
||||
if (NULL != pSelect->pWindow) {
|
||||
if (QUERY_NODE_EVENT_WINDOW == nodeType(pSelect->pWindow) || QUERY_NODE_COUNT_WINDOW == nodeType(pSelect->pWindow)) {
|
||||
if (QUERY_NODE_EVENT_WINDOW == nodeType(pSelect->pWindow) ||
|
||||
QUERY_NODE_COUNT_WINDOW == nodeType(pSelect->pWindow)) {
|
||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||
"%s function is not supported in count/event window", pFunc->functionName);
|
||||
}
|
||||
|
@ -3225,8 +3222,7 @@ static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode** pFunc
|
|||
|
||||
pCxt->errCode = getFuncInfo(pCxt, *pFunc);
|
||||
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
||||
if ((SQL_CLAUSE_GROUP_BY == pCxt->currClause ||
|
||||
SQL_CLAUSE_PARTITION_BY == pCxt->currClause) &&
|
||||
if ((SQL_CLAUSE_GROUP_BY == pCxt->currClause || SQL_CLAUSE_PARTITION_BY == pCxt->currClause) &&
|
||||
fmIsVectorFunc((*pFunc)->funcId)) {
|
||||
pCxt->errCode = TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION;
|
||||
}
|
||||
|
@ -3330,7 +3326,6 @@ static int32_t selectCommonType(SDataType* commonType, const SDataType* newType)
|
|||
}
|
||||
commonType->type = resultType;
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) {
|
||||
|
@ -4281,8 +4276,8 @@ static int32_t setTableTsmas(STranslateContext* pCxt, SName* pName, SRealTableNo
|
|||
SVgroupInfo vgInfo = {0};
|
||||
bool exists = false;
|
||||
toName(pCxt->pParseCxt->acctId, pRealTable->table.dbName, "", &tsmaTargetTbName);
|
||||
int32_t len = tsnprintf(buf, TSDB_TABLE_FNAME_LEN + TSDB_TABLE_NAME_LEN, "%s.%s_%s", pTsma->dbFName, pTsma->name,
|
||||
pRealTable->table.tableName);
|
||||
int32_t len = tsnprintf(buf, TSDB_TABLE_FNAME_LEN + TSDB_TABLE_NAME_LEN, "%s.%s_%s", pTsma->dbFName,
|
||||
pTsma->name, pRealTable->table.tableName);
|
||||
len = taosCreateMD5Hash(buf, len);
|
||||
strncpy(tsmaTargetTbName.tname, buf, MD5_OUTPUT_LEN);
|
||||
code = collectUseTable(&tsmaTargetTbName, pCxt->pTargetTables);
|
||||
|
@ -4960,8 +4955,7 @@ int32_t translateTable(STranslateContext* pCxt, SNode** pTable, SNode* pJoinPare
|
|||
}
|
||||
code = translateAudit(pCxt, pRealTable, &name);
|
||||
#endif
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = setTableVgroupList(pCxt, &name, pRealTable);
|
||||
if (TSDB_CODE_SUCCESS == code) code = setTableVgroupList(pCxt, &name, pRealTable);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = setTableIndex(pCxt, &name, pRealTable);
|
||||
}
|
||||
|
@ -5353,8 +5347,8 @@ static int32_t translateOrderBy(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
|||
}
|
||||
|
||||
static EDealRes needFillImpl(SNode* pNode, void* pContext) {
|
||||
if ((isAggFunc(pNode) || isInterpFunc(pNode)) && FUNCTION_TYPE_GROUP_KEY != ((SFunctionNode*)pNode)->funcType
|
||||
&& FUNCTION_TYPE_GROUP_CONST_VALUE != ((SFunctionNode*)pNode)->funcType) {
|
||||
if ((isAggFunc(pNode) || isInterpFunc(pNode)) && FUNCTION_TYPE_GROUP_KEY != ((SFunctionNode*)pNode)->funcType &&
|
||||
FUNCTION_TYPE_GROUP_CONST_VALUE != ((SFunctionNode*)pNode)->funcType) {
|
||||
*(bool*)pContext = true;
|
||||
return DEAL_RES_END;
|
||||
}
|
||||
|
@ -5463,9 +5457,7 @@ static int32_t translateProjectionList(STranslateContext* pCxt, SSelectStmt* pSe
|
|||
} else {
|
||||
SNode* pNode;
|
||||
int32_t projIdx = 1;
|
||||
FOREACH(pNode, pSelect->pProjectionList) {
|
||||
((SExprNode*)pNode)->projIdx = projIdx++;
|
||||
}
|
||||
FOREACH(pNode, pSelect->pProjectionList) { ((SExprNode*)pNode)->projIdx = projIdx++; }
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
@ -5514,8 +5506,7 @@ static int32_t replaceGroupByAlias(STranslateContext* pCxt, SSelectStmt* pSelect
|
|||
if (NULL == pSelect->pGroupByList) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
SReplaceGroupByAliasCxt cxt = {
|
||||
.pTranslateCxt = pCxt, .pProjectionList = pSelect->pProjectionList};
|
||||
SReplaceGroupByAliasCxt cxt = {.pTranslateCxt = pCxt, .pProjectionList = pSelect->pProjectionList};
|
||||
nodesRewriteExprsPostOrder(pSelect->pGroupByList, replaceGroupByAliasImpl, &cxt);
|
||||
|
||||
return pCxt->errCode;
|
||||
|
@ -5525,8 +5516,7 @@ static int32_t replacePartitionByAlias(STranslateContext* pCxt, SSelectStmt* pSe
|
|||
if (NULL == pSelect->pPartitionByList) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
SReplaceGroupByAliasCxt cxt = {
|
||||
.pTranslateCxt = pCxt, .pProjectionList = pSelect->pProjectionList};
|
||||
SReplaceGroupByAliasCxt cxt = {.pTranslateCxt = pCxt, .pProjectionList = pSelect->pProjectionList};
|
||||
nodesRewriteExprsPostOrder(pSelect->pPartitionByList, replaceGroupByAliasImpl, &cxt);
|
||||
|
||||
return pCxt->errCode;
|
||||
|
@ -6415,7 +6405,8 @@ static int32_t isOperatorTbnameInCond(STranslateContext* pCxt, SOperatorNode* pO
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static int32_t findEqCondTbNameInOperatorNode(STranslateContext* pCxt, SNode* pWhere, SEqCondTbNameTableInfo* pInfo, bool* pRet) {
|
||||
static int32_t findEqCondTbNameInOperatorNode(STranslateContext* pCxt, SNode* pWhere, SEqCondTbNameTableInfo* pInfo,
|
||||
bool* pRet) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
char* pTableAlias = NULL;
|
||||
bool eqTbnameCond = false, tbnameInCond = false;
|
||||
|
@ -6729,7 +6720,8 @@ static int32_t setEqualTbnameTableVgroups(STranslateContext* pCxt, SSelectStmt*
|
|||
}
|
||||
}
|
||||
|
||||
qDebug("before ctbname optimize, code:%d, aTableNum:%d, nTbls:%d, stableQuery:%d", code, aTableNum, nTbls, stableQuery);
|
||||
qDebug("before ctbname optimize, code:%d, aTableNum:%d, nTbls:%d, stableQuery:%d", code, aTableNum, nTbls,
|
||||
stableQuery);
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code && 1 == aTableNum && 1 == nTbls && stableQuery && NULL == pInfo->pRealTable->pTsmas) {
|
||||
code = replaceToChildTableQuery(pCxt, pInfo);
|
||||
|
@ -6823,8 +6815,8 @@ static EDealRes collectTableAlias(SNode* pNode, void* pContext) {
|
|||
*(SSHashObj**)pContext = pHash;
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS != tSimpleHashPut(*(SSHashObj**)pContext, pCol->tableAlias, strlen(pCol->tableAlias), pCol->tableAlias,
|
||||
sizeof(pCol->tableAlias))) {
|
||||
if (TSDB_CODE_SUCCESS != tSimpleHashPut(*(SSHashObj**)pContext, pCol->tableAlias, strlen(pCol->tableAlias),
|
||||
pCol->tableAlias, sizeof(pCol->tableAlias))) {
|
||||
return DEAL_RES_ERROR;
|
||||
}
|
||||
|
||||
|
@ -7090,8 +7082,7 @@ static int32_t translateSelectFrom(STranslateContext* pCxt, SSelectStmt* pSelect
|
|||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = resetSelectFuncNumWithoutDup(pSelect);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = checkAggColCoexist(pCxt, pSelect);
|
||||
if (TSDB_CODE_SUCCESS == code) code = checkAggColCoexist(pCxt, pSelect);
|
||||
}
|
||||
/*
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
|
@ -8020,8 +8011,8 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
|
|||
code = checkOptionsDependency(pCxt, pDbName, pOptions);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code =
|
||||
checkDbRangeOption(pCxt, "s3_chunksize", pOptions->s3ChunkSize, TSDB_MIN_S3_CHUNK_SIZE, TSDB_MAX_S3_CHUNK_SIZE);
|
||||
code = checkDbRangeOption(pCxt, "s3_chunkpages", pOptions->s3ChunkSize, TSDB_MIN_S3_CHUNK_SIZE,
|
||||
TSDB_MAX_S3_CHUNK_SIZE);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = checkDbRangeOption(pCxt, "s3_compact", pOptions->s3Compact, TSDB_MIN_S3_COMPACT, TSDB_MAX_S3_COMPACT);
|
||||
|
@ -9039,7 +9030,8 @@ static int32_t createRollupFuncs(SCreateTableStmt* pStmt, SNodeList** ppList) {
|
|||
}
|
||||
*ppList = pFuncs;
|
||||
|
||||
return code;;
|
||||
return code;
|
||||
;
|
||||
}
|
||||
|
||||
static int32_t createRollupTableMeta(SCreateTableStmt* pStmt, int8_t precision, STableMeta** ppTbMeta) {
|
||||
|
@ -9168,8 +9160,7 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
|
|||
// columnDefNodeToField(pStmt->pCols, &pReq->pColumns, true);
|
||||
// columnDefNodeToField(pStmt->pTags, &pReq->pTags, true);
|
||||
code = columnDefNodeToField(pStmt->pCols, &pReq->pColumns, true);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = tagDefNodeToField(pStmt->pTags, &pReq->pTags, true);
|
||||
if (TSDB_CODE_SUCCESS == code) code = tagDefNodeToField(pStmt->pTags, &pReq->pTags, true);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
pReq->numOfColumns = LIST_LENGTH(pStmt->pCols);
|
||||
pReq->numOfTags = LIST_LENGTH(pStmt->pTags);
|
||||
|
@ -9189,8 +9180,7 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
|
|||
toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName);
|
||||
code = tNameExtractFullName(&tableName, pReq->name);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = collectUseTable(&tableName, pCxt->pTables);
|
||||
if (TSDB_CODE_SUCCESS == code) code = collectUseTable(&tableName, pCxt->pTables);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = collectUseTable(&tableName, pCxt->pTargetTables);
|
||||
}
|
||||
|
@ -9547,7 +9537,8 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p
|
|||
code = tNameExtractFullName(&name, usedbReq.db);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = getDBVgVersion(pCxt, usedbReq.db, &usedbReq.vgVersion, &usedbReq.dbId, &usedbReq.numOfTable, &usedbReq.stateTs);
|
||||
code =
|
||||
getDBVgVersion(pCxt, usedbReq.db, &usedbReq.vgVersion, &usedbReq.dbId, &usedbReq.numOfTable, &usedbReq.stateTs);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = buildCmdMsg(pCxt, TDMT_MND_USE_DB, (FSerializeFunc)tSerializeSUseDbReq, &usedbReq);
|
||||
}
|
||||
|
@ -10127,8 +10118,7 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS
|
|||
} else if ('\0' != pStmt->subDbName[0]) {
|
||||
pReq->subType = TOPIC_SUB_TYPE__DB;
|
||||
code = tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->subDbName, strlen(pStmt->subDbName));
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
(void)tNameGetFullDbName(&name, pReq->subDbName);
|
||||
if (TSDB_CODE_SUCCESS == code) (void)tNameGetFullDbName(&name, pReq->subDbName);
|
||||
} else {
|
||||
pReq->subType = TOPIC_SUB_TYPE__COLUMN;
|
||||
char* dbName = ((SRealTableNode*)(((SSelectStmt*)pStmt->pQuery)->pFromTable))->table.dbName;
|
||||
|
@ -10683,8 +10673,7 @@ static int32_t addNullTagsForExistTable(STranslateContext* pCxt, STableMeta* pMe
|
|||
for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < numOfTags; ++i) {
|
||||
SNode* pNull = NULL;
|
||||
code = createNullValue(&pNull);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListMakeStrictAppend(&pSelect->pTags, pNull);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListMakeStrictAppend(&pSelect->pTags, pNull);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
@ -10744,8 +10733,7 @@ static int32_t addNullTagsForCreateTable(STranslateContext* pCxt, SCreateStreamS
|
|||
for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < LIST_LENGTH(pStmt->pTags); ++i) {
|
||||
SNode* pNull = NULL;
|
||||
code = createNullValue(&pNull);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListMakeStrictAppend(&((SSelectStmt*)pStmt->pQuery)->pTags, pNull);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListMakeStrictAppend(&((SSelectStmt*)pStmt->pQuery)->pTags, pNull);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
@ -11030,7 +11018,8 @@ static int32_t checkStreamQuery(STranslateContext* pCxt, SCreateStreamStmt* pStm
|
|||
SValueNode* pVal = (SValueNode*)pStmt->pOptions->pDelay;
|
||||
int64_t minDelay = 0;
|
||||
char* str = "5s";
|
||||
if (DEAL_RES_ERROR != translateValue(pCxt, pVal) && TSDB_CODE_SUCCESS ==
|
||||
if (DEAL_RES_ERROR != translateValue(pCxt, pVal) &&
|
||||
TSDB_CODE_SUCCESS ==
|
||||
parseNatualDuration(str, strlen(str), &minDelay, &pVal->unit, pVal->node.resType.precision, false)) {
|
||||
if (pVal->datum.i < minDelay) {
|
||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY,
|
||||
|
@ -11326,8 +11315,7 @@ static int32_t adjustOrderOfTags(STranslateContext* pCxt, SNodeList* pTags, cons
|
|||
}
|
||||
SNode* pNull = NULL;
|
||||
code = createNullValue(&pNull);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListStrictAppend(pNewTagExprs, pNull);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pNewTagExprs, pNull);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12233,8 +12221,7 @@ static int32_t translateShowCreateDatabase(STranslateContext* pCxt, SShowCreateD
|
|||
SName name;
|
||||
int32_t code = tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->dbName, strlen(pStmt->dbName));
|
||||
(void)tNameGetFullDbName(&name, pStmt->dbFName);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
return getDBCfg(pCxt, pStmt->dbName, (SDbCfgInfo*)pStmt->pCfg);
|
||||
if (TSDB_CODE_SUCCESS == code) return getDBCfg(pCxt, pStmt->dbName, (SDbCfgInfo*)pStmt->pCfg);
|
||||
return code;
|
||||
}
|
||||
|
||||
|
@ -12374,8 +12361,7 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC
|
|||
info.pDbName = pStmt->dbName;
|
||||
info.pTableName = tbName;
|
||||
code = nodesCloneList(pStmt->pOptions->pFuncs, &info.pFuncs);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesCloneNode(pStmt->pOptions->pInterval, &info.pInterval);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesCloneNode(pStmt->pOptions->pInterval, &info.pInterval);
|
||||
|
||||
SFunctionNode* pTbnameFunc = NULL;
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
|
@ -12402,8 +12388,7 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC
|
|||
if (TSDB_CODE_SUCCESS == code) {
|
||||
SNode* pNew = NULL;
|
||||
code = nodesCloneNode(pTagCol, &pNew);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListMakeStrictAppend(&info.pTags, pNew);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListMakeStrictAppend(&info.pTags, pNew);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12561,8 +12546,7 @@ static int32_t buildCreateTSMAReq(STranslateContext* pCxt, SCreateTSMAStmt* pStm
|
|||
} else {
|
||||
if (pReq->intervalUnit == TIME_UNIT_MONTH && (pReq->interval < 1 || pReq->interval > 12))
|
||||
return TSDB_CODE_TSMA_INVALID_INTERVAL;
|
||||
if (pReq->intervalUnit == TIME_UNIT_YEAR && (pReq->interval != 1))
|
||||
return TSDB_CODE_TSMA_INVALID_INTERVAL;
|
||||
if (pReq->intervalUnit == TIME_UNIT_YEAR && (pReq->interval != 1)) return TSDB_CODE_TSMA_INVALID_INTERVAL;
|
||||
}
|
||||
|
||||
STableMeta* pTableMeta = NULL;
|
||||
|
@ -13493,11 +13477,9 @@ static int32_t addShowUserDatabasesCond(SSelectStmt* pSelect) {
|
|||
}
|
||||
nodesDestroyNode((SNode*)pValNode2);
|
||||
nodesDestroyNode((SNode*)pValNode1);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createLogicCondNode(&pNameCond1, &pNameCond2, &pNameCond, LOGIC_COND_TYPE_AND);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createLogicCondNode(&pNameCond1, &pNameCond2, &pNameCond, LOGIC_COND_TYPE_AND);
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = insertCondIntoSelectStmt(pSelect, &pNameCond);
|
||||
if (TSDB_CODE_SUCCESS == code) code = insertCondIntoSelectStmt(pSelect, &pNameCond);
|
||||
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
nodesDestroyNode(pNameCond1);
|
||||
|
@ -13529,8 +13511,7 @@ static int32_t addShowSystemDatabasesCond(SSelectStmt* pSelect) {
|
|||
code = createLogicCondNode(&pNameCond1, &pNameCond2, &pNameCond, LOGIC_COND_TYPE_OR);
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = insertCondIntoSelectStmt(pSelect, &pNameCond);
|
||||
if (TSDB_CODE_SUCCESS == code) code = insertCondIntoSelectStmt(pSelect, &pNameCond);
|
||||
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
nodesDestroyNode(pNameCond1);
|
||||
|
@ -13546,8 +13527,7 @@ static int32_t addShowNormalTablesCond(SSelectStmt* pSelect) {
|
|||
SValueNode* pValNode1 = NULL;
|
||||
code = nodesMakeValueNodeFromString("NORMAL_TABLE", &pValNode1);
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond);
|
||||
|
||||
nodesDestroyNode((SNode*)pValNode1);
|
||||
|
||||
|
@ -13562,8 +13542,7 @@ static int32_t addShowChildTablesCond(SSelectStmt* pSelect) {
|
|||
SValueNode* pValNode1 = NULL;
|
||||
code = nodesMakeValueNodeFromString("CHILD_TABLE", &pValNode1);
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond);
|
||||
|
||||
nodesDestroyNode((SNode*)pValNode1);
|
||||
|
||||
|
@ -13662,7 +13641,8 @@ static int32_t checkShowTags(STranslateContext* pCxt, const SShowStmt* pShow) {
|
|||
int32_t code = 0;
|
||||
SName name = {0};
|
||||
STableMeta* pTableMeta = NULL;
|
||||
toName(pCxt->pParseCxt->acctId, ((SValueNode*)pShow->pDbName)->literal, ((SValueNode*)pShow->pTbName)->literal, &name);
|
||||
toName(pCxt->pParseCxt->acctId, ((SValueNode*)pShow->pDbName)->literal, ((SValueNode*)pShow->pTbName)->literal,
|
||||
&name);
|
||||
code = getTargetMeta(pCxt, &name, &pTableMeta, true);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_GET_META_ERROR, tstrerror(code));
|
||||
|
@ -13826,8 +13806,7 @@ static int32_t rewriteShowTableDist(STranslateContext* pCxt, SQuery* pQuery) {
|
|||
NODES_DESTORY_LIST(pStmt->pProjectionList);
|
||||
SFunctionNode* pFuncNew = NULL;
|
||||
code = createBlockDistFunc(&pFuncNew);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = nodesListMakeStrictAppend(&pStmt->pProjectionList, (SNode*)pFuncNew);
|
||||
if (TSDB_CODE_SUCCESS == code) code = nodesListMakeStrictAppend(&pStmt->pProjectionList, (SNode*)pFuncNew);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
pCxt->showRewrite = true;
|
||||
|
@ -15779,12 +15758,9 @@ static int32_t rewriteShowAliveStmt(STranslateContext* pCxt, SQuery* pQuery) {
|
|||
SNode* pCond3 = NULL;
|
||||
SNode* pCond4 = NULL;
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "v1_status", (SNode*)pValNode, &pCond1);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "v2_status", (SNode*)pValNode, &pCond2);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "v3_status", (SNode*)pValNode, &pCond3);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "v4_status", (SNode*)pValNode, &pCond4);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "v2_status", (SNode*)pValNode, &pCond2);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "v3_status", (SNode*)pValNode, &pCond3);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "v4_status", (SNode*)pValNode, &pCond4);
|
||||
nodesDestroyNode((SNode*)pValNode);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
nodesDestroyNode(pCond1);
|
||||
|
@ -15799,10 +15775,8 @@ static int32_t rewriteShowAliveStmt(STranslateContext* pCxt, SQuery* pQuery) {
|
|||
SNode* pTemp2 = NULL;
|
||||
SNode* pFullCond = NULL;
|
||||
code = createLogicCondNode(&pCond1, &pCond2, &pTemp1, LOGIC_COND_TYPE_OR);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createLogicCondNode(&pTemp1, &pCond3, &pTemp2, LOGIC_COND_TYPE_OR);
|
||||
if (TSDB_CODE_SUCCESS == code)
|
||||
code = createLogicCondNode(&pTemp2, &pCond4, &pFullCond, LOGIC_COND_TYPE_OR);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createLogicCondNode(&pTemp1, &pCond3, &pTemp2, LOGIC_COND_TYPE_OR);
|
||||
if (TSDB_CODE_SUCCESS == code) code = createLogicCondNode(&pTemp2, &pCond4, &pFullCond, LOGIC_COND_TYPE_OR);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
nodesDestroyNode(pCond1);
|
||||
nodesDestroyNode(pCond2);
|
||||
|
@ -16125,8 +16099,8 @@ static int32_t rewriteShowAliveStmt(STranslateContext* pCxt, SQuery* pQuery) {
|
|||
}
|
||||
// pSubSelect, pWhenThenlist need to free
|
||||
|
||||
// case when leader_col = count_col and leader_col > 0 then 1 when leader_col < count_col and leader_col > 0 then 2 else
|
||||
// 0 end as status
|
||||
// case when leader_col = count_col and leader_col > 0 then 1 when leader_col < count_col and leader_col > 0 then 2
|
||||
// else 0 end as status
|
||||
pElse = NULL;
|
||||
code = nodesMakeValueNodeFromInt32(0, &pElse);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
|
|
|
@ -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 {
|
||||
|
@ -99,22 +100,24 @@ SWords shellCommands[] = {
|
|||
{"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 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},
|
||||
|
@ -123,6 +126,7 @@ SWords shellCommands[] = {
|
|||
{"drop consumer group <anyword> on ", 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},
|
||||
|
@ -133,7 +137,7 @@ SWords shellCommands[] = {
|
|||
{"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},
|
||||
#ifdef TD_ENTERPRISE
|
||||
|
@ -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[] = {
|
||||
|
@ -290,7 +315,12 @@ char* db_options[] = {"keep ",
|
|||
"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 ",
|
||||
|
@ -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",
|
||||
"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) {
|
||||
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,9 +1329,23 @@ void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) {
|
|||
lastWordBytes = word->len;
|
||||
}
|
||||
|
||||
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
|
||||
bool firstMatchCommand(TAOS* con, SShellCmd* cmd) {
|
||||
|
@ -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;
|
||||
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;
|
||||
// move next
|
||||
++p1;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
taosMemoryFree(p1);
|
||||
|
||||
return ret;
|
||||
return n > 0;
|
||||
}
|
||||
|
||||
bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
|
||||
|
@ -1718,15 +1819,21 @@ bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
|
|||
|
||||
// check in create fields or tags input area
|
||||
if (isCreateFieldsArea(ps)) {
|
||||
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
|
||||
if (!ret) {
|
||||
// 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