diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0c474a355d..315036d115 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,7 @@ ENDIF ()
SET(TD_ACCOUNT FALSE)
SET(TD_ADMIN FALSE)
SET(TD_GRANT FALSE)
-SET(TD_MQTT TRUE)
+SET(TD_MQTT FALSE)
SET(TD_TSDB_PLUGINS FALSE)
SET(TD_COVER FALSE)
@@ -29,6 +29,11 @@ MESSAGE(STATUS "Community directory: " ${TD_COMMUNITY_DIR})
INCLUDE(cmake/input.inc)
INCLUDE(cmake/platform.inc)
+
+IF (TD_WINDOWS OR TD_DARWIN)
+ SET(TD_SOMODE_STATIC TRUE)
+ENDIF ()
+
INCLUDE(cmake/define.inc)
INCLUDE(cmake/env.inc)
INCLUDE(cmake/version.inc)
diff --git a/Jenkinsfile b/Jenkinsfile
index 73bb832d8e..516b179dce 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -176,5 +176,84 @@ pipeline {
}
}
}
+ post {
+
+ success {
+ emailext (
+ subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
+ body: '''
+
+
+
+
+
+
+
+
+ 构建信息
+
|
+
+
+
+
+
+ - 构建名称>>分支:${PROJECT_NAME}
+ - 构建结果: Successful
+ - 构建编号:${BUILD_NUMBER}
+ - 触发用户:${CAUSE}
+ - 提交信息:${CHANGE_TITLE}
+ - 构建地址:${BUILD_URL}
+ - 构建日志:${BUILD_URL}console
+ - 变更集:${JELLY_SCRIPT}
+
+
+ |
+
+
+
+ ''',
+ to: "${env.CHANGE_AUTHOR_EMAIL}",
+ from: "support@taosdata.com"
+ )
+ }
+ failure {
+ emailext (
+ subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
+ body: '''
+
+
+
+
+
+
+
+
+ 构建信息
+
|
+
+
+
+
+
+ - 构建名称>>分支:${PROJECT_NAME}
+ - 构建结果: Successful
+ - 构建编号:${BUILD_NUMBER}
+ - 触发用户:${CAUSE}
+ - 提交信息:${CHANGE_TITLE}
+ - 构建地址:${BUILD_URL}
+ - 构建日志:${BUILD_URL}console
+ - 变更集:${JELLY_SCRIPT}
+
+
+ |
+
+
+
+ ''',
+ to: "${env.CHANGE_AUTHOR_EMAIL}",
+ from: "support@taosdata.com"
+ )
+ }
+ }
}
diff --git a/README.md b/README.md
index 566b3e5c8b..fafcdc8321 100644
--- a/README.md
+++ b/README.md
@@ -133,7 +133,9 @@ cmake .. -G "NMake Makefiles"
nmake
```
-If you use the Visual Studio 2019, please open a command window by executing "cmd.exe".
+If you use the Visual Studio 2019 or 2017:
+
+please open a command window by executing "cmd.exe".
Please specify "x64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
```
mkdir debug && cd debug
@@ -142,7 +144,7 @@ cmake .. -G "NMake Makefiles"
nmake
```
-Or, you can open a command window by clicking Visual Studio 2019 menu "Tools -> Command Line -> Developer Command Prompt" or "Tools -> Command Line -> Developer PowerShell" then execute commands as follows:
+Or, you can simply open a command window by clicking Windows Start -> "Visual Studio < 2019 | 2017 >" folder -> "x64 Native Tools Command Prompt for VS < 2019 | 2017 >" or "x86 Native Tools Command Prompt for VS < 2019 | 2017 >" depends what architecture your Windows is, then execute commands as follows:
```
mkdir debug && cd debug
cmake .. -G "NMake Makefiles"
diff --git a/cmake/define.inc b/cmake/define.inc
index ba12df6f0c..91adfa64c3 100755
--- a/cmake/define.inc
+++ b/cmake/define.inc
@@ -141,6 +141,9 @@ IF (TD_WINDOWS)
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
IF (NOT TD_GODLL)
SET(COMMON_FLAGS "/nologo /WX /wd4018 /wd2220 /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
+ IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
+ SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
+ ENDIF ()
SET(DEBUG_FLAGS "/Zi /W3 /GL")
SET(RELEASE_FLAGS "/W0 /O3 /GL")
ENDIF ()
diff --git a/deps/zlib-1.2.11/src/gzlib.c b/deps/zlib-1.2.11/src/gzlib.c
index 381cdc2c7d..4c135aabff 100644
--- a/deps/zlib-1.2.11/src/gzlib.c
+++ b/deps/zlib-1.2.11/src/gzlib.c
@@ -5,6 +5,10 @@
#include
#include "gzguts.h"
+#ifndef O_BINARY
+ #define O_BINARY 0
+#endif
+
#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__)
# define LSEEK _lseeki64
#else
@@ -240,9 +244,9 @@ local gzFile gz_open(path, fd, mode)
/* open the file with the appropriate flags (or just use fd) */
state->fd = fd > -1 ? fd : (
#ifdef WIDECHAR
- fd == -2 ? _wopen(path, oflag, 0666) :
+ fd == -2 ? _wopen(path, oflag | O_BINARY, 0666) :
#endif
- open((const char *)path, oflag, 0666));
+ open((const char *)path, oflag | O_BINARY, 0666));
if (state->fd == -1) {
free(state->path);
free(state);
diff --git a/packaging/tools/install_client.sh b/packaging/tools/install_client.sh
index 84ca3b5131..d52428dc83 100755
--- a/packaging/tools/install_client.sh
+++ b/packaging/tools/install_client.sh
@@ -21,7 +21,7 @@ else
cd ${script_dir}
script_dir="$(pwd)"
data_dir="/var/lib/taos"
- log_dir=~/TDengineLog
+ log_dir=~/TDengine/log
fi
log_link_dir="/usr/local/taos/log"
diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh
index 0727fe2a1e..474b6f4619 100755
--- a/packaging/tools/make_install.sh
+++ b/packaging/tools/make_install.sh
@@ -24,7 +24,7 @@ data_dir="/var/lib/taos"
if [ "$osType" != "Darwin" ]; then
log_dir="/var/log/taos"
else
- log_dir=~/TDengineLog
+ log_dir=~/TDengine/log
fi
data_link_dir="/usr/local/taos/data"
diff --git a/src/balance/CMakeLists.txt b/src/balance/CMakeLists.txt
index a3ae74d825..bcb3769087 100644
--- a/src/balance/CMakeLists.txt
+++ b/src/balance/CMakeLists.txt
@@ -8,10 +8,4 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(balance ${SRC})
-ENDIF ()
-
-IF (TD_DARWIN)
- ADD_LIBRARY(balance ${SRC})
-ENDIF ()
+ADD_LIBRARY(balance ${SRC})
diff --git a/src/balance/inc/bnThread.h b/src/balance/inc/bnThread.h
index 8f54b66028..74a761299d 100644
--- a/src/balance/inc/bnThread.h
+++ b/src/balance/inc/bnThread.h
@@ -24,7 +24,7 @@ extern "C" {
int32_t bnInitThread();
void bnCleanupThread();
void bnNotify();
-void bnStartTimer(int64_t mseconds);
+void bnStartTimer(int32_t mseconds);
#ifdef __cplusplus
}
diff --git a/src/balance/src/bnMain.c b/src/balance/src/bnMain.c
index 3e1d5eda76..236b22afaf 100644
--- a/src/balance/src/bnMain.c
+++ b/src/balance/src/bnMain.c
@@ -30,7 +30,7 @@
#include "mnodeVgroup.h"
extern int64_t tsDnodeRid;
-extern int64_t tsSdbRid;
+extern int32_t tsSdbRid;
static SBnMgmt tsBnMgmt;
static void bnMonitorDnodeModule();
diff --git a/src/balance/src/bnScore.c b/src/balance/src/bnScore.c
index cbc2c62184..7d94df1c23 100644
--- a/src/balance/src/bnScore.c
+++ b/src/balance/src/bnScore.c
@@ -271,23 +271,23 @@ static int32_t bnRetrieveScores(SShowObj *pShow, char *data, int32_t rows, void
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(float *)pWrite = systemScore;
+ *(float *)pWrite = (float)systemScore;
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(float *)pWrite = pDnode->customScore;
+ *(float *)pWrite = (float)pDnode->customScore;
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(float *)pWrite = (int32_t)moduleScore;
+ *(float *)pWrite = (float)moduleScore;
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(float *)pWrite = (int32_t)vnodeScore;
+ *(float *)pWrite = (float)vnodeScore;
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(float *)pWrite = (int32_t)(vnodeScore + moduleScore + pDnode->customScore + systemScore);
+ *(float *)pWrite = (float)(vnodeScore + moduleScore + pDnode->customScore + systemScore);
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
diff --git a/src/balance/src/bnThread.c b/src/balance/src/bnThread.c
index 3931acd053..d07591ecd5 100644
--- a/src/balance/src/bnThread.c
+++ b/src/balance/src/bnThread.c
@@ -119,13 +119,13 @@ static void bnProcessTimer(void *handle, void *tmrId) {
}
}
-void bnStartTimer(int64_t mseconds) {
+void bnStartTimer(int32_t mseconds) {
if (tsBnThread.stop) return;
bool updateSoon = (mseconds != -1);
if (updateSoon) {
- mTrace("balance function will be called after %" PRId64 " ms", mseconds);
- taosTmrReset(bnProcessTimer, mseconds, (void *)mseconds, tsMnodeTmr, &tsBnThread.timer);
+ mTrace("balance function will be called after %d ms", mseconds);
+ taosTmrReset(bnProcessTimer, mseconds, (void *)(int64_t)mseconds, tsMnodeTmr, &tsBnThread.timer);
} else {
taosTmrReset(bnProcessTimer, tsStatusInterval * 1000, NULL, tsMnodeTmr, &tsBnThread.timer);
}
diff --git a/src/client/inc/tscUtil.h b/src/client/inc/tscUtil.h
index e614ddc872..ce623cdc03 100644
--- a/src/client/inc/tscUtil.h
+++ b/src/client/inc/tscUtil.h
@@ -99,14 +99,14 @@ static FORCE_INLINE SQueryInfo* tscGetQueryInfoDetail(SSqlCmd* pCmd, int32_t sub
}
int32_t tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOffset, SName* name, STableMeta* pTableMeta, STableDataBlocks** dataBlocks);
-void tscDestroyDataBlock(STableDataBlocks* pDataBlock);
+void tscDestroyDataBlock(STableDataBlocks* pDataBlock, bool removeMeta);
void tscSortRemoveDataBlockDupRows(STableDataBlocks* dataBuf);
SParamInfo* tscAddParamToDataBlock(STableDataBlocks* pDataBlock, char type, uint8_t timePrec, int16_t bytes,
uint32_t offset);
void* tscDestroyBlockArrayList(SArray* pDataBlockList);
-void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable);
+void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable, bool removeMeta);
int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock);
int32_t tscMergeTableDataBlocks(SSqlObj* pSql, bool freeBlockMap);
diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h
index 0a26cc87e3..68cd2747e9 100644
--- a/src/client/inc/tsclient.h
+++ b/src/client/inc/tsclient.h
@@ -22,15 +22,15 @@ extern "C" {
#include "os.h"
+#include "qAggMain.h"
#include "taos.h"
#include "taosdef.h"
#include "taosmsg.h"
#include "tarray.h"
-#include "tglobal.h"
-#include "tsqlfunction.h"
-#include "tutil.h"
#include "tcache.h"
+#include "tglobal.h"
#include "tref.h"
+#include "tutil.h"
#include "qExecutor.h"
#include "qSqlparser.h"
@@ -223,6 +223,8 @@ typedef struct SQueryInfo {
int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
int16_t resColumnId; // result column id
+ bool distinctTag; // distinct tag or not
+
} SQueryInfo;
typedef struct {
@@ -411,7 +413,7 @@ void tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo);
void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo);
-void tscResetSqlCmdObj(SSqlCmd *pCmd);
+void tscResetSqlCmd(SSqlCmd *pCmd, bool removeMeta);
/**
* free query result of the sql object
diff --git a/src/client/src/tscAsync.c b/src/client/src/tscAsync.c
index 4eae2b7a87..8e5f621b37 100644
--- a/src/client/src/tscAsync.c
+++ b/src/client/src/tscAsync.c
@@ -351,7 +351,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
if (pCmd->command == TSDB_SQL_SELECT) {
tscDebug("%p redo parse sql string and proceed", pSql);
pCmd->parseFinished = false;
- tscResetSqlCmdObj(pCmd);
+ tscResetSqlCmd(pCmd, true);
code = tsParseSql(pSql, true);
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
diff --git a/src/client/src/tscLocalMerge.c b/src/client/src/tscLocalMerge.c
index 5b5fe8e798..97426b2dd1 100644
--- a/src/client/src/tscLocalMerge.c
+++ b/src/client/src/tscLocalMerge.c
@@ -16,7 +16,7 @@
#include "tscLocalMerge.h"
#include "tscSubquery.h"
#include "os.h"
-#include "qAst.h"
+#include "texpr.h"
#include "tlosertree.h"
#include "tscLog.h"
#include "tscUtil.h"
@@ -1101,7 +1101,7 @@ static int64_t getNumOfResultLocal(SQueryInfo *pQueryInfo, SQLFunctionCtx *pCtx)
* the number of output result is decided by main output
*/
int32_t functionId = pCtx[j].functionId;
- if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG || functionId == TSDB_FUNC_TAGPRJ) {
+ if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG) {
continue;
}
@@ -1183,7 +1183,7 @@ bool needToMerge(SQueryInfo *pQueryInfo, SLocalMerger *pLocalMerge, tFilePage *t
int16_t functionId = pLocalMerge->pCtx[0].functionId;
// todo opt performance
- if ((/*functionId == TSDB_FUNC_PRJ || */functionId == TSDB_FUNC_ARITHM) || (tscIsProjectionQueryOnSTable(pQueryInfo, 0))) { // column projection query
+ if ((/*functionId == TSDB_FUNC_PRJ || */functionId == TSDB_FUNC_ARITHM) || (tscIsProjectionQueryOnSTable(pQueryInfo, 0) && pQueryInfo->distinctTag == false)) { // column projection query
ret = 1; // disable merge procedure
} else {
tOrderDescriptor *pDesc = pLocalMerge->pDesc;
diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c
index 2466ae060e..0b419a3305 100644
--- a/src/client/src/tscParseInsert.c
+++ b/src/client/src/tscParseInsert.c
@@ -1036,11 +1036,7 @@ static int32_t validateDataSource(SSqlCmd *pCmd, int8_t type, const char *sql) {
}
/**
- * usage: insert into table1 values() () table2 values()()
- *
- * @param str
- * @param acct
- * @param db
+ * parse insert sql
* @param pSql
* @return
*/
@@ -1343,10 +1339,11 @@ int tsParseSql(SSqlObj *pSql, bool initial) {
// make a backup as tsParseInsertSql may modify the string
char* sqlstr = strdup(pSql->sqlstr);
ret = tsParseInsertSql(pSql);
- if (sqlstr == NULL || pSql->parseRetry >= 1 || ret != TSDB_CODE_TSC_INVALID_SQL) {
+ if ((sqlstr == NULL) || (pSql->parseRetry >= 1) ||
+ (ret != TSDB_CODE_TSC_SQL_SYNTAX_ERROR && ret != TSDB_CODE_TSC_INVALID_SQL)) {
free(sqlstr);
} else {
- tscResetSqlCmdObj(pCmd);
+ tscResetSqlCmd(pCmd, true);
free(pSql->sqlstr);
pSql->sqlstr = sqlstr;
pSql->parseRetry++;
@@ -1358,7 +1355,7 @@ int tsParseSql(SSqlObj *pSql, bool initial) {
SSqlInfo SQLInfo = qSQLParse(pSql->sqlstr);
ret = tscToSQLCmd(pSql, &SQLInfo);
if (ret == TSDB_CODE_TSC_INVALID_SQL && pSql->parseRetry == 0 && SQLInfo.type == TSDB_SQL_NULL) {
- tscResetSqlCmdObj(pCmd);
+ tscResetSqlCmd(pCmd, true);
pSql->parseRetry++;
ret = tscToSQLCmd(pSql, &SQLInfo);
}
@@ -1551,7 +1548,7 @@ void tscImportDataFromFile(SSqlObj *pSql) {
SSqlObj *pNew = createSubqueryObj(pSql, 0, parseFileSendDataBlock, pSupporter, TSDB_SQL_INSERT, NULL);
pCmd->count = 1;
- FILE *fp = fopen(pCmd->payload, "r");
+ FILE *fp = fopen(pCmd->payload, "rb");
if (fp == NULL) {
pSql->res.code = TAOS_SYSTEM_ERROR(errno);
tscError("%p failed to open file %s to load data from file, code:%s", pSql, pCmd->payload, tstrerror(pSql->res.code));
diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c
index 4ff14ed6d0..2f98fbc270 100644
--- a/src/client/src/tscSQLParser.c
+++ b/src/client/src/tscSQLParser.c
@@ -22,7 +22,7 @@
#include "os.h"
#include "ttype.h"
-#include "qAst.h"
+#include "texpr.h"
#include "taos.h"
#include "taosmsg.h"
#include "tcompare.h"
@@ -43,7 +43,7 @@
#define COLUMN_INDEX_INITIAL_VAL (-3)
#define COLUMN_INDEX_INITIALIZER \
{ COLUMN_INDEX_INITIAL_VAL, COLUMN_INDEX_INITIAL_VAL }
-#define COLUMN_INDEX_VALIDE(index) (((index).tableIndex >= 0) && ((index).columnIndex >= TSDB_TBNAME_COLUMN_INDEX))
+#define COLUMN_INDEX_VALIDE(index) (((index).tableIndex >= 0) && ((index).columnIndex >= TSDB_BLOCK_DIST_COLUMN_INDEX))
#define TBNAME_LIST_SEP ","
typedef struct SColumnList { // todo refactor
@@ -1360,7 +1360,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
int32_t ret = exprTreeFromSqlExpr(pCmd, &pNode, pItem->pNode, pQueryInfo, colList, NULL);
if (ret != TSDB_CODE_SUCCESS) {
taosArrayDestroy(colList);
- tExprTreeDestroy(&pNode, NULL);
+ tExprTreeDestroy(pNode, NULL);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
}
@@ -1369,9 +1369,9 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
for(int32_t k = 0; k < numOfNode; ++k) {
SColIndex* pIndex = taosArrayGet(colList, k);
if (TSDB_COL_IS_TAG(pIndex->flag)) {
- tExprTreeDestroy(&pNode, NULL);
+ tExprTreeDestroy(pNode, NULL);
taosArrayDestroy(colList);
- tExprTreeDestroy(&pNode, NULL);
+
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
@@ -1398,7 +1398,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
tbufCloseWriter(&bw);
taosArrayDestroy(colList);
- tExprTreeDestroy(&pNode, NULL);
+ tExprTreeDestroy(pNode, NULL);
} else {
columnList.num = 0;
columnList.ids[0] = (SColumnIndex) {0, 0};
@@ -1430,7 +1430,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
int32_t ret = exprTreeFromSqlExpr(pCmd, &pArithExprInfo->pExpr, pItem->pNode, pQueryInfo, NULL, &pArithExprInfo->uid);
if (ret != TSDB_CODE_SUCCESS) {
- tExprTreeDestroy(&pArithExprInfo->pExpr, NULL);
+ tExprTreeDestroy(pArithExprInfo->pExpr, NULL);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "invalid expression in select clause");
}
@@ -1507,23 +1507,39 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) {
pQueryInfo->type |= TSDB_QUERY_TYPE_PROJECTION_QUERY;
}
+bool isValidDistinctSql(SQueryInfo* pQueryInfo) {
+ if (pQueryInfo == NULL) {
+ return false;
+ }
+ if ((pQueryInfo->type & TSDB_QUERY_TYPE_STABLE_QUERY) != TSDB_QUERY_TYPE_STABLE_QUERY) {
+ return false;
+ }
+ if (tscQueryTags(pQueryInfo) && tscSqlExprNumOfExprs(pQueryInfo) == 1){
+ return true;
+ }
+ return false;
+}
int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable, bool joinQuery, bool intervalQuery) {
assert(pSelection != NULL && pCmd != NULL);
const char* msg2 = "functions can not be mixed up";
const char* msg3 = "not support query expression";
const char* msg5 = "invalid function name";
+ const char* msg6 = "only support distinct one tag";
SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(pCmd, clauseIndex);
if (pQueryInfo->colList == NULL) {
pQueryInfo->colList = taosArrayInit(4, POINTER_BYTES);
}
-
+ bool hasDistinct = false;
for (int32_t i = 0; i < pSelection->nExpr; ++i) {
int32_t outputIndex = (int32_t)tscSqlExprNumOfExprs(pQueryInfo);
tSqlExprItem* pItem = &pSelection->a[i];
-
+
+ if (hasDistinct == false) {
+ hasDistinct = (pItem->distinct == true);
+ }
// project on all fields
int32_t optr = pItem->pNode->nSQLOptr;
@@ -1557,6 +1573,13 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
}
}
+ if (hasDistinct == true) {
+ if (!isValidDistinctSql(pQueryInfo)) {
+ return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
+ }
+ pQueryInfo->distinctTag = true;
+ }
+
// there is only one user-defined column in the final result field, add the timestamp column.
size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList);
if (numOfSrcCols <= 0 && !tscQueryTags(pQueryInfo)) {
@@ -1733,6 +1756,9 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
SSchema colSchema = tGetTableNameColumnSchema();
tscAddSpecialColumnForSelect(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG);
+ } else if (index.columnIndex == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ SSchema colSchema = tGetBlockDistColumnSchema();
+ tscAddSpecialColumnForSelect(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema, TSDB_COL_TAG);
} else {
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
@@ -2200,6 +2226,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if (getColumnIndexByName(pCmd, &pParamElem->pNode->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
+
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
}
@@ -2408,6 +2435,14 @@ static bool isTablenameToken(SStrToken* token) {
return (strncasecmp(TSQL_TBNAME_L, tmpToken.z, tmpToken.n) == 0 && tmpToken.n == strlen(TSQL_TBNAME_L));
}
+static bool isTableBlockDistToken(SStrToken* token) {
+ SStrToken tmpToken = *token;
+ SStrToken tableToken = {0};
+
+ extractTableNameFromToken(&tmpToken, &tableToken);
+
+ return (strncasecmp(TSQL_BLOCK_DIST, tmpToken.z, tmpToken.n) == 0 && tmpToken.n == strlen(TSQL_BLOCK_DIST_L));
+}
static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken* pToken) {
STableMeta* pTableMeta = tscGetMetaInfo(pQueryInfo, index)->pTableMeta;
@@ -2437,6 +2472,8 @@ int32_t doGetColumnIndexByName(SSqlCmd* pCmd, SStrToken* pToken, SQueryInfo* pQu
if (isTablenameToken(pToken)) {
pIndex->columnIndex = TSDB_TBNAME_COLUMN_INDEX;
+ } else if (isTableBlockDistToken(pToken)) {
+ pIndex->columnIndex = TSDB_BLOCK_DIST_COLUMN_INDEX;
} else if (strncasecmp(pToken->z, DEFAULT_PRIMARY_TIMESTAMP_COL_NAME, pToken->n) == 0) {
pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX;
} else {
@@ -2677,8 +2714,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if (!validateIpAddress(pDnodeIp->z, pDnodeIp->n)) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
}
- }
-
+ }
return TSDB_CODE_SUCCESS;
}
@@ -4309,7 +4345,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
doCompactQueryExpr(pExpr);
tSqlExprDestroy(p1);
- tExprTreeDestroy(&p, NULL);
+ tExprTreeDestroy(p, NULL);
taosArrayDestroy(colList);
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
@@ -4530,10 +4566,10 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
}
- size_t size = tscNumOfFields(pQueryInfo);
+ size_t numOfFields = tscNumOfFields(pQueryInfo);
if (pQueryInfo->fillVal == NULL) {
- pQueryInfo->fillVal = calloc(size, sizeof(int64_t));
+ pQueryInfo->fillVal = calloc(numOfFields, sizeof(int64_t));
if (pQueryInfo->fillVal == NULL) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
@@ -4543,7 +4579,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
pQueryInfo->fillType = TSDB_FILL_NONE;
} else if (strncasecmp(pItem->pVar.pz, "null", 4) == 0 && pItem->pVar.nLen == 4) {
pQueryInfo->fillType = TSDB_FILL_NULL;
- for (int32_t i = START_INTERPO_COL_IDX; i < size; ++i) {
+ for (int32_t i = START_INTERPO_COL_IDX; i < numOfFields; ++i) {
TAOS_FIELD* pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
setNull((char*)&pQueryInfo->fillVal[i], pField->type, pField->bytes);
}
@@ -4557,7 +4593,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
pQueryInfo->fillType = TSDB_FILL_SET_VALUE;
size_t num = taosArrayGetSize(pFillToken);
- if (num == 1) {
+ if (num == 1) { // no actual value, return with error code
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
}
@@ -4568,11 +4604,11 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
if (tscIsPointInterpQuery(pQueryInfo)) {
startPos = 0;
- if (numOfFillVal > size) {
- numOfFillVal = (int32_t)size;
+ if (numOfFillVal > numOfFields) {
+ numOfFillVal = (int32_t)numOfFields;
}
} else {
- numOfFillVal = (int16_t)((num > (int32_t)size) ? (int32_t)size : num);
+ numOfFillVal = (int16_t)((num > (int32_t)numOfFields) ? (int32_t)numOfFields : num);
}
int32_t j = 1;
@@ -4592,10 +4628,10 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
}
}
- if ((num < size) || ((num - 1 < size) && (tscIsPointInterpQuery(pQueryInfo)))) {
+ if ((num < numOfFields) || ((num - 1 < numOfFields) && (tscIsPointInterpQuery(pQueryInfo)))) {
tVariantListItem* lastItem = taosArrayGetLast(pFillToken);
- for (int32_t i = numOfFillVal; i < size; ++i) {
+ for (int32_t i = numOfFillVal; i < numOfFields; ++i) {
TAOS_FIELD* pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
if (pField->type == TSDB_DATA_TYPE_BINARY || pField->type == TSDB_DATA_TYPE_NCHAR) {
@@ -4646,6 +4682,12 @@ int32_t parseOrderbyClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu
setDefaultOrderInfo(pQueryInfo);
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
+
+ if (pQueryInfo->distinctTag == true) {
+ pQueryInfo->order.order = TSDB_ORDER_ASC;
+ pQueryInfo->order.orderColId = 0;
+ return TSDB_CODE_SUCCESS;
+ }
if (pQuerySql->pSortOrder == NULL) {
return TSDB_CODE_SUCCESS;
}
diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c
index ef9b079cfc..36146a49b9 100644
--- a/src/client/src/tscSql.c
+++ b/src/client/src/tscSql.c
@@ -15,7 +15,7 @@
#include "hash.h"
#include "os.h"
-#include "qAst.h"
+#include "texpr.h"
#include "tkey.h"
#include "tcache.h"
#include "tnote.h"
@@ -941,7 +941,7 @@ int taos_validate_sql(TAOS *taos, const char *sql) {
static int tscParseTblNameList(SSqlObj *pSql, const char *tblNameList, int32_t tblListLen) {
// must before clean the sqlcmd object
- tscResetSqlCmdObj(&pSql->cmd);
+ tscResetSqlCmd(&pSql->cmd, false);
SSqlCmd *pCmd = &pSql->cmd;
diff --git a/src/client/src/tscStream.c b/src/client/src/tscStream.c
index f14538fba9..d787f5b515 100644
--- a/src/client/src/tscStream.c
+++ b/src/client/src/tscStream.c
@@ -191,9 +191,10 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pStream->pSql->cmd, 0, 0);
- assert(0);
-// char* name = pTableMetaInfo->name;
-// taosHashRemove(tscTableMetaInfo, name, strnlen(name, TSDB_TABLE_FNAME_LEN));
+ char name[TSDB_TABLE_FNAME_LEN] = {0};
+ tNameExtractFullName(&pTableMetaInfo->name, name);
+
+ taosHashRemove(tscTableMetaInfo, name, strnlen(name, TSDB_TABLE_FNAME_LEN));
pTableMetaInfo->vgroupList = tscVgroupInfoClear(pTableMetaInfo->vgroupList);
tscSetRetryTimer(pStream, pStream->pSql, retryDelay);
@@ -292,8 +293,8 @@ static void tscProcessStreamRetrieveResult(void *param, TAOS_RES *res, int numOf
pStream->stime += 1;
}
-// tscDebug("%p stream:%p, query on:%s, fetch result completed, fetched rows:%" PRId64, pSql, pStream, pTableMetaInfo->name,
-// pStream->numOfRes);
+ tscDebug("%p stream:%p, query on:%s, fetch result completed, fetched rows:%" PRId64, pSql, pStream, tNameGetTableName(&pTableMetaInfo->name),
+ pStream->numOfRes);
tfree(pTableMetaInfo->pTableMeta);
@@ -556,8 +557,8 @@ static void tscCreateStream(void *param, TAOS_RES *res, int code) {
taosTmrReset(tscProcessStreamTimer, (int32_t)starttime, pStream, tscTmr, &pStream->pTimer);
-// tscDebug("%p stream:%p is opened, query on:%s, interval:%" PRId64 ", sliding:%" PRId64 ", first launched in:%" PRId64 ", sql:%s", pSql,
-// pStream, pTableMetaInfo->name, pStream->interval.interval, pStream->interval.sliding, starttime, pSql->sqlstr);
+ tscDebug("%p stream:%p is opened, query on:%s, interval:%" PRId64 ", sliding:%" PRId64 ", first launched in:%" PRId64 ", sql:%s", pSql,
+ pStream, tNameGetTableName(&pTableMetaInfo->name), pStream->interval.interval, pStream->interval.sliding, starttime, pSql->sqlstr);
}
void tscSetStreamDestTable(SSqlStream* pStream, const char* dstTable) {
diff --git a/src/client/src/tscSub.c b/src/client/src/tscSub.c
index 7f0b174ad3..527531b31a 100644
--- a/src/client/src/tscSub.c
+++ b/src/client/src/tscSub.c
@@ -313,7 +313,7 @@ static int tscLoadSubscriptionProgress(SSub* pSub) {
char buf[TSDB_MAX_SQL_LEN];
sprintf(buf, "%s/subscribe/%s", tsDataDir, pSub->topic);
- FILE* fp = fopen(buf, "r");
+ FILE* fp = fopen(buf, "rb");
if (fp == NULL) {
tscDebug("subscription progress file does not exist: %s", pSub->topic);
return 1;
@@ -368,7 +368,7 @@ void tscSaveSubscriptionProgress(void* sub) {
}
sprintf(path, "%s/subscribe/%s", tsDataDir, pSub->topic);
- FILE* fp = fopen(path, "w+");
+ FILE* fp = fopen(path, "wb+");
if (fp == NULL) {
tscError("failed to create progress file for subscription: %s", pSub->topic);
return;
diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c
index 4d928bc31a..67fd3d24bd 100644
--- a/src/client/src/tscSubquery.c
+++ b/src/client/src/tscSubquery.c
@@ -16,7 +16,7 @@
#include "os.h"
-#include "qAst.h"
+#include "texpr.h"
#include "qTsbuf.h"
#include "tcompare.h"
#include "tscLog.h"
@@ -582,13 +582,14 @@ void freeJoinSubqueryObj(SSqlObj* pSql) {
pSql->subState.numOfSub = 0;
}
-static void quitAllSubquery(SSqlObj* pSqlSub, SSqlObj* pSqlObj, SJoinSupporter* pSupporter) {
+static int32_t quitAllSubquery(SSqlObj* pSqlSub, SSqlObj* pSqlObj, SJoinSupporter* pSupporter) {
if (subAndCheckDone(pSqlSub, pSqlObj, pSupporter->subqueryIndex)) {
tscError("%p all subquery return and query failed, global code:%s", pSqlObj, tstrerror(pSqlObj->res.code));
freeJoinSubqueryObj(pSqlObj);
- return;
+ return 0;
}
+ return 1;
//tscDestroyJoinSupporter(pSupporter);
}
@@ -835,7 +836,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
if (pParentSql->res.code != TSDB_CODE_SUCCESS) {
tscError("%p abort query due to other subquery failure. code:%d, global code:%d", pSql, numOfRows, pParentSql->res.code);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
tscAsyncResultOnError(pParentSql);
@@ -850,7 +853,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
tscError("%p sub query failed, code:%s, index:%d", pSql, tstrerror(numOfRows), pSupporter->subqueryIndex);
pParentSql->res.code = numOfRows;
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
tscAsyncResultOnError(pParentSql);
return;
@@ -867,7 +872,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
tscError("%p failed to malloc memory", pSql);
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
tscAsyncResultOnError(pParentSql);
return;
@@ -985,7 +992,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
if (pParentSql->res.code != TSDB_CODE_SUCCESS) {
tscError("%p abort query due to other subquery failure. code:%d, global code:%d", pSql, numOfRows, pParentSql->res.code);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)){
+ return;
+ }
tscAsyncResultOnError(pParentSql);
@@ -999,7 +1008,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
tscError("%p sub query failed, code:%s, index:%d", pSql, tstrerror(numOfRows), pSupporter->subqueryIndex);
pParentSql->res.code = numOfRows;
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)){
+ return;
+ }
tscAsyncResultOnError(pParentSql);
return;
@@ -1007,14 +1018,16 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
if (numOfRows > 0) { // write the compressed timestamp to disk file
if(pSupporter->f == NULL) {
- pSupporter->f = fopen(pSupporter->path, "w");
+ pSupporter->f = fopen(pSupporter->path, "wb");
if (pSupporter->f == NULL) {
tscError("%p failed to create tmp file:%s, reason:%s", pSql, pSupporter->path, strerror(errno));
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
tscAsyncResultOnError(pParentSql);
@@ -1032,7 +1045,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)){
+ return;
+ }
tscAsyncResultOnError(pParentSql);
@@ -1051,7 +1066,7 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
// continue to retrieve ts-comp data from vnode
if (!pRes->completed) {
taosGetTmpfilePath("ts-join", pSupporter->path);
- pSupporter->f = fopen(pSupporter->path, "w");
+ pSupporter->f = fopen(pSupporter->path, "wb");
pRes->row = pRes->numOfRows;
taos_fetch_rows_a(tres, tsCompRetrieveCallback, param);
@@ -1077,7 +1092,7 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
taosGetTmpfilePath("ts-join", pSupporter->path);
// TODO check for failure
- pSupporter->f = fopen(pSupporter->path, "w");
+ pSupporter->f = fopen(pSupporter->path, "wb");
pRes->row = pRes->numOfRows;
// set the callback function
@@ -1129,8 +1144,10 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR
if (pParentSql->res.code != TSDB_CODE_SUCCESS) {
tscError("%p abort query due to other subquery failure. code:%d, global code:%d", pSql, numOfRows, pParentSql->res.code);
- quitAllSubquery(pSql, pParentSql, pSupporter);
-
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
+
tscAsyncResultOnError(pParentSql);
return;
@@ -1472,7 +1489,9 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) {
// retrieve actual query results from vnode during the second stage join subquery
if (pParentSql->res.code != TSDB_CODE_SUCCESS) {
tscError("%p abort query due to other subquery failure. code:%d, global code:%d", pSql, code, pParentSql->res.code);
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
tscAsyncResultOnError(pParentSql);
@@ -1486,7 +1505,10 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) {
tscError("%p abort query, code:%s, global code:%s", pSql, tstrerror(code), tstrerror(pParentSql->res.code));
pParentSql->res.code = code;
- quitAllSubquery(pSql, pParentSql, pSupporter);
+ if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
+ return;
+ }
+
tscAsyncResultOnError(pParentSql);
return;
@@ -2441,7 +2463,7 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
pParentObj->cmd.parseFinished = false;
- tscResetSqlCmdObj(&pParentObj->cmd);
+ tscResetSqlCmd(&pParentObj->cmd, false);
// in case of insert, redo parsing the sql string and build new submit data block for two reasons:
// 1. the table Id(tid & uid) may have been update, the submit block needs to be updated accordingly.
diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c
index e1521b4aa1..d045000e24 100644
--- a/src/client/src/tscUtil.c
+++ b/src/client/src/tscUtil.c
@@ -16,7 +16,7 @@
#include "tscUtil.h"
#include "hash.h"
#include "os.h"
-#include "qAst.h"
+#include "texpr.h"
#include "taosmsg.h"
#include "tkey.h"
#include "tmd5.h"
@@ -381,7 +381,7 @@ void tscFreeQueryInfo(SSqlCmd* pCmd) {
tfree(pCmd->pQueryInfo);
}
-void tscResetSqlCmdObj(SSqlCmd* pCmd) {
+void tscResetSqlCmd(SSqlCmd* pCmd, bool removeMeta) {
pCmd->command = 0;
pCmd->numOfCols = 0;
pCmd->count = 0;
@@ -399,7 +399,7 @@ void tscResetSqlCmdObj(SSqlCmd* pCmd) {
pCmd->numOfTables = 0;
tfree(pCmd->pTableNameList);
- pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList);
+ pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList, removeMeta);
pCmd->pDataBlocks = tscDestroyBlockArrayList(pCmd->pDataBlocks);
tscFreeQueryInfo(pCmd);
}
@@ -501,7 +501,7 @@ void tscFreeSqlObj(SSqlObj* pSql) {
pSql->self = 0;
tscFreeSqlResult(pSql);
- tscResetSqlCmdObj(pCmd);
+ tscResetSqlCmd(pCmd, false);
tfree(pCmd->tagData.data);
pCmd->tagData.dataLen = 0;
@@ -515,7 +515,7 @@ void tscFreeSqlObj(SSqlObj* pSql) {
free(pSql);
}
-void tscDestroyDataBlock(STableDataBlocks* pDataBlock) {
+void tscDestroyDataBlock(STableDataBlocks* pDataBlock, bool removeMeta) {
if (pDataBlock == NULL) {
return;
}
@@ -528,6 +528,13 @@ void tscDestroyDataBlock(STableDataBlocks* pDataBlock) {
tfree(pDataBlock->pTableMeta);
}
+ if (removeMeta) {
+ char name[TSDB_TABLE_FNAME_LEN] = {0};
+ tNameExtractFullName(&pDataBlock->tableName, name);
+
+ taosHashRemove(tscTableMetaInfo, name, strnlen(name, TSDB_TABLE_FNAME_LEN));
+ }
+
tfree(pDataBlock);
}
@@ -563,21 +570,21 @@ void* tscDestroyBlockArrayList(SArray* pDataBlockList) {
size_t size = taosArrayGetSize(pDataBlockList);
for (int32_t i = 0; i < size; i++) {
void* d = taosArrayGetP(pDataBlockList, i);
- tscDestroyDataBlock(d);
+ tscDestroyDataBlock(d, false);
}
taosArrayDestroy(pDataBlockList);
return NULL;
}
-void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable) {
+void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable, bool removeMeta) {
if (pBlockHashTable == NULL) {
return NULL;
}
STableDataBlocks** p = taosHashIterate(pBlockHashTable, NULL);
while(p) {
- tscDestroyDataBlock(*p);
+ tscDestroyDataBlock(*p, removeMeta);
p = taosHashIterate(pBlockHashTable, p);
}
@@ -791,7 +798,7 @@ static void extractTableNameList(SSqlCmd* pCmd, bool freeBlockMap) {
}
if (freeBlockMap) {
- pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList);
+ pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList, false);
}
}
@@ -1047,7 +1054,7 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
SInternalField* pInfo = taosArrayGet(pFieldInfo->internalField, i);
if (pInfo->pArithExprInfo != NULL) {
- tExprTreeDestroy(&pInfo->pArithExprInfo->pExpr, NULL);
+ tExprTreeDestroy(pInfo->pArithExprInfo->pExpr, NULL);
SSqlFuncMsg* pFuncMsg = &pInfo->pArithExprInfo->base;
for(int32_t j = 0; j < pFuncMsg->numOfParams; ++j) {
@@ -1080,6 +1087,8 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol
// set the correct columnIndex index
if (pColIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
pExpr->colInfo.colId = TSDB_TBNAME_COLUMN_INDEX;
+ } else if (pColIndex->columnIndex == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ pExpr->colInfo.colId = TSDB_BLOCK_DIST_COLUMN_INDEX;
} else if (pColIndex->columnIndex <= TSDB_UD_COLUMN_INDEX) {
pExpr->colInfo.colId = pColIndex->columnIndex;
} else {
@@ -1496,7 +1505,7 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId, int32_t
return false;
}
- if (colId == TSDB_TBNAME_COLUMN_INDEX || (colId <= TSDB_UD_COLUMN_INDEX && numOfParams == 2)) {
+ if (colId == TSDB_TBNAME_COLUMN_INDEX || colId == TSDB_BLOCK_DIST_COLUMN_INDEX || (colId <= TSDB_UD_COLUMN_INDEX && numOfParams == 2)) {
return true;
}
diff --git a/src/query/inc/qArithmeticOperator.h b/src/common/inc/tarithoperator.h
similarity index 100%
rename from src/query/inc/qArithmeticOperator.h
rename to src/common/inc/tarithoperator.h
diff --git a/src/common/inc/tdataformat.h b/src/common/inc/tdataformat.h
index 43208e0e47..e842030b4c 100644
--- a/src/common/inc/tdataformat.h
+++ b/src/common/inc/tdataformat.h
@@ -27,23 +27,23 @@
extern "C" {
#endif
-#define STR_TO_VARSTR(x, str) \
- do { \
- VarDataLenT __len = strlen(str); \
- *(VarDataLenT *)(x) = __len; \
- memcpy(varDataVal(x), (str), __len); \
+#define STR_TO_VARSTR(x, str) \
+ do { \
+ VarDataLenT __len = (VarDataLenT)strlen(str); \
+ *(VarDataLenT *)(x) = __len; \
+ memcpy(varDataVal(x), (str), __len); \
} while (0);
-#define STR_WITH_MAXSIZE_TO_VARSTR(x, str, _maxs) \
- do { \
+#define STR_WITH_MAXSIZE_TO_VARSTR(x, str, _maxs) \
+ do { \
char *_e = stpncpy(varDataVal(x), (str), (_maxs)-VARSTR_HEADER_SIZE); \
- varDataSetLen(x, (_e - (x)-VARSTR_HEADER_SIZE)); \
+ varDataSetLen(x, (_e - (x)-VARSTR_HEADER_SIZE)); \
} while (0)
-#define STR_WITH_SIZE_TO_VARSTR(x, str, _size) \
- do { \
- *(VarDataLenT *)(x) = (_size); \
- memcpy(varDataVal(x), (str), (_size)); \
+#define STR_WITH_SIZE_TO_VARSTR(x, str, _size) \
+ do { \
+ *(VarDataLenT *)(x) = (VarDataLenT)(_size); \
+ memcpy(varDataVal(x), (str), (_size)); \
} while (0);
// ----------------- TSDB COLUMN DEFINITION
@@ -156,7 +156,7 @@ static FORCE_INLINE int tkeyComparFn(const void *tkey1, const void *tkey2) {
* +----------+----------+---------------------------------+---------------------------------+
* | len | sversion | First part | Second part |
* +----------+----------+---------------------------------+---------------------------------+
- *
+ *
* NOTE: timestamp in this row structure is TKEY instead of TSKEY
*/
typedef void *SDataRow;
diff --git a/src/query/inc/qAst.h b/src/common/inc/texpr.h
similarity index 83%
rename from src/query/inc/qAst.h
rename to src/common/inc/texpr.h
index 39af7261ef..acfbffc01e 100644
--- a/src/query/inc/qAst.h
+++ b/src/common/inc/texpr.h
@@ -31,6 +31,15 @@ extern "C" {
struct tExprNode;
struct SSchema;
+#define QUERY_COND_REL_PREFIX_IN "IN|"
+#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
+
+#define QUERY_COND_REL_PREFIX_IN_LEN 3
+#define QUERY_COND_REL_PREFIX_LIKE_LEN 5
+
+typedef bool (*__result_filter_fn_t)(const void *, void *);
+typedef void (*__do_filter_suppl_fn_t)(void *, void *);
+
enum {
TSQL_NODE_DUMMY = 0x0,
TSQL_NODE_EXPR = 0x1,
@@ -38,9 +47,6 @@ enum {
TSQL_NODE_VALUE = 0x4,
};
-typedef bool (*__result_filter_fn_t)(const void *, void *);
-typedef void (*__do_filter_suppl_fn_t)(void *, void *);
-
/**
* this structure is used to filter data in tags, so the offset of filtered tag column in tagdata string is required
*/
@@ -52,12 +58,6 @@ typedef struct tQueryInfo {
bool indexed; // indexed columns
} tQueryInfo;
-typedef struct SExprTraverseSupp {
- __result_filter_fn_t nodeFilterFn;
- __do_filter_suppl_fn_t setupInfoFn;
- void * pExtInfo;
-} SExprTraverseSupp;
-
typedef struct tExprNode {
uint8_t nodeType;
union {
@@ -65,7 +65,7 @@ typedef struct tExprNode {
uint8_t optr; // filter operator
uint8_t hasPK; // 0: do not contain primary filter, 1: contain
void * info; // support filter operation on this expression only available for leaf node
-
+
struct tExprNode *pLeft; // left child pointer
struct tExprNode *pRight; // right child pointer
} _node;
@@ -74,19 +74,27 @@ typedef struct tExprNode {
};
} tExprNode;
-void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, void *param, int32_t order,
- char *(*cb)(void *, const char*, int32_t));
+typedef struct SExprTraverseSupp {
+ __result_filter_fn_t nodeFilterFn;
+ __do_filter_suppl_fn_t setupInfoFn;
+ void * pExtInfo;
+} SExprTraverseSupp;
+
+void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *));
tExprNode* exprTreeFromBinary(const void* data, size_t size);
tExprNode* exprTreeFromTableName(const char* tbnameCond);
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree);
-void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *));
-void tExprTreeDestroy(tExprNode **pExprs, void (*fp)(void*));
-
bool exprTreeApplayFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
+typedef void (*_arithmetic_operator_fn_t)(void *left, int32_t numLeft, int32_t leftType, void *right, int32_t numRight,
+ int32_t rightType, void *output, int32_t order);
+
+void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, void *param, int32_t order,
+ char *(*cb)(void *, const char*, int32_t));
+
#ifdef __cplusplus
}
#endif
diff --git a/src/common/inc/tglobal.h b/src/common/inc/tglobal.h
index 54334d49f3..284e718016 100644
--- a/src/common/inc/tglobal.h
+++ b/src/common/inc/tglobal.h
@@ -88,8 +88,8 @@ extern int32_t tsMinRowsInFileBlock;
extern int32_t tsMaxRowsInFileBlock;
extern int16_t tsCommitTime; // seconds
extern int32_t tsTimePrecision;
-extern int16_t tsCompression;
-extern int16_t tsWAL;
+extern int8_t tsCompression;
+extern int8_t tsWAL;
extern int32_t tsFsyncPeriod;
extern int32_t tsReplications;
extern int32_t tsQuorum;
diff --git a/src/common/inc/tname.h b/src/common/inc/tname.h
index bc1611cefe..892d682756 100644
--- a/src/common/inc/tname.h
+++ b/src/common/inc/tname.h
@@ -1,3 +1,18 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
#ifndef TDENGINE_NAME_H
#define TDENGINE_NAME_H
@@ -45,6 +60,8 @@ void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable);
SSchema tGetTableNameColumnSchema();
+SSchema tGetBlockDistColumnSchema();
+
SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name);
bool tscValidateTableNameLength(size_t len);
diff --git a/src/query/src/qArithmeticOperator.c b/src/common/src/tarithoperator.c
similarity index 99%
rename from src/query/src/qArithmeticOperator.c
rename to src/common/src/tarithoperator.c
index 677951bd07..1cb667d259 100644
--- a/src/query/src/qArithmeticOperator.c
+++ b/src/common/src/tarithoperator.c
@@ -15,9 +15,9 @@
#include "os.h"
-#include "qArithmeticOperator.h"
#include "ttype.h"
#include "tutil.h"
+#include "tarithoperator.h"
#define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
{ \
diff --git a/src/query/src/qAst.c b/src/common/src/texpr.c
similarity index 96%
rename from src/query/src/qAst.c
rename to src/common/src/texpr.c
index bd87cacb4b..f941fc4501 100644
--- a/src/query/src/qAst.c
+++ b/src/common/src/texpr.c
@@ -16,18 +16,15 @@
#include "os.h"
#include "exception.h"
-#include "qArithmeticOperator.h"
-#include "qAst.h"
#include "taosdef.h"
#include "taosmsg.h"
#include "tarray.h"
#include "tbuffer.h"
#include "tcompare.h"
-#include "tname.h"
-#include "tschemautil.h"
#include "tsdb.h"
#include "tskiplist.h"
-#include "tsqlfunction.h"
+#include "texpr.h"
+#include "tarithoperator.h"
static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
if (pLeft->nodeType == TSQL_NODE_COL) {
@@ -102,13 +99,15 @@ static void reverseCopy(char* dest, const char* src, int16_t type, int32_t numOf
}
}
-void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
+static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *));
+
+void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *)) {
if (pNode == NULL) {
return;
}
if (pNode->nodeType == TSQL_NODE_EXPR) {
- tExprTreeDestroy(&pNode, fp);
+ doExprTreeDestroy(&pNode, fp);
} else if (pNode->nodeType == TSQL_NODE_VALUE) {
tVariantDestroy(pNode->pVal);
} else if (pNode->nodeType == TSQL_NODE_COL) {
@@ -118,14 +117,14 @@ void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
free(pNode);
}
-void tExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
+static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
if (*pExpr == NULL) {
return;
}
if ((*pExpr)->nodeType == TSQL_NODE_EXPR) {
- tExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
- tExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
+ doExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
+ doExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
if (fp != NULL) {
fp((*pExpr)->_node.info);
@@ -270,8 +269,9 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
}
}
- free(pLeftOutput);
- free(pRightOutput);
+ tfree(pdata);
+ tfree(pLeftOutput);
+ tfree(pRightOutput);
}
static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) {
@@ -342,7 +342,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
}
tExprNode* pExpr = exception_calloc(1, sizeof(tExprNode));
- CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, pExpr, NULL);
+ CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, pExpr, NULL);
pExpr->nodeType = tbufReadUint8(br);
if (pExpr->nodeType == TSQL_NODE_VALUE) {
@@ -396,7 +396,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
int32_t anchor = CLEANUP_GET_ANCHOR();
tExprNode* expr = exception_calloc(1, sizeof(tExprNode));
- CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, expr, NULL);
+ CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, expr, NULL);
expr->nodeType = TSQL_NODE_EXPR;
diff --git a/src/common/src/tglobal.c b/src/common/src/tglobal.c
index cfe91d3519..bda4dce593 100644
--- a/src/common/src/tglobal.c
+++ b/src/common/src/tglobal.c
@@ -121,8 +121,8 @@ int32_t tsMinRowsInFileBlock = TSDB_DEFAULT_MIN_ROW_FBLOCK;
int32_t tsMaxRowsInFileBlock = TSDB_DEFAULT_MAX_ROW_FBLOCK;
int16_t tsCommitTime = TSDB_DEFAULT_COMMIT_TIME; // seconds
int32_t tsTimePrecision = TSDB_DEFAULT_PRECISION;
-int16_t tsCompression = TSDB_DEFAULT_COMP_LEVEL;
-int16_t tsWAL = TSDB_DEFAULT_WAL_LEVEL;
+int8_t tsCompression = TSDB_DEFAULT_COMP_LEVEL;
+int8_t tsWAL = TSDB_DEFAULT_WAL_LEVEL;
int32_t tsFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
int32_t tsReplications = TSDB_DEFAULT_DB_REPLICA_OPTION;
int32_t tsQuorum = TSDB_DEFAULT_DB_QUORUM_OPTION;
@@ -758,7 +758,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "comp";
cfg.ptr = &tsCompression;
- cfg.valType = TAOS_CFG_VTYPE_INT16;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = TSDB_MIN_COMP_LEVEL;
cfg.maxValue = TSDB_MAX_COMP_LEVEL;
@@ -768,7 +768,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "walLevel";
cfg.ptr = &tsWAL;
- cfg.valType = TAOS_CFG_VTYPE_INT16;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = TSDB_MIN_WAL_LEVEL;
cfg.maxValue = TSDB_MAX_WAL_LEVEL;
diff --git a/src/common/src/tname.c b/src/common/src/tname.c
index bbb0a8c082..178ed09123 100644
--- a/src/common/src/tname.c
+++ b/src/common/src/tname.c
@@ -39,6 +39,14 @@ SSchema tGetTableNameColumnSchema() {
tstrncpy(s.name, TSQL_TBNAME_L, TSDB_COL_NAME_LEN);
return s;
}
+SSchema tGetBlockDistColumnSchema() {
+ SSchema s = {0};
+ s.bytes = TSDB_MAX_BINARY_LEN;;
+ s.type = TSDB_DATA_TYPE_BINARY;
+ s.colId = TSDB_BLOCK_DIST_COLUMN_INDEX;
+ tstrncpy(s.name, TSQL_BLOCK_DIST_L, TSDB_COL_NAME_LEN);
+ return s;
+}
SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name) {
SSchema s = {0};
diff --git a/src/common/src/tvariant.c b/src/common/src/tvariant.c
index 95aa576889..fa95e17f32 100644
--- a/src/common/src/tvariant.c
+++ b/src/common/src/tvariant.c
@@ -775,7 +775,7 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
return -1;
}
} else {
- wcsncpy((wchar_t *)p, pVariant->wpz, pVariant->nLen);
+ memcpy(p, pVariant->wpz, pVariant->nLen);
newlen = pVariant->nLen;
}
@@ -867,4 +867,4 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/src/cq/CMakeLists.txt b/src/cq/CMakeLists.txt
index 34146241a5..73d5eebd6d 100644
--- a/src/cq/CMakeLists.txt
+++ b/src/cq/CMakeLists.txt
@@ -6,22 +6,10 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(tcq ${SRC})
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(tcq tutil common taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(tcq tutil common taos)
- ENDIF ()
- ADD_SUBDIRECTORY(test)
-ENDIF ()
-
-IF (TD_DARWIN)
- ADD_LIBRARY(tcq ${SRC})
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(tcq tutil common taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(tcq tutil common taos)
- ENDIF ()
- ADD_SUBDIRECTORY(test)
+ADD_LIBRARY(tcq ${SRC})
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(tcq tutil common taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(tcq tutil common taos)
ENDIF ()
+ADD_SUBDIRECTORY(test)
diff --git a/src/cq/src/cqMain.c b/src/cq/src/cqMain.c
index 0fe5ea78d4..5f1fecc494 100644
--- a/src/cq/src/cqMain.c
+++ b/src/cq/src/cqMain.c
@@ -343,7 +343,7 @@ static void cqProcessStreamRes(void *param, TAOS_RES *tres, TAOS_ROW row) {
char buf[TSDB_MAX_NCHAR_LEN];
int32_t len = taos_fetch_lengths(tres)[i];
taosMbsToUcs4(val, len, buf, sizeof(buf), &len);
- memcpy(val + sizeof(VarDataLenT), buf, len);
+ memcpy((char *)val + sizeof(VarDataLenT), buf, len);
varDataLen(val) = len;
}
tdAppendColVal(trow, val, c->type, c->bytes, c->offset);
diff --git a/src/cq/test/CMakeLists.txt b/src/cq/test/CMakeLists.txt
index 87a8705fcd..fc3a1ea93a 100644
--- a/src/cq/test/CMakeLists.txt
+++ b/src/cq/test/CMakeLists.txt
@@ -3,4 +3,4 @@ PROJECT(TDengine)
LIST(APPEND CQTEST_SRC ./cqtest.c)
ADD_EXECUTABLE(cqtest ${CQTEST_SRC})
-TARGET_LINK_LIBRARIES(cqtest tcq)
+TARGET_LINK_LIBRARIES(cqtest tcq taos_static)
diff --git a/src/dnode/CMakeLists.txt b/src/dnode/CMakeLists.txt
index 905ad9d920..14ec98b8f8 100644
--- a/src/dnode/CMakeLists.txt
+++ b/src/dnode/CMakeLists.txt
@@ -10,79 +10,38 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX)
- ADD_EXECUTABLE(taosd ${SRC})
- TARGET_LINK_LIBRARIES(taosd mnode monitor http tsdb twal vnode cJson lz4 balance sync)
+ADD_EXECUTABLE(taosd ${SRC})
+TARGET_LINK_LIBRARIES(taosd mnode monitor http tsdb twal vnode cJson lz4 balance sync)
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(taosd taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(taosd taos)
- ENDIF ()
-
- IF (TD_ACCOUNT)
- TARGET_LINK_LIBRARIES(taosd account)
- ENDIF ()
-
- IF (TD_GRANT)
- TARGET_LINK_LIBRARIES(taosd grant)
- ENDIF ()
-
- IF (TD_MQTT)
- TARGET_LINK_LIBRARIES(taosd mqtt)
- ENDIF ()
-
- SET(PREPARE_ENV_CMD "prepare_env_cmd")
- SET(PREPARE_ENV_TARGET "prepare_env_target")
- ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
- POST_BUILD
- COMMAND echo "make test directory"
- DEPENDS taosd
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/
- COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMENT "prepare taosd environment")
- ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD})
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(taosd taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(taosd taos)
ENDIF ()
-IF (TD_DARWIN)
- ADD_EXECUTABLE(taosd ${SRC})
- TARGET_LINK_LIBRARIES(taosd mnode monitor http tsdb twal vnode cJson lz4 balance sync)
-
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(taosd taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(taosd taos)
- ENDIF ()
-
- IF (TD_ACCOUNT)
- TARGET_LINK_LIBRARIES(taosd account)
- ENDIF ()
-
- IF (TD_GRANT)
- TARGET_LINK_LIBRARIES(taosd grant)
- ENDIF ()
-
- IF (TD_MQTT)
- TARGET_LINK_LIBRARIES(taosd mqtt)
- ENDIF ()
-
- # SET(PREPARE_ENV_CMD "prepare_env_cmd")
- # SET(PREPARE_ENV_TARGET "prepare_env_target")
- # ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
- # POST_BUILD
- # COMMAND echo "make test directory"
- # DEPENDS taosd
- # COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/
- # COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/
- # COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/
- # COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- # COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- # COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- # COMMENT "prepare taosd environment")
- # ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD})
+IF (TD_ACCOUNT)
+ TARGET_LINK_LIBRARIES(taosd account)
ENDIF ()
+IF (TD_GRANT)
+ TARGET_LINK_LIBRARIES(taosd grant)
+ENDIF ()
+
+IF ((TD_LINUX OR TD_WINDOWS) AND TD_MQTT)
+ TARGET_LINK_LIBRARIES(taosd mqtt)
+ENDIF ()
+
+SET(PREPARE_ENV_CMD "prepare_env_cmd")
+SET(PREPARE_ENV_TARGET "prepare_env_target")
+ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
+ POST_BUILD
+ COMMAND echo "make test directory"
+ DEPENDS taosd
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/
+ COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMENT "prepare taosd environment")
+ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD})
diff --git a/src/dnode/src/dnodeCfg.c b/src/dnode/src/dnodeCfg.c
index f495dbe285..e008d2fa0d 100644
--- a/src/dnode/src/dnodeCfg.c
+++ b/src/dnode/src/dnodeCfg.c
@@ -97,7 +97,7 @@ static int32_t dnodeReadCfg() {
goto PARSE_CFG_OVER;
}
- len = fread(content, 1, maxLen, fp);
+ len = (int32_t)fread(content, 1, maxLen, fp);
if (len <= 0) {
dError("failed to read %s, content is null", file);
goto PARSE_CFG_OVER;
@@ -115,7 +115,7 @@ static int32_t dnodeReadCfg() {
dError("failed to read %s, dnodeId not found", file);
goto PARSE_CFG_OVER;
}
- cfg.dnodeId = dnodeId->valueint;
+ cfg.dnodeId = (int32_t)dnodeId->valueint;
cJSON *clusterId = cJSON_GetObjectItem(root, "clusterId");
if (!clusterId || clusterId->type != cJSON_String) {
diff --git a/src/dnode/src/dnodeCheck.c b/src/dnode/src/dnodeCheck.c
index be26bb967b..94d2360950 100644
--- a/src/dnode/src/dnodeCheck.c
+++ b/src/dnode/src/dnodeCheck.c
@@ -29,8 +29,8 @@ typedef struct {
static SCheckItem tsCheckItem[TSDB_CHECK_ITEM_MAX] = {{0}};
int64_t tsMinFreeMemSizeForStart = 0;
-static int bindTcpPort(int port) {
- int serverSocket;
+static int32_t bindTcpPort(int16_t port) {
+ SOCKET serverSocket;
struct sockaddr_in server_addr;
if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
@@ -45,22 +45,22 @@ static int bindTcpPort(int port) {
if (bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
dError("port:%d tcp bind() fail: %s", port, strerror(errno));
- close(serverSocket);
+ taosCloseSocket(serverSocket);
return -1;
}
if (listen(serverSocket, 5) < 0) {
dError("port:%d listen() fail: %s", port, strerror(errno));
- close(serverSocket);
+ taosCloseSocket(serverSocket);
return -1;
}
- close(serverSocket);
+ taosCloseSocket(serverSocket);
return 0;
}
-static int bindUdpPort(int port) {
- int serverSocket;
+static int32_t bindUdpPort(int16_t port) {
+ SOCKET serverSocket;
struct sockaddr_in server_addr;
if ((serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
@@ -75,19 +75,19 @@ static int bindUdpPort(int port) {
if (bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
dError("port:%d udp bind() fail: %s", port, strerror(errno));
- close(serverSocket);
+ taosCloseSocket(serverSocket);
return -1;
}
- close(serverSocket);
+ taosCloseSocket(serverSocket);
return 0;
}
-static int dnodeCheckNetwork() {
- int ret;
- int startPort = tsServerPort;
+static int32_t dnodeCheckNetwork() {
+ int32_t ret;
+ int16_t startPort = tsServerPort;
- for (int port = startPort; port < startPort + 12; port++) {
+ for (int16_t port = startPort; port < startPort + 12; port++) {
ret = bindTcpPort(port);
if (0 != ret) {
dError("failed to tcp bind port %d, quit", port);
@@ -103,7 +103,7 @@ static int dnodeCheckNetwork() {
return 0;
}
-static int dnodeCheckMem() {
+static int32_t dnodeCheckMem() {
float memoryUsedMB;
float memoryAvailMB;
if (true != taosGetSysMemory(&memoryUsedMB)) {
@@ -121,12 +121,12 @@ static int dnodeCheckMem() {
return 0;
}
-static int dnodeCheckCpu() {
+static int32_t dnodeCheckCpu() {
// TODO:
return 0;
}
-static int dnodeCheckDisk() {
+static int32_t dnodeCheckDisk() {
taosGetDisk();
if (tsAvailDataDirGB < tsMinimalDataDirGB) {
@@ -147,24 +147,24 @@ static int dnodeCheckDisk() {
return 0;
}
-static int dnodeCheckOs() {
+static int32_t dnodeCheckOs() {
// TODO:
return 0;
}
-static int dnodeCheckAccess() {
+static int32_t dnodeCheckAccess() {
// TODO:
return 0;
}
-static int dnodeCheckVersion() {
+static int32_t dnodeCheckVersion() {
// TODO:
return 0;
}
-static int dnodeCheckDatafile() {
+static int32_t dnodeCheckDatafile() {
// TODO:
return 0;
diff --git a/src/dnode/src/dnodeEps.c b/src/dnode/src/dnodeEps.c
index e7dc7efeb2..1e05c696ce 100644
--- a/src/dnode/src/dnodeEps.c
+++ b/src/dnode/src/dnodeEps.c
@@ -152,7 +152,7 @@ static int32_t dnodeReadEps() {
goto PRASE_EPS_OVER;
}
- len = fread(content, 1, maxLen, fp);
+ len = (int32_t)fread(content, 1, maxLen, fp);
if (len <= 0) {
dError("failed to read %s, content is null", file);
goto PRASE_EPS_OVER;
@@ -199,7 +199,7 @@ static int32_t dnodeReadEps() {
dError("failed to read %s, dnodeId not found", file);
goto PRASE_EPS_OVER;
}
- ep->dnodeId = dnodeId->valueint;
+ ep->dnodeId = (int32_t)dnodeId->valueint;
cJSON *dnodeFqdn = cJSON_GetObjectItem(dnodeInfo, "dnodeFqdn");
if (!dnodeFqdn || dnodeFqdn->type != cJSON_String || dnodeFqdn->valuestring == NULL) {
diff --git a/src/dnode/src/dnodeMInfos.c b/src/dnode/src/dnodeMInfos.c
index dc89487f8b..884924f113 100644
--- a/src/dnode/src/dnodeMInfos.c
+++ b/src/dnode/src/dnodeMInfos.c
@@ -80,7 +80,7 @@ void dnodeUpdateEpSetForPeer(SRpcEpSet *ep) {
pthread_mutex_lock(&tsMInfosMutex);
dInfo("minfos is changed, numOfEps:%d inUse:%d", ep->numOfEps, ep->inUse);
- for (int i = 0; i < ep->numOfEps; ++i) {
+ for (int32_t i = 0; i < ep->numOfEps; ++i) {
ep->port[i] -= TSDB_PORT_DNODEDNODE;
dInfo("minfo:%d %s:%u", i, ep->fqdn[i], ep->port[i]);
}
@@ -108,7 +108,7 @@ void dnodeGetMInfos(SMInfos *pMinfos) {
void dnodeGetEpSetForPeer(SRpcEpSet *epSet) {
pthread_mutex_lock(&tsMInfosMutex);
*epSet = tsMEpSet;
- for (int i = 0; i < epSet->numOfEps; ++i) {
+ for (int32_t i = 0; i < epSet->numOfEps; ++i) {
epSet->port[i] += TSDB_PORT_DNODEDNODE;
}
pthread_mutex_unlock(&tsMInfosMutex);
@@ -171,7 +171,7 @@ static int32_t dnodeReadMInfos() {
goto PARSE_MINFOS_OVER;
}
- len = fread(content, 1, maxLen, fp);
+ len = (int32_t)fread(content, 1, maxLen, fp);
if (len <= 0) {
dError("failed to read %s, content is null", file);
goto PARSE_MINFOS_OVER;
@@ -189,14 +189,14 @@ static int32_t dnodeReadMInfos() {
dError("failed to read mnodeEpSet.json, inUse not found");
goto PARSE_MINFOS_OVER;
}
- tsMInfos.inUse = inUse->valueint;
+ tsMInfos.inUse = (int8_t)inUse->valueint;
cJSON *nodeNum = cJSON_GetObjectItem(root, "nodeNum");
if (!nodeNum || nodeNum->type != cJSON_Number) {
dError("failed to read mnodeEpSet.json, nodeNum not found");
goto PARSE_MINFOS_OVER;
}
- minfos.mnodeNum = nodeNum->valueint;
+ minfos.mnodeNum = (int8_t)nodeNum->valueint;
cJSON *nodeInfos = cJSON_GetObjectItem(root, "nodeInfos");
if (!nodeInfos || nodeInfos->type != cJSON_Array) {
@@ -204,13 +204,13 @@ static int32_t dnodeReadMInfos() {
goto PARSE_MINFOS_OVER;
}
- int size = cJSON_GetArraySize(nodeInfos);
+ int32_t size = cJSON_GetArraySize(nodeInfos);
if (size != minfos.mnodeNum) {
dError("failed to read mnodeEpSet.json, nodeInfos size not matched");
goto PARSE_MINFOS_OVER;
}
- for (int i = 0; i < size; ++i) {
+ for (int32_t i = 0; i < size; ++i) {
cJSON *nodeInfo = cJSON_GetArrayItem(nodeInfos, i);
if (nodeInfo == NULL) continue;
@@ -227,7 +227,7 @@ static int32_t dnodeReadMInfos() {
}
SMInfo *pMinfo = &minfos.mnodeInfos[i];
- pMinfo->mnodeId = nodeId->valueint;
+ pMinfo->mnodeId = (int32_t)nodeId->valueint;
tstrncpy(pMinfo->mnodeEp, nodeEp->valuestring, TSDB_EP_LEN);
bool changed = dnodeCheckEpChanged(pMinfo->mnodeId, pMinfo->mnodeEp);
diff --git a/src/dnode/src/dnodeMPeer.c b/src/dnode/src/dnodeMPeer.c
index 0863666f76..e4942c49aa 100644
--- a/src/dnode/src/dnodeMPeer.c
+++ b/src/dnode/src/dnodeMPeer.c
@@ -60,7 +60,7 @@ int32_t dnodeInitMPeer() {
void dnodeCleanupMPeer() {
for (int32_t i = 0; i < tsMPeerWP.maxNum; ++i) {
SMPeerWorker *pWorker = tsMPeerWP.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsMPeerQset);
}
dDebug("dnode mpeer worker:%d is closed", i);
@@ -69,7 +69,7 @@ void dnodeCleanupMPeer() {
for (int32_t i = 0; i < tsMPeerWP.maxNum; ++i) {
SMPeerWorker *pWorker = tsMPeerWP.worker + i;
dDebug("dnode mpeer worker:%d start to join", i);
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
dDebug("dnode mpeer worker:%d join success", i);
diff --git a/src/dnode/src/dnodeMRead.c b/src/dnode/src/dnodeMRead.c
index 9027c346f5..90332e6783 100644
--- a/src/dnode/src/dnodeMRead.c
+++ b/src/dnode/src/dnodeMRead.c
@@ -40,7 +40,7 @@ static void *dnodeProcessMReadQueue(void *param);
int32_t dnodeInitMRead() {
tsMReadQset = taosOpenQset();
- tsMReadWP.maxNum = tsNumOfCores * tsNumOfThreadsPerCore / 2;
+ tsMReadWP.maxNum = (int32_t)(tsNumOfCores * tsNumOfThreadsPerCore / 2);
tsMReadWP.maxNum = MAX(2, tsMReadWP.maxNum);
tsMReadWP.maxNum = MIN(4, tsMReadWP.maxNum);
tsMReadWP.curNum = 0;
@@ -60,7 +60,7 @@ int32_t dnodeInitMRead() {
void dnodeCleanupMRead() {
for (int32_t i = 0; i < tsMReadWP.maxNum; ++i) {
SMReadWorker *pWorker = tsMReadWP.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsMReadQset);
}
dDebug("dnode mread worker:%d is closed", i);
@@ -69,7 +69,7 @@ void dnodeCleanupMRead() {
for (int32_t i = 0; i < tsMReadWP.maxNum; ++i) {
SMReadWorker *pWorker = tsMReadWP.worker + i;
dDebug("dnode mread worker:%d start to join", i);
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
dDebug("dnode mread worker:%d start to join", i);
diff --git a/src/dnode/src/dnodeMWrite.c b/src/dnode/src/dnodeMWrite.c
index 8c9e22ef4b..218d487473 100644
--- a/src/dnode/src/dnodeMWrite.c
+++ b/src/dnode/src/dnodeMWrite.c
@@ -60,7 +60,7 @@ int32_t dnodeInitMWrite() {
void dnodeCleanupMWrite() {
for (int32_t i = 0; i < tsMWriteWP.maxNum; ++i) {
SMWriteWorker *pWorker = tsMWriteWP.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsMWriteQset);
}
dDebug("dnode mwrite worker:%d is closed", i);
@@ -69,7 +69,7 @@ void dnodeCleanupMWrite() {
for (int32_t i = 0; i < tsMWriteWP.maxNum; ++i) {
SMWriteWorker *pWorker = tsMWriteWP.worker + i;
dDebug("dnode mwrite worker:%d start to join", i);
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
dDebug("dnode mwrite worker:%d join success", i);
diff --git a/src/dnode/src/dnodePeer.c b/src/dnode/src/dnodePeer.c
index 5ee10abc30..79c60874f9 100644
--- a/src/dnode/src/dnodePeer.c
+++ b/src/dnode/src/dnodePeer.c
@@ -90,7 +90,10 @@ static void dnodeProcessReqMsgFromDnode(SRpcMsg *pMsg, SRpcEpSet *pEpSet) {
};
if (pMsg->pCont == NULL) return;
- if (pMsg->msgType == TSDB_MSG_TYPE_NETWORK_TEST) return dnodeSendStartupStep(pMsg);
+ if (pMsg->msgType == TSDB_MSG_TYPE_NETWORK_TEST) {
+ dnodeSendStartupStep(pMsg);
+ return;
+ }
if (dnodeGetRunStatus() != TSDB_RUN_STATUS_RUNING) {
rspMsg.code = TSDB_CODE_APP_NOT_READY;
diff --git a/src/dnode/src/dnodeShell.c b/src/dnode/src/dnodeShell.c
index fbdf7f7b40..a40df626e2 100644
--- a/src/dnode/src/dnodeShell.c
+++ b/src/dnode/src/dnodeShell.c
@@ -70,7 +70,7 @@ int32_t dnodeInitShell() {
dnodeProcessShellMsgFp[TSDB_MSG_TYPE_NETWORK_TEST] = dnodeSendStartupStep;
- int32_t numOfThreads = (tsNumOfCores * tsNumOfThreadsPerCore) / 2.0;
+ int32_t numOfThreads = (int32_t)((tsNumOfCores * tsNumOfThreadsPerCore) / 2.0);
if (numOfThreads < 1) {
numOfThreads = 1;
}
diff --git a/src/dnode/src/dnodeStep.c b/src/dnode/src/dnodeStep.c
index 2354b1d5a3..8878299d94 100644
--- a/src/dnode/src/dnodeStep.c
+++ b/src/dnode/src/dnodeStep.c
@@ -70,5 +70,5 @@ int32_t dnodeStepInit(SStep *pSteps, int32_t stepSize) {
}
void dnodeStepCleanup(SStep *pSteps, int32_t stepSize) {
- return taosStepCleanupImp(pSteps, stepSize - 1);
+ taosStepCleanupImp(pSteps, stepSize - 1);
}
\ No newline at end of file
diff --git a/src/dnode/src/dnodeSystem.c b/src/dnode/src/dnodeSystem.c
index 7a218f901e..33ebc8b64f 100644
--- a/src/dnode/src/dnodeSystem.c
+++ b/src/dnode/src/dnodeSystem.c
@@ -19,8 +19,10 @@
#include "tconfig.h"
#include "dnodeMain.h"
-static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context);
static tsem_t exitSem;
+static void siguser1Handler(int32_t signum, void *sigInfo, void *context);
+static void siguser2Handler(int32_t signum, void *sigInfo, void *context);
+static void sigintHandler(int32_t signum, void *sigInfo, void *context);
int32_t main(int32_t argc, char *argv[]) {
int dump_config = 0;
@@ -28,7 +30,7 @@ int32_t main(int32_t argc, char *argv[]) {
// Set global configuration file
for (int32_t i = 1; i < argc; ++i) {
if (strcmp(argv[i], "-c") == 0) {
- if (i < argc - 1) {
+ if (i < argc - 1) {
if (strlen(argv[++i]) >= TSDB_FILENAME_LEN) {
printf("config file path overflow");
exit(EXIT_FAILURE);
@@ -80,8 +82,8 @@ int32_t main(int32_t argc, char *argv[]) {
taosSetRandomFileFailOutput(NULL);
}
} else if (strcmp(argv[i], "--random-file-fail-factor") == 0) {
- if ( (i+1) < argc ) {
- int factor = atoi(argv[i+1]);
+ if ((i + 1) < argc) {
+ int factor = atoi(argv[i + 1]);
printf("The factor of random failure is %d\n", factor);
taosSetRandomFileFailFactor(factor);
} else {
@@ -93,7 +95,7 @@ int32_t main(int32_t argc, char *argv[]) {
}
if (0 != dump_config) {
- tscEmbedded = 1;
+ tscEmbedded = 1;
taosInitGlobalCfg();
taosReadGlobalLogCfg();
@@ -112,14 +114,13 @@ int32_t main(int32_t argc, char *argv[]) {
}
/* Set termination handler. */
- struct sigaction act = {{0}};
- act.sa_flags = SA_SIGINFO;
- act.sa_sigaction = signal_handler;
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGHUP, &act, NULL);
- sigaction(SIGINT, &act, NULL);
- sigaction(SIGUSR1, &act, NULL);
- sigaction(SIGUSR2, &act, NULL);
+ taosSetSignal(SIGUSR1, siguser1Handler);
+ taosSetSignal(SIGUSR2, siguser2Handler);
+ taosSetSignal(SIGTERM, sigintHandler);
+ taosSetSignal(SIGHUP, sigintHandler);
+ taosSetSignal(SIGINT, sigintHandler);
+ taosSetSignal(SIGABRT, sigintHandler);
+ taosSetSignal(SIGBREAK, sigintHandler);
// Open /var/log/syslog file to record information.
openlog("TDengine:", LOG_PID | LOG_CONS | LOG_NDELAY, LOG_LOCAL1);
@@ -144,37 +145,40 @@ int32_t main(int32_t argc, char *argv[]) {
syslog(LOG_INFO, "Shut down TDengine service successfully");
dInfo("TDengine is shut down!");
closelog();
+
+#ifdef WINDOWS
+ tsem_post(&exitSem);
+#endif
return EXIT_SUCCESS;
}
-static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context) {
- if (signum == SIGUSR1) {
- taosCfgDynamicOptions("debugFlag 143");
- return;
- }
- if (signum == SIGUSR2) {
- taosCfgDynamicOptions("resetlog");
- return;
- }
+static void siguser1Handler(int32_t signum, void *sigInfo, void *context) { taosCfgDynamicOptions("debugFlag 143"); }
+
+static void siguser2Handler(int32_t signum, void *sigInfo, void *context) { taosCfgDynamicOptions("resetlog"); }
+
+static void sigintHandler(int32_t signum, void *sigInfo, void *context) {
+ // protect the application from receive another signal
+ taosIgnSignal(SIGUSR1);
+ taosIgnSignal(SIGUSR2);
+ taosIgnSignal(SIGTERM);
+ taosIgnSignal(SIGHUP);
+ taosIgnSignal(SIGINT);
+ taosIgnSignal(SIGABRT);
+ taosIgnSignal(SIGBREAK);
+
+ // clean the system.
+ dInfo("shut down signal is %d", signum);
+
+#ifndef WINDOWS
+ dInfo("sender PID:%d cmdline:%s", ((siginfo_t *)sigInfo)->si_pid, taosGetCmdlineByPID(((siginfo_t *)sigInfo)->si_pid));
+#endif
syslog(LOG_INFO, "Shut down signal is %d", signum);
syslog(LOG_INFO, "Shutting down TDengine service...");
- // clean the system.
-#ifdef __APPLE__
- dInfo("shut down signal is %d, sender PID:%d", signum, sigInfo->si_pid);
-#else // __APPLE__
- dInfo("shut down signal is %d, sender PID:%d cmdline:%s", signum, sigInfo->si_pid, taosGetCmdlineByPID(sigInfo->si_pid));
-#endif // __APPLE__
-
- // protect the application from receive another signal
- struct sigaction act = {{0}};
- act.sa_handler = SIG_IGN;
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGHUP, &act, NULL);
- sigaction(SIGINT, &act, NULL);
- sigaction(SIGUSR1, &act, NULL);
- sigaction(SIGUSR2, &act, NULL);
// inform main thread to exit
tsem_post(&exitSem);
-}
+#ifdef WINDOWS
+ tsem_wait(&exitSem);
+#endif
+}
\ No newline at end of file
diff --git a/src/dnode/src/dnodeTelemetry.c b/src/dnode/src/dnodeTelemetry.c
index 1880e3084c..1da1486dda 100644
--- a/src/dnode/src/dnodeTelemetry.c
+++ b/src/dnode/src/dnodeTelemetry.c
@@ -93,14 +93,14 @@ static void addStringField(SBufferWriter* bw, const char* k, const char* v) {
static void addCpuInfo(SBufferWriter* bw) {
char * line = NULL;
size_t size = 0;
- int done = 0;
+ int32_t done = 0;
FILE* fp = fopen("/proc/cpuinfo", "r");
if (fp == NULL) {
return;
}
- while (done != 3 && (size = getline(&line, &size, fp)) != -1) {
+ while (done != 3 && (size = tgetline(&line, &size, fp)) != -1) {
line[size - 1] = '\0';
if (((done&1) == 0) && strncmp(line, "model name", 10) == 0) {
const char* v = strchr(line, ':') + 2;
@@ -129,7 +129,7 @@ static void addOsInfo(SBufferWriter* bw) {
return;
}
- while ((size = getline(&line, &size, fp)) != -1) {
+ while ((size = tgetline(&line, &size, fp)) != -1) {
line[size - 1] = '\0';
if (strncmp(line, "PRETTY_NAME", 11) == 0) {
const char* p = strchr(line, '=') + 1;
@@ -155,7 +155,7 @@ static void addMemoryInfo(SBufferWriter* bw) {
return;
}
- while ((size = getline(&line, &size, fp)) != -1) {
+ while ((size = tgetline(&line, &size, fp)) != -1) {
line[size - 1] = '\0';
if (strncmp(line, "MemTotal", 8) == 0) {
const char* p = strchr(line, ':') + 1;
@@ -200,7 +200,7 @@ static void sendTelemetryReport() {
dTrace("failed to get IP address of " TELEMETRY_SERVER ", reason:%s", strerror(errno));
return;
}
- int fd = taosOpenTcpClientSocket(ip, TELEMETRY_PORT, 0);
+ SOCKET fd = taosOpenTcpClientSocket(ip, TELEMETRY_PORT, 0);
if (fd < 0) {
dTrace("failed to create socket for telemetry, reason:%s", strerror(errno));
return;
@@ -222,10 +222,10 @@ static void sendTelemetryReport() {
"Content-Type: application/json\n"
"Content-Length: ";
- taosWriteSocket(fd, header, strlen(header));
- int contLen = tbufTell(&bw) - 1;
+ taosWriteSocket(fd, header, (int32_t)strlen(header));
+ int32_t contLen = (int32_t)(tbufTell(&bw) - 1);
sprintf(buf, "%d\n\n", contLen);
- taosWriteSocket(fd, buf, strlen(buf));
+ taosWriteSocket(fd, buf, (int32_t)strlen(buf));
taosWriteSocket(fd, tbufGetData(&bw, false), contLen);
tbufCloseWriter(&bw);
@@ -265,7 +265,7 @@ static void* telemetryThread(void* param) {
}
static void dnodeGetEmail(char* filepath) {
- int fd = open(filepath, O_RDONLY);
+ int32_t fd = open(filepath, O_RDONLY);
if (fd < 0) {
return;
}
@@ -274,10 +274,9 @@ static void dnodeGetEmail(char* filepath) {
dError("failed to read %d bytes from file %s since %s", TSDB_FQDN_LEN, filepath, strerror(errno));
}
- close(fd);
+ taosClose(fd);
}
-
int32_t dnodeInitTelemetry() {
if (!tsEnableTelemetryReporting) {
return 0;
@@ -310,7 +309,7 @@ void dnodeCleanupTelemetry() {
return;
}
- if (tsTelemetryThread) {
+ if (taosCheckPthreadValid(tsTelemetryThread)) {
tsem_post(&tsExitSem);
pthread_join(tsTelemetryThread, NULL);
tsem_destroy(&tsExitSem);
diff --git a/src/dnode/src/dnodeVWrite.c b/src/dnode/src/dnodeVWrite.c
index ab5a4ccaad..93d1611ebc 100644
--- a/src/dnode/src/dnodeVWrite.c
+++ b/src/dnode/src/dnodeVWrite.c
@@ -52,14 +52,14 @@ int32_t dnodeInitVWrite() {
void dnodeCleanupVWrite() {
for (int32_t i = 0; i < tsVWriteWP.max; ++i) {
SVWriteWorker *pWorker = tsVWriteWP.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(pWorker->qset);
}
}
for (int32_t i = 0; i < tsVWriteWP.max; ++i) {
SVWriteWorker *pWorker = tsVWriteWP.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
taosFreeQall(pWorker->qall);
taosCloseQset(pWorker->qset);
diff --git a/src/dnode/src/dnodeVnodes.c b/src/dnode/src/dnodeVnodes.c
index c62d5a8207..9f32541612 100644
--- a/src/dnode/src/dnodeVnodes.c
+++ b/src/dnode/src/dnodeVnodes.c
@@ -157,7 +157,7 @@ int32_t dnodeInitVnodes() {
int32_t failedVnodes = 0;
for (int32_t t = 0; t < threadNum; ++t) {
SOpenVnodeThread *pThread = &threads[t];
- if (pThread->vnodeNum > 0 && pThread->thread) {
+ if (pThread->vnodeNum > 0 && taosCheckPthreadValid(pThread->thread)) {
pthread_join(pThread->thread, NULL);
}
openVnodes += pThread->opened;
@@ -260,7 +260,7 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) {
tstrncpy(pStatus->clusterCfg.timezone, tsTimezone, 64);
pStatus->clusterCfg.checkTime = 0;
char timestr[32] = "1970-01-01 00:00:00.00";
- (void)taosParseTime(timestr, &pStatus->clusterCfg.checkTime, strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
+ (void)taosParseTime(timestr, &pStatus->clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
tstrncpy(pStatus->clusterCfg.locale, tsLocale, TSDB_LOCALE_LEN);
tstrncpy(pStatus->clusterCfg.charset, tsCharset, TSDB_LOCALE_LEN);
diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h
index d751dbb969..6fea049074 100644
--- a/src/inc/taosdef.h
+++ b/src/inc/taosdef.h
@@ -235,7 +235,9 @@ do { \
#define TSDB_MAX_REPLICA 5
#define TSDB_TBNAME_COLUMN_INDEX (-1)
+#define TSDB_BLOCK_DIST_COLUMN_INDEX (-2)
#define TSDB_UD_COLUMN_INDEX (-100)
+
#define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta
#define TSDB_MIN_CACHE_BLOCK_SIZE 1
diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h
index 262bf30309..95e6b7ff4a 100644
--- a/src/inc/tsdb.h
+++ b/src/inc/tsdb.h
@@ -114,6 +114,8 @@ void* tsdbGetTableTagVal(const void* pTable, int32_t colId, int16_t type, int16_
char* tsdbGetTableName(void *pTable);
#define TSDB_TABLEID(_table) ((STableId*) (_table))
+#define TSDB_PREV_ROW 0x1
+#define TSDB_NEXT_ROW 0x2
STableCfg *tsdbCreateTableCfgFromMsg(SMDCreateTableMsg *pMsg);
@@ -141,7 +143,6 @@ typedef struct {
int64_t tableTotalDataSize; // In bytes
int64_t tableTotalDiskSize; // In bytes
} STableInfo;
-STableInfo *tsdbGetTableInfo(TSDB_REPO_T *pRepo, STableId tid);
// -- FOR INSERT DATA
/**
@@ -160,9 +161,10 @@ typedef void *TsdbQueryHandleT; // Use void to hide implementation details
// query condition to build vnode iterator
typedef struct STsdbQueryCond {
STimeWindow twindow;
- int32_t order; // desc|asc order to iterate the data block
+ int32_t order; // desc|asc order to iterate the data block
int32_t numOfCols;
SColumnInfo *colList;
+ bool loadExternalRows; // load external rows or not
} STsdbQueryCond;
typedef struct SMemRef {
@@ -232,13 +234,32 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle);
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList,
void *qinfo, SMemRef* pRef);
+
/**
- * move to next block if exists
+ * get num of rows in mem table
+ *
+ * @param pHandle
+ * @return row size
+ */
+
+int64_t tsdbGetNumOfRowsInMemTable(TsdbQueryHandleT* pHandle);
+
+/**
+ * move to next block if exists
*
* @param pQueryHandle
* @return
*/
bool tsdbNextDataBlock(TsdbQueryHandleT *pQueryHandle);
+/**
+ * move to next block if exists but not merge data in memtable
+ *
+ * @param pQueryHandle
+ * @return
+ */
+bool tsdbNextDataBlockWithoutMerge(TsdbQueryHandleT *pQueryHandle);
+
+SArray* tsdbGetExternalRow(TsdbQueryHandleT *pHandle, SMemRef* pMemRef, int16_t type);
/**
* Get current data block information
diff --git a/src/inc/ttokendef.h b/src/inc/ttokendef.h
index dde74f4eb1..031857df09 100644
--- a/src/inc/ttokendef.h
+++ b/src/inc/ttokendef.h
@@ -16,6 +16,7 @@
#ifndef TDENGINE_TTOKENDEF_H
#define TDENGINE_TTOKENDEF_H
+
#define TK_ID 1
#define TK_BOOL 2
#define TK_TINYINT 3
@@ -127,104 +128,104 @@
#define TK_SELECT 109
#define TK_UNION 110
#define TK_ALL 111
-#define TK_FROM 112
-#define TK_VARIABLE 113
-#define TK_INTERVAL 114
-#define TK_FILL 115
-#define TK_SLIDING 116
-#define TK_ORDER 117
-#define TK_BY 118
-#define TK_ASC 119
-#define TK_DESC 120
-#define TK_GROUP 121
-#define TK_HAVING 122
-#define TK_LIMIT 123
-#define TK_OFFSET 124
-#define TK_SLIMIT 125
-#define TK_SOFFSET 126
-#define TK_WHERE 127
-#define TK_NOW 128
-#define TK_RESET 129
-#define TK_QUERY 130
-#define TK_ADD 131
-#define TK_COLUMN 132
-#define TK_TAG 133
-#define TK_CHANGE 134
-#define TK_SET 135
-#define TK_KILL 136
-#define TK_CONNECTION 137
-#define TK_STREAM 138
-#define TK_COLON 139
-#define TK_ABORT 140
-#define TK_AFTER 141
-#define TK_ATTACH 142
-#define TK_BEFORE 143
-#define TK_BEGIN 144
-#define TK_CASCADE 145
-#define TK_CLUSTER 146
-#define TK_CONFLICT 147
-#define TK_COPY 148
-#define TK_DEFERRED 149
-#define TK_DELIMITERS 150
-#define TK_DETACH 151
-#define TK_EACH 152
-#define TK_END 153
-#define TK_EXPLAIN 154
-#define TK_FAIL 155
-#define TK_FOR 156
-#define TK_IGNORE 157
-#define TK_IMMEDIATE 158
-#define TK_INITIALLY 159
-#define TK_INSTEAD 160
-#define TK_MATCH 161
-#define TK_KEY 162
-#define TK_OF 163
-#define TK_RAISE 164
-#define TK_REPLACE 165
-#define TK_RESTRICT 166
-#define TK_ROW 167
-#define TK_STATEMENT 168
-#define TK_TRIGGER 169
-#define TK_VIEW 170
-#define TK_COUNT 171
-#define TK_SUM 172
-#define TK_AVG 173
-#define TK_MIN 174
-#define TK_MAX 175
-#define TK_FIRST 176
-#define TK_LAST 177
-#define TK_TOP 178
-#define TK_BOTTOM 179
-#define TK_STDDEV 180
-#define TK_PERCENTILE 181
-#define TK_APERCENTILE 182
-#define TK_LEASTSQUARES 183
-#define TK_HISTOGRAM 184
-#define TK_DIFF 185
-#define TK_SPREAD 186
-#define TK_TWA 187
-#define TK_INTERP 188
-#define TK_LAST_ROW 189
-#define TK_RATE 190
-#define TK_IRATE 191
-#define TK_SUM_RATE 192
-#define TK_SUM_IRATE 193
-#define TK_AVG_RATE 194
-#define TK_AVG_IRATE 195
-#define TK_TBID 196
-#define TK_SEMI 197
-#define TK_NONE 198
-#define TK_PREV 199
-#define TK_LINEAR 200
-#define TK_IMPORT 201
-#define TK_METRIC 202
-#define TK_TBNAME 203
-#define TK_JOIN 204
-#define TK_METRICS 205
-#define TK_INSERT 206
-#define TK_INTO 207
-#define TK_VALUES 208
-
+#define TK_DISTINCT 112
+#define TK_FROM 113
+#define TK_VARIABLE 114
+#define TK_INTERVAL 115
+#define TK_FILL 116
+#define TK_SLIDING 117
+#define TK_ORDER 118
+#define TK_BY 119
+#define TK_ASC 120
+#define TK_DESC 121
+#define TK_GROUP 122
+#define TK_HAVING 123
+#define TK_LIMIT 124
+#define TK_OFFSET 125
+#define TK_SLIMIT 126
+#define TK_SOFFSET 127
+#define TK_WHERE 128
+#define TK_NOW 129
+#define TK_RESET 130
+#define TK_QUERY 131
+#define TK_ADD 132
+#define TK_COLUMN 133
+#define TK_TAG 134
+#define TK_CHANGE 135
+#define TK_SET 136
+#define TK_KILL 137
+#define TK_CONNECTION 138
+#define TK_STREAM 139
+#define TK_COLON 140
+#define TK_ABORT 141
+#define TK_AFTER 142
+#define TK_ATTACH 143
+#define TK_BEFORE 144
+#define TK_BEGIN 145
+#define TK_CASCADE 146
+#define TK_CLUSTER 147
+#define TK_CONFLICT 148
+#define TK_COPY 149
+#define TK_DEFERRED 150
+#define TK_DELIMITERS 151
+#define TK_DETACH 152
+#define TK_EACH 153
+#define TK_END 154
+#define TK_EXPLAIN 155
+#define TK_FAIL 156
+#define TK_FOR 157
+#define TK_IGNORE 158
+#define TK_IMMEDIATE 159
+#define TK_INITIALLY 160
+#define TK_INSTEAD 161
+#define TK_MATCH 162
+#define TK_KEY 163
+#define TK_OF 164
+#define TK_RAISE 165
+#define TK_REPLACE 166
+#define TK_RESTRICT 167
+#define TK_ROW 168
+#define TK_STATEMENT 169
+#define TK_TRIGGER 170
+#define TK_VIEW 171
+#define TK_COUNT 172
+#define TK_SUM 173
+#define TK_AVG 174
+#define TK_MIN 175
+#define TK_MAX 176
+#define TK_FIRST 177
+#define TK_LAST 178
+#define TK_TOP 179
+#define TK_BOTTOM 180
+#define TK_STDDEV 181
+#define TK_PERCENTILE 182
+#define TK_APERCENTILE 183
+#define TK_LEASTSQUARES 184
+#define TK_HISTOGRAM 185
+#define TK_DIFF 186
+#define TK_SPREAD 187
+#define TK_TWA 188
+#define TK_INTERP 189
+#define TK_LAST_ROW 190
+#define TK_RATE 191
+#define TK_IRATE 192
+#define TK_SUM_RATE 193
+#define TK_SUM_IRATE 194
+#define TK_AVG_RATE 195
+#define TK_AVG_IRATE 196
+#define TK_TBID 197
+#define TK_SEMI 198
+#define TK_NONE 199
+#define TK_PREV 200
+#define TK_LINEAR 201
+#define TK_IMPORT 202
+#define TK_METRIC 203
+#define TK_TBNAME 204
+#define TK_JOIN 205
+#define TK_METRICS 206
+#define TK_INSERT 207
+#define TK_INTO 208
+#define TK_VALUES 209
#define TK_SPACE 300
diff --git a/src/inc/ttype.h b/src/inc/ttype.h
index 686c986f5b..05622a16be 100644
--- a/src/inc/ttype.h
+++ b/src/inc/ttype.h
@@ -45,6 +45,7 @@ typedef struct tstr {
case TSDB_DATA_TYPE_USMALLINT: \
(_v) = (_finalType)GET_UINT16_VAL(_data); \
break; \
+ case TSDB_DATA_TYPE_TIMESTAMP:\
case TSDB_DATA_TYPE_BIGINT: \
(_v) = (_finalType)(GET_INT64_VAL(_data)); \
break; \
@@ -66,6 +67,43 @@ typedef struct tstr {
} \
} while (0)
+#define SET_TYPED_DATA(_v, _type, _data) \
+ do { \
+ switch (_type) { \
+ case TSDB_DATA_TYPE_BOOL: \
+ case TSDB_DATA_TYPE_TINYINT: \
+ *(int8_t *)(_v) = (int8_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_UTINYINT: \
+ *(uint8_t *)(_v) = (uint8_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_SMALLINT: \
+ *(int16_t *)(_v) = (int16_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_USMALLINT: \
+ *(uint16_t *)(_v) = (uint16_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_BIGINT: \
+ *(int64_t *)(_v) = (int64_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_UBIGINT: \
+ *(uint64_t *)(_v) = (uint64_t)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_FLOAT: \
+ *(float *)(_v) = (float)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_DOUBLE: \
+ *(double *)(_v) = (double)(_data); \
+ break; \
+ case TSDB_DATA_TYPE_UINT: \
+ *(uint32_t *)(_v) = (uint32_t)(_data); \
+ break; \
+ default: \
+ *(int32_t *)(_v) = (int32_t)(_data); \
+ break; \
+ } \
+ } while (0)
+
#define IS_SIGNED_NUMERIC_TYPE(_t) ((_t) >= TSDB_DATA_TYPE_TINYINT && (_t) <= TSDB_DATA_TYPE_BIGINT)
#define IS_UNSIGNED_NUMERIC_TYPE(_t) ((_t) >= TSDB_DATA_TYPE_UTINYINT && (_t) <= TSDB_DATA_TYPE_UBIGINT)
#define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE)
diff --git a/src/kit/shell/src/shellMain.c b/src/kit/shell/src/shellMain.c
index 041ad71ccb..49de42796c 100644
--- a/src/kit/shell/src/shellMain.c
+++ b/src/kit/shell/src/shellMain.c
@@ -21,7 +21,7 @@
pthread_t pid;
static tsem_t cancelSem;
-void shellQueryInterruptHandler(int signum) {
+void shellQueryInterruptHandler(int32_t signum, void *sigInfo, void *context) {
tsem_post(&cancelSem);
}
@@ -130,12 +130,10 @@ int main(int argc, char* argv[]) {
pthread_create(&spid, NULL, cancelHandler, NULL);
/* Interrupt handler. */
- struct sigaction act;
- memset(&act, 0, sizeof(struct sigaction));
-
- act.sa_handler = shellQueryInterruptHandler;
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGINT, &act, NULL);
+ taosSetSignal(SIGTERM, shellQueryInterruptHandler);
+ taosSetSignal(SIGINT, shellQueryInterruptHandler);
+ taosSetSignal(SIGHUP, shellQueryInterruptHandler);
+ taosSetSignal(SIGABRT, shellQueryInterruptHandler);
/* Get grant information */
shellGetGrantInfo(con);
diff --git a/src/mnode/CMakeLists.txt b/src/mnode/CMakeLists.txt
index ae4a37320c..fffc82c6ef 100644
--- a/src/mnode/CMakeLists.txt
+++ b/src/mnode/CMakeLists.txt
@@ -1,23 +1,10 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
PROJECT(TDengine)
-IF (TD_LINUX)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
+INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
+INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
- INCLUDE_DIRECTORIES(inc)
- AUX_SOURCE_DIRECTORY(src SRC)
-
- ADD_LIBRARY(mnode ${SRC})
-ENDIF ()
-
-IF (TD_DARWIN)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
-
- INCLUDE_DIRECTORIES(inc)
- AUX_SOURCE_DIRECTORY(src SRC)
-
- ADD_LIBRARY(mnode ${SRC})
-ENDIF ()
+INCLUDE_DIRECTORIES(inc)
+AUX_SOURCE_DIRECTORY(src SRC)
+ADD_LIBRARY(mnode ${SRC})
diff --git a/src/mnode/src/mnodeAcct.c b/src/mnode/src/mnodeAcct.c
index 6fba05674f..afe474df6b 100644
--- a/src/mnode/src/mnodeAcct.c
+++ b/src/mnode/src/mnodeAcct.c
@@ -81,7 +81,7 @@ static int32_t mnodeAcctActionDecode(SSdbRow *pRow) {
}
static int32_t mnodeAcctActionRestored() {
- int32_t numOfRows = sdbGetNumOfRows(tsAcctSdb);
+ int64_t numOfRows = sdbGetNumOfRows(tsAcctSdb);
if (numOfRows <= 0 && dnodeIsFirstDeploy()) {
mInfo("dnode first deploy, create root acct");
int32_t code = mnodeCreateRootAcct();
@@ -97,14 +97,14 @@ static int32_t mnodeAcctActionRestored() {
int32_t mnodeInitAccts() {
SAcctObj tObj;
- tsAcctUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsAcctUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_ACCOUNT,
.name = "accounts",
.hashSessions = TSDB_DEFAULT_ACCOUNTS_HASH_SIZE,
.maxRowSize = tsAcctUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_STRING,
.fpInsert = mnodeAcctActionInsert,
.fpDelete = mnodeAcctActionDelete,
@@ -206,7 +206,7 @@ void mnodeDropUserFromAcct(SAcctObj *pAcct, SUserObj *pUser) {
}
static int32_t mnodeCreateRootAcct() {
- int32_t numOfAccts = sdbGetNumOfRows(tsAcctSdb);
+ int64_t numOfAccts = sdbGetNumOfRows(tsAcctSdb);
if (numOfAccts != 0) return TSDB_CODE_SUCCESS;
SAcctObj *pAcct = malloc(sizeof(SAcctObj));
diff --git a/src/mnode/src/mnodeCluster.c b/src/mnode/src/mnodeCluster.c
index 5dee0e1c26..94ec59b1b0 100644
--- a/src/mnode/src/mnodeCluster.c
+++ b/src/mnode/src/mnodeCluster.c
@@ -68,7 +68,7 @@ static int32_t mnodeClusterActionDecode(SSdbRow *pRow) {
}
static int32_t mnodeClusterActionRestored() {
- int32_t numOfRows = sdbGetNumOfRows(tsClusterSdb);
+ int64_t numOfRows = sdbGetNumOfRows(tsClusterSdb);
if (numOfRows <= 0 && dnodeIsFirstDeploy()) {
mInfo("dnode first deploy, create cluster");
int32_t code = mnodeCreateCluster();
@@ -84,14 +84,14 @@ static int32_t mnodeClusterActionRestored() {
int32_t mnodeInitCluster() {
SClusterObj tObj;
- tsClusterUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsClusterUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_CLUSTER,
.name = "cluster",
.hashSessions = TSDB_DEFAULT_CLUSTER_HASH_SIZE,
.maxRowSize = tsClusterUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_STRING,
.fpInsert = mnodeClusterActionInsert,
.fpDelete = mnodeClusterActionDelete,
@@ -147,7 +147,7 @@ bool taosGetSystemUid(char *uid) {
#endif // __APPLE__
static int32_t mnodeCreateCluster() {
- int32_t numOfClusters = sdbGetNumOfRows(tsClusterSdb);
+ int64_t numOfClusters = sdbGetNumOfRows(tsClusterSdb);
if (numOfClusters != 0) return TSDB_CODE_SUCCESS;
SClusterObj *pCluster = malloc(sizeof(SClusterObj));
@@ -234,7 +234,7 @@ static int32_t mnodeRetrieveClusters(SShowObj *pShow, char *data, int32_t rows,
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- *(int32_t *) pWrite = pCluster->createdTime;
+ *(int64_t *) pWrite = pCluster->createdTime;
cols++;
mnodeDecClusterRef(pCluster);
diff --git a/src/mnode/src/mnodeDb.c b/src/mnode/src/mnodeDb.c
index d9ed22a567..a853342ab3 100644
--- a/src/mnode/src/mnodeDb.c
+++ b/src/mnode/src/mnodeDb.c
@@ -143,14 +143,14 @@ static int32_t mnodeDbActionRestored() {
int32_t mnodeInitDbs() {
SDbObj tObj;
- tsDbUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsDbUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_DB,
.name = "dbs",
.hashSessions = TSDB_DEFAULT_DBS_HASH_SIZE,
.maxRowSize = tsDbUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_STRING,
.fpInsert = mnodeDbActionInsert,
.fpDelete = mnodeDbActionDelete,
@@ -192,11 +192,11 @@ SDbObj *mnodeGetDb(char *db) {
}
void mnodeIncDbRef(SDbObj *pDb) {
- return sdbIncRef(tsDbSdb, pDb);
+ sdbIncRef(tsDbSdb, pDb);
}
void mnodeDecDbRef(SDbObj *pDb) {
- return sdbDecRef(tsDbSdb, pDb);
+ sdbDecRef(tsDbSdb, pDb);
}
SDbObj *mnodeGetDbByTableName(char *tableName) {
diff --git a/src/mnode/src/mnodeDnode.c b/src/mnode/src/mnodeDnode.c
index 792e41dd5b..d76ecd9ba0 100644
--- a/src/mnode/src/mnodeDnode.c
+++ b/src/mnode/src/mnodeDnode.c
@@ -39,7 +39,7 @@
#include "mnodeCluster.h"
int32_t tsAccessSquence = 0;
-int64_t tsDnodeRid = -1;
+int64_t tsDnodeRid = -1;
static void * tsDnodeSdb = NULL;
static int32_t tsDnodeUpdateSize = 0;
extern void * tsMnodeSdb;
@@ -148,7 +148,7 @@ static int32_t mnodeDnodeActionDecode(SSdbRow *pRow) {
}
static int32_t mnodeDnodeActionRestored() {
- int32_t numOfRows = sdbGetNumOfRows(tsDnodeSdb);
+ int64_t numOfRows = sdbGetNumOfRows(tsDnodeSdb);
if (numOfRows <= 0 && dnodeIsFirstDeploy()) {
mInfo("dnode first deploy, create dnode:%s", tsLocalEp);
mnodeCreateDnode(tsLocalEp, NULL);
@@ -165,7 +165,7 @@ static int32_t mnodeDnodeActionRestored() {
int32_t mnodeInitDnodes() {
SDnodeObj tObj;
- tsDnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsDnodeUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
pthread_mutex_init(&tsDnodeEpsMutex, NULL);
SSdbTableDesc desc = {
@@ -173,7 +173,7 @@ int32_t mnodeInitDnodes() {
.name = "dnodes",
.hashSessions = TSDB_DEFAULT_DNODES_HASH_SIZE,
.maxRowSize = tsDnodeUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_AUTO,
.fpInsert = mnodeDnodeActionInsert,
.fpDelete = mnodeDnodeActionDelete,
@@ -227,7 +227,7 @@ void mnodeCancelGetNextDnode(void *pIter) {
}
int32_t mnodeGetDnodesNum() {
- return sdbGetNumOfRows(tsDnodeSdb);
+ return (int32_t)sdbGetNumOfRows(tsDnodeSdb);
}
int32_t mnodeGetOnlinDnodesCpuCoreNum() {
@@ -407,7 +407,7 @@ static int32_t mnodeCheckClusterCfgPara(const SClusterCfg *clusterCfg) {
int64_t checkTime = 0;
char timestr[32] = "1970-01-01 00:00:00.00";
- (void)taosParseTime(timestr, &checkTime, strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
+ (void)taosParseTime(timestr, &checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
if ((0 != strncasecmp(clusterCfg->timezone, tsTimezone, strlen(tsTimezone))) &&
(checkTime != clusterCfg->checkTime)) {
mError("\"timezone\"[%s - %s] [%" PRId64 " - %" PRId64 "] cfg parameters inconsistent", clusterCfg->timezone,
@@ -638,9 +638,9 @@ static int32_t mnodeCreateDnode(char *ep, SMnodeMsg *pMsg) {
char *temp = strchr(dnodeEp, ':');
if (!temp) {
- int len = strlen(dnodeEp);
+ int32_t len = (int32_t)strlen(dnodeEp);
if (dnodeEp[len - 1] == ';') dnodeEp[len - 1] = 0;
- len = strlen(dnodeEp);
+ len = (int32_t)strlen(dnodeEp);
snprintf(dnodeEp + len, TSDB_EP_LEN - len, ":%d", tsServerPort);
}
ep = dnodeEp;
diff --git a/src/mnode/src/mnodeMnode.c b/src/mnode/src/mnodeMnode.c
index 3ea41c41c6..49473d3e06 100644
--- a/src/mnode/src/mnodeMnode.c
+++ b/src/mnode/src/mnodeMnode.c
@@ -136,14 +136,14 @@ int32_t mnodeInitMnodes() {
mnodeMnodeInitLock();
SMnodeObj tObj;
- tsMnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsMnodeUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_MNODE,
.name = "mnodes",
.hashSessions = TSDB_DEFAULT_MNODES_HASH_SIZE,
.maxRowSize = tsMnodeUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_INT,
.fpInsert = mnodeMnodeActionInsert,
.fpDelete = mnodeMnodeActionDelete,
@@ -176,7 +176,7 @@ void mnodeCleanupMnodes() {
}
int32_t mnodeGetMnodesNum() {
- return sdbGetNumOfRows(tsMnodeSdb);
+ return (int32_t)sdbGetNumOfRows(tsMnodeSdb);
}
void *mnodeGetMnode(int32_t mnodeId) {
diff --git a/src/mnode/src/mnodeSdb.c b/src/mnode/src/mnodeSdb.c
index ae495108b3..17cfd3e9d4 100644
--- a/src/mnode/src/mnodeSdb.c
+++ b/src/mnode/src/mnodeSdb.c
@@ -207,7 +207,7 @@ static void sdbRestoreTables() {
(*pTable->fpRestored)();
}
- totalRows += pTable->numOfRows;
+ totalRows += (int32_t)pTable->numOfRows;
numOfTables++;
sdbInfo("vgId:1, sdb:%s is checked, rows:%" PRId64, pTable->name, pTable->numOfRows);
}
@@ -475,7 +475,7 @@ void sdbIncRef(void *tparam, void *pRow) {
if (pRow == NULL || tparam == NULL) return;
SSdbTable *pTable = tparam;
- int32_t * pRefCount = (int32_t *)(pRow + pTable->refCountPos);
+ int32_t * pRefCount = (int32_t *)((char *)pRow + pTable->refCountPos);
int32_t refCount = atomic_add_fetch_32(pRefCount, 1);
sdbTrace("vgId:1, sdb:%s, inc ref to row:%p:%s:%d", pTable->name, pRow, sdbGetRowStr(pTable, pRow), refCount);
}
@@ -484,11 +484,11 @@ void sdbDecRef(void *tparam, void *pRow) {
if (pRow == NULL || tparam == NULL) return;
SSdbTable *pTable = tparam;
- int32_t * pRefCount = (int32_t *)(pRow + pTable->refCountPos);
+ int32_t * pRefCount = (int32_t *)((char *)pRow + pTable->refCountPos);
int32_t refCount = atomic_sub_fetch_32(pRefCount, 1);
sdbTrace("vgId:1, sdb:%s, dec ref to row:%p:%s:%d", pTable->name, pRow, sdbGetRowStr(pTable, pRow), refCount);
- int32_t *updateEnd = pRow + pTable->refCountPos - 4;
+ int32_t *updateEnd = (int32_t *)((char *)pRow + pTable->refCountPos - 4);
if (refCount <= 0 && *updateEnd) {
sdbTrace("vgId:1, sdb:%s, row:%p:%s:%d destroyed", pTable->name, pRow, sdbGetRowStr(pTable, pRow), refCount);
SSdbRow row = {.pObj = pRow};
@@ -501,7 +501,7 @@ static void *sdbGetRowMeta(SSdbTable *pTable, void *key) {
int32_t keySize = sizeof(int32_t);
if (pTable->keyType == SDB_KEY_STRING || pTable->keyType == SDB_KEY_VAR_STRING) {
- keySize = strlen((char *)key);
+ keySize = (int32_t)strlen((char *)key);
}
void **ppRow = (void **)taosHashGet(pTable->iHandle, key, keySize);
@@ -534,7 +534,7 @@ static int32_t sdbInsertHash(SSdbTable *pTable, SSdbRow *pRow) {
int32_t keySize = sizeof(int32_t);
if (pTable->keyType == SDB_KEY_STRING || pTable->keyType == SDB_KEY_VAR_STRING) {
- keySize = strlen((char *)key);
+ keySize = (int32_t)strlen((char *)key);
}
pthread_mutex_lock(&pTable->mutex);
@@ -564,7 +564,7 @@ static int32_t sdbInsertHash(SSdbTable *pTable, SSdbRow *pRow) {
}
static int32_t sdbDeleteHash(SSdbTable *pTable, SSdbRow *pRow) {
- int32_t *updateEnd = pRow->pObj + pTable->refCountPos - 4;
+ int32_t *updateEnd = (int32_t *)((char*)pRow->pObj + pTable->refCountPos - 4);
bool set = atomic_val_compare_exchange_32(updateEnd, 0, 1) == 0;
if (!set) {
sdbError("vgId:1, sdb:%s, failed to delete key:%s from hash, for it already removed", pTable->name,
@@ -577,7 +577,7 @@ static int32_t sdbDeleteHash(SSdbTable *pTable, SSdbRow *pRow) {
void * key = sdbGetObjKey(pTable, pRow->pObj);
int32_t keySize = sizeof(int32_t);
if (pTable->keyType == SDB_KEY_STRING || pTable->keyType == SDB_KEY_VAR_STRING) {
- keySize = strlen((char *)key);
+ keySize = (int32_t)strlen((char *)key);
}
pthread_mutex_lock(&pTable->mutex);
@@ -764,7 +764,7 @@ bool sdbCheckRowDeleted(void *tparam, void *pRow) {
SSdbTable *pTable = tparam;
if (pTable == NULL) return false;
- int32_t *updateEnd = pRow + pTable->refCountPos - 4;
+ int32_t *updateEnd = (int32_t *)((char*)pRow + pTable->refCountPos - 4);
return atomic_val_compare_exchange_32(updateEnd, 1, 1) == 1;
}
@@ -942,14 +942,14 @@ static int32_t sdbInitWorker() {
static void sdbCleanupWorker() {
for (int32_t i = 0; i < tsSdbPool.num; ++i) {
SSdbWorker *pWorker = tsSdbPool.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsSdbWQset);
}
}
for (int32_t i = 0; i < tsSdbPool.num; ++i) {
SSdbWorker *pWorker = tsSdbPool.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
}
diff --git a/src/mnode/src/mnodeShow.c b/src/mnode/src/mnodeShow.c
index 6b9f0e26a7..0377df97fd 100644
--- a/src/mnode/src/mnodeShow.c
+++ b/src/mnode/src/mnodeShow.c
@@ -218,7 +218,7 @@ static int32_t mnodeProcessRetrieveMsg(SMnodeMsg *pMsg) {
}
pRsp->numOfRows = htonl(rowsRead);
- pRsp->precision = htonl(TSDB_TIME_PRECISION_MILLI); // millisecond time precision
+ pRsp->precision = (int16_t)htonl(TSDB_TIME_PRECISION_MILLI); // millisecond time precision
pMsg->rpcRsp.rsp = pRsp;
pMsg->rpcRsp.len = size;
diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c
index 4229a4ce6e..8928bf0aac 100644
--- a/src/mnode/src/mnodeTable.c
+++ b/src/mnode/src/mnodeTable.c
@@ -222,23 +222,23 @@ static int32_t mnodeChildTableActionEncode(SSdbRow *pRow) {
SCTableObj *pTable = pRow->pObj;
assert(pTable != NULL && pRow->rowData != NULL);
- int32_t len = strlen(pTable->info.tableId);
+ int32_t len = (int32_t)strlen(pTable->info.tableId);
if (len >= TSDB_TABLE_FNAME_LEN) return TSDB_CODE_MND_INVALID_TABLE_ID;
memcpy(pRow->rowData, pTable->info.tableId, len);
- memset(pRow->rowData + len, 0, 1);
+ memset((char *)pRow->rowData + len, 0, 1);
len++;
- memcpy(pRow->rowData + len, (char*)pTable + sizeof(char *), tsChildTableUpdateSize);
+ memcpy((char *)pRow->rowData + len, (char *)pTable + sizeof(char *), tsChildTableUpdateSize);
len += tsChildTableUpdateSize;
if (pTable->info.type != TSDB_CHILD_TABLE) {
int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema);
- memcpy(pRow->rowData + len, pTable->schema, schemaSize);
+ memcpy((char *)pRow->rowData + len, pTable->schema, schemaSize);
len += schemaSize;
if (pTable->sqlLen != 0) {
- memcpy(pRow->rowData + len, pTable->sql, pTable->sqlLen);
+ memcpy((char *)pRow->rowData + len, pTable->sql, pTable->sqlLen);
len += pTable->sqlLen;
}
}
@@ -253,7 +253,7 @@ static int32_t mnodeChildTableActionDecode(SSdbRow *pRow) {
SCTableObj *pTable = calloc(1, sizeof(SCTableObj));
if (pTable == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
- int32_t len = strlen(pRow->rowData);
+ int32_t len = (int32_t)strlen(pRow->rowData);
if (len >= TSDB_TABLE_FNAME_LEN) {
free(pTable);
return TSDB_CODE_MND_INVALID_TABLE_ID;
@@ -261,7 +261,7 @@ static int32_t mnodeChildTableActionDecode(SSdbRow *pRow) {
pTable->info.tableId = strdup(pRow->rowData);
len++;
- memcpy((char*)pTable + sizeof(char *), pRow->rowData + len, tsChildTableUpdateSize);
+ memcpy((char *)pTable + sizeof(char *), (char *)pRow->rowData + len, tsChildTableUpdateSize);
len += tsChildTableUpdateSize;
if (pTable->info.type != TSDB_CHILD_TABLE) {
@@ -271,7 +271,7 @@ static int32_t mnodeChildTableActionDecode(SSdbRow *pRow) {
mnodeDestroyChildTable(pTable);
return TSDB_CODE_MND_INVALID_TABLE_TYPE;
}
- memcpy(pTable->schema, pRow->rowData + len, schemaSize);
+ memcpy(pTable->schema, (char *)pRow->rowData + len, schemaSize);
len += schemaSize;
if (pTable->sqlLen != 0) {
@@ -280,7 +280,7 @@ static int32_t mnodeChildTableActionDecode(SSdbRow *pRow) {
mnodeDestroyChildTable(pTable);
return TSDB_CODE_MND_OUT_OF_MEMORY;
}
- memcpy(pTable->sql, pRow->rowData + len, pTable->sqlLen);
+ memcpy(pTable->sql, (char *)pRow->rowData + len, pTable->sqlLen);
}
}
@@ -352,14 +352,14 @@ static int32_t mnodeChildTableActionRestored() {
static int32_t mnodeInitChildTables() {
SCTableObj tObj;
- tsChildTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj.info.type;
+ tsChildTableUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj.info.type);
SSdbTableDesc desc = {
.id = SDB_TABLE_CTABLE,
.name = "ctables",
.hashSessions = TSDB_DEFAULT_CTABLES_HASH_SIZE,
.maxRowSize = sizeof(SCTableObj) + sizeof(SSchema) * (TSDB_MAX_TAGS + TSDB_MAX_COLUMNS + 16) + TSDB_TABLE_FNAME_LEN + TSDB_CQ_SQL_SIZE,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_VAR_STRING,
.fpInsert = mnodeChildTableActionInsert,
.fpDelete = mnodeChildTableActionDelete,
@@ -501,18 +501,18 @@ static int32_t mnodeSuperTableActionEncode(SSdbRow *pRow) {
SSTableObj *pStable = pRow->pObj;
assert(pRow->pObj != NULL && pRow->rowData != NULL);
- int32_t len = strlen(pStable->info.tableId);
+ int32_t len = (int32_t)strlen(pStable->info.tableId);
if (len >= TSDB_TABLE_FNAME_LEN) len = TSDB_CODE_MND_INVALID_TABLE_ID;
memcpy(pRow->rowData, pStable->info.tableId, len);
- memset(pRow->rowData + len, 0, 1);
+ memset((char *)pRow->rowData + len, 0, 1);
len++;
- memcpy(pRow->rowData + len, (char*)pStable + sizeof(char *), tsSuperTableUpdateSize);
+ memcpy((char *)pRow->rowData + len, (char *)pStable + sizeof(char *), tsSuperTableUpdateSize);
len += tsSuperTableUpdateSize;
int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags);
- memcpy(pRow->rowData + len, pStable->schema, schemaSize);
+ memcpy((char *)pRow->rowData + len, pStable->schema, schemaSize);
len += schemaSize;
pRow->rowSize = len;
@@ -525,7 +525,7 @@ static int32_t mnodeSuperTableActionDecode(SSdbRow *pRow) {
SSTableObj *pStable = (SSTableObj *) calloc(1, sizeof(SSTableObj));
if (pStable == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
- int32_t len = strlen(pRow->rowData);
+ int32_t len = (int32_t)strlen(pRow->rowData);
if (len >= TSDB_TABLE_FNAME_LEN){
free(pStable);
return TSDB_CODE_MND_INVALID_TABLE_ID;
@@ -533,7 +533,7 @@ static int32_t mnodeSuperTableActionDecode(SSdbRow *pRow) {
pStable->info.tableId = strdup(pRow->rowData);
len++;
- memcpy((char*)pStable + sizeof(char *), pRow->rowData + len, tsSuperTableUpdateSize);
+ memcpy((char *)pStable + sizeof(char *), (char *)pRow->rowData + len, tsSuperTableUpdateSize);
len += tsSuperTableUpdateSize;
int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags);
@@ -543,8 +543,7 @@ static int32_t mnodeSuperTableActionDecode(SSdbRow *pRow) {
return TSDB_CODE_MND_NOT_SUPER_TABLE;
}
- memcpy(pStable->schema, pRow->rowData + len, schemaSize);
-
+ memcpy(pStable->schema, (char *)pRow->rowData + len, schemaSize);
pRow->pObj = pStable;
return TSDB_CODE_SUCCESS;
@@ -556,14 +555,14 @@ static int32_t mnodeSuperTableActionRestored() {
static int32_t mnodeInitSuperTables() {
SSTableObj tObj;
- tsSuperTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj.info.type;
+ tsSuperTableUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj.info.type);
SSdbTableDesc desc = {
.id = SDB_TABLE_STABLE,
.name = "stables",
.hashSessions = TSDB_DEFAULT_STABLES_HASH_SIZE,
.maxRowSize = sizeof(SSTableObj) + sizeof(SSchema) * (TSDB_MAX_TAGS + TSDB_MAX_COLUMNS + 16) + TSDB_TABLE_FNAME_LEN,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_VAR_STRING,
.fpInsert = mnodeSuperTableActionInsert,
.fpDelete = mnodeSuperTableActionDelete,
@@ -844,6 +843,7 @@ static int32_t mnodeProcessBatchCreateTableMsg(SMnodeMsg *pMsg) {
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
} else { // batch master replay, reprocess the whole batch
assert(0);
+ return TSDB_CODE_MND_MSG_NOT_PROCESSED;
}
}
}
@@ -1257,7 +1257,7 @@ static int32_t mnodeModifySuperTableTagName(SMnodeMsg *pMsg, char *oldTagName, c
}
// int32_t rowSize = 0;
- uint32_t len = strlen(newTagName);
+ uint32_t len = (int32_t)strlen(newTagName);
if (len >= TSDB_COL_NAME_LEN) {
return TSDB_CODE_MND_COL_NAME_TOO_LONG;
}
@@ -1420,7 +1420,7 @@ static int32_t mnodeChangeSuperTableColumn(SMnodeMsg *pMsg, char *oldName, char
}
// int32_t rowSize = 0;
- uint32_t len = strlen(newName);
+ uint32_t len = (uint32_t)strlen(newName);
if (len >= TSDB_COL_NAME_LEN) {
return TSDB_CODE_MND_COL_NAME_TOO_LONG;
}
@@ -1525,7 +1525,7 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows,
tstrncpy(prefix, pDb->name, 64);
strcat(prefix, TS_PATH_DELIMITER);
- prefixLen = strlen(prefix);
+ prefixLen = (int32_t)strlen(prefix);
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
char stableName[TSDB_TABLE_NAME_LEN] = {0};
@@ -1550,7 +1550,7 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows,
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
- int16_t len = strnlen(stableName, TSDB_TABLE_NAME_LEN - 1);
+ int16_t len = (int16_t)strnlen(stableName, TSDB_TABLE_NAME_LEN - 1);
*(int16_t*) pWrite = len;
pWrite += sizeof(int16_t); // todo refactor
@@ -1593,7 +1593,7 @@ void mnodeDropAllSuperTables(SDbObj *pDropDb) {
char prefix[64] = {0};
tstrncpy(prefix, pDropDb->name, 64);
strcat(prefix, TS_PATH_DELIMITER);
- int32_t prefixLen = strlen(prefix);
+ int32_t prefixLen = (int32_t)strlen(prefix);
mInfo("db:%s, all super tables will be dropped from sdb", pDropDb->name);
@@ -1746,9 +1746,9 @@ static int32_t mnodeProcessSuperTableVgroupMsg(SMnodeMsg *pMsg) {
rpcFreeCont(pRsp);
return TSDB_CODE_MND_INVALID_TABLE_NAME;
} else {
- pRsp->numOfTables = htonl(pRsp->numOfTables);
+ pRsp->numOfTables = (int32_t)htonl(pRsp->numOfTables);
pMsg->rpcRsp.rsp = pRsp;
- pMsg->rpcRsp.len = msg - (char *)pRsp;
+ pMsg->rpcRsp.len = (int32_t)((char *)msg - (char *)pRsp);
return TSDB_CODE_SUCCESS;
}
@@ -2021,7 +2021,7 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) {
static int32_t mnodeProcessCreateChildTableMsg(SMnodeMsg *pMsg) {
//SCMCreateTableMsg* p1 = pMsg->rpcMsg.pCont; // there are several tables here.
- SCreateTableMsg* pCreate = (SCreateTableMsg*)(pMsg->rpcMsg.pCont + sizeof(SCMCreateTableMsg));
+ SCreateTableMsg* pCreate = (SCreateTableMsg*)((char *)pMsg->rpcMsg.pCont + sizeof(SCMCreateTableMsg));
int32_t code = grantCheck(TSDB_GRANT_TIMESERIES);
if (code != TSDB_CODE_SUCCESS) {
@@ -2278,7 +2278,7 @@ static int32_t mnodeChangeNormalTableColumn(SMnodeMsg *pMsg, char *oldName, char
}
// int32_t rowSize = 0;
- uint32_t len = strlen(newName);
+ uint32_t len = (uint32_t)strlen(newName);
if (len >= TSDB_COL_NAME_LEN) {
return TSDB_CODE_MND_COL_NAME_TOO_LONG;
}
@@ -2481,7 +2481,7 @@ void mnodeDropAllChildTables(SDbObj *pDropDb) {
char prefix[64] = {0};
tstrncpy(prefix, pDropDb->name, 64);
strcat(prefix, TS_PATH_DELIMITER);
- int32_t prefixLen = strlen(prefix);
+ int32_t prefixLen = (int32_t)strlen(prefix);
mInfo("db:%s, all child tables will be dropped from sdb", pDropDb->name);
@@ -2897,7 +2897,7 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
char prefix[64] = {0};
- int32_t prefixLen = tableIdPrefix(pDb->name, prefix, 64);
+ int32_t prefixLen = (int32_t)tableIdPrefix(pDb->name, prefix, 64);
char* pattern = NULL;
if (pShow->payloadLen > 0) {
@@ -3133,7 +3133,7 @@ static int32_t mnodeRetrieveStreamTables(SShowObj *pShow, char *data, int32_t ro
char prefix[64] = {0};
tstrncpy(prefix, pDb->name, 64);
strcat(prefix, TS_PATH_DELIMITER);
- int32_t prefixLen = strlen(prefix);
+ int32_t prefixLen = (int32_t)strlen(prefix);
while (numOfRows < rows) {
pShow->pIter = mnodeGetNextChildTable(pShow->pIter, &pTable);
diff --git a/src/mnode/src/mnodeUser.c b/src/mnode/src/mnodeUser.c
index fbee8a42b8..d12e49e3ce 100644
--- a/src/mnode/src/mnodeUser.c
+++ b/src/mnode/src/mnodeUser.c
@@ -128,7 +128,7 @@ static void mnodePrintUserAuth() {
}
static int32_t mnodeUserActionRestored() {
- int32_t numOfRows = sdbGetNumOfRows(tsUserSdb);
+ int64_t numOfRows = sdbGetNumOfRows(tsUserSdb);
if (numOfRows <= 0 && dnodeIsFirstDeploy()) {
mInfo("dnode first deploy, create root user");
SAcctObj *pAcct = mnodeGetAcct(TSDB_DEFAULT_USER);
@@ -148,14 +148,14 @@ static int32_t mnodeUserActionRestored() {
int32_t mnodeInitUsers() {
SUserObj tObj;
- tsUserUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsUserUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_USER,
.name = "users",
.hashSessions = TSDB_DEFAULT_USERS_HASH_SIZE,
.maxRowSize = tsUserUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_STRING,
.fpInsert = mnodeUserActionInsert,
.fpDelete = mnodeUserActionDelete,
@@ -204,11 +204,11 @@ void mnodeCancelGetNextUser(void *pIter) {
}
void mnodeIncUserRef(SUserObj *pUser) {
- return sdbIncRef(tsUserSdb, pUser);
+ sdbIncRef(tsUserSdb, pUser);
}
void mnodeDecUserRef(SUserObj *pUser) {
- return sdbDecRef(tsUserSdb, pUser);
+ sdbDecRef(tsUserSdb, pUser);
}
static int32_t mnodeUpdateUser(SUserObj *pUser, void *pMsg) {
@@ -561,7 +561,7 @@ static int32_t mnodeProcessDropUserMsg(SMnodeMsg *pMsg) {
void mnodeDropAllUsers(SAcctObj *pAcct) {
void * pIter = NULL;
int32_t numOfUsers = 0;
- int32_t acctNameLen = strlen(pAcct->user);
+ int32_t acctNameLen = (int32_t)strlen(pAcct->user);
SUserObj *pUser = NULL;
while (1) {
diff --git a/src/mnode/src/mnodeVgroup.c b/src/mnode/src/mnodeVgroup.c
index 881ef95fca..09e367ed66 100644
--- a/src/mnode/src/mnodeVgroup.c
+++ b/src/mnode/src/mnodeVgroup.c
@@ -206,14 +206,14 @@ static int32_t mnodeVgroupActionRestored() {
int32_t mnodeInitVgroups() {
SVgObj tObj;
- tsVgUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
+ tsVgUpdateSize = (int32_t)((int8_t *)tObj.updateEnd - (int8_t *)&tObj);
SSdbTableDesc desc = {
.id = SDB_TABLE_VGROUP,
.name = "vgroups",
.hashSessions = TSDB_DEFAULT_VGROUPS_HASH_SIZE,
.maxRowSize = tsVgUpdateSize,
- .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
+ .refCountPos = (int32_t)((int8_t *)(&tObj.refCount) - (int8_t *)&tObj),
.keyType = SDB_KEY_AUTO,
.fpInsert = mnodeVgroupActionInsert,
.fpDelete = mnodeVgroupActionDelete,
@@ -245,11 +245,11 @@ int32_t mnodeInitVgroups() {
}
void mnodeIncVgroupRef(SVgObj *pVgroup) {
- return sdbIncRef(tsVgroupSdb, pVgroup);
+ sdbIncRef(tsVgroupSdb, pVgroup);
}
void mnodeDecVgroupRef(SVgObj *pVgroup) {
- return sdbDecRef(tsVgroupSdb, pVgroup);
+ sdbDecRef(tsVgroupSdb, pVgroup);
}
SVgObj *mnodeGetVgroup(int32_t vgId) {
diff --git a/src/os/inc/os.h b/src/os/inc/os.h
index 9383ae48dc..8312b74a50 100644
--- a/src/os/inc/os.h
+++ b/src/os/inc/os.h
@@ -62,6 +62,7 @@ extern "C" {
#include "osMemory.h"
#include "osRand.h"
#include "osSemphone.h"
+#include "osSignal.h"
#include "osSocket.h"
#include "osString.h"
#include "osSysinfo.h"
diff --git a/src/os/inc/osDarwin.h b/src/os/inc/osDarwin.h
index 0a77ed6895..13f93456f2 100644
--- a/src/os/inc/osDarwin.h
+++ b/src/os/inc/osDarwin.h
@@ -106,10 +106,11 @@ int64_t tsosStr2int64(char *str);
void taos_block_sigalrm(void);
-
-
-
-
+#define TAOS_OS_DEF_EPOLL
+ #define TAOS_EPOLL_WAIT_TIME 500
+ typedef int32_t SOCKET;
+ typedef SOCKET EpollFd;
+ #define EpollClose(pollFd) epoll_close(pollFd)
#ifdef __cplusplus
}
diff --git a/src/os/inc/osDef.h b/src/os/inc/osDef.h
index e15c45ad14..04cb8b6e74 100644
--- a/src/os/inc/osDef.h
+++ b/src/os/inc/osDef.h
@@ -20,6 +20,12 @@
extern "C" {
#endif
+#ifndef WINDOWS
+ #ifndef O_BINARY
+ #define O_BINARY 0
+ #endif
+#endif
+
#ifndef STDERR_FILENO
#define STDERR_FILENO (2)
#endif
@@ -94,8 +100,7 @@ extern "C" {
#elif defined(__GNUC__) && !defined(threadlocal)
#define threadlocal __thread
#else
- // #define threadlocal
- #error please follow with the thread-local implementation on the target platform
+ #define threadlocal __declspec( thread )
#endif
#ifdef __cplusplus
diff --git a/src/os/inc/osFile.h b/src/os/inc/osFile.h
index c9b3b9cd76..19cc78472c 100644
--- a/src/os/inc/osFile.h
+++ b/src/os/inc/osFile.h
@@ -20,6 +20,8 @@
extern "C" {
#endif
+#include "osSocket.h"
+
int64_t taosReadImp(int32_t fd, void *buf, int64_t count);
int64_t taosWriteImp(int32_t fd, void *buf, int64_t count);
int64_t taosLSeekImp(int32_t fd, int64_t offset, int32_t whence);
@@ -37,7 +39,7 @@ int32_t taosRenameFile(char *fullPath, char *suffix, char delimiter, char **dstP
}
// TAOS_OS_FUNC_FILE_SENDIFLE
-int64_t taosSendFile(int32_t dfd, int32_t sfd, int64_t *offset, int64_t size);
+int64_t taosSendFile(SOCKET dfd, int32_t sfd, int64_t *offset, int64_t size);
int64_t taosFSendFile(FILE *outfile, FILE *infile, int64_t *offset, int64_t size);
#ifdef TAOS_RANDOM_FILE_FAIL
diff --git a/src/os/inc/osSignal.h b/src/os/inc/osSignal.h
new file mode 100644
index 0000000000..c13cd83178
--- /dev/null
+++ b/src/os/inc/osSignal.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#ifndef TDENGINE_OS_SIGNAL_H
+#define TDENGINE_OS_SIGNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "os.h"
+#include "taosdef.h"
+#include
+
+#ifndef SIGALRM
+ #define SIGALRM 1234
+#endif
+
+#ifndef SIGHUP
+ #define SIGHUP 1230
+#endif
+
+#ifndef SIGCHLD
+ #define SIGCHLD 1234
+#endif
+
+#ifndef SIGUSR1
+ #define SIGUSR1 1234
+#endif
+
+#ifndef SIGUSR2
+ #define SIGUSR2 1234
+#endif
+
+#ifndef SIGBREAK
+ #define SIGBREAK 1234
+#endif
+
+typedef void (*FSignalHandler)(int32_t signum, void *sigInfo, void *context);
+void taosSetSignal(int32_t signum, FSignalHandler sigfp);
+void taosIgnSignal(int32_t signum);
+void taosDflSignal(int32_t signum);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // TDENGINE_TTIME_H
diff --git a/src/os/inc/osSocket.h b/src/os/inc/osSocket.h
index 13d3fa4079..111fca712c 100644
--- a/src/os/inc/osSocket.h
+++ b/src/os/inc/osSocket.h
@@ -33,11 +33,13 @@ extern "C" {
x = FD_INITIALIZER; \
} \
}
- typedef int32_t SOCKET;
#endif
#ifndef TAOS_OS_DEF_EPOLL
#define TAOS_EPOLL_WAIT_TIME 500
+ typedef int32_t SOCKET;
+ typedef SOCKET EpollFd;
+ #define EpollClose(pollFd) taosCloseSocket(pollFd)
#endif
#ifdef TAOS_RANDOM_NETWORK_FAIL
@@ -61,6 +63,7 @@ extern "C" {
int32_t taosSetNonblocking(SOCKET sock, int32_t on);
void taosIgnSIGPIPE();
void taosBlockSIGPIPE();
+void taosSetMaskSIGPIPE();
// TAOS_OS_FUNC_SOCKET_SETSOCKETOPT
int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t optlen);
diff --git a/src/os/inc/osWindows.h b/src/os/inc/osWindows.h
index 5a1e642572..1f3b1b02e3 100644
--- a/src/os/inc/osWindows.h
+++ b/src/os/inc/osWindows.h
@@ -93,6 +93,12 @@ typedef SOCKET eventfd_t;
#define TAOS_OS_DEF_EPOLL
#define TAOS_EPOLL_WAIT_TIME 100
+ typedef SOCKET EpollFd;
+ #define EpollClose(pollFd) epoll_close(pollFd)
+
+#ifndef EPOLLWAKEUP
+ #define EPOLLWAKEUP (1u << 29)
+#endif
#define TAOS_OS_DEF_ZU
#define PRIzu "ld"
@@ -191,13 +197,7 @@ int gettimeofday(struct timeval *ptv, void *pTimeZone);
#define PATH_MAX 256
#endif
-//for signal, not dispose
-#define SIGALRM 1234
-typedef int sigset_t;
-struct sigaction {
- void (*sa_handler)(int);
-};
-int sigaction(int, struct sigaction *, void *);
+#define TAOS_OS_FUNC_SIGNAL
typedef struct {
int we_wordc;
@@ -208,6 +208,12 @@ typedef struct {
int wordexp(const char *words, wordexp_t *pwordexp, int flags);
void wordfree(wordexp_t *pwordexp);
+#define openlog(a, b, c)
+#define closelog()
+#define LOG_ERR 0
+#define LOG_INFO 1
+void syslog(int unused, const char *format, ...);
+
#define TAOS_OS_FUNC_ATOMIC
#define atomic_load_8(ptr) (*(char volatile*)(ptr))
#define atomic_load_16(ptr) (*(short volatile*)(ptr))
diff --git a/src/os/src/darwin/darwinFile.c b/src/os/src/darwin/darwinFile.c
index dacf4db741..1e77cd68d8 100644
--- a/src/os/src/darwin/darwinFile.c
+++ b/src/os/src/darwin/darwinFile.c
@@ -51,7 +51,37 @@ int64_t taosFSendFile(FILE *out_file, FILE *in_file, int64_t *offset, int64_t co
return writeLen;
}
-int64_t taosSendFile(int32_t dfd, int32_t sfd, int64_t* offset, int64_t size) {
- uError("taosSendFile not implemented yet");
- return -1;
-}
\ No newline at end of file
+int64_t taosSendFile(SOCKET dfd, int32_t sfd, int64_t* offset, int64_t count) {
+ lseek(sfd, (int32_t)(*offset), 0);
+ int64_t writeLen = 0;
+ uint8_t buffer[_SEND_FILE_STEP_] = { 0 };
+
+ for (int64_t len = 0; len < (count - _SEND_FILE_STEP_); len += _SEND_FILE_STEP_) {
+ int32_t rlen = (int32_t)read(sfd, buffer, _SEND_FILE_STEP_);
+ if (rlen <= 0) {
+ return writeLen;
+ }
+ else if (rlen < _SEND_FILE_STEP_) {
+ taosWriteSocket(dfd, buffer, rlen);
+ return (int64_t)(writeLen + rlen);
+ }
+ else {
+ taosWriteSocket(dfd, buffer, _SEND_FILE_STEP_);
+ writeLen += _SEND_FILE_STEP_;
+ }
+ }
+
+ int64_t remain = count - writeLen;
+ if (remain > 0) {
+ int32_t rlen = read(sfd, buffer, (int32_t)remain);
+ if (rlen <= 0) {
+ return writeLen;
+ }
+ else {
+ taosWriteSocket(sfd, buffer, (int32_t)remain);
+ writeLen += remain;
+ }
+ }
+
+ return writeLen;
+}
diff --git a/src/os/src/darwin/darwinSysInfo.c b/src/os/src/darwin/darwinSysInfo.c
index f8aa02dcff..ad3facdcee 100644
--- a/src/os/src/darwin/darwinSysInfo.c
+++ b/src/os/src/darwin/darwinSysInfo.c
@@ -101,4 +101,6 @@ int taosSystem(const char *cmd) {
return -1;
}
-void taosSetCoreDump() {}
\ No newline at end of file
+void taosSetCoreDump() {}
+
+char *taosGetCmdlineByPID(int pid) { return ""; }
\ No newline at end of file
diff --git a/src/os/src/detail/osDir.c b/src/os/src/detail/osDir.c
index d3f0fda1a5..4f2985548c 100644
--- a/src/os/src/detail/osDir.c
+++ b/src/os/src/detail/osDir.c
@@ -54,6 +54,9 @@ int taosMkDir(const char *path, mode_t mode) {
void taosRename(char* oldName, char *newName) {
// if newName in not empty, rename return fail.
// the newName must be empty or does not exist
+#ifdef WINDOWS
+ remove(newName);
+#endif
if (rename(oldName, newName)) {
uError("failed to rename file %s to %s, reason:%s", oldName, newName, strerror(errno));
} else {
@@ -117,7 +120,7 @@ int32_t taosCompressFile(char *srcFileName, char *destFileName) {
goto cmp_end;
}
- int32_t fd = open(destFileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
+ int32_t fd = open(destFileName, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRWXU | S_IRWXG | S_IRWXO);
if (fd < 0) {
ret = -2;
goto cmp_end;
diff --git a/src/os/src/detail/osFile.c b/src/os/src/detail/osFile.c
index 2e6886aa21..bb68622731 100644
--- a/src/os/src/detail/osFile.c
+++ b/src/os/src/detail/osFile.c
@@ -121,15 +121,11 @@ int64_t taosLSeekImp(int32_t fd, int64_t offset, int32_t whence) {
#ifndef TAOS_OS_FUNC_FILE_SENDIFLE
-int64_t taosSendFile(int32_t dfd, int32_t sfd, int64_t *offset, int64_t size) {
+int64_t taosSendFile(SOCKET dfd, int32_t sfd, int64_t *offset, int64_t size) {
int64_t leftbytes = size;
int64_t sentbytes;
while (leftbytes > 0) {
- /*
- * TODO : Think to check if file is larger than 1GB
- */
- // if (leftbytes > 1000000000) leftbytes = 1000000000;
sentbytes = sendfile(dfd, sfd, offset, leftbytes);
if (sentbytes == -1) {
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
diff --git a/src/os/src/detail/osSignal.c b/src/os/src/detail/osSignal.c
new file mode 100644
index 0000000000..e1a0e84e7f
--- /dev/null
+++ b/src/os/src/detail/osSignal.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#define _DEFAULT_SOURCE
+#include "os.h"
+#include "tconfig.h"
+#include "tglobal.h"
+#include "tulog.h"
+
+#ifndef TAOS_OS_FUNC_SIGNAL
+typedef void (*FLinuxSignalHandler)(int32_t signum, siginfo_t *sigInfo, void *context);
+
+void taosSetSignal(int32_t signum, FSignalHandler sigfp) {
+ struct sigaction act = {{0}};
+#if 1
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = (FLinuxSignalHandler)sigfp;
+#else
+ act.sa_handler = sigfp;
+#endif
+ sigaction(signum, &act, NULL);
+}
+
+void taosIgnSignal(int32_t signum) {
+ signal(signum, SIG_IGN);
+}
+
+void taosDflSignal(int32_t signum) {
+ signal(signum, SIG_DFL);
+}
+
+#endif
diff --git a/src/os/src/detail/osSocket.c b/src/os/src/detail/osSocket.c
index 659c8510dc..1186a6dd0a 100644
--- a/src/os/src/detail/osSocket.c
+++ b/src/os/src/detail/osSocket.c
@@ -53,6 +53,16 @@ void taosBlockSIGPIPE() {
}
}
+void taosSetMaskSIGPIPE() {
+ sigset_t signal_mask;
+ sigemptyset(&signal_mask);
+ sigaddset(&signal_mask, SIGPIPE);
+ int32_t rc = pthread_sigmask(SIG_SETMASK, &signal_mask, NULL);
+ if (rc != 0) {
+ uError("failed to setmask SIGPIPE");
+ }
+}
+
#endif
#ifndef TAOS_OS_FUNC_SOCKET_SETSOCKETOPT
diff --git a/src/os/src/detail/osSysinfo.c b/src/os/src/detail/osSysinfo.c
index b0ca6139ed..2ba0dd6917 100644
--- a/src/os/src/detail/osSysinfo.c
+++ b/src/os/src/detail/osSysinfo.c
@@ -45,6 +45,21 @@ static char tsProcMemFile[25] = {0};
static char tsProcIOFile[25] = {0};
static float tsPageSizeKB = 0;
+static void taosGetProcInfos() {
+ tsPageSize = sysconf(_SC_PAGESIZE);
+ tsOpenMax = sysconf(_SC_OPEN_MAX);
+ tsStreamMax = sysconf(_SC_STREAM_MAX);
+
+ tsProcId = (pid_t)syscall(SYS_gettid);
+ tsPageSizeKB = (float)(sysconf(_SC_PAGESIZE)) / 1024;
+
+ snprintf(tsProcMemFile, 25, "/proc/%d/status", tsProcId);
+ snprintf(tsProcCpuFile, 25, "/proc/%d/stat", tsProcId);
+ snprintf(tsProcIOFile, 25, "/proc/%d/io", tsProcId);
+}
+
+static int32_t taosGetTotalMemory() { return (int32_t)((float)sysconf(_SC_PHYS_PAGES) * tsPageSizeKB / 1024); }
+
bool taosGetSysMemory(float *memoryUsedMB) {
float memoryAvailMB = (float)sysconf(_SC_AVPHYS_PAGES) * tsPageSizeKB / 1024;
*memoryUsedMB = (float)tsTotalMemoryMB - memoryAvailMB;
@@ -105,7 +120,8 @@ static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) {
}
char cpu[10] = {0};
- sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system, &cpuInfo->idle);
+ sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system,
+ &cpuInfo->idle);
tfree(line);
fclose(fp);
@@ -131,7 +147,8 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
for (int i = 0, blank = 0; line[i] != 0; ++i) {
if (line[i] == ' ') blank++;
if (blank == PROCESS_ITEM) {
- sscanf(line + i + 1, "%" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, &cpuInfo->utime, &cpuInfo->stime, &cpuInfo->cutime, &cpuInfo->cstime);
+ sscanf(line + i + 1, "%" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, &cpuInfo->utime, &cpuInfo->stime,
+ &cpuInfo->cutime, &cpuInfo->cstime);
break;
}
}
@@ -162,12 +179,12 @@ static void taosGetSystemTimezone() {
char buf[68] = {0};
if (f != NULL) {
int len = fread(buf, 64, 1, f);
- if(len < 64 && ferror(f)) {
+ if (len < 64 && ferror(f)) {
fclose(f);
uError("read /etc/timezone error, reason:%s", strerror(errno));
return;
}
-
+
fclose(f);
buf[sizeof(buf) - 1] = 0;
@@ -258,6 +275,8 @@ static void taosGetSystemLocale() { // get and set default locale
}
}
+static int32_t taosGetCpuCores() { return (int32_t)sysconf(_SC_NPROCESSORS_ONLN); }
+
bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
static uint64_t lastSysUsed = 0;
static uint64_t lastSysTotal = 0;
@@ -300,11 +319,9 @@ bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
bool taosGetDisk() {
struct statvfs info;
const double unit = 1024 * 1024 * 1024;
-
+
if (tscEmbedded) {
if (statvfs(tsDataDir, &info)) {
- //tsTotalDataDirGB = 0;
- //tsAvailDataDirGB = 0;
uError("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
return false;
} else {
@@ -314,8 +331,6 @@ bool taosGetDisk() {
}
if (statvfs(tsLogDir, &info)) {
- //tsTotalLogDirGB = 0;
- //tsAvailLogDirGB = 0;
uError("failed to get disk size, logDir:%s errno:%s", tsLogDir, strerror(errno));
return false;
} else {
@@ -324,8 +339,6 @@ bool taosGetDisk() {
}
if (statvfs("/tmp", &info)) {
- //tsTotalTmpDirGB = 0;
- //tsAvailTmpDirectorySpace = 0;
uError("failed to get disk size, tmpDir:/tmp errno:%s", strerror(errno));
return false;
} else {
@@ -344,13 +357,12 @@ static bool taosGetCardInfo(int64_t *bytes) {
return false;
}
-
size_t len = 2048;
char * line = calloc(1, len);
while (!feof(fp)) {
memset(line, 0, len);
-
+
int64_t rbytes = 0;
int64_t rpackts = 0;
int64_t tbytes = 0;
@@ -465,7 +477,7 @@ bool taosGetProcIO(float *readKB, float *writeKB) {
static int64_t lastReadbyte = -1;
static int64_t lastWritebyte = -1;
- int64_t curReadbyte = 0;
+ int64_t curReadbyte = 0;
int64_t curWritebyte = 0;
if (!taosReadProcIO(&curReadbyte, &curWritebyte)) {
@@ -490,18 +502,10 @@ bool taosGetProcIO(float *readKB, float *writeKB) {
}
void taosGetSystemInfo() {
- tsNumOfCores = (int32_t)sysconf(_SC_NPROCESSORS_ONLN);
- tsPageSize = sysconf(_SC_PAGESIZE);
- tsOpenMax = sysconf(_SC_OPEN_MAX);
- tsStreamMax = sysconf(_SC_STREAM_MAX);
+ taosGetProcInfos();
- tsProcId = (pid_t)syscall(SYS_gettid);
- tsPageSizeKB = (float)(sysconf(_SC_PAGESIZE)) / 1024;
- tsTotalMemoryMB = (int32_t)((float)sysconf(_SC_PHYS_PAGES) * tsPageSizeKB / 1024);
-
- snprintf(tsProcMemFile, 25, "/proc/%d/status", tsProcId);
- snprintf(tsProcCpuFile, 25, "/proc/%d/stat", tsProcId);
- snprintf(tsProcIOFile, 25, "/proc/%d/io", tsProcId);
+ tsNumOfCores = taosGetCpuCores();
+ tsTotalMemoryMB = taosGetTotalMemory();
float tmp1, tmp2;
taosGetSysMemory(&tmp1);
@@ -573,16 +577,16 @@ void taosSetCoreDump() {
if (0 == tsEnableCoreFile) {
return;
}
-
+
// 1. set ulimit -c unlimited
struct rlimit rlim;
struct rlimit rlim_new;
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
- #ifndef _ALPINE
+#ifndef _ALPINE
uInfo("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
- #else
+#else
uInfo("the old unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
- #endif
+#endif
rlim_new.rlim_cur = RLIM_INFINITY;
rlim_new.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
@@ -594,57 +598,56 @@ void taosSetCoreDump() {
}
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
- #ifndef _ALPINE
+#ifndef _ALPINE
uInfo("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
- #else
+#else
uInfo("the new unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
- #endif
+#endif
}
#ifndef _TD_ARM_
// 2. set the path for saving core file
struct __sysctl_args args;
- int old_usespid = 0;
- size_t old_len = 0;
- int new_usespid = 1;
- size_t new_len = sizeof(new_usespid);
-
+
+ int old_usespid = 0;
+ size_t old_len = 0;
+ int new_usespid = 1;
+ size_t new_len = sizeof(new_usespid);
+
int name[] = {CTL_KERN, KERN_CORE_USES_PID};
-
+
memset(&args, 0, sizeof(struct __sysctl_args));
- args.name = name;
- args.nlen = sizeof(name)/sizeof(name[0]);
- args.oldval = &old_usespid;
+ args.name = name;
+ args.nlen = sizeof(name) / sizeof(name[0]);
+ args.oldval = &old_usespid;
args.oldlenp = &old_len;
- args.newval = &new_usespid;
- args.newlen = new_len;
-
+ args.newval = &new_usespid;
+ args.newlen = new_len;
+
old_len = sizeof(old_usespid);
-
+
if (syscall(SYS__sysctl, &args) == -1) {
- uInfo("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
+ uInfo("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
}
-
+
uInfo("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
-
old_usespid = 0;
- old_len = 0;
+ old_len = 0;
memset(&args, 0, sizeof(struct __sysctl_args));
- args.name = name;
- args.nlen = sizeof(name)/sizeof(name[0]);
- args.oldval = &old_usespid;
+ args.name = name;
+ args.nlen = sizeof(name) / sizeof(name[0]);
+ args.oldval = &old_usespid;
args.oldlenp = &old_len;
-
+
old_len = sizeof(old_usespid);
-
+
if (syscall(SYS__sysctl, &args) == -1) {
- uInfo("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
+ uInfo("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
}
-
+
uInfo("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
#endif
-
}
bool taosGetSystemUid(char *uid) {
diff --git a/src/os/src/detail/osTime.c b/src/os/src/detail/osTime.c
index d6877790a8..d9d070218e 100644
--- a/src/os/src/detail/osTime.c
+++ b/src/os/src/detail/osTime.c
@@ -43,7 +43,7 @@
*/
int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
const unsigned int day, const unsigned int hour,
- const unsigned int min, const unsigned int sec)
+ const unsigned int min, const unsigned int sec, int64_t timezone)
{
unsigned int mon = mon0, year = year0;
@@ -61,12 +61,6 @@ int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
res = res*24;
res = ((res + hour) * 60 + min) * 60 + sec;
-#ifdef _MSC_VER
-#if _MSC_VER >= 1900
- int64_t timezone = _timezone;
-#endif
-#endif
-
return (res + timezone);
}
@@ -219,7 +213,7 @@ int32_t parseTimeWithTz(char* timestr, int64_t* time, int32_t timePrec) {
/* mktime will be affected by TZ, set by using taos_options */
#ifdef WINDOWS
- int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 0);
//int64_t seconds = gmtime(&tm);
#else
int64_t seconds = timegm(&tm);
@@ -276,7 +270,13 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
return -1;
}
- int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+#ifdef _MSC_VER
+#if _MSC_VER >= 1900
+ int64_t timezone = _timezone;
+#endif
+#endif
+
+ int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, timezone);
int64_t fraction = 0;
@@ -574,4 +574,4 @@ const char* fmtts(int64_t ts) {
}
return buf;
-}
\ No newline at end of file
+}
diff --git a/src/os/src/linux/linuxEnv.c b/src/os/src/linux/linuxEnv.c
index 5772885cb4..e3eadbc94b 100644
--- a/src/os/src/linux/linuxEnv.c
+++ b/src/os/src/linux/linuxEnv.c
@@ -18,7 +18,6 @@
#include "tglobal.h"
void osInit() {
-
#ifdef _TD_POWER_
if (configDir[0] == 0) {
strcpy(configDir, "/etc/power");
@@ -43,16 +42,14 @@ void osInit() {
char cmdline[1024];
-char *taosGetCmdlineByPID(int pid)
-{
- sprintf(cmdline, "/proc/%d/cmdline",pid);
- FILE* f = fopen(cmdline,"r");
- if(f){
+char* taosGetCmdlineByPID(int pid) {
+ sprintf(cmdline, "/proc/%d/cmdline", pid);
+ FILE* f = fopen(cmdline, "r");
+ if (f) {
size_t size;
size = fread(cmdline, sizeof(char), 1024, f);
- if(size>0){
- if('\n'==cmdline[size-1])
- cmdline[size-1]='\0';
+ if (size > 0) {
+ if ('\n' == cmdline[size - 1]) cmdline[size - 1] = '\0';
}
fclose(f);
}
diff --git a/src/os/src/windows/wFile.c b/src/os/src/windows/wFile.c
index 2204135ae6..4ad195dc6f 100644
--- a/src/os/src/windows/wFile.c
+++ b/src/os/src/windows/wFile.c
@@ -15,18 +15,19 @@
#define _DEFAULT_SOURCE
#include "os.h"
-#include "tulog.h"
+#include "osSocket.h"
#include "tglobal.h"
+#include "tulog.h"
void taosGetTmpfilePath(const char *fileNamePrefix, char *dstPath) {
- const char* tdengineTmpFileNamePrefix = "tdengine-";
- char tmpPath[PATH_MAX];
+ const char *tdengineTmpFileNamePrefix = "tdengine-";
+ char tmpPath[PATH_MAX];
int32_t len = (int32_t)strlen(tsTempDir);
memcpy(tmpPath, tsTempDir, len);
if (tmpPath[len - 1] != '/' && tmpPath[len - 1] != '\\') {
- tmpPath[len++] = '\\';
+ tmpPath[len++] = '\\';
}
strcpy(tmpPath + len, tdengineTmpFileNamePrefix);
@@ -35,7 +36,7 @@ void taosGetTmpfilePath(const char *fileNamePrefix, char *dstPath) {
strcat(tmpPath, fileNamePrefix);
strcat(tmpPath, "-%d-%s");
}
-
+
char rand[8] = {0};
taosRandStr(rand, tListLen(rand) - 1);
snprintf(dstPath, PATH_MAX, tmpPath, getpid(), rand);
@@ -46,18 +47,16 @@ void taosGetTmpfilePath(const char *fileNamePrefix, char *dstPath) {
int64_t taosFSendFile(FILE *out_file, FILE *in_file, int64_t *offset, int64_t count) {
fseek(in_file, (int32_t)(*offset), 0);
int64_t writeLen = 0;
- uint8_t buffer[_SEND_FILE_STEP_] = { 0 };
-
+ uint8_t buffer[_SEND_FILE_STEP_] = {0};
+
for (int64_t len = 0; len < (count - _SEND_FILE_STEP_); len += _SEND_FILE_STEP_) {
size_t rlen = fread(buffer, 1, _SEND_FILE_STEP_, in_file);
if (rlen <= 0) {
return writeLen;
- }
- else if (rlen < _SEND_FILE_STEP_) {
+ } else if (rlen < _SEND_FILE_STEP_) {
fwrite(buffer, 1, rlen, out_file);
return (int64_t)(writeLen + rlen);
- }
- else {
+ } else {
fwrite(buffer, 1, _SEND_FILE_STEP_, in_file);
writeLen += _SEND_FILE_STEP_;
}
@@ -65,12 +64,11 @@ int64_t taosFSendFile(FILE *out_file, FILE *in_file, int64_t *offset, int64_t co
int64_t remain = count - writeLen;
if (remain > 0) {
- size_t rlen = fread(buffer, 1, (size_t) remain, in_file);
+ size_t rlen = fread(buffer, 1, (size_t)remain, in_file);
if (rlen <= 0) {
return writeLen;
- }
- else {
- fwrite(buffer, 1, (size_t) remain, out_file);
+ } else {
+ fwrite(buffer, 1, (size_t)remain, out_file);
writeLen += remain;
}
}
@@ -78,12 +76,99 @@ int64_t taosFSendFile(FILE *out_file, FILE *in_file, int64_t *offset, int64_t co
return writeLen;
}
-int64_t taosSendFile(int32_t dfd, int32_t sfd, int64_t* offset, int64_t size) {
- uError("taosSendFile no implemented yet");
+int64_t taosSendFile(SOCKET dfd, int32_t sfd, int64_t *offset, int64_t count) {
+ if (offset != NULL) lseek(sfd, (int32_t)(*offset), 0);
+
+ int64_t writeLen = 0;
+ uint8_t buffer[_SEND_FILE_STEP_] = {0};
+
+ for (int64_t len = 0; len < (count - _SEND_FILE_STEP_); len += _SEND_FILE_STEP_) {
+ int32_t rlen = (int32_t)read(sfd, buffer, _SEND_FILE_STEP_);
+ if (rlen <= 0) {
+ return writeLen;
+ } else if (rlen < _SEND_FILE_STEP_) {
+ taosWriteSocket(dfd, buffer, rlen);
+ return (int64_t)(writeLen + rlen);
+ } else {
+ taosWriteSocket(dfd, buffer, _SEND_FILE_STEP_);
+ writeLen += _SEND_FILE_STEP_;
+ }
+ }
+
+ int64_t remain = count - writeLen;
+ if (remain > 0) {
+ int32_t rlen = read(sfd, buffer, (int32_t)remain);
+ if (rlen <= 0) {
+ return writeLen;
+ } else {
+ taosWriteSocket(sfd, buffer, (int32_t)remain);
+ writeLen += remain;
+ }
+ }
+
+ return writeLen;
+}
+
+int32_t taosFtruncate(int32_t fd, int64_t l_size) {
+ if (fd < 0) {
+ errno = EBADF;
+ uError("%s\n", "fd arg was negative");
+ return -1;
+ }
+
+ HANDLE h = (HANDLE)_get_osfhandle(fd);
+
+ LARGE_INTEGER li_0;
+ li_0.QuadPart = (int64_t)0;
+ BOOL cur = SetFilePointerEx(h, li_0, NULL, FILE_CURRENT);
+ if (!cur) {
+ uError("SetFilePointerEx Error getting current position in file.\n");
+ return -1;
+ }
+
+ LARGE_INTEGER li_size;
+ li_size.QuadPart = l_size;
+ BOOL cur2 = SetFilePointerEx(h, li_size, NULL, FILE_BEGIN);
+ if (cur2 == 0) {
+ int error = GetLastError();
+ uError("SetFilePointerEx GetLastError is: %d\n", error);
+ switch (error) {
+ case ERROR_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ default:
+ errno = EIO;
+ break;
+ }
+ return -1;
+ }
+
+ if (!SetEndOfFile(h)) {
+ int error = GetLastError();
+ uError("SetEndOfFile GetLastError is:%d", error);
+ switch (error) {
+ case ERROR_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ default:
+ errno = EIO;
+ break;
+ }
+ return -1;
+ }
+
return 0;
}
-int32_t taosFtruncate(int32_t fd, int64_t length) {
- uError("taosFtruncate no implemented yet");
- return 0;
-}
\ No newline at end of file
+
+int fsync(int filedes) {
+ if (filedes < 0) {
+ errno = EBADF;
+ uError("%s\n", "fd arg was negative");
+ return -1;
+ }
+
+ HANDLE h = (HANDLE)_get_osfhandle(filedes);
+
+ return FlushFileBuffers(h);
+}
diff --git a/src/os/src/windows/wSignal.c b/src/os/src/windows/wSignal.c
new file mode 100644
index 0000000000..9de6b5f343
--- /dev/null
+++ b/src/os/src/windows/wSignal.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#define _DEFAULT_SOURCE
+#include "os.h"
+#include
+#include
+
+typedef void (*FWinSignalHandler)(int32_t signum);
+
+void taosSetSignal(int32_t signum, FSignalHandler sigfp) {
+ if (signum == SIGUSR1) return;
+
+ // SIGHUP doesn't exist in windows, we handle it in the way of ctrlhandler
+ if (signum == SIGHUP) {
+ SetConsoleCtrlHandler((PHANDLER_ROUTINE)sigfp, TRUE);
+ } else {
+ signal(signum, (FWinSignalHandler)sigfp);
+ }
+}
+
+void taosIgnSignal(int32_t signum) {
+ if (signum == SIGUSR1 || signum == SIGHUP) return;
+ signal(signum, SIG_IGN);
+}
+
+void taosDflSignal(int32_t signum) {
+ if (signum == SIGUSR1 || signum == SIGHUP) return;
+ signal(signum, SIG_DFL);
+}
diff --git a/src/os/src/windows/wSocket.c b/src/os/src/windows/wSocket.c
index 9697c5e65f..4e6ee15e77 100644
--- a/src/os/src/windows/wSocket.c
+++ b/src/os/src/windows/wSocket.c
@@ -48,6 +48,7 @@ int32_t taosSetNonblocking(SOCKET sock, int32_t on) {
void taosIgnSIGPIPE() {}
void taosBlockSIGPIPE() {}
+void taosSetMaskSIGPIPE() {}
int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t optlen) {
if (level == SOL_SOCKET && optname == TCP_KEEPCNT) {
diff --git a/src/os/src/windows/wSysLog.c b/src/os/src/windows/wSysLog.c
new file mode 100644
index 0000000000..866cacbaba
--- /dev/null
+++ b/src/os/src/windows/wSysLog.c
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#define _DEFAULT_SOURCE
+#include "os.h"
+
+void syslog(int unused, const char *format, ...) {}
\ No newline at end of file
diff --git a/src/os/src/windows/wSysinfo.c b/src/os/src/windows/wSysinfo.c
index 1bfee25c4a..082aaaf5d8 100644
--- a/src/os/src/windows/wSysinfo.c
+++ b/src/os/src/windows/wSysinfo.c
@@ -31,11 +31,54 @@
#pragma comment(lib, "Mswsock.lib ")
#endif
+#include
+
#pragma warning(push)
-#pragma warning(disable:4091)
+#pragma warning(disable : 4091)
#include
#pragma warning(pop)
+static int32_t taosGetTotalMemory() {
+ MEMORYSTATUSEX memsStat;
+ memsStat.dwLength = sizeof(memsStat);
+ if (!GlobalMemoryStatusEx(&memsStat)) {
+ return 0;
+ }
+
+ float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f);
+ return (int32_t)nMemTotal;
+}
+
+bool taosGetSysMemory(float *memoryUsedMB) {
+ MEMORYSTATUSEX memsStat;
+ memsStat.dwLength = sizeof(memsStat);
+ if (!GlobalMemoryStatusEx(&memsStat)) {
+ return false;
+ }
+
+ float nMemFree = memsStat.ullAvailPhys / (1024.0f * 1024.0f);
+ float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f);
+
+ *memoryUsedMB = nMemTotal - nMemFree;
+ return true;
+}
+
+bool taosGetProcMemory(float *memoryUsedMB) {
+ unsigned bytes_used = 0;
+
+#if defined(_WIN64) && defined(_MSC_VER)
+ PROCESS_MEMORY_COUNTERS pmc;
+ HANDLE cur_proc = GetCurrentProcess();
+
+ if (GetProcessMemoryInfo(cur_proc, &pmc, sizeof(pmc))) {
+ bytes_used = (unsigned)(pmc.WorkingSetSize + pmc.PagefileUsage);
+ }
+#endif
+
+ *memoryUsedMB = (float)bytes_used / 1024 / 1024;
+ return true;
+}
+
static void taosGetSystemTimezone() {
// get and set default timezone
SGlobalCfg *cfg_timezone = taosGetConfigOption("timezone");
@@ -71,16 +114,16 @@ static void taosGetSystemLocale() {
}
}
-void taosPrintOsInfo() {}
-
-void taosKillSystem() {
- uError("function taosKillSystem, exit!");
- exit(0);
+static int32_t taosGetCpuCores() {
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ return (int32_t)info.dwNumberOfProcessors;
}
-void taosGetSystemInfo() {
- taosGetSystemTimezone();
- taosGetSystemLocale();
+bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
+ *sysCpuUsage = 0;
+ *procCpuUsage = 0;
+ return true;
}
bool taosGetDisk() {
@@ -89,20 +132,35 @@ bool taosGetDisk() {
unsigned _int64 i64FreeBytesToCaller;
unsigned _int64 i64TotalBytes;
unsigned _int64 i64FreeBytes;
- char dir[4] = {'C', ':', '\\', '\0'};
- int drive_type;
if (tscEmbedded) {
- drive_type = GetDriveTypeA(dir);
- if (drive_type == DRIVE_FIXED) {
- fResult = GetDiskFreeSpaceExA(dir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,
- (PULARGE_INTEGER)&i64FreeBytes);
- if (fResult) {
- tsTotalDataDirGB = tsTotalLogDirGB = tsTotalTmpDirGB = (float)(i64TotalBytes / unit);
- tsAvailDataDirGB = tsAvailLogDirGB = tsAvailTmpDirectorySpace = (float)(i64FreeBytes / unit);
- }
+ fResult = GetDiskFreeSpaceExA(tsDataDir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,
+ (PULARGE_INTEGER)&i64FreeBytes);
+ if (fResult) {
+ tsTotalDataDirGB = (float)(i64TotalBytes / unit);
+ tsAvailDataDirGB = (float)(i64FreeBytes / unit);
}
}
+
+ fResult = GetDiskFreeSpaceExA(tsLogDir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,
+ (PULARGE_INTEGER)&i64FreeBytes);
+ if (fResult) {
+ tsTotalLogDirGB = (float)(i64TotalBytes / unit);
+ tsAvailLogDirGB = (float)(i64FreeBytes / unit);
+ }
+
+ fResult = GetDiskFreeSpaceExA(tsTempDir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,
+ (PULARGE_INTEGER)&i64FreeBytes);
+ if (fResult) {
+ tsTotalTmpDirGB = (float)(i64TotalBytes / unit);
+ tsAvailTmpDirectorySpace = (float)(i64FreeBytes / unit);
+ }
+
+ return true;
+}
+
+bool taosGetBandSpeed(float *bandSpeedKb) {
+ *bandSpeedKb = 0;
return true;
}
@@ -144,48 +202,30 @@ bool taosGetProcIO(float *readKB, float *writeKB) {
return true;
}
-bool taosGetBandSpeed(float *bandSpeedKb) {
- *bandSpeedKb = 0;
- return true;
+void taosGetSystemInfo() {
+ tsNumOfCores = taosGetCpuCores();
+ tsTotalMemoryMB = taosGetTotalMemory();
+
+ float tmp1, tmp2;
+ taosGetDisk();
+ taosGetBandSpeed(&tmp1);
+ taosGetCpuUsage(&tmp1, &tmp2);
+ taosGetProcIO(&tmp1, &tmp2);
+
+ taosGetSystemTimezone();
+ taosGetSystemLocale();
}
-bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
- *sysCpuUsage = 0;
- *procCpuUsage = 0;
- return true;
+void taosPrintOsInfo() {
+ uInfo(" os numOfCores: %d", tsNumOfCores);
+ uInfo(" os totalDisk: %f(GB)", tsTotalDataDirGB);
+ uInfo(" os totalMemory: %d(MB)", tsTotalMemoryMB);
+ uInfo("==================================");
}
-bool taosGetProcMemory(float *memoryUsedMB) {
- unsigned bytes_used = 0;
-#if 0
-#if defined(_WIN32) && defined(_MSC_VER)
- PROCESS_MEMORY_COUNTERS pmc;
- HANDLE cur_proc = GetCurrentProcess();
-
- if (GetProcessMemoryInfo(cur_proc, &pmc, sizeof(pmc))) {
- bytes_used = (unsigned)(pmc.WorkingSetSize + pmc.PagefileUsage);
- }
-#endif
-#endif
-
- *memoryUsedMB = (float)bytes_used / 1024 / 1024;
-
- return true;
-}
-
-bool taosGetSysMemory(float *memoryUsedMB) {
- MEMORYSTATUSEX memsStat;
- float nMemFree;
- float nMemTotal;
-
- memsStat.dwLength = sizeof(memsStat);
- if (!GlobalMemoryStatusEx(&memsStat)) {
- return false;
- }
- nMemFree = memsStat.ullAvailPhys / (1024.0f * 1024.0f);
- nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f);
- *memoryUsedMB = nMemTotal - nMemFree;
- return true;
+void taosKillSystem() {
+ uError("function taosKillSystem, exit!");
+ exit(0);
}
int taosSystem(const char *cmd) {
@@ -195,10 +235,6 @@ int taosSystem(const char *cmd) {
int flock(int fd, int option) { return 0; }
-int fsync(int filedes) { return 0; }
-
-int sigaction(int sig, struct sigaction *d, void *p) { return 0; }
-
LONG WINAPI FlCrashDump(PEXCEPTION_POINTERS ep) {
typedef BOOL(WINAPI * FxMiniDumpWriteDump)(IN HANDLE hProcess, IN DWORD ProcessId, IN HANDLE hFile,
IN MINIDUMP_TYPE DumpType,
@@ -235,4 +271,22 @@ LONG WINAPI FlCrashDump(PEXCEPTION_POINTERS ep) {
return EXCEPTION_CONTINUE_SEARCH;
}
-void taosSetCoreDump() { SetUnhandledExceptionFilter(&FlCrashDump); }
\ No newline at end of file
+void taosSetCoreDump() { SetUnhandledExceptionFilter(&FlCrashDump); }
+
+bool taosGetSystemUid(char *uid) {
+ GUID guid;
+ CoCreateGuid(&guid);
+
+ sprintf(
+ uid,
+ "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
+ guid.Data1, guid.Data2, guid.Data3,
+ guid.Data4[0], guid.Data4[1],
+ guid.Data4[2], guid.Data4[3],
+ guid.Data4[4], guid.Data4[5],
+ guid.Data4[6], guid.Data4[7]);
+
+ return true;
+}
+
+char *taosGetCmdlineByPID(int pid) { return ""; }
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index d03717b6e1..e66997dc8e 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -3,6 +3,6 @@ PROJECT(TDengine)
ADD_SUBDIRECTORY(monitor)
ADD_SUBDIRECTORY(http)
-IF (TD_MQTT)
+IF (TD_LINUX AND TD_MQTT)
ADD_SUBDIRECTORY(mqtt)
ENDIF ()
\ No newline at end of file
diff --git a/src/plugins/http/CMakeLists.txt b/src/plugins/http/CMakeLists.txt
index 274f50d24a..42016b8645 100644
--- a/src/plugins/http/CMakeLists.txt
+++ b/src/plugins/http/CMakeLists.txt
@@ -9,32 +9,15 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(http ${SRC})
- TARGET_LINK_LIBRARIES(http z)
+ADD_LIBRARY(http ${SRC})
+TARGET_LINK_LIBRARIES(http z)
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(http taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(http taos)
- ENDIF ()
-
- IF (TD_ADMIN)
- TARGET_LINK_LIBRARIES(http admin)
- ENDIF ()
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(http taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(http taos)
ENDIF ()
-IF (TD_DARWIN)
- ADD_LIBRARY(http ${SRC})
- TARGET_LINK_LIBRARIES(http z)
-
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(http taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(http taos)
- ENDIF ()
-
- IF (TD_ADMIN)
- TARGET_LINK_LIBRARIES(http admin)
- ENDIF ()
+IF (TD_ADMIN)
+ TARGET_LINK_LIBRARIES(http admin)
ENDIF ()
diff --git a/src/plugins/http/inc/httpContext.h b/src/plugins/http/inc/httpContext.h
index 260858c5cc..b016da2dd3 100644
--- a/src/plugins/http/inc/httpContext.h
+++ b/src/plugins/http/inc/httpContext.h
@@ -22,7 +22,7 @@ bool httpInitContexts();
void httpCleanupContexts();
const char *httpContextStateStr(HttpContextState state);
-HttpContext *httpCreateContext(int32_t fd);
+HttpContext *httpCreateContext(SOCKET fd);
bool httpInitContext(HttpContext *pContext);
HttpContext *httpGetContext(void * pContext);
void httpReleaseContext(HttpContext *pContext, bool clearRes);
diff --git a/src/plugins/http/inc/httpInt.h b/src/plugins/http/inc/httpInt.h
index 3dac0dec93..634468f3cc 100644
--- a/src/plugins/http/inc/httpInt.h
+++ b/src/plugins/http/inc/httpInt.h
@@ -16,6 +16,7 @@
#ifndef TDENGINE_HTTP_INT_H
#define TDENGINE_HTTP_INT_H
+#include "os.h"
#include
#include "pthread.h"
#include "semaphore.h"
@@ -140,7 +141,7 @@ typedef enum {
typedef struct HttpContext {
int32_t refCount;
- int32_t fd;
+ SOCKET fd;
uint32_t accessTimes;
uint32_t lastAccessTime;
int32_t state;
@@ -167,7 +168,7 @@ typedef struct HttpThread {
HttpContext * pHead;
pthread_mutex_t threadMutex;
bool stop;
- int32_t pollFd;
+ EpollFd pollFd;
int32_t numOfContexts;
int32_t threadId;
char label[HTTP_LABEL_SIZE];
@@ -178,7 +179,9 @@ typedef struct HttpServer {
char label[HTTP_LABEL_SIZE];
uint32_t serverIp;
uint16_t serverPort;
- int32_t fd;
+ int8_t stop;
+ int8_t reserve;
+ SOCKET fd;
int32_t numOfThreads;
int32_t methodScannerLen;
int32_t requestNum;
diff --git a/src/plugins/http/src/httpAuth.c b/src/plugins/http/src/httpAuth.c
index 973f69f24e..2ef5406823 100644
--- a/src/plugins/http/src/httpAuth.c
+++ b/src/plugins/http/src/httpAuth.c
@@ -26,7 +26,7 @@
int32_t httpParseBasicAuthToken(HttpContext *pContext, char *token, int32_t len) {
token[len] = '\0';
int32_t outlen = 0;
- char *base64 = (char *)base64_decode(token, len, &outlen);
+ char * base64 = (char *)base64_decode(token, len, &outlen);
if (base64 == NULL || outlen == 0) {
httpError("context:%p, fd:%d, basic token:%s parsed error", pContext, pContext->fd, token);
free(base64);
@@ -49,7 +49,7 @@ int32_t httpParseBasicAuthToken(HttpContext *pContext, char *token, int32_t len)
strncpy(pContext->user, base64, (size_t)user_len);
pContext->user[user_len] = 0;
- char *password = user + 1;
+ char * password = user + 1;
int32_t pass_len = (int32_t)((base64 + outlen) - password);
if (pass_len < 1 || pass_len >= HTTP_PASSWORD_LEN) {
httpError("context:%p, fd:%d, basic token:%s parse password error", pContext, pContext->fd, token);
@@ -66,7 +66,7 @@ int32_t httpParseBasicAuthToken(HttpContext *pContext, char *token, int32_t len)
int32_t httpParseTaosdAuthToken(HttpContext *pContext, char *token, int32_t len) {
token[len] = '\0';
- int32_t outlen = 0;
+ int32_t outlen = 0;
unsigned char *base64 = base64_decode(token, len, &outlen);
if (base64 == NULL || outlen == 0) {
httpError("context:%p, fd:%d, taosd token:%s parsed error", pContext, pContext->fd, token);
@@ -97,7 +97,7 @@ int32_t httpParseTaosdAuthToken(HttpContext *pContext, char *token, int32_t len)
}
int32_t httpGenTaosdAuthToken(HttpContext *pContext, char *token, int32_t maxLen) {
- char buffer[sizeof(pContext->user) + sizeof(pContext->pass)] = {0};
+ char buffer[sizeof(pContext->user) + sizeof(pContext->pass)] = {0};
size_t size = sizeof(pContext->user);
tstrncpy(buffer, pContext->user, size);
size = sizeof(pContext->pass);
diff --git a/src/plugins/http/src/httpContext.c b/src/plugins/http/src/httpContext.c
index 266228e7ac..f71a84a5af 100644
--- a/src/plugins/http/src/httpContext.c
+++ b/src/plugins/http/src/httpContext.c
@@ -35,20 +35,24 @@ static void httpRemoveContextFromEpoll(HttpContext *pContext) {
HttpThread *pThread = pContext->pThread;
if (pContext->fd >= 0) {
epoll_ctl(pThread->pollFd, EPOLL_CTL_DEL, pContext->fd, NULL);
- int32_t fd = atomic_val_compare_exchange_32(&pContext->fd, pContext->fd, -1);
+#ifdef WINDOWS
+ SOCKET fd = atomic_val_compare_exchange_32(&pContext->fd, pContext->fd, -1);
+#else
+ SOCKET fd = atomic_val_compare_exchange_64(&pContext->fd, pContext->fd, -1);
+#endif
taosCloseSocket(fd);
}
}
static void httpDestroyContext(void *data) {
HttpContext *pContext = *(HttpContext **)data;
- if (pContext->fd > 0) taosClose(pContext->fd);
+ if (pContext->fd > 0) taosCloseSocket(pContext->fd);
HttpThread *pThread = pContext->pThread;
httpRemoveContextFromEpoll(pContext);
httpReleaseSession(pContext);
atomic_sub_fetch_32(&pThread->numOfContexts, 1);
-
+
httpDebug("context:%p, is destroyed, refCount:%d data:%p thread:%s numOfContexts:%d", pContext, pContext->refCount,
data, pContext->pThread->label, pContext->pThread->numOfContexts);
pContext->pThread = 0;
@@ -100,15 +104,13 @@ const char *httpContextStateStr(HttpContextState state) {
}
}
-void httpNotifyContextClose(HttpContext *pContext) {
- shutdown(pContext->fd, SHUT_WR);
-}
+void httpNotifyContextClose(HttpContext *pContext) { shutdown(pContext->fd, SHUT_WR); }
bool httpAlterContextState(HttpContext *pContext, HttpContextState srcState, HttpContextState destState) {
return (atomic_val_compare_exchange_32(&pContext->state, srcState, destState) == srcState);
}
-HttpContext *httpCreateContext(int32_t fd) {
+HttpContext *httpCreateContext(SOCKET fd) {
HttpContext *pContext = calloc(1, sizeof(HttpContext));
if (pContext == NULL) return NULL;
@@ -123,8 +125,8 @@ HttpContext *httpCreateContext(int32_t fd) {
pContext->ppContext = ppContext;
httpDebug("context:%p, fd:%d, is created, data:%p", pContext, fd, ppContext);
- // set the ref to 0
- taosCacheRelease(tsHttpServer.contextCache, (void**)&ppContext, false);
+ // set the ref to 0
+ taosCacheRelease(tsHttpServer.contextCache, (void **)&ppContext, false);
return pContext;
}
@@ -174,7 +176,6 @@ bool httpInitContext(HttpContext *pContext) {
pContext->encodeMethod = NULL;
memset(&pContext->singleCmd, 0, sizeof(HttpSqlCmd));
-
httpTrace("context:%p, fd:%d, parsed:%d", pContext, pContext->fd, pContext->parsed);
return true;
}
diff --git a/src/plugins/http/src/httpGcHandle.c b/src/plugins/http/src/httpGcHandle.c
index 4c10249672..925c74e7cd 100644
--- a/src/plugins/http/src/httpGcHandle.c
+++ b/src/plugins/http/src/httpGcHandle.c
@@ -192,7 +192,7 @@ bool gcProcessQueryRequest(HttpContext* pContext) {
break;
}
- cJSON* alias = cJSON_GetObjectItem(query, "alias");
+ cJSON* alias = cJSON_GetObjectItem(query, "alias");
int32_t aliasBuffer = -1;
if (!(alias == NULL || alias->valuestring == NULL || strlen(alias->valuestring) == 0)) {
aliasBuffer = httpAddToSqlCmdBuffer(pContext, alias->valuestring);
diff --git a/src/plugins/http/src/httpGcJson.c b/src/plugins/http/src/httpGcJson.c
index 2c9eca11de..8c223a1500 100644
--- a/src/plugins/http/src/httpGcJson.c
+++ b/src/plugins/http/src/httpGcJson.c
@@ -86,7 +86,7 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
if (jsonBuf == NULL) return false;
- int32_t num_fields = taos_num_fields(result);
+ int32_t num_fields = taos_num_fields(result);
TAOS_FIELD *fields = taos_fetch_fields(result);
if (num_fields == 0) {
return false;
@@ -101,7 +101,7 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
// such as select count(*) count(*) from sys.cpu group by ipaddr interval(1d)
int32_t dataFields = -1;
int32_t groupFields = -1;
- bool hasTimestamp = fields[0].type == TSDB_DATA_TYPE_TIMESTAMP;
+ bool hasTimestamp = fields[0].type == TSDB_DATA_TYPE_TIMESTAMP;
if (hasTimestamp) {
dataFields = 1;
if (num_fields > 2) groupFields = num_fields - 1;
@@ -125,15 +125,15 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
cmd->numOfRows--;
continue;
}
- int32_t* length = taos_fetch_lengths(result);
+ int32_t *length = taos_fetch_lengths(result);
// for group by
if (groupFields != -1) {
- char target[HTTP_GC_TARGET_SIZE] = {0};
+ char target[HTTP_GC_TARGET_SIZE] = {0};
int32_t len;
- len = snprintf(target,HTTP_GC_TARGET_SIZE,"%s{",aliasBuffer);
- for (int32_t i = dataFields + 1; istate) {
+ switch (gzip->state) {
case EHTTP_GZIP_READY: {
inflateEnd(gzip->gzip);
} break;
- default: break;
+ default:
+ break;
}
if (gzip->gzip) {
free(gzip->gzip);
@@ -60,43 +59,43 @@ static void ehttp_gzip_cleanup(ehttp_gzip_t *gzip) {
gzip->state = EHTTP_GZIP_CLOSED;
}
-ehttp_gzip_t* ehttp_gzip_create_decompressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg) {
- ehttp_gzip_t *gzip = (ehttp_gzip_t*)calloc(1, sizeof(*gzip));
+ehttp_gzip_t *ehttp_gzip_create_decompressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg) {
+ ehttp_gzip_t *gzip = (ehttp_gzip_t *)calloc(1, sizeof(*gzip));
if (!gzip) return NULL;
do {
- gzip->conf = conf;
- gzip->callbacks = callbacks;
- gzip->arg = arg;
+ gzip->conf = conf;
+ gzip->callbacks = callbacks;
+ gzip->arg = arg;
if (gzip->callbacks.on_data == NULL) gzip->callbacks.on_data = dummy_on_data;
- gzip->gzip = (z_stream*)calloc(1, sizeof(*gzip->gzip));
+ gzip->gzip = (z_stream *)calloc(1, sizeof(*gzip->gzip));
if (gzip->conf.get_header) {
- gzip->header = (gz_header*)calloc(1, sizeof(*gzip->header));
+ gzip->header = (gz_header *)calloc(1, sizeof(*gzip->header));
}
- if (gzip->conf.chunk_size<=0) gzip->conf.chunk_size = EHTTP_GZIP_CHUNK_SIZE_DEFAULT;
- gzip->chunk = (char*)malloc(gzip->conf.chunk_size);
+ if (gzip->conf.chunk_size <= 0) gzip->conf.chunk_size = EHTTP_GZIP_CHUNK_SIZE_DEFAULT;
+ gzip->chunk = (char *)malloc(gzip->conf.chunk_size);
if (!gzip->gzip || (gzip->conf.get_header && !gzip->header) || !gzip->chunk) break;
- gzip->gzip->zalloc = Z_NULL;
- gzip->gzip->zfree = Z_NULL;
- gzip->gzip->opaque = Z_NULL;
+ gzip->gzip->zalloc = Z_NULL;
+ gzip->gzip->zfree = Z_NULL;
+ gzip->gzip->opaque = Z_NULL;
- // 863 windowBits can also be greater than 15 for optional gzip decoding. Add
- // 864 32 to windowBits to enable zlib and gzip decoding with automatic header
- // 865 detection, or add 16 to decode only the gzip format (the zlib format will
- // 866 return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
- // 867 CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
- // 868 below), inflate() will not automatically decode concatenated gzip streams.
- // 869 inflate() will return Z_STREAM_END at the end of the gzip stream. The state
- // 870 would need to be reset to continue decoding a subsequent gzip stream.
- int32_t ret = inflateInit2(gzip->gzip, 32); // 32/16? 32/16 + MAX_WBITS
+ // 863 windowBits can also be greater than 15 for optional gzip decoding. Add
+ // 864 32 to windowBits to enable zlib and gzip decoding with automatic header
+ // 865 detection, or add 16 to decode only the gzip format (the zlib format will
+ // 866 return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
+ // 867 CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
+ // 868 below), inflate() will not automatically decode concatenated gzip streams.
+ // 869 inflate() will return Z_STREAM_END at the end of the gzip stream. The state
+ // 870 would need to be reset to continue decoding a subsequent gzip stream.
+ int32_t ret = inflateInit2(gzip->gzip, 32); // 32/16? 32/16 + MAX_WBITS
if (ret != Z_OK) break;
if (gzip->header) {
ret = inflateGetHeader(gzip->gzip, gzip->header);
}
if (ret != Z_OK) break;
- gzip->gzip->next_out = (z_const Bytef*)gzip->chunk;
- gzip->gzip->avail_out = gzip->conf.chunk_size;
+ gzip->gzip->next_out = (z_const Bytef *)gzip->chunk;
+ gzip->gzip->avail_out = gzip->conf.chunk_size;
gzip->state = EHTTP_GZIP_READY;
return gzip;
} while (0);
@@ -105,7 +104,7 @@ ehttp_gzip_t* ehttp_gzip_create_decompressor(ehttp_gzip_conf_t conf, ehttp_gzip_
return NULL;
}
-ehttp_gzip_t* ehttp_gzip_create_compressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg);
+ehttp_gzip_t *ehttp_gzip_create_compressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg);
void ehttp_gzip_destroy(ehttp_gzip_t *gzip) {
ehttp_gzip_cleanup(gzip);
@@ -129,16 +128,16 @@ int32_t ehttp_gzip_write(ehttp_gzip_t *gzip, const char *buf, int32_t len) {
}
if (ret != Z_OK && ret != Z_STREAM_END) return -1;
- if (gzip->gzip->avail_out>0) {
- if (ret!=Z_STREAM_END) continue;
+ if (gzip->gzip->avail_out > 0) {
+ if (ret != Z_STREAM_END) continue;
}
- int32_t len = gzip->gzip->next_out - (z_const Bytef*)gzip->chunk;
+ int32_t len = (int32_t)(gzip->gzip->next_out - (z_const Bytef *)gzip->chunk);
gzip->gzip->next_out[0] = '\0';
gzip->callbacks.on_data(gzip, gzip->arg, gzip->chunk, len);
- gzip->gzip->next_out = (z_const Bytef*)gzip->chunk;
- gzip->gzip->avail_out = gzip->conf.chunk_size;
+ gzip->gzip->next_out = (z_const Bytef *)gzip->chunk;
+ gzip->gzip->avail_out = gzip->conf.chunk_size;
}
return 0;
@@ -147,21 +146,20 @@ int32_t ehttp_gzip_write(ehttp_gzip_t *gzip, const char *buf, int32_t len) {
int32_t ehttp_gzip_finish(ehttp_gzip_t *gzip) {
if (gzip->state != EHTTP_GZIP_READY) return -1;
- gzip->gzip->next_in = NULL;
- gzip->gzip->avail_in = 0;
+ gzip->gzip->next_in = NULL;
+ gzip->gzip->avail_in = 0;
int32_t ret;
ret = inflate(gzip->gzip, Z_FINISH);
if (ret != Z_STREAM_END) return -1;
- int32_t len = gzip->gzip->next_out - (z_const Bytef*)gzip->chunk;
+ int32_t len = (int32_t)(gzip->gzip->next_out - (z_const Bytef *)gzip->chunk);
gzip->gzip->next_out[0] = '\0';
gzip->callbacks.on_data(gzip, gzip->arg, gzip->chunk, len);
- gzip->gzip->next_out = NULL;
- gzip->gzip->avail_out = 0;
+ gzip->gzip->next_out = NULL;
+ gzip->gzip->avail_out = 0;
return 0;
}
-
diff --git a/src/plugins/http/src/httpHandle.c b/src/plugins/http/src/httpHandle.c
index 7c56507514..ad79e24061 100644
--- a/src/plugins/http/src/httpHandle.c
+++ b/src/plugins/http/src/httpHandle.c
@@ -48,7 +48,7 @@ bool httpProcessData(HttpContext* pContext) {
/*
* httpCloseContextByApp has been called when parsing the error
*/
- //httpCloseContextByApp(pContext);
+ // httpCloseContextByApp(pContext);
} else {
httpProcessRequest(pContext);
}
diff --git a/src/plugins/http/src/httpJson.c b/src/plugins/http/src/httpJson.c
index 1aa6cfac4b..b120496898 100644
--- a/src/plugins/http/src/httpJson.c
+++ b/src/plugins/http/src/httpJson.c
@@ -44,20 +44,21 @@ int32_t httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int32_t
int32_t writeLen = 0;
do {
- if (pContext->fd > 2){
+ if (pContext->fd > 2) {
len = (int32_t)taosSend(pContext->fd, buf + writeLen, (size_t)(sz - writeLen), MSG_NOSIGNAL);
- }
- else {
+ } else {
return sz;
}
if (len < 0) {
- httpDebug("context:%p, fd:%d, socket write errno:%d:%s, times:%d", pContext, pContext->fd, errno, strerror(errno), countWait);
+ httpDebug("context:%p, fd:%d, socket write errno:%d:%s, times:%d", pContext, pContext->fd, errno, strerror(errno),
+ countWait);
if (++countWait > HTTP_WRITE_RETRY_TIMES) break;
taosMsleep(HTTP_WRITE_WAIT_TIME_MS);
continue;
} else if (len == 0) {
- httpDebug("context:%p, fd:%d, socket write errno:%d:%s, connect already closed", pContext, pContext->fd, errno, strerror(errno));
+ httpDebug("context:%p, fd:%d, socket write errno:%d:%s, connect already closed", pContext, pContext->fd, errno,
+ strerror(errno));
break;
} else {
countWait = 0;
@@ -80,7 +81,7 @@ int32_t httpWriteBuf(struct HttpContext* pContext, const char* buf, int32_t sz)
return writeSz;
}
-int32_t httpWriteBufNoTrace(struct HttpContext *pContext, const char *buf, int32_t sz) {
+int32_t httpWriteBufNoTrace(struct HttpContext* pContext, const char* buf, int32_t sz) {
int32_t writeSz = httpWriteBufByFd(pContext, buf, sz);
if (writeSz != sz) {
httpError("context:%p, fd:%d, dataSize:%d, writeSize:%d, failed to send response", pContext, pContext->fd, sz,
@@ -92,8 +93,8 @@ int32_t httpWriteBufNoTrace(struct HttpContext *pContext, const char *buf, int32
int32_t httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
int32_t remain = 0;
- char sLen[24];
- uint64_t srcLen = (uint64_t) (buf->lst - buf->buf);
+ char sLen[24];
+ int32_t srcLen = (int32_t)(buf->lst - buf->buf);
if (buf->pContext->fd <= 0) {
httpTrace("context:%p, fd:%d, write json body error", buf->pContext, buf->pContext->fd);
@@ -113,21 +114,21 @@ int32_t httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
httpTrace("context:%p, fd:%d, no data need dump", buf->pContext, buf->pContext->fd);
return 0; // there is no data to dump.
} else {
- int32_t len = sprintf(sLen, "%" PRIx64 "\r\n", srcLen);
- httpTrace("context:%p, fd:%d, write body, chunkSize:%" PRIu64 ", response:\n%s", buf->pContext, buf->pContext->fd,
- srcLen, buf->buf);
+ int32_t len = sprintf(sLen, "%x\r\n", srcLen);
+ httpTrace("context:%p, fd:%d, write body, chunkSize:%d, response:\n%s", buf->pContext, buf->pContext->fd, srcLen,
+ buf->buf);
httpWriteBufNoTrace(buf->pContext, sLen, len);
- remain = httpWriteBufNoTrace(buf->pContext, buf->buf, (int32_t)srcLen);
+ remain = httpWriteBufNoTrace(buf->pContext, buf->buf, srcLen);
}
} else {
- char compressBuf[JSON_BUFFER_SIZE] = {0};
+ char compressBuf[JSON_BUFFER_SIZE] = {0};
int32_t compressBufLen = JSON_BUFFER_SIZE;
int32_t ret = httpGzipCompress(buf->pContext, buf->buf, srcLen, compressBuf, &compressBufLen, isTheLast);
if (ret == 0) {
if (compressBufLen > 0) {
int32_t len = sprintf(sLen, "%x\r\n", compressBufLen);
- httpTrace("context:%p, fd:%d, write body, chunkSize:%" PRIu64 ", compressSize:%d, last:%d, response:\n%s",
- buf->pContext, buf->pContext->fd, srcLen, compressBufLen, isTheLast, buf->buf);
+ httpTrace("context:%p, fd:%d, write body, chunkSize:%d, compressSize:%d, last:%d, response:\n%s", buf->pContext,
+ buf->pContext->fd, srcLen, compressBufLen, isTheLast, buf->buf);
httpWriteBufNoTrace(buf->pContext, sLen, len);
remain = httpWriteBufNoTrace(buf->pContext, (const char*)compressBuf, compressBufLen);
} else {
@@ -136,7 +137,7 @@ int32_t httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
remain = 0; // there is no data to dump.
}
} else {
- httpError("context:%p, fd:%d, failed to compress data, chunkSize:%" PRIu64 ", last:%d, error:%d, response:\n%s",
+ httpError("context:%p, fd:%d, failed to compress data, chunkSize:%d, last:%d, error:%d, response:\n%s",
buf->pContext, buf->pContext->fd, srcLen, isTheLast, ret, buf->buf);
remain = 0;
}
@@ -154,8 +155,8 @@ void httpWriteJsonBufHead(JsonBuf* buf) {
buf->pContext->fd = -1;
}
- char msg[1024] = {0};
- int32_t len = -1;
+ char msg[1024] = {0};
+ int32_t len = -1;
if (buf->pContext->parser->acceptEncodingGzip == 0 || !tsHttpEnableCompress) {
len = sprintf(msg, httpRespTemplate[HTTP_RESPONSE_CHUNKED_UN_COMPRESS], httpVersionStr[buf->pContext->parser->httpVersion],
@@ -256,16 +257,16 @@ void httpJsonInt64(JsonBuf* buf, int64_t num) {
}
void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us) {
- char ts[35] = {0};
- struct tm *ptm;
- int32_t precision = 1000;
+ char ts[35] = {0};
+ struct tm* ptm;
+ int32_t precision = 1000;
if (us) {
precision = 1000000;
}
time_t tt = t / precision;
ptm = localtime(&tt);
- int32_t length = (int32_t) strftime(ts, 35, "%Y-%m-%d %H:%M:%S", ptm);
+ int32_t length = (int32_t)strftime(ts, 35, "%Y-%m-%d %H:%M:%S", ptm);
if (us) {
length += snprintf(ts + length, 8, ".%06" PRId64, t % precision);
} else {
@@ -276,9 +277,9 @@ void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us) {
}
void httpJsonUtcTimestamp(JsonBuf* buf, int64_t t, bool us) {
- char ts[40] = {0};
- struct tm *ptm;
- int32_t precision = 1000;
+ char ts[40] = {0};
+ struct tm* ptm;
+ int32_t precision = 1000;
if (us) {
precision = 1000000;
}
diff --git a/src/plugins/http/src/httpParser.c b/src/plugins/http/src/httpParser.c
index b844834537..e537253f0d 100644
--- a/src/plugins/http/src/httpParser.c
+++ b/src/plugins/http/src/httpParser.c
@@ -130,7 +130,7 @@ static int32_t httpAppendString(HttpString *str, const char *s, int32_t len) {
static void httpClearString(HttpString *str) {
if (str->str) {
str->str[0] = '\0';
- str->pos = 0;
+ str->pos = 0;
}
}
@@ -153,7 +153,7 @@ static int32_t httpOnRequestLine(HttpParser *pParser, char *method, char *target
for (int32_t i = 0; i < HTTP_MAX_URL; i++) {
char *pSeek = strchr(pStart, '/');
if (pSeek == NULL) {
- (void)httpAppendString(pParser->path + i, pStart, strlen(pStart));
+ (void)httpAppendString(pParser->path + i, pStart, (int32_t)strlen(pStart));
break;
} else {
(void)httpAppendString(pParser->path + i, pStart, (int32_t)(pSeek - pStart));
@@ -237,7 +237,6 @@ static int32_t httpOnParseHeaderField(HttpParser *parser, const char *key, const
}
httpTrace("context:%p, fd:%d, keepAlive:%d", pContext, pContext->fd, pContext->parser->keepAlive);
}
-
#if 0
else if (0 == strcasecmp(key, "Content-Encoding")) {
if (0 == strcmp(val, "gzip")) {
@@ -246,7 +245,7 @@ static int32_t httpOnParseHeaderField(HttpParser *parser, const char *key, const
}
return 0;
}
- #endif
+#endif
else if (0 == strcasecmp(key, "Transfer-Encoding") || 0 == strcasecmp(key, "Content-Encoding")) {
if (strstr(val, "gzip")) {
@@ -272,20 +271,17 @@ static int32_t httpOnParseHeaderField(HttpParser *parser, const char *key, const
}
else if (0 == strcasecmp(key, "Authorization")) {
- char * t = NULL;
- char * s = NULL;
+ char t[6] = {0};
+ char s[129] = {0};
int32_t bytes = 0;
- int32_t n = sscanf(val, "%ms %ms%n", &t, &s, &bytes);
- if (n == 2 && t && s && bytes == strlen(val)) {
+ int32_t n = sscanf(val, "%5s %128s%n", t, s, &bytes);
+ if (n == 2 && t[0] && s[0] && bytes == strlen(val)) {
if (strcmp(t, "Basic") == 0) {
free(parser->authContent);
- parser->authContent = s;
+ parser->authContent = strdup(s);
parser->authType = HTTP_BASIC_AUTH;
- s = NULL;
- free(t);
- free(s);
httpTrace("context:%p, fd:%d, basic auth:%s", pContext, pContext->fd, parser->authContent);
- int32_t ok = httpParseBasicAuthToken(pContext, parser->authContent, strlen(parser->authContent));
+ int32_t ok = httpParseBasicAuthToken(pContext, parser->authContent, (int32_t)strlen(parser->authContent));
if (ok != 0) {
httpOnError(parser, 0, TSDB_CODE_HTTP_INVALID_BASIC_AUTH);
return -1;
@@ -293,13 +289,10 @@ static int32_t httpOnParseHeaderField(HttpParser *parser, const char *key, const
return 0;
} else if (strcmp(t, "Taosd") == 0) {
free(parser->authContent);
- parser->authContent = s;
+ parser->authContent = strdup(s);
parser->authType = HTTP_TAOSD_AUTH;
- s = NULL;
- free(t);
- free(s);
httpTrace("context:%p, fd:%d, taosd auth:%s", pContext, pContext->fd, parser->authContent);
- int32_t ok = httpParseTaosdAuthToken(pContext, parser->authContent, strlen(parser->authContent));
+ int32_t ok = httpParseTaosdAuthToken(pContext, parser->authContent, (int32_t)strlen(parser->authContent));
if (ok != 0) {
httpOnError(parser, 0, TSDB_CODE_HTTP_INVALID_TAOSD_AUTH);
return -1;
@@ -309,16 +302,12 @@ static int32_t httpOnParseHeaderField(HttpParser *parser, const char *key, const
parser->authType = HTTP_INVALID_AUTH;
httpError("context:%p, fd:%d, invalid auth, t:%s s:%s", pContext, pContext->fd, t, s);
httpOnError(parser, 0, TSDB_CODE_HTTP_INVALID_AUTH_TYPE);
- free(t);
- free(s);
return -1;
}
} else {
parser->authType = HTTP_INVALID_AUTH;
httpError("context:%p, fd:%d, parse auth failed, t:%s s:%s", pContext, pContext->fd, t, s);
httpOnError(parser, 0, TSDB_CODE_HTTP_INVALID_AUTH_FORMAT);
- free(t);
- free(s);
return -1;
}
}
@@ -349,7 +338,7 @@ static int32_t httpOnBody(HttpParser *parser, const char *chunk, int32_t len) {
newSize = MIN(newSize, HTTP_BUFFER_SIZE);
buf->str = realloc(buf->str, newSize);
buf->size = newSize;
-
+
if (buf->str == NULL) {
httpError("context:%p, fd:%d, failed parse body, realloc %d failed", pContext, pContext->fd, buf->size);
httpOnError(parser, 0, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
@@ -410,9 +399,7 @@ static int32_t httpPopStack(HttpParser *parser) {
return 0;
}
-static void httpClearStack(HttpStack *stack) {
- stack->pos = 0;
-}
+static void httpClearStack(HttpStack *stack) { stack->pos = 0; }
static int32_t httpCleanupStack(HttpStack *stack) {
free(stack->stacks);
@@ -451,7 +438,7 @@ void httpInitParser(HttpParser *parser) {
free(parser->key); parser->key = NULL;
free(parser->val); parser->val = NULL;
free(parser->authContent); parser->authContent = NULL;
-
+
httpClearStack(&parser->stacks);
httpClearString(&parser->str);
httpClearString(&parser->body);
@@ -497,7 +484,7 @@ void httpDestroyParser(HttpParser *parser) {
free(parser->key); parser->key = NULL;
free(parser->val); parser->val = NULL;
free(parser->authContent); parser->authContent = NULL;
-
+
httpCleanupStack(&parser->stacks);
httpCleanupString(&parser->str);
httpCleanupString(&parser->body);
@@ -513,42 +500,53 @@ void httpDestroyParser(HttpParser *parser) {
free(parser);
}
-#define is_token(c) (strchr("!#$%&'*+-.^_`|~", c) || isdigit(c) || isalpha(c))
+#define is_token(c) (strchr("!#$%&'*+-.^_`|~", c) || isdigit(c) || isalpha(c))
char *httpDecodeUrl(const char *enc) {
- int32_t ok = 1;
+ int32_t ok = 1;
HttpString str = {0};
while (*enc) {
char *p = strchr(enc, '%');
if (!p) break;
int32_t hex, cnt;
- int32_t n = sscanf(p+1, "%2x%n", &hex, &cnt);
- if (n!=1 && cnt !=2) { ok = 0; break; }
- if (httpAppendString(&str, enc, p-enc)) { ok = 0; break; }
+ int32_t n = sscanf(p + 1, "%2x%n", &hex, &cnt);
+ if (n != 1 && cnt != 2) {
+ ok = 0;
+ break;
+ }
+ if (httpAppendString(&str, enc, (int32_t)(p - enc))) {
+ ok = 0;
+ break;
+ }
char c = (char)hex;
- if (httpAppendString(&str, &c, 1)) { ok = 0; break; }
- enc = p+3;
+ if (httpAppendString(&str, &c, 1)) {
+ ok = 0;
+ break;
+ }
+ enc = p + 3;
}
char *dec = NULL;
if (ok && *enc) {
- if (httpAppendString(&str, enc, strlen(enc))) { ok = 0; }
+ if (httpAppendString(&str, enc, (int32_t)strlen(enc))) {
+ ok = 0;
+ }
}
if (ok) {
dec = str.str;
str.str = NULL;
}
- httpCleanupString(&str);
+ //httpCleanupString(&str);
return dec;
}
static void httpOnData(ehttp_gzip_t *gzip, void *arg, const char *buf, int32_t len) {
- HttpParser *parser = (HttpParser*)arg;
+ HttpParser *parser = (HttpParser *)arg;
httpOnBody(parser, buf, len);
}
static int32_t httpParserOnBegin(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (c == 'G' || c == 'P' || c == 'H' || c == 'D' || c == 'C' || c == 'O' || c == 'T') {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -570,7 +568,7 @@ static int32_t httpParserOnBegin(HttpParser *parser, HTTP_PARSER_STATE state, co
static int32_t httpParserOnRquestOrResponse(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (parser->str.pos == 1) {
if (c == 'T' && parser->str.str[0] == 'H') {
@@ -608,7 +606,7 @@ static int32_t httpParserOnRquestOrResponse(HttpParser *parser, HTTP_PARSER_STAT
static int32_t httpParserOnMethod(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (isalnum(c) || strchr("!#$%&'*+-.^_`|~", c)) {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -637,7 +635,7 @@ static int32_t httpParserOnMethod(HttpParser *parser, HTTP_PARSER_STATE state, c
static int32_t httpParserOnTarget(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (!isspace(c) && c != '\r' && c != '\n') {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -648,7 +646,7 @@ static int32_t httpParserOnTarget(HttpParser *parser, HTTP_PARSER_STATE state, c
}
break;
}
- parser->target = strdup(parser->str.str);
+ parser->target = httpDecodeUrl(parser->str.str);
if (!parser->target) {
httpError("context:%p, fd:%d, parser state:%d, char:[%c]%02x, oom", pContext, pContext->fd, state, c, c);
ok = -1;
@@ -664,10 +662,10 @@ static int32_t httpParserOnTarget(HttpParser *parser, HTTP_PARSER_STATE state, c
static int32_t httpParserOnVersion(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
const char *prefix = "HTTP/1.";
- int32_t len = strlen(prefix);
+ int32_t len = (int32_t)strlen(prefix);
if (parser->str.pos < len) {
if (prefix[parser->str.pos] != c) {
httpError("context:%p, fd:%d, parser state:%d, unexpected char:[%c]%02x", pContext, pContext->fd, state, c, c);
@@ -717,6 +715,10 @@ static int32_t httpParserOnVersion(HttpParser *parser, HTTP_PARSER_STATE state,
if (parser->method) {
ok = httpOnRequestLine(parser, parser->method, parser->target, parser->version);
+ if (parser->target) {
+ free(parser->target);
+ parser->target = NULL;
+ }
}
httpClearString(&parser->str);
@@ -727,7 +729,7 @@ static int32_t httpParserOnVersion(HttpParser *parser, HTTP_PARSER_STATE state,
static int32_t httpParserOnSp(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (c == ' ') {
httpPopStack(parser);
@@ -742,7 +744,7 @@ static int32_t httpParserOnSp(HttpParser *parser, HTTP_PARSER_STATE state, const
static int32_t httpParserOnStatusCode(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (isdigit(c)) {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -767,7 +769,7 @@ static int32_t httpParserOnStatusCode(HttpParser *parser, HTTP_PARSER_STATE stat
static int32_t httpParserOnReasonPhrase(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (c == '\r') {
parser->reasonPhrase = strdup(parser->str.str);
@@ -808,10 +810,10 @@ static int32_t httpParserPostProcess(HttpParser *parser) {
static int32_t httpParserOnCrlf(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
- const char *s = "\r\n";
- int32_t len = strlen(s);
+ const char *s = "\r\n";
+ int32_t len = (int32_t)strlen(s);
if (s[parser->str.pos] != c) {
httpError("context:%p, fd:%d, parser state:%d, unexpected char:[%c]%02x", pContext, pContext->fd, state, c, c);
ok = -1;
@@ -838,7 +840,7 @@ static int32_t httpParserOnCrlf(HttpParser *parser, HTTP_PARSER_STATE state, con
static int32_t httpParserOnHeader(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (c == '\r') {
httpPopStack(parser);
@@ -876,7 +878,7 @@ static int32_t httpParserOnHeader(HttpParser *parser, HTTP_PARSER_STATE state, c
static int32_t httpParserOnHeaderKey(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (isalnum(c) || strchr("!#$%&'*+-.^_`|~", c)) {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -888,7 +890,7 @@ static int32_t httpParserOnHeaderKey(HttpParser *parser, HTTP_PARSER_STATE state
break;
}
if (c == ':') {
- parser->key = strdup(parser->str.str);
+ parser->key = strdup(parser->str.str);
if (!parser->key) {
httpError("context:%p, fd:%d, parser state:%d, char:[%c]%02x, oom", pContext, pContext->fd, state, c, c);
ok = -1;
@@ -908,7 +910,7 @@ static int32_t httpParserOnHeaderKey(HttpParser *parser, HTTP_PARSER_STATE state
static int32_t httpParserOnHeaderVal(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (c != '\r' && c != '\n' && (!isspace(c) || parser->str.pos > 0)) {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -935,10 +937,10 @@ static int32_t httpParserOnHeaderVal(HttpParser *parser, HTTP_PARSER_STATE state
static int32_t httpParserOnChunkSize(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
- int32_t bytes;
- int32_t len;
- int32_t n;
+ int32_t ok = 0;
+ int32_t bytes;
+ int32_t len;
+ int32_t n;
do {
if (isxdigit(c)) {
if (httpAppendString(&parser->str, &c, 1)) {
@@ -985,7 +987,7 @@ static int32_t httpParserOnChunkSize(HttpParser *parser, HTTP_PARSER_STATE state
static int32_t httpParserOnChunk(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
if (httpAppendString(&parser->str, &c, 1)) {
httpError("context:%p, fd:%d, parser state:%d, char:[%c]%02x, oom", pContext, pContext->fd, state, c, c);
@@ -1019,7 +1021,7 @@ static int32_t httpParserOnChunk(HttpParser *parser, HTTP_PARSER_STATE state, co
static int32_t httpParserOnEnd(HttpParser *parser, HTTP_PARSER_STATE state, const char c, int32_t *again) {
HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ int32_t ok = 0;
do {
ok = -1;
httpError("context:%p, fd:%d, parser state:%d, unexpected char:[%c]%02x", pContext, pContext->fd, state, c, c);
@@ -1029,8 +1031,8 @@ static int32_t httpParserOnEnd(HttpParser *parser, HTTP_PARSER_STATE state, cons
}
static int32_t httpParseChar(HttpParser *parser, const char c, int32_t *again) {
- HttpContext *pContext = parser->pContext;
- int32_t ok = 0;
+ HttpContext * pContext = parser->pContext;
+ int32_t ok = 0;
HTTP_PARSER_STATE state = httpTopStack(parser);
do {
if (state == HTTP_PARSER_BEGIN) {
@@ -1119,9 +1121,9 @@ static int32_t httpParseChar(HttpParser *parser, const char c, int32_t *again) {
int32_t httpParseBuf(HttpParser *parser, const char *buf, int32_t len) {
HttpContext *pContext = parser->pContext;
- const char *p = buf;
- int32_t ret = 0;
- int32_t i = 0;
+ const char * p = buf;
+ int32_t ret = 0;
+ int32_t i = 0;
while (i < len) {
int32_t again = 0;
diff --git a/src/plugins/http/src/httpQueue.c b/src/plugins/http/src/httpQueue.c
index 1c039abb4d..aebba97fb8 100644
--- a/src/plugins/http/src/httpQueue.c
+++ b/src/plugins/http/src/httpQueue.c
@@ -38,16 +38,16 @@ typedef struct {
} SHttpWorkerPool;
typedef struct {
- void * param;
- void * result;
- int32_t code;
- int32_t rows;
+ void * param;
+ void * result;
+ int32_t code;
+ int32_t rows;
FHttpResultFp fp;
} SHttpResult;
static SHttpWorkerPool tsHttpPool;
-static taos_qset tsHttpQset;
-static taos_queue tsHttpQueue;
+static taos_qset tsHttpQset;
+static taos_queue tsHttpQueue;
void httpDispatchToResultQueue(void *param, TAOS_RES *result, int32_t code, int32_t rows, FHttpResultFp fp) {
if (tsHttpQueue != NULL) {
@@ -105,7 +105,7 @@ static bool httpAllocateResultQueue() {
httpDebug("http result worker:%d is launched, total:%d", pWorker->workerId, tsHttpPool.num);
}
- httpInfo("http result queue is opened");
+ httpInfo("http result queue is opened");
return true;
}
@@ -134,14 +134,14 @@ void httpCleanupResultQueue() {
for (int32_t i = 0; i < tsHttpPool.num; ++i) {
SHttpWorker *pWorker = tsHttpPool.httpWorker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsHttpQset);
}
}
for (int32_t i = 0; i < tsHttpPool.num; ++i) {
SHttpWorker *pWorker = tsHttpPool.httpWorker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
}
diff --git a/src/plugins/http/src/httpResp.c b/src/plugins/http/src/httpResp.c
index 72604e79b7..37eef2bfad 100644
--- a/src/plugins/http/src/httpResp.c
+++ b/src/plugins/http/src/httpResp.c
@@ -160,8 +160,9 @@ void httpSendTaosdInvalidSqlErrorResp(HttpContext *pContext, char *errMsg) {
if (temp[i] == '\"') {
temp[i] = '\'';
} else if (temp[i] == '\n') {
- temp[i] = ' ';
- } else {}
+ temp[i] = ' ';
+ } else {
+ }
}
httpSendErrorRespImp(pContext, httpCode, "Bad Request", TSDB_CODE_TSC_INVALID_SQL & 0XFFFF, temp);
diff --git a/src/plugins/http/src/httpRestHandle.c b/src/plugins/http/src/httpRestHandle.c
index 112137b3df..8999fb879e 100644
--- a/src/plugins/http/src/httpRestHandle.c
+++ b/src/plugins/http/src/httpRestHandle.c
@@ -95,7 +95,6 @@ bool restProcessSqlRequest(HttpContext* pContext, int32_t timestampFmt) {
return false;
}
-
/*
* for async test
*
diff --git a/src/plugins/http/src/httpRestJson.c b/src/plugins/http/src/httpRestJson.c
index a5b156bffc..baa61117be 100644
--- a/src/plugins/http/src/httpRestJson.c
+++ b/src/plugins/http/src/httpRestJson.c
@@ -83,7 +83,8 @@ void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result)
httpJsonToken(jsonBuf, JsonArrStt);
}
-bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows, int32_t timestampFormat) {
+bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows,
+ int32_t timestampFormat) {
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
if (jsonBuf == NULL) return false;
@@ -95,7 +96,7 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
if (row == NULL) {
continue;
}
- int32_t* length = taos_fetch_lengths(result);
+ int32_t *length = taos_fetch_lengths(result);
// data row array begin
httpJsonItemToken(jsonBuf);
@@ -131,15 +132,17 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
break;
case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_NCHAR:
- httpJsonStringForTransMean(jsonBuf, (char*)row[i], length[i]);
+ httpJsonStringForTransMean(jsonBuf, (char *)row[i], length[i]);
break;
case TSDB_DATA_TYPE_TIMESTAMP:
if (timestampFormat == REST_TIMESTAMP_FMT_LOCAL_STRING) {
- httpJsonTimestamp(jsonBuf, *((int64_t *)row[i]), taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO);
+ httpJsonTimestamp(jsonBuf, *((int64_t *)row[i]),
+ taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO);
} else if (timestampFormat == REST_TIMESTAMP_FMT_TIMESTAMP) {
httpJsonInt64(jsonBuf, *((int64_t *)row[i]));
} else {
- httpJsonUtcTimestamp(jsonBuf, *((int64_t *)row[i]), taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO);
+ httpJsonUtcTimestamp(jsonBuf, *((int64_t *)row[i]),
+ taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO);
}
break;
default:
@@ -148,8 +151,8 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
}
// data row array end
- httpJsonToken(jsonBuf, JsonArrEnd);
- cmd->numOfRows ++;
+ httpJsonToken(jsonBuf, JsonArrEnd);
+ cmd->numOfRows++;
if (pContext->fd <= 0) {
httpError("context:%p, fd:%d, user:%s, conn closed, abort retrieve", pContext, pContext->fd, pContext->user);
@@ -168,15 +171,15 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
}
bool restBuildSqlTimestampJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
- return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_TIMESTAMP);
+ return restBuildSqlJson(pContext, cmd, result, numOfRows, REST_TIMESTAMP_FMT_TIMESTAMP);
}
bool restBuildSqlLocalTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
- return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_LOCAL_STRING);
+ return restBuildSqlJson(pContext, cmd, result, numOfRows, REST_TIMESTAMP_FMT_LOCAL_STRING);
}
bool restBuildSqlUtcTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
- return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_UTC_STRING);
+ return restBuildSqlJson(pContext, cmd, result, numOfRows, REST_TIMESTAMP_FMT_UTC_STRING);
}
void restStopSqlJson(HttpContext *pContext, HttpSqlCmd *cmd) {
diff --git a/src/plugins/http/src/httpServer.c b/src/plugins/http/src/httpServer.c
index 64dc1514fa..a5f40fdc4c 100644
--- a/src/plugins/http/src/httpServer.c
+++ b/src/plugins/http/src/httpServer.c
@@ -25,17 +25,13 @@
#include "httpResp.h"
#include "httpUtil.h"
-#ifndef EPOLLWAKEUP
- #define EPOLLWAKEUP (1u << 29)
-#endif
-
static bool httpReadData(HttpContext *pContext);
#ifdef __APPLE__
static int sv_dummy = 0;
-#endif // __APPLE__
+#endif
-static void httpStopThread(HttpThread* pThread) {
+static void httpStopThread(HttpThread *pThread) {
pThread->stop = true;
// signal the thread to stop, try graceful method first,
@@ -52,7 +48,7 @@ static void httpStopThread(HttpThread* pThread) {
pThread->stop = true;
r = epoll_ctl(pThread->pollFd, EPOLL_CTL_ADD, sv[0], &ev);
if (r) break;
- if (1!=send(sv[1], "1", 1, 0)) {
+ if (1 != send(sv[1], "1", 1, 0)) {
r = -1;
break;
}
@@ -60,40 +56,39 @@ static void httpStopThread(HttpThread* pThread) {
if (r) {
pthread_cancel(pThread->thread);
}
-#else // __APPLE__
- struct epoll_event event = { .events = EPOLLIN };
- eventfd_t fd = eventfd(1, 0);
+#else
+ struct epoll_event event = {.events = EPOLLIN};
+ eventfd_t fd = eventfd(1, 0);
if (fd == -1) {
- httpError("%s, failed to create eventfd, will call pthread_cancel instead, which may result in data corruption: %s", pThread->label, strerror(errno));
+ httpError("%s, failed to create eventfd, will call pthread_cancel instead, which may result in data corruption: %s",
+ pThread->label, strerror(errno));
pThread->stop = true;
pthread_cancel(pThread->thread);
} else if (epoll_ctl(pThread->pollFd, EPOLL_CTL_ADD, fd, &event) < 0) {
- httpError("%s, failed to call epoll_ctl, will call pthread_cancel instead, which may result in data corruption: %s", pThread->label, strerror(errno));
+ httpError("%s, failed to call epoll_ctl, will call pthread_cancel instead, which may result in data corruption: %s",
+ pThread->label, strerror(errno));
pthread_cancel(pThread->thread);
}
-#endif // __APPLE__
+#endif // __APPLE__
pthread_join(pThread->thread, NULL);
+
#ifdef __APPLE__
- if (sv[0]!=-1) {
+ if (sv[0] != -1) {
close(sv[0]);
sv[0] = -1;
}
- if (sv[1]!=-1) {
+ if (sv[1] != -1) {
close(sv[1]);
sv[1] = -1;
}
-#else // __APPLE__
+#else // __APPLE__
if (fd != -1) {
- close(fd);
+ taosCloseSocket(fd);
}
-#endif // __APPLE__
+#endif // __APPLE__
-#ifdef __APPLE__
- epoll_close(pThread->pollFd);
-#else
- close(pThread->pollFd);
-#endif
+ EpollClose(pThread->pollFd);
pthread_mutex_destroy(&(pThread->threadMutex));
}
@@ -106,7 +101,7 @@ void httpCleanUpConnect() {
}
for (int32_t i = 0; i < pServer->numOfThreads; ++i) {
- HttpThread* pThread = pServer->pThreads + i;
+ HttpThread *pThread = pServer->pThreads + i;
if (pThread != NULL) {
httpStopThread(pThread);
}
@@ -116,15 +111,12 @@ void httpCleanUpConnect() {
}
static void httpProcessHttpData(void *param) {
- HttpServer *pServer = &tsHttpServer;
- HttpThread *pThread = (HttpThread *)param;
+ HttpServer * pServer = &tsHttpServer;
+ HttpThread * pThread = (HttpThread *)param;
HttpContext *pContext;
int32_t fdNum;
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, SIGPIPE);
- pthread_sigmask(SIG_SETMASK, &set, NULL);
+ taosSetMaskSIGPIPE();
while (1) {
struct epoll_event events[HTTP_MAX_EVENTS];
@@ -149,8 +141,8 @@ static void httpProcessHttpData(void *param) {
pContext = httpGetContext(events[i].data.ptr);
if (pContext == NULL) {
httpError("context:%p, is already released, close connect", events[i].data.ptr);
- //epoll_ctl(pThread->pollFd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
- //taosClose(events[i].data.fd);
+ // epoll_ctl(pThread->pollFd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
+ // taosClose(events[i].data.fd);
continue;
}
@@ -207,7 +199,7 @@ static void httpProcessHttpData(void *param) {
}
static void *httpAcceptHttpConnection(void *arg) {
- int32_t connFd = -1;
+ SOCKET connFd = -1;
struct sockaddr_in clientAddr;
int32_t threadId = 0;
HttpServer * pServer = &tsHttpServer;
@@ -215,10 +207,7 @@ static void *httpAcceptHttpConnection(void *arg) {
HttpContext * pContext = NULL;
int32_t totalFds = 0;
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, SIGPIPE);
- pthread_sigmask(SIG_SETMASK, &set, NULL);
+ taosSetMaskSIGPIPE();
pServer->fd = taosOpenTcpServerSocket(pServer->serverIp, pServer->serverPort);
@@ -233,7 +222,12 @@ static void *httpAcceptHttpConnection(void *arg) {
while (1) {
socklen_t addrlen = sizeof(clientAddr);
- connFd = (int32_t)accept(pServer->fd, (struct sockaddr *)&clientAddr, &addrlen);
+ connFd = accept(pServer->fd, (struct sockaddr *)&clientAddr, &addrlen);
+ if (pServer->stop) {
+ httpDebug("http server:%s socket stop, exiting...", pServer->label);
+ break;
+ }
+
if (connFd == -1) {
if (errno == EINVAL) {
httpDebug("http server:%s socket was shutdown, exiting...", pServer->label);
@@ -255,7 +249,7 @@ static void *httpAcceptHttpConnection(void *arg) {
taosCloseSocket(connFd);
continue;
}
-#endif
+#endif
taosKeepTcpAlive(connFd);
taosSetNonblocking(connFd, 1);
@@ -265,22 +259,22 @@ static void *httpAcceptHttpConnection(void *arg) {
pContext = httpCreateContext(connFd);
if (pContext == NULL) {
- httpError("fd:%d, ip:%s:%u, no enough resource to allocate http context", connFd, taosInetNtoa(clientAddr.sin_addr),
- htons(clientAddr.sin_port));
+ httpError("fd:%d, ip:%s:%u, no enough resource to allocate http context", connFd,
+ taosInetNtoa(clientAddr.sin_addr), htons(clientAddr.sin_port));
taosCloseSocket(connFd);
continue;
}
pContext->pThread = pThread;
sprintf(pContext->ipstr, "%s:%u", taosInetNtoa(clientAddr.sin_addr), htons(clientAddr.sin_port));
-
+
struct epoll_event event;
event.events = EPOLLIN | EPOLLPRI | EPOLLWAKEUP | EPOLLERR | EPOLLHUP | EPOLLRDHUP;
event.data.ptr = pContext;
if (epoll_ctl(pThread->pollFd, EPOLL_CTL_ADD, connFd, &event) < 0) {
httpError("context:%p, fd:%d, ip:%s, thread:%s, failed to add http fd for epoll, error:%s", pContext, connFd,
pContext->ipstr, pThread->label, strerror(errno));
- taosClose(pContext->fd);
+ taosCloseSocket(pContext->fd);
httpReleaseContext(pContext, true);
continue;
}
@@ -295,7 +289,7 @@ static void *httpAcceptHttpConnection(void *arg) {
threadId = threadId % pServer->numOfThreads;
}
- close(pServer->fd);
+ taosCloseSocket(pServer->fd);
return NULL;
}
@@ -318,8 +312,8 @@ bool httpInitConnect() {
return false;
}
- pThread->pollFd = epoll_create(HTTP_MAX_EVENTS); // size does not matter
- if (pThread->pollFd < 0) {
+ pThread->pollFd = (EpollFd)epoll_create(HTTP_MAX_EVENTS); // size does not matter
+ if (pThread->pollFd <= 0) {
httpError("http thread:%s, failed to create HTTP epoll", pThread->label);
pthread_mutex_destroy(&(pThread->threadMutex));
return false;
@@ -331,7 +325,7 @@ bool httpInitConnect() {
if (pthread_create(&(pThread->thread), &thattr, (void *)httpProcessHttpData, (void *)(pThread)) != 0) {
httpError("http thread:%s, failed to create HTTP process data thread, reason:%s", pThread->label,
strerror(errno));
- pthread_mutex_destroy(&(pThread->threadMutex));
+ pthread_mutex_destroy(&(pThread->threadMutex));
return false;
}
pthread_attr_destroy(&thattr);
@@ -362,7 +356,7 @@ static bool httpReadData(HttpContext *pContext) {
}
if (pParser->parsed) {
- httpDebug("context:%p, fd:%d, not in ready state, parsed:%d", pContext, pContext->fd, pParser->parsed);
+ httpDebug("context:%p, fd:%d, not in ready state, parsed:%d", pContext, pContext->fd, pParser->parsed);
return false;
}
diff --git a/src/plugins/http/src/httpSession.c b/src/plugins/http/src/httpSession.c
index 35ce0160b2..2e1ee7df2f 100644
--- a/src/plugins/http/src/httpSession.c
+++ b/src/plugins/http/src/httpSession.c
@@ -35,7 +35,8 @@ void httpCreateSession(HttpContext *pContext, void *taos) {
session.refCount = 1;
int32_t len = snprintf(session.id, HTTP_SESSION_ID_LEN, "%s.%s", pContext->user, pContext->pass);
- pContext->session = taosCachePut(server->sessionCache, session.id, len, &session, sizeof(HttpSession), tsHttpSessionExpire * 1000);
+ pContext->session =
+ taosCachePut(server->sessionCache, session.id, len, &session, sizeof(HttpSession), tsHttpSessionExpire * 1000);
// void *temp = pContext->session;
// taosCacheRelease(server->sessionCache, (void **)&temp, false);
@@ -56,7 +57,7 @@ static void httpFetchSessionImp(HttpContext *pContext) {
HttpServer *server = &tsHttpServer;
pthread_mutex_lock(&server->serverMutex);
- char sessionId[HTTP_SESSION_ID_LEN];
+ char sessionId[HTTP_SESSION_ID_LEN];
int32_t len = snprintf(sessionId, HTTP_SESSION_ID_LEN, "%s.%s", pContext->user, pContext->pass);
pContext->session = taosCacheAcquireByKey(server->sessionCache, sessionId, len);
diff --git a/src/plugins/http/src/httpSql.c b/src/plugins/http/src/httpSql.c
index cc8e9e86e3..4e9b54b7bd 100644
--- a/src/plugins/http/src/httpSql.c
+++ b/src/plugins/http/src/httpSql.c
@@ -64,7 +64,7 @@ void httpProcessMultiSqlRetrieveCallBackImp(void *param, TAOS_RES *result, int32
}
taos_free_result(result);
-
+
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN && encode->stopJsonFp) {
(encode->stopJsonFp)(pContext, singleCmd);
}
@@ -82,7 +82,7 @@ void httpProcessMultiSqlCallBackImp(void *param, TAOS_RES *result, int32_t code,
HttpContext *pContext = (HttpContext *)param;
if (pContext == NULL) return;
- HttpSqlCmds *multiCmds = pContext->multiCmds;
+ HttpSqlCmds * multiCmds = pContext->multiCmds;
HttpEncodeMethod *encode = pContext->encodeMethod;
HttpSqlCmd *singleCmd = multiCmds->cmds + multiCmds->pos;
@@ -269,8 +269,8 @@ void httpProcessSingleSqlCallBackImp(void *param, TAOS_RES *result, int32_t code
pContext->user, tstrerror(code), pObj, taos_errstr(pObj));
httpSendTaosdInvalidSqlErrorResp(pContext, taos_errstr(pObj));
} else {
- httpError("context:%p, fd:%d, user:%s, query error, code:%s, sqlObj:%p", pContext, pContext->fd,
- pContext->user, tstrerror(code), pObj);
+ httpError("context:%p, fd:%d, user:%s, query error, code:%s, sqlObj:%p", pContext, pContext->fd, pContext->user,
+ tstrerror(code), pObj);
httpSendErrorResp(pContext, code);
}
taos_free_result(result);
@@ -381,7 +381,7 @@ void httpExecCmd(HttpContext *pContext) {
void httpProcessRequestCb(void *param, TAOS_RES *result, int32_t code) {
HttpContext *pContext = param;
taos_free_result(result);
-
+
if (pContext == NULL) return;
if (code < 0) {
diff --git a/src/plugins/http/src/httpSystem.c b/src/plugins/http/src/httpSystem.c
index 34a70a658b..4721451529 100644
--- a/src/plugins/http/src/httpSystem.c
+++ b/src/plugins/http/src/httpSystem.c
@@ -89,7 +89,12 @@ int32_t httpStartSystem() {
void httpStopSystem() {
tsHttpServer.status = HTTP_SERVER_CLOSING;
+ tsHttpServer.stop = 1;
+#ifdef WINDOWS
+ closesocket(tsHttpServer.fd);
+#else
shutdown(tsHttpServer.fd, SHUT_RD);
+#endif
tgCleanupHandle();
}
@@ -105,10 +110,8 @@ void httpCleanUpSystem() {
pthread_mutex_destroy(&tsHttpServer.serverMutex);
tfree(tsHttpServer.pThreads);
tsHttpServer.pThreads = NULL;
-
+
tsHttpServer.status = HTTP_SERVER_CLOSED;
}
-int32_t httpGetReqCount() {
- return atomic_exchange_32(&tsHttpServer.requestNum, 0);
-}
+int32_t httpGetReqCount() { return atomic_exchange_32(&tsHttpServer.requestNum, 0); }
diff --git a/src/plugins/http/src/httpTgHandle.c b/src/plugins/http/src/httpTgHandle.c
index bae8c44490..c1d006ff5a 100644
--- a/src/plugins/http/src/httpTgHandle.c
+++ b/src/plugins/http/src/httpTgHandle.c
@@ -137,8 +137,8 @@ void tgInitSchemas(int32_t size) {
}
void tgParseSchemaMetric(cJSON *metric) {
- STgSchema schema = {0};
- bool parsedOk = true;
+ STgSchema schema = {0};
+ bool parsedOk = true;
// name
cJSON *name = cJSON_GetObjectItem(metric, "name");
@@ -186,7 +186,7 @@ void tgParseSchemaMetric(cJSON *metric) {
schema.tbName = calloc(tbnameLen + 1, 1);
strcpy(schema.tbName, tbname->valuestring);
- // fields
+ // fields
cJSON *fields = cJSON_GetObjectItem(metric, "fields");
if (fields == NULL) {
goto ParseEnd;
@@ -227,14 +227,14 @@ ParseEnd:
}
}
-int32_t tgParseSchema(const char *content, char*fileName) {
+int32_t tgParseSchema(const char *content, char *fileName) {
cJSON *root = cJSON_Parse(content);
if (root == NULL) {
httpError("failed to parse telegraf schema file:%s, invalid json format, content:%s", fileName, content);
return -1;
}
int32_t size = 0;
- cJSON *metrics = cJSON_GetObjectItem(root, "metrics");
+ cJSON * metrics = cJSON_GetObjectItem(root, "metrics");
if (metrics != NULL) {
size = cJSON_GetArraySize(metrics);
if (size <= 0) {
@@ -276,8 +276,8 @@ int32_t tgReadSchema(char *fileName) {
rewind(fp);
char * content = (char *)calloc(contentSize + 1, 1);
- int32_t result = fread(content, 1, contentSize, fp);
-
+ int32_t result = (int32_t)fread(content, 1, contentSize, fp);
+
if (result != contentSize) {
httpError("failed to read telegraf schema file:%s", fileName);
fclose(fp);
@@ -296,7 +296,7 @@ int32_t tgReadSchema(char *fileName) {
}
void tgInitHandle(HttpServer *pServer) {
- char fileName[TSDB_FILENAME_LEN*2] = {0};
+ char fileName[TSDB_FILENAME_LEN * 2] = {0};
sprintf(fileName, "%s/taos.telegraf.cfg", configDir);
if (tgReadSchema(fileName) <= 0) {
tgFreeSchemas();
@@ -308,9 +308,7 @@ void tgInitHandle(HttpServer *pServer) {
httpAddMethod(pServer, &tgDecodeMethod);
}
-void tgCleanupHandle() {
- tgFreeSchemas();
-}
+void tgCleanupHandle() { tgFreeSchemas(); }
bool tgGetUserFromUrl(HttpContext *pContext) {
HttpParser *pParser = pContext->parser;
@@ -357,7 +355,7 @@ char *tgGetStableName(char *stname, cJSON *fields, int32_t fieldsSize) {
bool schemaMatched = true;
for (int32_t f = 0; f < schema->fieldNum; ++f) {
char *fieldName = schema->fields[f];
- bool fieldMatched = false;
+ bool fieldMatched = false;
for (int32_t i = 0; i < fieldsSize; i++) {
cJSON *field = cJSON_GetArrayItem(fields, i);
@@ -469,9 +467,9 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
}
/*
- * tag size may be larget than TSDB_COL_NAME_LEN
- * we keep the first TSDB_COL_NAME_LEN bytes
- */
+ * tag size may be larget than TSDB_COL_NAME_LEN
+ * we keep the first TSDB_COL_NAME_LEN bytes
+ */
if (0) {
if (strlen(tag->string) >= TSDB_COL_NAME_LEN) {
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_NAME_SIZE);
@@ -540,9 +538,9 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
return false;
}
/*
- * tag size may be larget than TSDB_COL_NAME_LEN
- * we keep the first TSDB_COL_NAME_LEN bytes
- */
+ * tag size may be larget than TSDB_COL_NAME_LEN
+ * we keep the first TSDB_COL_NAME_LEN bytes
+ */
if (0) {
if (strlen(field->string) >= TSDB_COL_NAME_LEN) {
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_NAME_SIZE);
@@ -578,8 +576,8 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
table_cmd->cmdType = HTTP_CMD_TYPE_INSERT;
// order by tag name
- cJSON *orderedTags[TG_MAX_SORT_TAG_SIZE] = {0};
- int32_t orderTagsLen = 0;
+ cJSON * orderedTags[TG_MAX_SORT_TAG_SIZE] = {0};
+ int32_t orderTagsLen = 0;
for (int32_t i = 0; i < tagsSize; ++i) {
cJSON *tag = cJSON_GetArrayItem(tags, i);
orderedTags[orderTagsLen++] = tag;
@@ -603,7 +601,8 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
if (tsTelegrafUseFieldNum == 0) {
table_cmd->stable = stable_cmd->stable = httpAddToSqlCmdBuffer(pContext, "%s", stname);
} else {
- table_cmd->stable = stable_cmd->stable = httpAddToSqlCmdBuffer(pContext, "%s_%d_%d", stname, fieldsSize, orderTagsLen);
+ table_cmd->stable = stable_cmd->stable =
+ httpAddToSqlCmdBuffer(pContext, "%s_%d_%d", stname, fieldsSize, orderTagsLen);
}
table_cmd->stable = stable_cmd->stable =
httpShrinkTableName(pContext, table_cmd->stable, httpGetCmdsString(pContext, table_cmd->stable));
@@ -627,9 +626,11 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
// table name
if (tsTelegrafUseFieldNum == 0) {
- table_cmd->table = stable_cmd->table = httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%s", stname, host->valuestring);
+ table_cmd->table = stable_cmd->table =
+ httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%s", stname, host->valuestring);
} else {
- table_cmd->table = stable_cmd->table = httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%d_%d_%s", stname, fieldsSize, orderTagsLen, host->valuestring);
+ table_cmd->table = stable_cmd->table =
+ httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%d_%d_%s", stname, fieldsSize, orderTagsLen, host->valuestring);
}
for (int32_t i = 0; i < orderTagsLen; ++i) {
cJSON *tag = orderedTags[i];
diff --git a/src/plugins/http/src/httpUtil.c b/src/plugins/http/src/httpUtil.c
index 39168ee96d..7f1e2a94d1 100644
--- a/src/plugins/http/src/httpUtil.c
+++ b/src/plugins/http/src/httpUtil.c
@@ -37,7 +37,7 @@ void httpTimeToString(time_t t, char *buf, int32_t buflen) {
time_t tt = t / 1000;
ptm = localtime(&tt);
strftime(ts, 31, "%Y-%m-%d %H:%M:%S", ptm);
- sprintf(buf, "%s.%03ld", ts, t % 1000);
+ sprintf(buf, "%s.%03" PRId64, ts, t % 1000);
}
int32_t httpAddToSqlCmdBuffer(HttpContext *pContext, const char *const format, ...) {
@@ -160,8 +160,7 @@ bool httpMallocMultiCmds(HttpContext *pContext, int32_t cmdSize, int32_t bufferS
free(multiCmds->cmds);
multiCmds->cmds = (HttpSqlCmd *)malloc((size_t)cmdSize * sizeof(HttpSqlCmd));
if (multiCmds->cmds == NULL) {
- httpError("context:%p, fd:%d, user:%s, malloc cmds:%d error", pContext, pContext->fd,
- pContext->user, cmdSize);
+ httpError("context:%p, fd:%d, user:%s, malloc cmds:%d error", pContext, pContext->fd, pContext->user, cmdSize);
return false;
}
multiCmds->maxSize = (int16_t)cmdSize;
@@ -350,74 +349,78 @@ char *httpGetCmdsString(HttpContext *pContext, int32_t pos) {
}
int32_t httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData) {
- int32_t err = 0;
+ int32_t err = 0;
z_stream gzipStream = {0};
static char dummyHead[2] = {
- 0x8 + 0x7 * 0x10,
- (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
+ 0x8 + 0x7 * 0x10,
+ (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
};
- gzipStream.zalloc = (alloc_func) 0;
- gzipStream.zfree = (free_func) 0;
- gzipStream.opaque = (voidpf) 0;
- gzipStream.next_in = (Bytef *) srcData;
+ gzipStream.zalloc = (alloc_func)0;
+ gzipStream.zfree = (free_func)0;
+ gzipStream.opaque = (voidpf)0;
+ gzipStream.next_in = (Bytef *)srcData;
gzipStream.avail_in = 0;
- gzipStream.next_out = (Bytef *) destData;
+ gzipStream.next_out = (Bytef *)destData;
if (inflateInit2(&gzipStream, 47) != Z_OK) {
return -1;
}
while (gzipStream.total_out < *nDestData && gzipStream.total_in < nSrcData) {
- gzipStream.avail_in = gzipStream.avail_out = nSrcData; //1
+ gzipStream.avail_in = gzipStream.avail_out = nSrcData; // 1
if ((err = inflate(&gzipStream, Z_NO_FLUSH)) == Z_STREAM_END) {
break;
}
if (err != Z_OK) {
if (err == Z_DATA_ERROR) {
- gzipStream.next_in = (Bytef *) dummyHead;
+ gzipStream.next_in = (Bytef *)dummyHead;
gzipStream.avail_in = sizeof(dummyHead);
if ((err = inflate(&gzipStream, Z_NO_FLUSH)) != Z_OK) {
return -2;
}
- } else return -3;
+ } else {
+ return -3;
+ }
}
}
if (inflateEnd(&gzipStream) != Z_OK) {
return -4;
}
- *nDestData = gzipStream.total_out;
+ *nDestData = (int32_t)gzipStream.total_out;
return 0;
}
int32_t httpGzipCompressInit(HttpContext *pContext) {
- pContext->gzipStream.zalloc = (alloc_func) 0;
- pContext->gzipStream.zfree = (free_func) 0;
- pContext->gzipStream.opaque = (voidpf) 0;
- if (deflateInit2(&pContext->gzipStream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
+ pContext->gzipStream.zalloc = (alloc_func)0;
+ pContext->gzipStream.zfree = (free_func)0;
+ pContext->gzipStream.opaque = (voidpf)0;
+ if (deflateInit2(&pContext->gzipStream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) !=
+ Z_OK) {
return -1;
}
return 0;
}
-int32_t httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData, bool isTheLast) {
+int32_t httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData,
+ bool isTheLast) {
int32_t err = 0;
- int32_t lastTotalLen = (int32_t) (pContext->gzipStream.total_out);
- pContext->gzipStream.next_in = (Bytef *) srcData;
- pContext->gzipStream.avail_in = (uLong) nSrcData;
- pContext->gzipStream.next_out = (Bytef *) destData;
- pContext->gzipStream.avail_out = (uLong) (*nDestData);
+ int32_t lastTotalLen = (int32_t)(pContext->gzipStream.total_out);
+ pContext->gzipStream.next_in = (Bytef *)srcData;
+ pContext->gzipStream.avail_in = (uLong)nSrcData;
+ pContext->gzipStream.next_out = (Bytef *)destData;
+ pContext->gzipStream.avail_out = (uLong)(*nDestData);
while (pContext->gzipStream.avail_in != 0) {
if (deflate(&pContext->gzipStream, Z_FULL_FLUSH) != Z_OK) {
return -1;
}
- int32_t cacheLen = pContext->gzipStream.total_out - lastTotalLen;
+ int32_t cacheLen = (int32_t)(pContext->gzipStream.total_out - lastTotalLen);
if (cacheLen >= *nDestData) {
return -2;
}
@@ -442,12 +445,12 @@ int32_t httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData,
}
}
- *nDestData = (int32_t) (pContext->gzipStream.total_out) - lastTotalLen;
+ *nDestData = (int32_t)(pContext->gzipStream.total_out) - lastTotalLen;
return 0;
}
-bool httpUrlMatch(HttpContext* pContext, int32_t pos, char* cmp) {
- HttpParser* pParser = pContext->parser;
+bool httpUrlMatch(HttpContext *pContext, int32_t pos, char *cmp) {
+ HttpParser *pParser = pContext->parser;
if (pos < 0 || pos >= HTTP_MAX_URL) {
return false;
diff --git a/src/plugins/monitor/CMakeLists.txt b/src/plugins/monitor/CMakeLists.txt
index 6b26c0447a..abab07e0cd 100644
--- a/src/plugins/monitor/CMakeLists.txt
+++ b/src/plugins/monitor/CMakeLists.txt
@@ -6,22 +6,10 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
AUX_SOURCE_DIRECTORY(./src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(monitor ${SRC})
+ADD_LIBRARY(monitor ${SRC})
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(monitor taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(monitor taos)
- ENDIF ()
-ENDIF ()
-
-IF (TD_DARWIN)
- ADD_LIBRARY(monitor ${SRC})
-
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(monitor taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(monitor taos)
- ENDIF ()
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(monitor taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(monitor taos)
ENDIF ()
diff --git a/src/plugins/monitor/src/monMain.c b/src/plugins/monitor/src/monMain.c
index 3b0b6a2fef..f61298fb83 100644
--- a/src/plugins/monitor/src/monMain.c
+++ b/src/plugins/monitor/src/monMain.c
@@ -79,8 +79,8 @@ int32_t monInitSystem() {
strcpy(tsMonitor.ep, tsLocalEp);
}
- int len = strlen(tsMonitor.ep);
- for (int i = 0; i < len; ++i) {
+ int32_t len = (int32_t)strlen(tsMonitor.ep);
+ for (int32_t i = 0; i < len; ++i) {
if (tsMonitor.ep[i] == ':' || tsMonitor.ep[i] == '-' || tsMonitor.ep[i] == '.') {
tsMonitor.ep[i] = '_';
}
@@ -148,7 +148,7 @@ static void *monThreadFunc(void *param) {
}
if (tsMonitor.state == MON_STATE_NOT_INIT) {
- int code = 0;
+ int32_t code = 0;
for (; tsMonitor.cmdIndex < MON_CMD_MAX; ++tsMonitor.cmdIndex) {
monBuildMonitorSql(tsMonitor.sql, tsMonitor.cmdIndex);
@@ -333,7 +333,7 @@ static void monSaveSystemInfo() {
pos += monBuildReqSql(sql + pos);
void *res = taos_query(tsMonitor.conn, tsMonitor.sql);
- int code = taos_errno(res);
+ int32_t code = taos_errno(res);
taos_free_result(res);
if (code != 0) {
diff --git a/src/query/inc/tsqlfunction.h b/src/query/inc/qAggMain.h
similarity index 97%
rename from src/query/inc/tsqlfunction.h
rename to src/query/inc/qAggMain.h
index 51048bbe72..53af502e27 100644
--- a/src/query/inc/tsqlfunction.h
+++ b/src/query/inc/qAggMain.h
@@ -13,8 +13,8 @@
* along with this program. If not, see .
*/
-#ifndef TDENGINE_TSQLFUNCTION_H
-#define TDENGINE_TSQLFUNCTION_H
+#ifndef TDENGINE_QAGGMAIN_H
+#define TDENGINE_QAGGMAIN_H
#ifdef __cplusplus
extern "C" {
@@ -97,11 +97,7 @@ extern "C" {
#define DATA_SET_FLAG ',' // to denote the output area has data, not null value
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)
-#define QUERY_COND_REL_PREFIX_IN "IN|"
-#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
-#define QUERY_COND_REL_PREFIX_IN_LEN 3
-#define QUERY_COND_REL_PREFIX_LIKE_LEN 5
#define QUERY_ASC_FORWARD_STEP 1
#define QUERY_DESC_FORWARD_STEP -1
@@ -153,7 +149,7 @@ typedef struct SResultRowCellInfo {
typedef struct SPoint1 {
int64_t key;
- double val;
+ union{double val; char* ptr;};
} SPoint1;
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowCellInfo)))
@@ -279,4 +275,4 @@ static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, uint32_t b
}
#endif
-#endif // TDENGINE_TSQLFUNCTION_H
+#endif // TDENGINE_QAGGMAIN_H
diff --git a/src/query/inc/qExecutor.h b/src/query/inc/qExecutor.h
index 79d98432c8..87c16f2ee4 100644
--- a/src/query/inc/qExecutor.h
+++ b/src/query/inc/qExecutor.h
@@ -18,6 +18,7 @@
#include "os.h"
#include "hash.h"
+#include "qAggMain.h"
#include "qFill.h"
#include "qResultbuf.h"
#include "qSqlparser.h"
@@ -27,7 +28,6 @@
#include "tarray.h"
#include "tlockfree.h"
#include "tsdb.h"
-#include "tsqlfunction.h"
struct SColumnFilterElem;
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
@@ -164,13 +164,14 @@ typedef struct SQuery {
SColumnInfo* tagColList;
int32_t numOfFilterCols;
int64_t* fillVal;
- uint32_t status; // query status
+ uint32_t status; // query status
SResultRec rec;
int32_t pos;
tFilePage** sdata;
STableQueryInfo* current;
+ int32_t numOfCheckedBlocks; // number of check data blocks
- SOrderedPrjQueryInfo prjInfo; // limit value for each vgroup, only available in global order projection query.
+ SOrderedPrjQueryInfo prjInfo; // limit value for each vgroup, only available in global order projection query.
SSingleColumnFilterInfo* pFilterInfo;
} SQuery;
@@ -194,6 +195,7 @@ typedef struct SQueryRuntimeEnv {
bool hasTagResults; // if there are tag values in final result or not
bool timeWindowInterpo;// if the time window start/end required interpolation
bool queryWindowIdentical; // all query time windows are identical for all tables in one group
+ bool queryBlockDist; // if query data block distribution
int32_t interBufSize; // intermediate buffer sizse
int32_t prevGroupId; // previous executed group id
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
diff --git a/src/query/inc/qFill.h b/src/query/inc/qFill.h
index 93537ec3da..9b7f0fb529 100644
--- a/src/query/inc/qFill.h
+++ b/src/query/inc/qFill.h
@@ -86,7 +86,7 @@ bool taosFillHasMoreResults(SFillInfo* pFillInfo);
int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows);
-int32_t taosGetLinearInterpolationVal(int32_t type, SPoint *point1, SPoint *point2, SPoint *point);
+int32_t taosGetLinearInterpolationVal(SPoint* point, int32_t outputType, SPoint* point1, SPoint* point2, int32_t inputType);
int64_t taosFillResultDataBlock(SFillInfo* pFillInfo, tFilePage** output, int32_t capacity);
diff --git a/src/query/inc/qSqlparser.h b/src/query/inc/qSqlparser.h
index c225ebd44a..77647813d6 100644
--- a/src/query/inc/qSqlparser.h
+++ b/src/query/inc/qSqlparser.h
@@ -200,6 +200,7 @@ typedef struct tSQLExpr {
typedef struct tSqlExprItem {
tSQLExpr *pNode; // The list of expressions
char * aliasName; // alias name, null-terminated string
+ bool distinct;
} tSqlExprItem;
// todo refactor by using SArray
@@ -232,7 +233,7 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType);
void tSqlExprDestroy(tSQLExpr *pExpr);
-tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pToken);
+tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pDistinct, SStrToken *pToken);
void tSqlExprListDestroy(tSQLExprList *pList);
diff --git a/src/query/inc/sql.y b/src/query/inc/sql.y
index 2a4a91ac3a..cd02d4fb00 100644
--- a/src/query/inc/sql.y
+++ b/src/query/inc/sql.y
@@ -161,7 +161,7 @@ cmd ::= ALTER DNODE ids(X) ids(Y). { setDCLSQLElems(pInfo, TSDB_SQL
cmd ::= ALTER DNODE ids(X) ids(Y) ids(Z). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 3, &X, &Y, &Z); }
cmd ::= ALTER LOCAL ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 1, &X); }
cmd ::= ALTER LOCAL ids(X) ids(Y). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &X, &Y); }
-cmd ::= ALTER DATABASE ids(X) alter_db_optr(Y). { SStrToken t = {0}; setCreateDBSQL(pInfo, TSDB_SQL_ALTER_DB, &X, &Y, &t);}
+cmd ::= ALTER DATABASE ids(X) alter_db_optr(Y). { SStrToken t = {0}; setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &X, &Y, &t);}
cmd ::= ALTER ACCOUNT ids(X) acct_optr(Z). { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &X, NULL, &Z);}
cmd ::= ALTER ACCOUNT ids(X) PASS ids(Y) acct_optr(Z). { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &X, &Y, &Z);}
@@ -186,7 +186,7 @@ ifnotexists(X) ::= . { X.n = 0;}
cmd ::= CREATE DNODE ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &X);}
cmd ::= CREATE ACCOUNT ids(X) PASS ids(Y) acct_optr(Z).
{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &X, &Y, &Z);}
-cmd ::= CREATE DATABASE ifnotexists(Z) ids(X) db_optr(Y). { setCreateDBSQL(pInfo, TSDB_SQL_CREATE_DB, &X, &Y, &Z);}
+cmd ::= CREATE DATABASE ifnotexists(Z) ids(X) db_optr(Y). { setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &X, &Y, &Z);}
cmd ::= CREATE USER ids(X) PASS ids(Y). { setCreateUserSql(pInfo, &X, &Y);}
pps(Y) ::= . { Y.n = 0; }
@@ -457,13 +457,13 @@ select(A) ::= SELECT(T) selcollist(W). {
%destructor sclp {tSqlExprListDestroy($$);}
sclp(A) ::= selcollist(X) COMMA. {A = X;}
sclp(A) ::= . {A = 0;}
-selcollist(A) ::= sclp(P) expr(X) as(Y). {
- A = tSqlExprListAppend(P, X, Y.n?&Y:0);
+selcollist(A) ::= sclp(P) distinct(Z) expr(X) as(Y). {
+ A = tSqlExprListAppend(P, X, Z.n? &Z:0, Y.n?&Y:0);
}
selcollist(A) ::= sclp(P) STAR. {
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
- A = tSqlExprListAppend(P, pNode, 0);
+ A = tSqlExprListAppend(P, pNode, 0, 0);
}
// An option "AS " phrase that can follow one of the expressions that
@@ -474,6 +474,10 @@ as(X) ::= AS ids(Y). { X = Y; }
as(X) ::= ids(Y). { X = Y; }
as(X) ::= . { X.n = 0; }
+%type distinct {SStrToken}
+distinct(X) ::= DISTINCT(Y). { X = Y; }
+distinct(X) ::= . { X.n = 0;}
+
// A complete FROM clause.
%type from {SArray*}
// current not support query from no-table
@@ -681,8 +685,8 @@ expr(A) ::= expr(X) IN LP exprlist(Y) RP. {A = tSqlExprCreate(X, (tSQLExpr*)Y,
%type expritem {tSQLExpr*}
%destructor expritem {tSqlExprDestroy($$);}
-exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSqlExprListAppend(X,Y,0);}
-exprlist(A) ::= expritem(X). {A = tSqlExprListAppend(0,X,0);}
+exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSqlExprListAppend(X,Y,0, 0);}
+exprlist(A) ::= expritem(X). {A = tSqlExprListAppend(0,X,0, 0);}
expritem(A) ::= expr(X). {A = X;}
expritem(A) ::= . {A = 0;}
diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c
index 543b205112..12c8a16f1f 100644
--- a/src/query/src/qAggMain.c
+++ b/src/query/src/qAggMain.c
@@ -14,17 +14,17 @@
*/
#include "os.h"
-#include "qAst.h"
+#include "taosdef.h"
+#include "taosmsg.h"
+#include "texpr.h"
+#include "ttype.h"
+
+#include "qAggMain.h"
#include "qFill.h"
#include "qHistogram.h"
#include "qPercentile.h"
#include "qTsbuf.h"
-#include "taosdef.h"
-#include "taosmsg.h"
#include "queryLog.h"
-#include "tscSubquery.h"
-#include "tsqlfunction.h"
-#include "ttype.h"
#define GET_INPUT_DATA_LIST(x) (((char *)((x)->aInputElemBuf)) + ((x)->startOffset) * ((x)->inputBytes))
#define GET_INPUT_DATA(x, y) (GET_INPUT_DATA_LIST(x) + (y) * (x)->inputBytes)
@@ -3776,89 +3776,67 @@ void twa_function_finalizer(SQLFunctionCtx *pCtx) {
*
* @param pCtx
*/
-static void interp_function(SQLFunctionCtx *pCtx) {
- // at this point, the value is existed, return directly
- SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
- SInterpInfoDetail* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
- assert(pCtx->startOffset == 0);
+static void interp_function_impl(SQLFunctionCtx *pCtx) {
+ int32_t type = (int32_t) pCtx->param[2].i64;
+ if (type == TSDB_FILL_NONE) {
+ return;
+ }
- if (pCtx->size == 1) {
- char *pData = GET_INPUT_DATA_LIST(pCtx);
- assignVal(pCtx->aOutputBuf, pData, pCtx->inputBytes, pCtx->inputType);
+ if (pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP) {
+ *(TSKEY *) pCtx->aOutputBuf = pCtx->nStartQueryTimestamp;
} else {
- /*
- * use interpolation to generate the result.
- * Note: the result of primary timestamp column uses the timestamp specified by user in the query sql
- */
- assert(pCtx->size == 2);
- if (pInfo->type == TSDB_FILL_NONE) { // set no output result
+ if (pCtx->start.key == INT64_MIN) {
+ assert(pCtx->end.key == INT64_MIN);
return;
}
-
- if (pInfo->primaryCol == 1) {
- *(TSKEY *) pCtx->aOutputBuf = pInfo->ts;
- } else {
- if (pInfo->type == TSDB_FILL_NULL) {
- if (pCtx->outputType == TSDB_DATA_TYPE_BINARY || pCtx->outputType == TSDB_DATA_TYPE_NCHAR) {
- setVardataNull(pCtx->aOutputBuf, pCtx->outputType);
+
+ if (type == TSDB_FILL_NULL) {
+ setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
+ } else if (type == TSDB_FILL_SET_VALUE) {
+ tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true);
+ } else if (type == TSDB_FILL_PREV) {
+ if (IS_NUMERIC_TYPE(pCtx->inputType) || pCtx->inputType == TSDB_DATA_TYPE_BOOL) {
+ SET_TYPED_DATA(pCtx->aOutputBuf, pCtx->inputType, pCtx->start.val);
+ } else {
+ assignVal(pCtx->aOutputBuf, pCtx->start.ptr, pCtx->outputBytes, pCtx->inputType);
+ }
+ } else if (type == TSDB_FILL_LINEAR) {
+ SPoint point1 = {.key = pCtx->start.key, .val = &pCtx->start.val};
+ SPoint point2 = {.key = pCtx->end.key, .val = &pCtx->end.val};
+ SPoint point = {.key = pCtx->nStartQueryTimestamp, .val = pCtx->aOutputBuf};
+
+ int32_t srcType = pCtx->inputType;
+ if (IS_NUMERIC_TYPE(srcType)) { // TODO should find the not null data?
+ if (isNull((char *)&pCtx->start.val, srcType) || isNull((char *)&pCtx->end.val, srcType)) {
+ setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} else {
- setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
- }
-
- SET_VAL(pCtx, pCtx->size, 1);
- } else if (pInfo->type == TSDB_FILL_SET_VALUE) {
- tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true);
- } else if (pInfo->type == TSDB_FILL_PREV) {
- char *data = GET_INPUT_DATA(pCtx, 0);
- assignVal(pCtx->aOutputBuf, data, pCtx->outputBytes, pCtx->outputType);
-
- SET_VAL(pCtx, pCtx->size, 1);
- } else if (pInfo->type == TSDB_FILL_LINEAR) {
- char *data1 = GET_INPUT_DATA(pCtx, 0);
- char *data2 = GET_INPUT_DATA(pCtx, 1);
-
- TSKEY key1 = pCtx->ptsList[0];
- TSKEY key2 = pCtx->ptsList[1];
-
- SPoint point1 = {.key = key1, .val = data1};
- SPoint point2 = {.key = key2, .val = data2};
-
- SPoint point = {.key = pInfo->ts, .val = pCtx->aOutputBuf};
-
- int32_t srcType = pCtx->inputType;
- if ((srcType >= TSDB_DATA_TYPE_TINYINT && srcType <= TSDB_DATA_TYPE_BIGINT) ||
- srcType == TSDB_DATA_TYPE_TIMESTAMP || srcType == TSDB_DATA_TYPE_DOUBLE) {
- point1.val = data1;
- point2.val = data2;
-
- if (isNull(data1, srcType) || isNull(data2, srcType)) {
- setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
- } else {
- taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point);
- }
- } else if (srcType == TSDB_DATA_TYPE_FLOAT) {
- point1.val = data1;
- point2.val = data2;
-
- if (isNull(data1, srcType) || isNull(data2, srcType)) {
- setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
- } else {
- taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point);
- }
-
- } else {
- if (srcType == TSDB_DATA_TYPE_BINARY || srcType == TSDB_DATA_TYPE_NCHAR) {
- setVardataNull(pCtx->aOutputBuf, pCtx->inputType);
- } else {
- setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
- }
+ taosGetLinearInterpolationVal(&point, pCtx->outputType, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
}
+ } else {
+ setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
}
}
}
-
- SET_VAL(pCtx, pCtx->size, 1);
+
+ SET_VAL(pCtx, 1, 1);
+
+}
+static void interp_function(SQLFunctionCtx *pCtx) {
+ // at this point, the value is existed, return directly
+ if (pCtx->size > 0) {
+ // impose the timestamp check
+ TSKEY key = GET_TS_DATA(pCtx, 0);
+ if (key == pCtx->nStartQueryTimestamp) {
+ char *pData = GET_INPUT_DATA(pCtx, 0);
+ assignVal(pCtx->aOutputBuf, pData, pCtx->inputBytes, pCtx->inputType);
+ SET_VAL(pCtx, 1, 1);
+ } else {
+ interp_function_impl(pCtx);
+ }
+ } else { //no qualified data rows and interpolation is required
+ interp_function_impl(pCtx);
+ }
}
static bool ts_comp_function_setup(SQLFunctionCtx *pCtx) {
diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c
index f8b5d0497a..63b2f3ea15 100644
--- a/src/query/src/qExecutor.c
+++ b/src/query/src/qExecutor.c
@@ -20,7 +20,7 @@
#include "exception.h"
#include "hash.h"
-#include "qAst.h"
+#include "texpr.h"
#include "qExecutor.h"
#include "qResultbuf.h"
#include "qUtil.h"
@@ -28,6 +28,7 @@
#include "queryLog.h"
#include "tlosertree.h"
#include "ttype.h"
+#include "tcompare.h"
#define MAX_ROWS_PER_RESBUF_PAGE ((1u<<12) - 1)
@@ -90,6 +91,13 @@ typedef struct {
STSCursor cur;
} SQueryStatusInfo;
+typedef struct {
+ SArray *dataBlockInfos;
+ int64_t firstSeekTimeUs;
+ int64_t numOfRowsInMemTable;
+ char *result;
+} STableBlockDist;
+
#if 0
static UNUSED_FUNC void *u_malloc (size_t __size) {
uint32_t v = rand();
@@ -408,7 +416,7 @@ static bool isTopBottomQuery(SQuery *pQuery) {
static bool timeWindowInterpoRequired(SQuery *pQuery) {
for(int32_t i = 0; i < pQuery->numOfOutput; ++i) {
int32_t functionId = pQuery->pExpr1[i].base.functionId;
- if (functionId == TSDB_FUNC_TWA) {
+ if (functionId == TSDB_FUNC_TWA || functionId == TSDB_FUNC_INTERP) {
return true;
}
}
@@ -818,6 +826,7 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo
return num;
}
+// TODO decouple the data block and the SQLFunctionCtx
static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow *pWin, int32_t offset, int32_t forwardStep, TSKEY *tsCol, int32_t numOfTotal) {
SQuery *pQuery = pRuntimeEnv->pQuery;
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
@@ -825,8 +834,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow
bool hasPrev = pCtx[0].preAggVals.isSet;
for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
- pCtx[k].nStartQueryTimestamp = pWin->skey;
pCtx[k].size = forwardStep;
+ pCtx[k].nStartQueryTimestamp = pWin->skey;
pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? offset : offset - (forwardStep - 1);
int32_t functionId = pQuery->pExpr1[k].base.functionId;
@@ -1029,7 +1038,8 @@ static void setNotInterpoWindowKey(SQLFunctionCtx* pCtx, int32_t numOfOutput, in
}
// window start key interpolation
-static bool setTimeWindowInterpolationStartTs(SQueryRuntimeEnv* pRuntimeEnv, int32_t pos, int32_t numOfRows, SArray* pDataBlock, TSKEY* tsCols, STimeWindow* win) {
+static bool setTimeWindowInterpolationStartTs(SQueryRuntimeEnv* pRuntimeEnv, int32_t pos, int32_t numOfRows,
+ SArray* pDataBlock, TSKEY* tsCols, STimeWindow* win, int16_t type) {
SQuery* pQuery = pRuntimeEnv->pQuery;
TSKEY curTs = tsCols[pos];
@@ -1118,6 +1128,8 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
assert(pDataBlock != NULL);
SQuery* pQuery = pRuntimeEnv->pQuery;
+ int32_t fillType = pQuery->fillType;
+
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, 0);
@@ -1126,7 +1138,7 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP);
if (!done) {
int32_t startRowIndex = startPos;
- bool interp = setTimeWindowInterpolationStartTs(pRuntimeEnv, startRowIndex, pDataBlockInfo->rows, pDataBlock, tsCols, win);
+ bool interp = setTimeWindowInterpolationStartTs(pRuntimeEnv, startRowIndex, pDataBlockInfo->rows, pDataBlock, tsCols, win, fillType);
if (interp) {
setResultRowInterpo(pResult, RESULT_ROW_START_INTERP);
}
@@ -1134,6 +1146,12 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
}
+ // point interpolation does not require the end key time window interpolation.
+ if (isPointInterpoQuery(pQuery)) {
+ return;
+ }
+
+ // interpolation query does not generate the time window end interpolation
done = resultRowInterpolated(pResult, RESULT_ROW_END_INTERP);
if (!done) {
int32_t endRowIndex = startPos + (forwardStep - 1) * step;
@@ -1259,7 +1277,7 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
int32_t functionId = pQuery->pExpr1[k].base.functionId;
if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
- pCtx[k].nStartQueryTimestamp = pDataBlockInfo->window.skey;
+ pCtx[k].nStartQueryTimestamp = pQuery->window.skey;
aAggs[functionId].xFunction(&pCtx[k]);
}
}
@@ -1423,18 +1441,20 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
return true;
}
-void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDataBlock, TSKEY prevTs, int32_t prevRowIndex, TSKEY curTs, int32_t curRowIndex, TSKEY windowKey, int32_t type) {
- SQuery* pQuery = pRuntimeEnv->pQuery;
+void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv *pRuntimeEnv, SArray *pDataBlock, TSKEY prevTs,
+ int32_t prevRowIndex, TSKEY curTs, int32_t curRowIndex, TSKEY windowKey,
+ int32_t type) {
+ SQuery *pQuery = pRuntimeEnv->pQuery;
for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
int32_t functionId = pQuery->pExpr1[k].base.functionId;
- if (functionId != TSDB_FUNC_TWA) {
+ if (functionId != TSDB_FUNC_TWA && functionId != TSDB_FUNC_INTERP) {
pRuntimeEnv->pCtx[k].start.key = INT64_MIN;
continue;
}
- SColIndex* pColIndex = &pQuery->pExpr1[k].base.colInfo;
- int16_t index = pColIndex->colIndex;
- SColumnInfoData* pColInfo = taosArrayGet(pDataBlock, index);
+ SColIndex * pColIndex = &pQuery->pExpr1[k].base.colInfo;
+ int16_t index = pColIndex->colIndex;
+ SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, index);
assert(pColInfo->info.colId == pColIndex->colId && curTs != windowKey);
double v1 = 0, v2 = 0, v = 0;
@@ -1450,14 +1470,25 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa
SPoint point1 = (SPoint){.key = prevTs, .val = &v1};
SPoint point2 = (SPoint){.key = curTs, .val = &v2};
SPoint point = (SPoint){.key = windowKey, .val = &v};
- taosGetLinearInterpolationVal(TSDB_DATA_TYPE_DOUBLE, &point1, &point2, &point);
- if (type == RESULT_ROW_START_INTERP) {
- pRuntimeEnv->pCtx[k].start.key = point.key;
- pRuntimeEnv->pCtx[k].start.val = v;
+ if (functionId == TSDB_FUNC_TWA) {
+ taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
+
+ if (type == RESULT_ROW_START_INTERP) {
+ pRuntimeEnv->pCtx[k].start.key = point.key;
+ pRuntimeEnv->pCtx[k].start.val = v;
+ } else {
+ pRuntimeEnv->pCtx[k].end.key = point.key;
+ pRuntimeEnv->pCtx[k].end.val = v;
+ }
} else {
- pRuntimeEnv->pCtx[k].end.key = point.key;
- pRuntimeEnv->pCtx[k].end.val = v;
+ if (type == RESULT_ROW_START_INTERP) {
+ pRuntimeEnv->pCtx[k].start.key = prevTs;
+ pRuntimeEnv->pCtx[k].start.val = v1;
+
+ pRuntimeEnv->pCtx[k].end.key = curTs;
+ pRuntimeEnv->pCtx[k].end.val = v2;
+ }
}
}
}
@@ -1796,13 +1827,7 @@ void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY
pCtx->preAggVals.statis.max = pBlockInfo->window.ekey;
}
} else if (functionId == TSDB_FUNC_INTERP) {
- SResultRowCellInfo* pInfo = GET_RES_INFO(pCtx);
-
- SInterpInfoDetail *pInterpInfo = (SInterpInfoDetail *)GET_ROWCELL_INTERBUF(pInfo);
- pInterpInfo->type = (int8_t)pQuery->fillType;
- pInterpInfo->ts = pQuery->window.skey;
- pInterpInfo->primaryCol = (colId == PRIMARYKEY_TIMESTAMP_COL_INDEX);
-
+ pCtx->param[2].i64 = (int8_t) pQuery->fillType;
if (pQuery->fillVal != NULL) {
if (isNull((const char*) &pQuery->fillVal[colIndex], pCtx->inputType)) {
pCtx->param[1].nType = TSDB_DATA_TYPE_NULL;
@@ -1908,6 +1933,10 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
if (pIndex->colId == TSDB_TBNAME_COLUMN_INDEX) { // todo refactor
SSchema s = tGetTableNameColumnSchema();
+ pCtx->inputBytes = s.bytes;
+ pCtx->inputType = s.type;
+ } else if (pIndex->colId == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ SSchema s = tGetBlockDistColumnSchema();
pCtx->inputBytes = s.bytes;
pCtx->inputType = s.type;
} else {
@@ -2579,7 +2608,6 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo * pW
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf > 0) {
*status = BLK_DATA_ALL_NEEDED;
} else { // check if this data block is required to load
-
// Calculate all time windows that are overlapping or contain current data block.
// If current data block is contained by all possible time window, do not load current data block.
if (QUERY_IS_INTERVAL_QUERY(pQuery) && overlapWithTimeWindow(pQuery, pBlockInfo)) {
@@ -2818,6 +2846,10 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
while (tsdbNextDataBlock(pQueryHandle)) {
summary->totalBlocks += 1;
+ if (IS_MASTER_SCAN(pRuntimeEnv)) {
+ pQuery->numOfCheckedBlocks += 1;
+ }
+
if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
}
@@ -3557,7 +3589,7 @@ void setQueryStatus(SQuery *pQuery, int8_t status) {
}
}
-bool needScanDataBlocksAgain(SQueryRuntimeEnv *pRuntimeEnv) {
+bool needRepeatScan(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery *pQuery = pRuntimeEnv->pQuery;
bool toContinue = false;
@@ -3684,6 +3716,67 @@ static void restoreTimeWindow(STableGroupInfo* pTableGroupInfo, STsdbQueryCond*
pKeyInfo->lastKey = pCond->twindow.skey;
}
+static void handleInterpolationQuery(SQInfo* pQInfo) {
+ SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
+
+ SQuery *pQuery = pRuntimeEnv->pQuery;
+ if (pQuery->numOfCheckedBlocks > 0 || !isPointInterpoQuery(pQuery)) {
+ return;
+ }
+
+ SArray *prev = tsdbGetExternalRow(pRuntimeEnv->pQueryHandle, &pQInfo->memRef, TSDB_PREV_ROW);
+ SArray *next = tsdbGetExternalRow(pRuntimeEnv->pQueryHandle, &pQInfo->memRef, TSDB_NEXT_ROW);
+ if (prev == NULL || next == NULL) {
+ return;
+ }
+
+ // setup the pCtx->start/end info and calculate the interpolation value
+ SColumnInfoData *startTs = taosArrayGet(prev, 0);
+ SColumnInfoData *endTs = taosArrayGet(next, 0);
+
+ for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
+ SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
+
+ int32_t functionId = pQuery->pExpr1[i].base.functionId;
+ SColIndex *pColIndex = &pQuery->pExpr1[i].base.colInfo;
+
+ if (!TSDB_COL_IS_NORMAL_COL(pColIndex->flag)) {
+ aAggs[functionId].xFunction(pCtx);
+ continue;
+ }
+
+ SColumnInfoData *p = taosArrayGet(prev, pColIndex->colIndex);
+ SColumnInfoData *n = taosArrayGet(next, pColIndex->colIndex);
+
+ assert(p->info.colId == pColIndex->colId);
+
+ pCtx->start.key = *(TSKEY *)startTs->pData;
+ pCtx->end.key = *(TSKEY *)endTs->pData;
+
+ if (p->info.type != TSDB_DATA_TYPE_BINARY && p->info.type != TSDB_DATA_TYPE_NCHAR) {
+ GET_TYPED_DATA(pCtx->start.val, double, p->info.type, p->pData);
+ GET_TYPED_DATA(pCtx->end.val, double, n->info.type, n->pData);
+ } else { // string pointer
+ pCtx->start.ptr = p->pData;
+ pCtx->end.ptr = n->pData;
+ }
+
+ pCtx->param[2].i64 = (int8_t)pQuery->fillType;
+ pCtx->nStartQueryTimestamp = pQuery->window.skey;
+ if (pQuery->fillVal != NULL) {
+ if (isNull((const char *)&pQuery->fillVal[i], pCtx->inputType)) {
+ pCtx->param[1].nType = TSDB_DATA_TYPE_NULL;
+ } else { // todo refactor, tVariantCreateFromBinary should handle the NULL value
+ if (pCtx->inputType != TSDB_DATA_TYPE_BINARY && pCtx->inputType != TSDB_DATA_TYPE_NCHAR) {
+ tVariantCreateFromBinary(&pCtx->param[1], (char *)&pQuery->fillVal[i], pCtx->inputBytes, pCtx->inputType);
+ }
+ }
+ }
+
+ aAggs[functionId].xFunction(pCtx);
+ }
+}
+
void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
SQInfo *pQInfo = (SQInfo *) GET_QINFO_ADDR(pRuntimeEnv);
SQuery *pQuery = pRuntimeEnv->pQuery;
@@ -3711,7 +3804,7 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
}
}
- if (!needScanDataBlocksAgain(pRuntimeEnv)) {
+ if (!needRepeatScan(pRuntimeEnv)) {
// restore the status code and jump out of loop
if (pRuntimeEnv->scanFlag == REPEAT_SCAN) {
pQuery->status = qstatus.status;
@@ -3737,24 +3830,19 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
qDebug("QInfo:%p start to repeat scan data blocks due to query func required, qrange:%"PRId64"-%"PRId64, pQInfo,
cond.twindow.skey, cond.twindow.ekey);
-
- // check if query is killed or not
- if (isQueryKilled(pQInfo)) {
- longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
- }
}
- if (!needReverseScan(pQuery)) {
- return;
+ if (needReverseScan(pQuery)) {
+ setEnvBeforeReverseScan(pRuntimeEnv, &qstatus);
+
+ // reverse scan from current position
+ qDebug("QInfo:%p start to reverse scan", pQInfo);
+ doScanAllDataBlocks(pRuntimeEnv);
+
+ clearEnvAfterReverseScan(pRuntimeEnv, &qstatus);
}
- setEnvBeforeReverseScan(pRuntimeEnv, &qstatus);
-
- // reverse scan from current position
- qDebug("QInfo:%p start to reverse scan", pQInfo);
- doScanAllDataBlocks(pRuntimeEnv);
-
- clearEnvAfterReverseScan(pRuntimeEnv, &qstatus);
+ handleInterpolationQuery(pQInfo);
}
void finalizeQueryResult(SQueryRuntimeEnv *pRuntimeEnv) {
@@ -4377,7 +4465,59 @@ static void updateOffsetVal(SQueryRuntimeEnv *pRuntimeEnv, SDataBlockInfo *pBloc
qDebug("QInfo:%p check data block, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, numOfRes:%d, lastKey:%"PRId64, GET_QINFO_ADDR(pRuntimeEnv),
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, numOfRes, pQuery->current->lastKey);
}
+static void freeTableBlockDist(STableBlockDist *pTableBlockDist) {
+ if (pTableBlockDist != NULL) {
+ taosArrayDestroy(pTableBlockDist->dataBlockInfos);
+ free(pTableBlockDist->result);
+ free(pTableBlockDist);
+ }
+}
+static int32_t getPercentileFromSortedArray(const SArray* pArray, double rate) {
+ int32_t len = (int32_t)taosArrayGetSize(pArray);
+ if (len <= 0) {
+ return 0;
+ }
+ assert(rate >= 0 && rate <= 1.0);
+ int idx = (int32_t)((len - 1) * rate);
+ return ((SDataBlockInfo *)(taosArrayGet(pArray, idx)))->rows;
+}
+static int compareBlockInfo(const void *pLeft, const void *pRight) {
+ int32_t left = ((SDataBlockInfo *)pLeft)->rows;
+ int32_t right = ((SDataBlockInfo *)pRight)->rows;
+ if (left > right) return 1;
+ if (left < right) return -1;
+ return 0;
+}
+static void generateBlockDistResult(STableBlockDist *pTableBlockDist) {
+ if (pTableBlockDist == NULL) {
+ return;
+ }
+ int64_t min = INT64_MAX, max = INT64_MIN, avg = 0;
+ SArray* blockInfos= pTableBlockDist->dataBlockInfos;
+ int64_t totalRows = 0, totalBlocks = taosArrayGetSize(blockInfos);
+ for (size_t i = 0; i < taosArrayGetSize(blockInfos); i++) {
+ SDataBlockInfo *blockInfo = taosArrayGet(blockInfos, i);
+ int64_t rows = blockInfo->rows;
+ min = MIN(min, rows);
+ max = MAX(max, rows);
+ totalRows += rows;
+ }
+ avg = totalBlocks > 0 ? (int64_t)(totalRows/totalBlocks) : 0;
+
+ taosArraySort(blockInfos, compareBlockInfo);
+
+ int sz = sprintf(pTableBlockDist->result,
+ "summery: \n\t 5th=[%d], 25th=[%d], 50th=[%d],75th=[%d], 95th=[%d], 99th=[%d] \n\t min=[%"PRId64"], max=[%"PRId64"], avg = [%"PRId64"] \n\t totalRows=[%"PRId64"], totalBlocks=[%"PRId64"] \n\t seekHeaderTimeCost=[%"PRId64"(us)] \n\t rowsInMem=[%"PRId64"]",
+ getPercentileFromSortedArray(blockInfos, 0.05), getPercentileFromSortedArray(blockInfos, 0.25), getPercentileFromSortedArray(blockInfos, 0.50),
+ getPercentileFromSortedArray(blockInfos, 0.75), getPercentileFromSortedArray(blockInfos, 0.95), getPercentileFromSortedArray(blockInfos, 0.99),
+ min, max, avg,
+ totalRows, totalBlocks,
+ pTableBlockDist->firstSeekTimeUs,
+ pTableBlockDist->numOfRowsInMemTable);
+ UNUSED(sz);
+ return;
+}
void skipBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery *pQuery = pRuntimeEnv->pQuery;
@@ -4891,6 +5031,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
.order = pQuery->order.order,
.colList = pQuery->colList,
.numOfCols = pQuery->numOfCols,
+ .loadExternalRows = false,
};
// todo refactor
@@ -4985,6 +5126,7 @@ STsdbQueryCond createTsdbQueryCond(SQuery* pQuery, STimeWindow* win) {
.colList = pQuery->colList,
.order = pQuery->order.order,
.numOfCols = pQuery->numOfCols,
+ .loadExternalRows = false,
};
TIME_WINDOW_COPY(cond.twindow, *win);
@@ -5728,15 +5870,13 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
}
scanOneTableDataBlocks(pRuntimeEnv, newStartKey);
- assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
-
finalizeQueryResult(pRuntimeEnv);
// skip offset result rows
pQuery->rec.rows = 0;
// not fill or no result generated during this query
- if (pQuery->fillType == TSDB_FILL_NONE || pRuntimeEnv->windowResInfo.size == 0) {
+ if (pQuery->fillType == TSDB_FILL_NONE || pRuntimeEnv->windowResInfo.size == 0 || isPointInterpoQuery(pQuery)) {
// all data scanned, the group by normal column can return
int32_t numOfClosed = numOfClosedResultRows(&pRuntimeEnv->windowResInfo);
if (pQuery->limit.offset > numOfClosed) {
@@ -5771,7 +5911,7 @@ static void tableQueryImpl(SQInfo *pQInfo) {
SQuery * pQuery = pRuntimeEnv->pQuery;
if (hasNotReturnedResults(pRuntimeEnv)) {
- if (pQuery->fillType != TSDB_FILL_NONE) {
+ if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) {
/*
* There are remain results that are not returned due to result interpolation
* So, we do keep in this procedure instead of launching retrieve procedure for next results.
@@ -5830,6 +5970,58 @@ static void tableQueryImpl(SQInfo *pQInfo) {
pRuntimeEnv->summary.elapsedTime += (taosGetTimestampUs() - st);
assert(pQInfo->tableqinfoGroupInfo.numOfTables == 1);
}
+static void buildTableBlockDistResult(SQInfo *pQInfo) {
+ SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
+ SQuery *pQuery = pRuntimeEnv->pQuery;
+ pQuery->pos = 0;
+
+ STableBlockDist *pTableBlockDist = calloc(1, sizeof(STableBlockDist));
+ pTableBlockDist->dataBlockInfos = taosArrayInit(512, sizeof(SDataBlockInfo));
+ pTableBlockDist->result = (char *)malloc(512);
+
+ TsdbQueryHandleT pQueryHandle = pRuntimeEnv->pQueryHandle;
+ SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
+ SSchema blockDistSchema = tGetBlockDistColumnSchema();
+
+ int64_t startTime = taosGetTimestampUs();
+ while (tsdbNextDataBlockWithoutMerge(pQueryHandle)) {
+ if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
+ freeTableBlockDist(pTableBlockDist);
+ longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ }
+ if (pTableBlockDist->firstSeekTimeUs == 0) {
+ pTableBlockDist->firstSeekTimeUs = taosGetTimestampUs() - startTime;
+ }
+
+ tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
+ taosArrayPush(pTableBlockDist->dataBlockInfos, &blockInfo);
+ }
+ if (terrno != TSDB_CODE_SUCCESS) {
+ freeTableBlockDist(pTableBlockDist);
+ longjmp(pRuntimeEnv->env, terrno);
+ }
+
+ pTableBlockDist->numOfRowsInMemTable = tsdbGetNumOfRowsInMemTable(pQueryHandle);
+
+ generateBlockDistResult(pTableBlockDist);
+
+ int type = -1;
+ assert(pQuery->numOfOutput == 1);
+ SExprInfo* pExprInfo = pQuery->pExpr1;
+ for (int32_t j = 0; j < pQuery->numOfOutput; j++) {
+ if (pExprInfo[j].base.colInfo.colId == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ type = blockDistSchema.type;
+ }
+ assert(type == TSDB_DATA_TYPE_BINARY);
+ STR_WITH_SIZE_TO_VARSTR(pQuery->sdata[j]->data, pTableBlockDist->result, (VarDataLenT)strlen(pTableBlockDist->result));
+ }
+
+ freeTableBlockDist(pTableBlockDist);
+
+ pQuery->rec.rows = 1;
+ setQueryStatus(pQuery, QUERY_COMPLETED);
+ return;
+}
static void stableQueryImpl(SQInfo *pQInfo) {
SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
@@ -5857,7 +6049,10 @@ static int32_t getColumnIndexInSource(SQueryTableMsg *pQueryMsg, SSqlFuncMsg *pE
if (TSDB_COL_IS_TAG(pExprMsg->colInfo.flag)) {
if (pExprMsg->colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
return TSDB_TBNAME_COLUMN_INDEX;
+ } else if (pExprMsg->colInfo.colId == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ return TSDB_BLOCK_DIST_COLUMN_INDEX;
}
+
while(j < pQueryMsg->numOfTags) {
if (pExprMsg->colInfo.colId == pTagCols[j].colId) {
@@ -6314,6 +6509,10 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num
SSchema s = tGetTableNameColumnSchema();
type = s.type;
bytes = s.bytes;
+ } else if (pExprs[i].base.colInfo.colId == TSDB_BLOCK_DIST_COLUMN_INDEX) {
+ SSchema s = tGetBlockDistColumnSchema();
+ type = s.type;
+ bytes = s.bytes;
} else if (pExprs[i].base.colInfo.colId <= TSDB_UD_COLUMN_INDEX) {
// it is a user-defined constant value column
assert(pExprs[i].base.functionId == TSDB_FUNC_PRJ);
@@ -6327,7 +6526,7 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num
} else {
int32_t j = getColumnIndexInSource(pQueryMsg, &pExprs[i].base, pTagCols);
if (TSDB_COL_IS_TAG(pExprs[i].base.colInfo.flag)) {
- if (j < TSDB_TBNAME_COLUMN_INDEX || j >= pQueryMsg->numOfTags) {
+ if (j < TSDB_BLOCK_DIST_COLUMN_INDEX || j >= pQueryMsg->numOfTags) {
return TSDB_CODE_QRY_INVALID_MSG;
}
} else {
@@ -6497,7 +6696,7 @@ static void doUpdateExprColumnIndex(SQuery *pQuery) {
}
}
- assert(f < pQuery->numOfTags || pColIndex->colId == TSDB_TBNAME_COLUMN_INDEX);
+ assert(f < pQuery->numOfTags || pColIndex->colId == TSDB_TBNAME_COLUMN_INDEX || pColIndex->colId == TSDB_BLOCK_DIST_COLUMN_INDEX);
}
}
}
@@ -6700,9 +6899,10 @@ static SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SSqlGroupbyExpr *pGrou
index += 1;
}
}
-
colIdCheck(pQuery);
+ pQInfo->runtimeEnv.queryBlockDist = (numOfOutput == 1 && pExprs[0].base.colInfo.colId == TSDB_BLOCK_DIST_COLUMN_INDEX);
+
qDebug("qmsg:%p QInfo:%p created", pQueryMsg, pQInfo);
return pQInfo;
@@ -6719,7 +6919,8 @@ _cleanup_query:
for (int32_t i = 0; i < numOfOutput; ++i) {
SExprInfo* pExprInfo = &pExprs[i];
if (pExprInfo->pExpr != NULL) {
- tExprTreeDestroy(&pExprInfo->pExpr, NULL);
+ tExprTreeDestroy(pExprInfo->pExpr, NULL);
+ pExprInfo->pExpr = NULL;
}
}
@@ -6835,7 +7036,7 @@ static void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr) {
for (int32_t i = 0; i < numOfExpr; ++i) {
if (pExprInfo[i].pExpr != NULL) {
- tExprNodeDestroy(pExprInfo[i].pExpr, NULL);
+ tExprTreeDestroy(pExprInfo[i].pExpr, NULL);
}
}
@@ -7212,6 +7413,8 @@ bool qTableQuery(qinfo_t qinfo) {
buildTagQueryResult(pQInfo);
} else if (pQInfo->runtimeEnv.stableQuery) {
stableQueryImpl(pQInfo);
+ } else if (pQInfo->runtimeEnv.queryBlockDist){
+ buildTableBlockDistResult(pQInfo);
} else {
tableQueryImpl(pQInfo);
}
diff --git a/src/query/src/qExtbuffer.c b/src/query/src/qExtbuffer.c
index fa3fe285a8..e4c62d90e3 100644
--- a/src/query/src/qExtbuffer.c
+++ b/src/query/src/qExtbuffer.c
@@ -12,13 +12,13 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
-#include "os.h"
#include "qExtbuffer.h"
+#include "os.h"
+#include "qAggMain.h"
#include "queryLog.h"
#include "taos.h"
#include "taosdef.h"
#include "taosmsg.h"
-#include "tsqlfunction.h"
#include "tulog.h"
#define COLMODEL_GET_VAL(data, schema, allrow, rowId, colId) \
diff --git a/src/query/src/qFill.c b/src/query/src/qFill.c
index 65b58467b7..c82f8f632d 100644
--- a/src/query/src/qFill.c
+++ b/src/query/src/qFill.c
@@ -15,9 +15,9 @@
#include "os.h"
+#include "qAggMain.h"
#include "taosdef.h"
#include "taosmsg.h"
-#include "tsqlfunction.h"
#include "ttype.h"
#include "qFill.h"
@@ -120,7 +120,7 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, tFilePage** data, char** sr
point1 = (SPoint){.key = *(TSKEY*)(prev), .val = prev + pCol->col.offset};
point2 = (SPoint){.key = ts, .val = srcData[i] + pFillInfo->index * bytes};
point = (SPoint){.key = pFillInfo->currentKey, .val = val1};
- taosGetLinearInterpolationVal(type, &point1, &point2, &point);
+ taosGetLinearInterpolationVal(&point, type, &point1, &point2, type);
}
} else {
setNullValueForRow(pFillInfo, data, pFillInfo->numOfCols, index);
@@ -479,25 +479,13 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, TSKEY ekey, int32_t ma
return (numOfRes > maxNumOfRows) ? maxNumOfRows : numOfRes;
}
-int32_t taosGetLinearInterpolationVal(int32_t type, SPoint* point1, SPoint* point2, SPoint* point) {
- double v1 = -1;
- double v2 = -1;
-
- GET_TYPED_DATA(v1, double, type, point1->val);
- GET_TYPED_DATA(v2, double, type, point2->val);
+int32_t taosGetLinearInterpolationVal(SPoint* point, int32_t outputType, SPoint* point1, SPoint* point2, int32_t inputType) {
+ double v1 = -1, v2 = -1;
+ GET_TYPED_DATA(v1, double, inputType, point1->val);
+ GET_TYPED_DATA(v2, double, inputType, point2->val);
double r = DO_INTERPOLATION(v1, v2, point1->key, point2->key, point->key);
-
- switch(type) {
- case TSDB_DATA_TYPE_TINYINT: *(int8_t*) point->val = (int8_t) r;break;
- case TSDB_DATA_TYPE_SMALLINT: *(int16_t*) point->val = (int16_t) r;break;
- case TSDB_DATA_TYPE_INT: *(int32_t*) point->val = (int32_t) r;break;
- case TSDB_DATA_TYPE_BIGINT: *(int64_t*) point->val = (int64_t) r;break;
- case TSDB_DATA_TYPE_DOUBLE: *(double*) point->val = (double) r;break;
- case TSDB_DATA_TYPE_FLOAT: *(float*) point->val = (float) r;break;
- default:
- assert(0);
- }
+ SET_TYPED_DATA(point->val, outputType, r);
return TSDB_CODE_SUCCESS;
}
diff --git a/src/query/src/qParserImpl.c b/src/query/src/qParserImpl.c
index 6dff550755..d0839b3dc4 100644
--- a/src/query/src/qParserImpl.c
+++ b/src/query/src/qParserImpl.c
@@ -71,7 +71,7 @@ abort_parse:
return sqlInfo;
}
-tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pToken) {
+tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pDistinct, SStrToken *pToken) {
if (pList == NULL) {
pList = calloc(1, sizeof(tSQLExprList));
}
@@ -97,6 +97,7 @@ tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken
strdequote(pItem->aliasName);
}
+ pItem->distinct = (pDistinct != NULL);
}
return pList;
}
diff --git a/src/query/src/qPercentile.c b/src/query/src/qPercentile.c
index 3e4891092a..523fa42547 100644
--- a/src/query/src/qPercentile.c
+++ b/src/query/src/qPercentile.c
@@ -115,6 +115,11 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) {
GET_TYPED_DATA(v, int64_t, pBucket->type, value);
int32_t index = -1;
+
+ if (v > pBucket->range.i64MaxVal || v < pBucket->range.i64MinVal) {
+ return index;
+ }
+
// divide the value range into 1024 buckets
uint64_t span = pBucket->range.i64MaxVal - pBucket->range.i64MinVal;
if (span < pBucket->numOfSlots) {
@@ -128,7 +133,7 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) {
}
}
- assert(v >= pBucket->range.i64MinVal && v <= pBucket->range.i64MaxVal && index >= 0 && index < pBucket->numOfSlots);
+ assert(index >= 0 && index < pBucket->numOfSlots);
return index;
}
@@ -137,6 +142,11 @@ int32_t tBucketUintHash(tMemBucket *pBucket, const void *value) {
GET_TYPED_DATA(v, uint64_t, pBucket->type, value);
int32_t index = -1;
+
+ if (v > pBucket->range.u64MaxVal || v < pBucket->range.u64MinVal) {
+ return index;
+ }
+
// divide the value range into 1024 buckets
uint64_t span = pBucket->range.u64MaxVal - pBucket->range.u64MinVal;
if (span < pBucket->numOfSlots) {
@@ -150,7 +160,7 @@ int32_t tBucketUintHash(tMemBucket *pBucket, const void *value) {
}
}
- assert(v >= pBucket->range.u64MinVal && v <= pBucket->range.i64MaxVal && index >= 0 && index < pBucket->numOfSlots);
+ assert(index >= 0 && index < pBucket->numOfSlots);
return index;
}
@@ -164,6 +174,10 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value) {
int32_t index = -1;
+ if (v > pBucket->range.dMaxVal || v < pBucket->range.dMinVal) {
+ return index;
+ }
+
// divide a range of [dMinVal, dMaxVal] into 1024 buckets
double span = pBucket->range.dMaxVal - pBucket->range.dMinVal;
if (span < pBucket->numOfSlots) {
@@ -177,7 +191,7 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value) {
}
}
- assert(v >= pBucket->range.dMinVal && v <= pBucket->range.dMaxVal && index >= 0 && index < pBucket->numOfSlots);
+ assert(index >= 0 && index < pBucket->numOfSlots);
return index;
}
@@ -309,9 +323,13 @@ int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size) {
int32_t bytes = pBucket->bytes;
for (int32_t i = 0; i < size; ++i) {
char *d = (char *) data + i * bytes;
- count += 1;
int32_t index = (pBucket->hashFunc)(pBucket, d);
+ if (index < 0) {
+ continue;
+ }
+
+ count += 1;
tMemBucketSlot *pSlot = &pBucket->pSlots[index];
tMemBucketUpdateBoundingBox(&pSlot->range, d, pBucket->type);
diff --git a/src/query/src/qTokenizer.c b/src/query/src/qTokenizer.c
index 48d2f5d505..b55f813b5b 100644
--- a/src/query/src/qTokenizer.c
+++ b/src/query/src/qTokenizer.c
@@ -240,6 +240,7 @@ static SKeyword keywordTable[] = {
{"AVG_RATE", TK_AVG_RATE},
{"AVG_IRATE", TK_AVG_IRATE},
{"CACHELAST", TK_CACHELAST},
+ {"DISTINCT", TK_DISTINCT},
};
static const char isIdChar[] = {
diff --git a/src/query/src/qTsbuf.c b/src/query/src/qTsbuf.c
index a53f8935ee..1f43c5b33c 100644
--- a/src/query/src/qTsbuf.c
+++ b/src/query/src/qTsbuf.c
@@ -23,7 +23,7 @@ STSBuf* tsBufCreate(bool autoDelete, int32_t order) {
pTSBuf->autoDelete = autoDelete;
taosGetTmpfilePath("join", pTSBuf->path);
- pTSBuf->f = fopen(pTSBuf->path, "w+");
+ pTSBuf->f = fopen(pTSBuf->path, "wb+");
if (pTSBuf->f == NULL) {
free(pTSBuf);
return NULL;
@@ -59,7 +59,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
tstrncpy(pTSBuf->path, path, sizeof(pTSBuf->path));
- pTSBuf->f = fopen(pTSBuf->path, "r+");
+ pTSBuf->f = fopen(pTSBuf->path, "rb+");
if (pTSBuf->f == NULL) {
free(pTSBuf);
return NULL;
diff --git a/src/query/src/sql.c b/src/query/src/sql.c
index cc5d6c0b4a..0f945d0230 100644
--- a/src/query/src/sql.c
+++ b/src/query/src/sql.c
@@ -97,27 +97,27 @@
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int
-#define YYNOCODE 280
+#define YYNOCODE 282
#define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SStrToken
typedef union {
int yyinit;
ParseTOKENTYPE yy0;
- SQuerySQL* yy30;
- SCreateTableSQL* yy38;
- SCreatedTableInfo yy78;
- SLimitVal yy126;
- int yy130;
- SArray* yy135;
- SSubclauseInfo* yy153;
- SIntervalVal yy160;
- TAOS_FIELD yy181;
- SCreateDbInfo yy256;
- tSQLExprList* yy266;
- SCreateAcctInfo yy277;
- tVariant yy308;
- tSQLExpr* yy316;
- int64_t yy531;
+ SCreatedTableInfo yy42;
+ SCreateAcctInfo yy47;
+ SQuerySQL* yy114;
+ TAOS_FIELD yy179;
+ SLimitVal yy204;
+ SSubclauseInfo* yy219;
+ int yy222;
+ SArray* yy247;
+ SCreateDbInfo yy262;
+ tSQLExpr* yy326;
+ SCreateTableSQL* yy358;
+ tVariant yy378;
+ int64_t yy403;
+ SIntervalVal yy430;
+ tSQLExprList* yy522;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -127,17 +127,17 @@ typedef union {
#define ParseARG_FETCH SSqlInfo* pInfo = yypParser->pInfo
#define ParseARG_STORE yypParser->pInfo = pInfo
#define YYFALLBACK 1
-#define YYNSTATE 282
-#define YYNRULE 248
-#define YYNTOKEN 209
-#define YY_MAX_SHIFT 281
-#define YY_MIN_SHIFTREDUCE 461
-#define YY_MAX_SHIFTREDUCE 708
-#define YY_ERROR_ACTION 709
-#define YY_ACCEPT_ACTION 710
-#define YY_NO_ACTION 711
-#define YY_MIN_REDUCE 712
-#define YY_MAX_REDUCE 959
+#define YYNSTATE 283
+#define YYNRULE 250
+#define YYNTOKEN 210
+#define YY_MAX_SHIFT 282
+#define YY_MIN_SHIFTREDUCE 463
+#define YY_MAX_SHIFTREDUCE 712
+#define YY_ERROR_ACTION 713
+#define YY_ACCEPT_ACTION 714
+#define YY_NO_ACTION 715
+#define YY_MIN_REDUCE 716
+#define YY_MAX_REDUCE 965
/************* End control #defines *******************************************/
/* Define the yytestcase() macro to be a no-op if is not already defined
@@ -203,243 +203,241 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (622)
+#define YY_ACTTAB_COUNT (615)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 158, 505, 158, 710, 281, 857, 15, 578, 182, 506,
- /* 10 */ 941, 185, 942, 41, 42, 157, 43, 44, 26, 179,
- /* 20 */ 190, 35, 505, 505, 231, 47, 45, 49, 46, 868,
- /* 30 */ 506, 506, 846, 40, 39, 256, 255, 38, 37, 36,
- /* 40 */ 41, 42, 162, 43, 44, 857, 951, 190, 35, 178,
- /* 50 */ 279, 231, 47, 45, 49, 46, 180, 195, 843, 214,
- /* 60 */ 40, 39, 938, 61, 38, 37, 36, 462, 463, 464,
- /* 70 */ 465, 466, 467, 468, 469, 470, 471, 472, 473, 280,
- /* 80 */ 198, 846, 204, 41, 42, 865, 43, 44, 246, 266,
- /* 90 */ 190, 35, 158, 834, 231, 47, 45, 49, 46, 122,
- /* 100 */ 122, 184, 942, 40, 39, 122, 62, 38, 37, 36,
- /* 110 */ 20, 244, 274, 273, 243, 242, 241, 272, 240, 271,
- /* 120 */ 270, 269, 239, 268, 267, 38, 37, 36, 813, 657,
- /* 130 */ 801, 802, 803, 804, 805, 806, 807, 808, 809, 810,
- /* 140 */ 811, 812, 814, 815, 42, 200, 43, 44, 253, 252,
- /* 150 */ 190, 35, 937, 275, 231, 47, 45, 49, 46, 228,
- /* 160 */ 895, 66, 226, 40, 39, 115, 894, 38, 37, 36,
- /* 170 */ 26, 43, 44, 32, 26, 190, 35, 846, 207, 231,
- /* 180 */ 47, 45, 49, 46, 26, 211, 210, 754, 40, 39,
- /* 190 */ 146, 845, 38, 37, 36, 189, 670, 117, 835, 661,
- /* 200 */ 71, 664, 26, 667, 763, 189, 670, 146, 193, 661,
- /* 210 */ 843, 664, 194, 667, 843, 189, 670, 16, 26, 661,
- /* 220 */ 936, 664, 249, 667, 843, 10, 21, 186, 187, 70,
- /* 230 */ 132, 230, 837, 166, 32, 196, 69, 186, 187, 167,
- /* 240 */ 250, 615, 843, 122, 102, 101, 165, 186, 187, 174,
- /* 250 */ 20, 26, 274, 273, 219, 905, 254, 272, 843, 271,
- /* 260 */ 270, 269, 607, 268, 267, 832, 833, 25, 836, 819,
- /* 270 */ 216, 90, 817, 818, 21, 246, 266, 820, 68, 822,
- /* 280 */ 823, 821, 32, 824, 825, 47, 45, 49, 46, 258,
- /* 290 */ 33, 843, 199, 40, 39, 48, 26, 38, 37, 36,
- /* 300 */ 197, 217, 213, 248, 67, 48, 27, 669, 659, 173,
- /* 310 */ 278, 277, 109, 755, 232, 48, 146, 669, 599, 638,
- /* 320 */ 639, 596, 668, 597, 844, 598, 612, 669, 175, 40,
- /* 330 */ 39, 22, 668, 38, 37, 36, 842, 160, 625, 88,
- /* 340 */ 92, 188, 668, 119, 660, 82, 97, 100, 91, 201,
- /* 350 */ 202, 99, 98, 629, 94, 3, 136, 161, 52, 152,
- /* 360 */ 148, 29, 77, 73, 76, 150, 105, 104, 103, 630,
- /* 370 */ 689, 671, 53, 56, 18, 17, 17, 663, 163, 666,
- /* 380 */ 662, 588, 665, 4, 81, 80, 27, 234, 589, 164,
- /* 390 */ 57, 54, 27, 52, 12, 11, 87, 86, 59, 603,
- /* 400 */ 577, 604, 14, 13, 601, 170, 602, 673, 114, 112,
- /* 410 */ 171, 169, 156, 168, 159, 859, 904, 191, 901, 116,
- /* 420 */ 900, 192, 257, 867, 600, 872, 874, 887, 118, 886,
- /* 430 */ 133, 134, 32, 131, 135, 765, 238, 154, 30, 247,
- /* 440 */ 762, 956, 78, 955, 953, 137, 251, 950, 84, 113,
- /* 450 */ 949, 947, 138, 783, 31, 28, 155, 752, 93, 750,
- /* 460 */ 215, 95, 96, 748, 624, 58, 747, 203, 147, 745,
- /* 470 */ 744, 743, 742, 220, 741, 55, 149, 50, 181, 229,
- /* 480 */ 224, 856, 227, 124, 151, 738, 736, 734, 732, 730,
- /* 490 */ 225, 223, 221, 153, 34, 218, 89, 63, 64, 259,
- /* 500 */ 260, 888, 261, 262, 264, 263, 265, 276, 708, 205,
- /* 510 */ 206, 707, 208, 209, 706, 176, 236, 237, 694, 177,
- /* 520 */ 172, 212, 74, 216, 65, 609, 746, 60, 233, 106,
- /* 530 */ 6, 183, 740, 141, 107, 140, 784, 139, 142, 144,
- /* 540 */ 143, 145, 739, 1, 108, 841, 731, 2, 626, 129,
- /* 550 */ 127, 125, 123, 126, 128, 120, 222, 130, 631, 121,
- /* 560 */ 23, 7, 8, 672, 24, 5, 9, 674, 19, 72,
- /* 570 */ 235, 546, 542, 70, 540, 539, 538, 535, 509, 245,
- /* 580 */ 79, 75, 27, 83, 51, 580, 579, 576, 530, 528,
- /* 590 */ 520, 526, 522, 85, 524, 518, 516, 548, 547, 545,
- /* 600 */ 544, 543, 541, 537, 536, 52, 507, 477, 475, 110,
- /* 610 */ 712, 711, 711, 711, 711, 711, 711, 711, 711, 711,
- /* 620 */ 711, 111,
+ /* 0 */ 872, 507, 159, 714, 282, 159, 15, 580, 183, 508,
+ /* 10 */ 663, 186, 948, 41, 42, 947, 43, 44, 26, 158,
+ /* 20 */ 191, 35, 507, 507, 232, 47, 45, 49, 46, 163,
+ /* 30 */ 508, 508, 850, 40, 39, 257, 256, 38, 37, 36,
+ /* 40 */ 41, 42, 118, 43, 44, 861, 664, 191, 35, 179,
+ /* 50 */ 280, 232, 47, 45, 49, 46, 181, 869, 847, 215,
+ /* 60 */ 40, 39, 957, 123, 38, 37, 36, 464, 465, 466,
+ /* 70 */ 467, 468, 469, 470, 471, 472, 473, 474, 475, 281,
+ /* 80 */ 91, 196, 205, 41, 42, 267, 43, 44, 839, 247,
+ /* 90 */ 191, 35, 159, 944, 232, 47, 45, 49, 46, 123,
+ /* 100 */ 220, 185, 948, 40, 39, 850, 62, 38, 37, 36,
+ /* 110 */ 20, 245, 275, 274, 244, 243, 242, 273, 241, 272,
+ /* 120 */ 271, 270, 240, 269, 268, 901, 267, 227, 817, 661,
+ /* 130 */ 805, 806, 807, 808, 809, 810, 811, 812, 813, 814,
+ /* 140 */ 815, 816, 818, 819, 42, 208, 43, 44, 642, 643,
+ /* 150 */ 191, 35, 212, 211, 232, 47, 45, 49, 46, 229,
+ /* 160 */ 861, 67, 21, 40, 39, 247, 276, 38, 37, 36,
+ /* 170 */ 32, 43, 44, 197, 180, 191, 35, 849, 70, 232,
+ /* 180 */ 47, 45, 49, 46, 16, 38, 37, 36, 40, 39,
+ /* 190 */ 850, 123, 38, 37, 36, 190, 674, 72, 26, 665,
+ /* 200 */ 167, 668, 667, 671, 670, 61, 168, 836, 837, 25,
+ /* 210 */ 840, 103, 102, 166, 190, 674, 758, 199, 665, 147,
+ /* 220 */ 668, 767, 671, 20, 147, 275, 274, 187, 188, 841,
+ /* 230 */ 273, 231, 272, 271, 270, 838, 269, 268, 846, 198,
+ /* 240 */ 823, 21, 249, 821, 822, 943, 187, 188, 824, 32,
+ /* 250 */ 826, 827, 825, 900, 828, 829, 123, 3, 137, 47,
+ /* 260 */ 45, 49, 46, 29, 78, 74, 77, 40, 39, 617,
+ /* 270 */ 214, 38, 37, 36, 233, 601, 759, 174, 598, 147,
+ /* 280 */ 599, 26, 600, 201, 89, 93, 254, 253, 26, 942,
+ /* 290 */ 83, 98, 101, 92, 26, 48, 153, 149, 26, 95,
+ /* 300 */ 175, 26, 151, 106, 105, 104, 202, 203, 673, 26,
+ /* 310 */ 69, 40, 39, 200, 48, 38, 37, 36, 68, 194,
+ /* 320 */ 10, 847, 63, 672, 71, 133, 195, 673, 847, 279,
+ /* 330 */ 278, 110, 250, 666, 847, 669, 251, 614, 847, 255,
+ /* 340 */ 116, 847, 672, 22, 621, 848, 609, 259, 32, 847,
+ /* 350 */ 218, 629, 633, 634, 217, 27, 120, 52, 18, 693,
+ /* 360 */ 675, 189, 53, 176, 17, 17, 590, 677, 56, 235,
+ /* 370 */ 591, 27, 100, 99, 27, 52, 82, 81, 12, 11,
+ /* 380 */ 161, 602, 54, 59, 162, 579, 57, 88, 87, 14,
+ /* 390 */ 13, 605, 603, 606, 604, 115, 113, 164, 165, 171,
+ /* 400 */ 911, 172, 170, 4, 157, 169, 160, 910, 192, 907,
+ /* 410 */ 906, 193, 258, 117, 871, 33, 878, 880, 119, 863,
+ /* 420 */ 893, 892, 134, 135, 132, 136, 769, 32, 239, 155,
+ /* 430 */ 30, 248, 766, 216, 962, 79, 961, 114, 959, 138,
+ /* 440 */ 252, 956, 85, 955, 628, 953, 221, 139, 182, 225,
+ /* 450 */ 787, 31, 28, 58, 156, 756, 94, 860, 55, 50,
+ /* 460 */ 754, 96, 230, 124, 228, 125, 97, 752, 126, 127,
+ /* 470 */ 226, 128, 224, 222, 751, 34, 204, 148, 90, 749,
+ /* 480 */ 260, 261, 262, 748, 747, 746, 745, 263, 150, 152,
+ /* 490 */ 742, 740, 264, 738, 736, 734, 265, 154, 266, 219,
+ /* 500 */ 64, 65, 894, 277, 712, 206, 207, 177, 237, 238,
+ /* 510 */ 711, 178, 173, 209, 75, 210, 710, 698, 217, 213,
+ /* 520 */ 750, 611, 107, 60, 744, 234, 142, 141, 788, 140,
+ /* 530 */ 143, 144, 146, 145, 1, 108, 743, 2, 109, 735,
+ /* 540 */ 66, 6, 184, 630, 845, 121, 223, 131, 129, 130,
+ /* 550 */ 635, 122, 5, 23, 7, 8, 24, 676, 9, 19,
+ /* 560 */ 678, 71, 73, 236, 548, 544, 542, 541, 540, 537,
+ /* 570 */ 511, 246, 76, 27, 51, 582, 80, 84, 581, 578,
+ /* 580 */ 532, 86, 530, 522, 528, 524, 526, 520, 518, 550,
+ /* 590 */ 549, 547, 546, 545, 543, 539, 538, 52, 509, 479,
+ /* 600 */ 477, 716, 715, 715, 715, 715, 715, 715, 715, 715,
+ /* 610 */ 715, 715, 715, 111, 112,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 268, 1, 268, 210, 211, 252, 268, 5, 230, 9,
- /* 10 */ 278, 277, 278, 13, 14, 268, 16, 17, 213, 266,
- /* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 213,
- /* 30 */ 9, 9, 254, 33, 34, 33, 34, 37, 38, 39,
- /* 40 */ 13, 14, 268, 16, 17, 252, 254, 20, 21, 212,
- /* 50 */ 213, 24, 25, 26, 27, 28, 251, 230, 253, 266,
- /* 60 */ 33, 34, 268, 218, 37, 38, 39, 45, 46, 47,
+ /* 0 */ 214, 1, 270, 211, 212, 270, 270, 5, 231, 9,
+ /* 10 */ 1, 279, 280, 13, 14, 280, 16, 17, 214, 270,
+ /* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 270,
+ /* 30 */ 9, 9, 255, 33, 34, 33, 34, 37, 38, 39,
+ /* 40 */ 13, 14, 214, 16, 17, 253, 37, 20, 21, 213,
+ /* 50 */ 214, 24, 25, 26, 27, 28, 252, 271, 254, 267,
+ /* 60 */ 33, 34, 255, 214, 37, 38, 39, 45, 46, 47,
/* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 80 */ 66, 254, 60, 13, 14, 269, 16, 17, 77, 79,
- /* 90 */ 20, 21, 268, 248, 24, 25, 26, 27, 28, 213,
- /* 100 */ 213, 277, 278, 33, 34, 213, 106, 37, 38, 39,
+ /* 80 */ 74, 231, 60, 13, 14, 79, 16, 17, 0, 77,
+ /* 90 */ 20, 21, 270, 270, 24, 25, 26, 27, 28, 214,
+ /* 100 */ 272, 279, 280, 33, 34, 255, 106, 37, 38, 39,
/* 110 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
- /* 120 */ 96, 97, 98, 99, 100, 37, 38, 39, 229, 102,
- /* 130 */ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
- /* 140 */ 241, 242, 243, 244, 14, 131, 16, 17, 134, 135,
- /* 150 */ 20, 21, 268, 230, 24, 25, 26, 27, 28, 272,
- /* 160 */ 274, 274, 276, 33, 34, 101, 274, 37, 38, 39,
- /* 170 */ 213, 16, 17, 109, 213, 20, 21, 254, 130, 24,
- /* 180 */ 25, 26, 27, 28, 213, 137, 138, 217, 33, 34,
- /* 190 */ 220, 254, 37, 38, 39, 1, 2, 213, 0, 5,
- /* 200 */ 218, 7, 213, 9, 217, 1, 2, 220, 251, 5,
- /* 210 */ 253, 7, 251, 9, 253, 1, 2, 44, 213, 5,
- /* 220 */ 268, 7, 251, 9, 253, 101, 101, 33, 34, 105,
- /* 230 */ 106, 37, 250, 60, 109, 66, 218, 33, 34, 66,
- /* 240 */ 251, 37, 253, 213, 71, 72, 73, 33, 34, 268,
- /* 250 */ 86, 213, 88, 89, 270, 246, 251, 93, 253, 95,
- /* 260 */ 96, 97, 102, 99, 100, 247, 248, 249, 250, 229,
- /* 270 */ 110, 74, 232, 233, 101, 77, 79, 237, 255, 239,
- /* 280 */ 240, 241, 109, 243, 244, 25, 26, 27, 28, 251,
- /* 290 */ 267, 253, 213, 33, 34, 101, 213, 37, 38, 39,
- /* 300 */ 131, 102, 129, 134, 274, 101, 107, 113, 1, 136,
- /* 310 */ 63, 64, 65, 217, 15, 101, 220, 113, 2, 119,
- /* 320 */ 120, 5, 128, 7, 245, 9, 107, 113, 268, 33,
- /* 330 */ 34, 112, 128, 37, 38, 39, 253, 268, 102, 61,
- /* 340 */ 62, 59, 128, 107, 37, 67, 68, 69, 70, 33,
- /* 350 */ 34, 74, 75, 102, 76, 61, 62, 268, 107, 61,
- /* 360 */ 62, 67, 68, 69, 70, 67, 68, 69, 70, 102,
- /* 370 */ 102, 102, 107, 107, 107, 107, 107, 5, 268, 7,
- /* 380 */ 5, 102, 7, 101, 132, 133, 107, 102, 102, 268,
- /* 390 */ 124, 126, 107, 107, 132, 133, 132, 133, 101, 5,
- /* 400 */ 103, 7, 132, 133, 5, 268, 7, 108, 61, 62,
- /* 410 */ 268, 268, 268, 268, 268, 252, 246, 246, 246, 213,
- /* 420 */ 246, 246, 246, 213, 108, 213, 213, 275, 213, 275,
- /* 430 */ 213, 213, 109, 256, 213, 213, 213, 213, 213, 213,
- /* 440 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 59,
- /* 450 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- /* 460 */ 252, 213, 213, 213, 113, 123, 213, 213, 213, 213,
- /* 470 */ 213, 213, 213, 271, 213, 125, 213, 122, 271, 117,
- /* 480 */ 271, 265, 121, 263, 213, 213, 213, 213, 213, 213,
- /* 490 */ 116, 115, 114, 213, 127, 214, 85, 214, 214, 84,
- /* 500 */ 49, 214, 81, 83, 82, 53, 80, 77, 5, 139,
- /* 510 */ 5, 5, 139, 5, 5, 214, 214, 214, 87, 214,
- /* 520 */ 214, 130, 218, 110, 107, 102, 214, 111, 104, 215,
- /* 530 */ 101, 1, 214, 222, 215, 226, 228, 227, 225, 224,
- /* 540 */ 223, 221, 214, 219, 215, 252, 214, 216, 102, 258,
- /* 550 */ 260, 262, 264, 261, 259, 101, 101, 257, 102, 101,
- /* 560 */ 107, 118, 118, 102, 107, 101, 101, 108, 101, 74,
- /* 570 */ 104, 9, 5, 105, 5, 5, 5, 5, 78, 15,
- /* 580 */ 133, 74, 107, 133, 16, 5, 5, 102, 5, 5,
- /* 590 */ 5, 5, 5, 133, 5, 5, 5, 5, 5, 5,
- /* 600 */ 5, 5, 5, 5, 5, 107, 78, 59, 58, 21,
- /* 610 */ 0, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 620 */ 279, 21, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 630 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 640 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 650 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 660 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 670 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 680 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 690 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 700 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 710 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 720 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 730 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 740 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 750 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 760 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 770 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 780 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 790 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 800 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 810 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 820 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
- /* 830 */ 279,
+ /* 120 */ 96, 97, 98, 99, 100, 276, 79, 278, 230, 102,
+ /* 130 */ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
+ /* 140 */ 242, 243, 244, 245, 14, 131, 16, 17, 120, 121,
+ /* 150 */ 20, 21, 138, 139, 24, 25, 26, 27, 28, 274,
+ /* 160 */ 253, 276, 101, 33, 34, 77, 231, 37, 38, 39,
+ /* 170 */ 109, 16, 17, 66, 267, 20, 21, 255, 219, 24,
+ /* 180 */ 25, 26, 27, 28, 44, 37, 38, 39, 33, 34,
+ /* 190 */ 255, 214, 37, 38, 39, 1, 2, 219, 214, 5,
+ /* 200 */ 60, 7, 5, 9, 7, 219, 66, 248, 249, 250,
+ /* 210 */ 251, 71, 72, 73, 1, 2, 218, 66, 5, 221,
+ /* 220 */ 7, 218, 9, 86, 221, 88, 89, 33, 34, 251,
+ /* 230 */ 93, 37, 95, 96, 97, 249, 99, 100, 254, 132,
+ /* 240 */ 230, 101, 135, 233, 234, 270, 33, 34, 238, 109,
+ /* 250 */ 240, 241, 242, 276, 244, 245, 214, 61, 62, 25,
+ /* 260 */ 26, 27, 28, 67, 68, 69, 70, 33, 34, 37,
+ /* 270 */ 130, 37, 38, 39, 15, 2, 218, 137, 5, 221,
+ /* 280 */ 7, 214, 9, 132, 61, 62, 135, 136, 214, 270,
+ /* 290 */ 67, 68, 69, 70, 214, 101, 61, 62, 214, 76,
+ /* 300 */ 270, 214, 67, 68, 69, 70, 33, 34, 114, 214,
+ /* 310 */ 256, 33, 34, 214, 101, 37, 38, 39, 276, 252,
+ /* 320 */ 101, 254, 268, 129, 105, 106, 252, 114, 254, 63,
+ /* 330 */ 64, 65, 252, 5, 254, 7, 252, 107, 254, 252,
+ /* 340 */ 101, 254, 129, 113, 112, 246, 102, 252, 109, 254,
+ /* 350 */ 102, 102, 102, 102, 110, 107, 107, 107, 107, 102,
+ /* 360 */ 102, 59, 107, 270, 107, 107, 102, 108, 107, 102,
+ /* 370 */ 102, 107, 74, 75, 107, 107, 133, 134, 133, 134,
+ /* 380 */ 270, 108, 127, 101, 270, 103, 125, 133, 134, 133,
+ /* 390 */ 134, 5, 5, 7, 7, 61, 62, 270, 270, 270,
+ /* 400 */ 247, 270, 270, 101, 270, 270, 270, 247, 247, 247,
+ /* 410 */ 247, 247, 247, 214, 214, 269, 214, 214, 214, 253,
+ /* 420 */ 277, 277, 214, 214, 257, 214, 214, 109, 214, 214,
+ /* 430 */ 214, 214, 214, 253, 214, 214, 214, 59, 214, 214,
+ /* 440 */ 214, 214, 214, 214, 114, 214, 273, 214, 273, 273,
+ /* 450 */ 214, 214, 214, 124, 214, 214, 214, 266, 126, 123,
+ /* 460 */ 214, 214, 118, 265, 122, 264, 214, 214, 263, 262,
+ /* 470 */ 117, 261, 116, 115, 214, 128, 214, 214, 85, 214,
+ /* 480 */ 84, 49, 81, 214, 214, 214, 214, 83, 214, 214,
+ /* 490 */ 214, 214, 53, 214, 214, 214, 82, 214, 80, 215,
+ /* 500 */ 215, 215, 215, 77, 5, 140, 5, 215, 215, 215,
+ /* 510 */ 5, 215, 215, 140, 219, 5, 5, 87, 110, 131,
+ /* 520 */ 215, 102, 216, 111, 215, 104, 223, 227, 229, 228,
+ /* 530 */ 226, 224, 222, 225, 220, 216, 215, 217, 216, 215,
+ /* 540 */ 107, 101, 1, 102, 253, 101, 101, 258, 260, 259,
+ /* 550 */ 102, 101, 101, 107, 119, 119, 107, 102, 101, 101,
+ /* 560 */ 108, 105, 74, 104, 9, 5, 5, 5, 5, 5,
+ /* 570 */ 78, 15, 74, 107, 16, 5, 134, 134, 5, 102,
+ /* 580 */ 5, 134, 5, 5, 5, 5, 5, 5, 5, 5,
+ /* 590 */ 5, 5, 5, 5, 5, 5, 5, 107, 78, 59,
+ /* 600 */ 58, 0, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 610 */ 281, 281, 281, 21, 21, 281, 281, 281, 281, 281,
+ /* 620 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 630 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 640 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 650 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 660 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 670 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 680 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 690 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 700 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 710 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 720 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 730 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 740 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 750 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 760 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 770 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 780 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 790 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 800 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 810 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ /* 820 */ 281, 281, 281, 281, 281,
};
-#define YY_SHIFT_COUNT (281)
+#define YY_SHIFT_COUNT (282)
#define YY_SHIFT_MIN (0)
-#define YY_SHIFT_MAX (610)
+#define YY_SHIFT_MAX (601)
static const unsigned short int yy_shift_ofst[] = {
- /* 0 */ 173, 24, 164, 11, 194, 214, 21, 21, 21, 21,
- /* 10 */ 21, 21, 21, 21, 21, 0, 22, 214, 316, 316,
- /* 20 */ 316, 125, 21, 21, 21, 198, 21, 21, 197, 11,
- /* 30 */ 10, 10, 622, 204, 214, 214, 214, 214, 214, 214,
- /* 40 */ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
- /* 50 */ 214, 316, 316, 2, 2, 2, 2, 2, 2, 2,
- /* 60 */ 64, 21, 21, 21, 21, 21, 200, 200, 219, 21,
+ /* 0 */ 140, 24, 137, 12, 194, 213, 21, 21, 21, 21,
+ /* 10 */ 21, 21, 21, 21, 21, 0, 22, 213, 273, 273,
+ /* 20 */ 273, 61, 21, 21, 21, 88, 21, 21, 6, 12,
+ /* 30 */ 47, 47, 615, 213, 213, 213, 213, 213, 213, 213,
+ /* 40 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+ /* 50 */ 213, 273, 273, 2, 2, 2, 2, 2, 2, 2,
+ /* 60 */ 239, 21, 21, 232, 21, 21, 21, 28, 28, 230,
/* 70 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* 80 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* 90 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* 100 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- /* 110 */ 21, 21, 21, 21, 21, 323, 390, 390, 390, 351,
- /* 120 */ 351, 351, 390, 342, 350, 355, 362, 361, 374, 376,
- /* 130 */ 378, 367, 323, 390, 390, 390, 11, 390, 390, 411,
- /* 140 */ 415, 451, 421, 420, 452, 422, 426, 390, 430, 390,
- /* 150 */ 430, 390, 430, 390, 622, 622, 27, 70, 70, 70,
- /* 160 */ 130, 155, 260, 260, 260, 278, 294, 298, 296, 296,
- /* 170 */ 296, 296, 14, 48, 88, 88, 124, 169, 247, 160,
- /* 180 */ 199, 236, 251, 267, 268, 269, 372, 375, 307, 282,
- /* 190 */ 299, 265, 266, 279, 285, 286, 252, 262, 264, 297,
- /* 200 */ 270, 394, 399, 277, 347, 503, 370, 505, 506, 373,
- /* 210 */ 508, 509, 431, 391, 413, 423, 416, 424, 429, 417,
- /* 220 */ 446, 454, 530, 455, 456, 458, 453, 443, 457, 444,
- /* 230 */ 461, 464, 459, 465, 424, 467, 466, 468, 495, 562,
- /* 240 */ 567, 569, 570, 571, 572, 500, 564, 507, 447, 475,
- /* 250 */ 475, 568, 450, 460, 475, 580, 581, 485, 475, 583,
- /* 260 */ 584, 585, 586, 587, 589, 590, 591, 592, 593, 594,
- /* 270 */ 595, 596, 597, 598, 599, 498, 528, 588, 600, 548,
- /* 280 */ 550, 610,
+ /* 110 */ 21, 21, 21, 21, 21, 21, 318, 378, 378, 378,
+ /* 120 */ 330, 330, 330, 378, 329, 332, 336, 344, 342, 353,
+ /* 130 */ 356, 358, 347, 318, 378, 378, 378, 12, 378, 378,
+ /* 140 */ 393, 396, 432, 401, 404, 439, 414, 418, 378, 426,
+ /* 150 */ 378, 426, 378, 426, 378, 615, 615, 27, 70, 70,
+ /* 160 */ 70, 130, 155, 234, 234, 234, 223, 196, 235, 278,
+ /* 170 */ 278, 278, 278, 151, 14, 148, 148, 219, 107, 266,
+ /* 180 */ 244, 248, 249, 250, 251, 257, 258, 197, 328, 9,
+ /* 190 */ 302, 259, 255, 261, 264, 267, 268, 243, 245, 254,
+ /* 200 */ 282, 256, 386, 387, 298, 334, 499, 365, 501, 505,
+ /* 210 */ 373, 510, 511, 430, 388, 408, 419, 412, 421, 440,
+ /* 220 */ 433, 441, 444, 541, 445, 448, 450, 446, 435, 449,
+ /* 230 */ 436, 455, 451, 452, 457, 421, 458, 459, 456, 488,
+ /* 240 */ 555, 560, 561, 562, 563, 564, 492, 556, 498, 442,
+ /* 250 */ 466, 466, 558, 443, 447, 466, 570, 573, 477, 466,
+ /* 260 */ 575, 577, 578, 579, 580, 581, 582, 583, 584, 585,
+ /* 270 */ 586, 587, 588, 589, 590, 591, 490, 520, 592, 593,
+ /* 280 */ 540, 542, 601,
};
-#define YY_REDUCE_COUNT (155)
+#define YY_REDUCE_COUNT (156)
#define YY_REDUCE_MIN (-268)
-#define YY_REDUCE_MAX (332)
+#define YY_REDUCE_MAX (324)
static const short yy_reduce_ofst[] = {
- /* 0 */ -207, -101, 40, 18, -266, -176, -195, -114, -113, -43,
- /* 10 */ -39, -29, -11, 5, 38, -184, -163, -268, -222, -173,
- /* 20 */ -77, -247, -16, -108, 30, -18, 79, 83, -30, -155,
- /* 30 */ -13, 96, 23, -262, -253, -226, -206, -116, -48, -19,
- /* 40 */ 60, 69, 89, 110, 121, 137, 142, 143, 144, 145,
- /* 50 */ 146, -208, -63, 9, 170, 171, 172, 174, 175, 176,
- /* 60 */ 163, 206, 210, 212, 213, 215, 152, 154, 177, 217,
- /* 70 */ 218, 221, 222, 223, 224, 225, 226, 227, 228, 229,
- /* 80 */ 230, 231, 232, 233, 234, 235, 237, 238, 239, 240,
- /* 90 */ 241, 242, 243, 244, 245, 246, 248, 249, 250, 253,
- /* 100 */ 254, 255, 256, 257, 258, 259, 261, 263, 271, 272,
- /* 110 */ 273, 274, 275, 276, 280, 208, 281, 283, 284, 202,
- /* 120 */ 207, 209, 287, 216, 288, 220, 289, 292, 290, 295,
- /* 130 */ 291, 300, 293, 301, 302, 303, 304, 305, 306, 308,
- /* 140 */ 310, 309, 311, 313, 317, 315, 320, 312, 314, 318,
- /* 150 */ 319, 328, 329, 332, 324, 331,
+ /* 0 */ -208, -102, 10, -41, -268, -178, -196, -151, -115, 67,
+ /* 10 */ 74, 80, 84, 87, 95, -214, -164, -265, -223, -150,
+ /* 20 */ -65, -93, -172, -23, 42, -22, 99, -16, -2, -14,
+ /* 30 */ 3, 58, 54, -264, -251, -241, -177, -25, 19, 30,
+ /* 40 */ 93, 110, 114, 127, 128, 129, 131, 132, 134, 135,
+ /* 50 */ 136, -193, -78, 153, 160, 161, 162, 163, 164, 165,
+ /* 60 */ 166, 199, 200, 146, 202, 203, 204, 143, 144, 167,
+ /* 70 */ 208, 209, 211, 212, 214, 215, 216, 217, 218, 220,
+ /* 80 */ 221, 222, 224, 225, 226, 227, 228, 229, 231, 233,
+ /* 90 */ 236, 237, 238, 240, 241, 242, 246, 247, 252, 253,
+ /* 100 */ 260, 262, 263, 265, 269, 270, 271, 272, 274, 275,
+ /* 110 */ 276, 277, 279, 280, 281, 283, 180, 284, 285, 286,
+ /* 120 */ 173, 175, 176, 287, 191, 198, 201, 205, 207, 210,
+ /* 130 */ 288, 290, 289, 291, 292, 293, 294, 295, 296, 297,
+ /* 140 */ 299, 301, 300, 303, 304, 307, 308, 310, 305, 306,
+ /* 150 */ 309, 319, 321, 322, 324, 314, 320,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 709, 764, 753, 761, 944, 944, 709, 709, 709, 709,
- /* 10 */ 709, 709, 709, 709, 709, 869, 727, 944, 709, 709,
- /* 20 */ 709, 709, 709, 709, 709, 761, 709, 709, 766, 761,
- /* 30 */ 766, 766, 864, 709, 709, 709, 709, 709, 709, 709,
- /* 40 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 50 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 60 */ 709, 709, 709, 871, 873, 709, 891, 891, 862, 709,
- /* 70 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 80 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 90 */ 709, 709, 709, 751, 709, 749, 709, 709, 709, 709,
- /* 100 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 737,
- /* 110 */ 709, 709, 709, 709, 709, 709, 729, 729, 729, 709,
- /* 120 */ 709, 709, 729, 898, 902, 896, 884, 892, 883, 879,
- /* 130 */ 878, 906, 709, 729, 729, 729, 761, 729, 729, 782,
- /* 140 */ 780, 778, 770, 776, 772, 774, 768, 729, 759, 729,
- /* 150 */ 759, 729, 759, 729, 800, 816, 709, 907, 943, 897,
- /* 160 */ 933, 932, 939, 931, 930, 709, 709, 709, 926, 927,
- /* 170 */ 929, 928, 709, 709, 935, 934, 709, 709, 709, 709,
- /* 180 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 909,
- /* 190 */ 709, 903, 899, 709, 709, 709, 709, 709, 709, 826,
- /* 200 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 210 */ 709, 709, 709, 709, 861, 709, 709, 709, 709, 870,
- /* 220 */ 709, 709, 709, 709, 709, 709, 893, 709, 885, 709,
- /* 230 */ 709, 709, 709, 709, 838, 709, 709, 709, 709, 709,
- /* 240 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 954,
- /* 250 */ 952, 709, 709, 709, 948, 709, 709, 709, 946, 709,
- /* 260 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- /* 270 */ 709, 709, 709, 709, 709, 785, 709, 735, 733, 709,
- /* 280 */ 725, 709,
+ /* 0 */ 713, 768, 757, 765, 950, 950, 713, 713, 713, 713,
+ /* 10 */ 713, 713, 713, 713, 713, 873, 731, 950, 713, 713,
+ /* 20 */ 713, 713, 713, 713, 713, 765, 713, 713, 770, 765,
+ /* 30 */ 770, 770, 868, 713, 713, 713, 713, 713, 713, 713,
+ /* 40 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 50 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 60 */ 713, 713, 713, 875, 877, 879, 713, 897, 897, 866,
+ /* 70 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 80 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 90 */ 713, 713, 713, 713, 755, 713, 753, 713, 713, 713,
+ /* 100 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 110 */ 741, 713, 713, 713, 713, 713, 713, 733, 733, 733,
+ /* 120 */ 713, 713, 713, 733, 904, 908, 902, 890, 898, 889,
+ /* 130 */ 885, 884, 912, 713, 733, 733, 733, 765, 733, 733,
+ /* 140 */ 786, 784, 782, 774, 780, 776, 778, 772, 733, 763,
+ /* 150 */ 733, 763, 733, 763, 733, 804, 820, 713, 913, 949,
+ /* 160 */ 903, 939, 938, 945, 937, 936, 713, 713, 713, 932,
+ /* 170 */ 933, 935, 934, 713, 713, 941, 940, 713, 713, 713,
+ /* 180 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 190 */ 915, 713, 909, 905, 713, 713, 713, 713, 713, 713,
+ /* 200 */ 830, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 210 */ 713, 713, 713, 713, 713, 865, 713, 713, 713, 713,
+ /* 220 */ 876, 713, 713, 713, 713, 713, 713, 899, 713, 891,
+ /* 230 */ 713, 713, 713, 713, 713, 842, 713, 713, 713, 713,
+ /* 240 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 250 */ 960, 958, 713, 713, 713, 954, 713, 713, 713, 952,
+ /* 260 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ /* 270 */ 713, 713, 713, 713, 713, 713, 789, 713, 739, 737,
+ /* 280 */ 713, 729, 713,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -571,6 +569,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* SELECT => nothing */
0, /* UNION => nothing */
1, /* ALL => ID */
+ 0, /* DISTINCT => nothing */
0, /* FROM => nothing */
0, /* VARIABLE => nothing */
0, /* INTERVAL => nothing */
@@ -866,173 +865,175 @@ static const char *const yyTokenName[] = {
/* 109 */ "SELECT",
/* 110 */ "UNION",
/* 111 */ "ALL",
- /* 112 */ "FROM",
- /* 113 */ "VARIABLE",
- /* 114 */ "INTERVAL",
- /* 115 */ "FILL",
- /* 116 */ "SLIDING",
- /* 117 */ "ORDER",
- /* 118 */ "BY",
- /* 119 */ "ASC",
- /* 120 */ "DESC",
- /* 121 */ "GROUP",
- /* 122 */ "HAVING",
- /* 123 */ "LIMIT",
- /* 124 */ "OFFSET",
- /* 125 */ "SLIMIT",
- /* 126 */ "SOFFSET",
- /* 127 */ "WHERE",
- /* 128 */ "NOW",
- /* 129 */ "RESET",
- /* 130 */ "QUERY",
- /* 131 */ "ADD",
- /* 132 */ "COLUMN",
- /* 133 */ "TAG",
- /* 134 */ "CHANGE",
- /* 135 */ "SET",
- /* 136 */ "KILL",
- /* 137 */ "CONNECTION",
- /* 138 */ "STREAM",
- /* 139 */ "COLON",
- /* 140 */ "ABORT",
- /* 141 */ "AFTER",
- /* 142 */ "ATTACH",
- /* 143 */ "BEFORE",
- /* 144 */ "BEGIN",
- /* 145 */ "CASCADE",
- /* 146 */ "CLUSTER",
- /* 147 */ "CONFLICT",
- /* 148 */ "COPY",
- /* 149 */ "DEFERRED",
- /* 150 */ "DELIMITERS",
- /* 151 */ "DETACH",
- /* 152 */ "EACH",
- /* 153 */ "END",
- /* 154 */ "EXPLAIN",
- /* 155 */ "FAIL",
- /* 156 */ "FOR",
- /* 157 */ "IGNORE",
- /* 158 */ "IMMEDIATE",
- /* 159 */ "INITIALLY",
- /* 160 */ "INSTEAD",
- /* 161 */ "MATCH",
- /* 162 */ "KEY",
- /* 163 */ "OF",
- /* 164 */ "RAISE",
- /* 165 */ "REPLACE",
- /* 166 */ "RESTRICT",
- /* 167 */ "ROW",
- /* 168 */ "STATEMENT",
- /* 169 */ "TRIGGER",
- /* 170 */ "VIEW",
- /* 171 */ "COUNT",
- /* 172 */ "SUM",
- /* 173 */ "AVG",
- /* 174 */ "MIN",
- /* 175 */ "MAX",
- /* 176 */ "FIRST",
- /* 177 */ "LAST",
- /* 178 */ "TOP",
- /* 179 */ "BOTTOM",
- /* 180 */ "STDDEV",
- /* 181 */ "PERCENTILE",
- /* 182 */ "APERCENTILE",
- /* 183 */ "LEASTSQUARES",
- /* 184 */ "HISTOGRAM",
- /* 185 */ "DIFF",
- /* 186 */ "SPREAD",
- /* 187 */ "TWA",
- /* 188 */ "INTERP",
- /* 189 */ "LAST_ROW",
- /* 190 */ "RATE",
- /* 191 */ "IRATE",
- /* 192 */ "SUM_RATE",
- /* 193 */ "SUM_IRATE",
- /* 194 */ "AVG_RATE",
- /* 195 */ "AVG_IRATE",
- /* 196 */ "TBID",
- /* 197 */ "SEMI",
- /* 198 */ "NONE",
- /* 199 */ "PREV",
- /* 200 */ "LINEAR",
- /* 201 */ "IMPORT",
- /* 202 */ "METRIC",
- /* 203 */ "TBNAME",
- /* 204 */ "JOIN",
- /* 205 */ "METRICS",
- /* 206 */ "INSERT",
- /* 207 */ "INTO",
- /* 208 */ "VALUES",
- /* 209 */ "error",
- /* 210 */ "program",
- /* 211 */ "cmd",
- /* 212 */ "dbPrefix",
- /* 213 */ "ids",
- /* 214 */ "cpxName",
- /* 215 */ "ifexists",
- /* 216 */ "alter_db_optr",
- /* 217 */ "acct_optr",
- /* 218 */ "ifnotexists",
- /* 219 */ "db_optr",
- /* 220 */ "pps",
- /* 221 */ "tseries",
- /* 222 */ "dbs",
- /* 223 */ "streams",
- /* 224 */ "storage",
- /* 225 */ "qtime",
- /* 226 */ "users",
- /* 227 */ "conns",
- /* 228 */ "state",
- /* 229 */ "keep",
- /* 230 */ "tagitemlist",
- /* 231 */ "cache",
- /* 232 */ "replica",
- /* 233 */ "quorum",
- /* 234 */ "days",
- /* 235 */ "minrows",
- /* 236 */ "maxrows",
- /* 237 */ "blocks",
- /* 238 */ "ctime",
- /* 239 */ "wal",
- /* 240 */ "fsync",
- /* 241 */ "comp",
- /* 242 */ "prec",
- /* 243 */ "update",
- /* 244 */ "cachelast",
- /* 245 */ "typename",
- /* 246 */ "signed",
- /* 247 */ "create_table_args",
- /* 248 */ "create_stable_args",
- /* 249 */ "create_table_list",
- /* 250 */ "create_from_stable",
- /* 251 */ "columnlist",
- /* 252 */ "select",
- /* 253 */ "column",
- /* 254 */ "tagitem",
- /* 255 */ "selcollist",
- /* 256 */ "from",
- /* 257 */ "where_opt",
- /* 258 */ "interval_opt",
- /* 259 */ "fill_opt",
- /* 260 */ "sliding_opt",
- /* 261 */ "groupby_opt",
- /* 262 */ "orderby_opt",
- /* 263 */ "having_opt",
- /* 264 */ "slimit_opt",
- /* 265 */ "limit_opt",
- /* 266 */ "union",
- /* 267 */ "sclp",
- /* 268 */ "expr",
- /* 269 */ "as",
- /* 270 */ "tablelist",
- /* 271 */ "tmvar",
- /* 272 */ "sortlist",
- /* 273 */ "sortitem",
- /* 274 */ "item",
- /* 275 */ "sortorder",
- /* 276 */ "grouplist",
- /* 277 */ "exprlist",
- /* 278 */ "expritem",
+ /* 112 */ "DISTINCT",
+ /* 113 */ "FROM",
+ /* 114 */ "VARIABLE",
+ /* 115 */ "INTERVAL",
+ /* 116 */ "FILL",
+ /* 117 */ "SLIDING",
+ /* 118 */ "ORDER",
+ /* 119 */ "BY",
+ /* 120 */ "ASC",
+ /* 121 */ "DESC",
+ /* 122 */ "GROUP",
+ /* 123 */ "HAVING",
+ /* 124 */ "LIMIT",
+ /* 125 */ "OFFSET",
+ /* 126 */ "SLIMIT",
+ /* 127 */ "SOFFSET",
+ /* 128 */ "WHERE",
+ /* 129 */ "NOW",
+ /* 130 */ "RESET",
+ /* 131 */ "QUERY",
+ /* 132 */ "ADD",
+ /* 133 */ "COLUMN",
+ /* 134 */ "TAG",
+ /* 135 */ "CHANGE",
+ /* 136 */ "SET",
+ /* 137 */ "KILL",
+ /* 138 */ "CONNECTION",
+ /* 139 */ "STREAM",
+ /* 140 */ "COLON",
+ /* 141 */ "ABORT",
+ /* 142 */ "AFTER",
+ /* 143 */ "ATTACH",
+ /* 144 */ "BEFORE",
+ /* 145 */ "BEGIN",
+ /* 146 */ "CASCADE",
+ /* 147 */ "CLUSTER",
+ /* 148 */ "CONFLICT",
+ /* 149 */ "COPY",
+ /* 150 */ "DEFERRED",
+ /* 151 */ "DELIMITERS",
+ /* 152 */ "DETACH",
+ /* 153 */ "EACH",
+ /* 154 */ "END",
+ /* 155 */ "EXPLAIN",
+ /* 156 */ "FAIL",
+ /* 157 */ "FOR",
+ /* 158 */ "IGNORE",
+ /* 159 */ "IMMEDIATE",
+ /* 160 */ "INITIALLY",
+ /* 161 */ "INSTEAD",
+ /* 162 */ "MATCH",
+ /* 163 */ "KEY",
+ /* 164 */ "OF",
+ /* 165 */ "RAISE",
+ /* 166 */ "REPLACE",
+ /* 167 */ "RESTRICT",
+ /* 168 */ "ROW",
+ /* 169 */ "STATEMENT",
+ /* 170 */ "TRIGGER",
+ /* 171 */ "VIEW",
+ /* 172 */ "COUNT",
+ /* 173 */ "SUM",
+ /* 174 */ "AVG",
+ /* 175 */ "MIN",
+ /* 176 */ "MAX",
+ /* 177 */ "FIRST",
+ /* 178 */ "LAST",
+ /* 179 */ "TOP",
+ /* 180 */ "BOTTOM",
+ /* 181 */ "STDDEV",
+ /* 182 */ "PERCENTILE",
+ /* 183 */ "APERCENTILE",
+ /* 184 */ "LEASTSQUARES",
+ /* 185 */ "HISTOGRAM",
+ /* 186 */ "DIFF",
+ /* 187 */ "SPREAD",
+ /* 188 */ "TWA",
+ /* 189 */ "INTERP",
+ /* 190 */ "LAST_ROW",
+ /* 191 */ "RATE",
+ /* 192 */ "IRATE",
+ /* 193 */ "SUM_RATE",
+ /* 194 */ "SUM_IRATE",
+ /* 195 */ "AVG_RATE",
+ /* 196 */ "AVG_IRATE",
+ /* 197 */ "TBID",
+ /* 198 */ "SEMI",
+ /* 199 */ "NONE",
+ /* 200 */ "PREV",
+ /* 201 */ "LINEAR",
+ /* 202 */ "IMPORT",
+ /* 203 */ "METRIC",
+ /* 204 */ "TBNAME",
+ /* 205 */ "JOIN",
+ /* 206 */ "METRICS",
+ /* 207 */ "INSERT",
+ /* 208 */ "INTO",
+ /* 209 */ "VALUES",
+ /* 210 */ "error",
+ /* 211 */ "program",
+ /* 212 */ "cmd",
+ /* 213 */ "dbPrefix",
+ /* 214 */ "ids",
+ /* 215 */ "cpxName",
+ /* 216 */ "ifexists",
+ /* 217 */ "alter_db_optr",
+ /* 218 */ "acct_optr",
+ /* 219 */ "ifnotexists",
+ /* 220 */ "db_optr",
+ /* 221 */ "pps",
+ /* 222 */ "tseries",
+ /* 223 */ "dbs",
+ /* 224 */ "streams",
+ /* 225 */ "storage",
+ /* 226 */ "qtime",
+ /* 227 */ "users",
+ /* 228 */ "conns",
+ /* 229 */ "state",
+ /* 230 */ "keep",
+ /* 231 */ "tagitemlist",
+ /* 232 */ "cache",
+ /* 233 */ "replica",
+ /* 234 */ "quorum",
+ /* 235 */ "days",
+ /* 236 */ "minrows",
+ /* 237 */ "maxrows",
+ /* 238 */ "blocks",
+ /* 239 */ "ctime",
+ /* 240 */ "wal",
+ /* 241 */ "fsync",
+ /* 242 */ "comp",
+ /* 243 */ "prec",
+ /* 244 */ "update",
+ /* 245 */ "cachelast",
+ /* 246 */ "typename",
+ /* 247 */ "signed",
+ /* 248 */ "create_table_args",
+ /* 249 */ "create_stable_args",
+ /* 250 */ "create_table_list",
+ /* 251 */ "create_from_stable",
+ /* 252 */ "columnlist",
+ /* 253 */ "select",
+ /* 254 */ "column",
+ /* 255 */ "tagitem",
+ /* 256 */ "selcollist",
+ /* 257 */ "from",
+ /* 258 */ "where_opt",
+ /* 259 */ "interval_opt",
+ /* 260 */ "fill_opt",
+ /* 261 */ "sliding_opt",
+ /* 262 */ "groupby_opt",
+ /* 263 */ "orderby_opt",
+ /* 264 */ "having_opt",
+ /* 265 */ "slimit_opt",
+ /* 266 */ "limit_opt",
+ /* 267 */ "union",
+ /* 268 */ "sclp",
+ /* 269 */ "distinct",
+ /* 270 */ "expr",
+ /* 271 */ "as",
+ /* 272 */ "tablelist",
+ /* 273 */ "tmvar",
+ /* 274 */ "sortlist",
+ /* 275 */ "sortitem",
+ /* 276 */ "item",
+ /* 277 */ "sortorder",
+ /* 278 */ "grouplist",
+ /* 279 */ "exprlist",
+ /* 280 */ "expritem",
};
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
@@ -1193,101 +1194,103 @@ static const char *const yyRuleName[] = {
/* 150 */ "select ::= SELECT selcollist",
/* 151 */ "sclp ::= selcollist COMMA",
/* 152 */ "sclp ::=",
- /* 153 */ "selcollist ::= sclp expr as",
+ /* 153 */ "selcollist ::= sclp distinct expr as",
/* 154 */ "selcollist ::= sclp STAR",
/* 155 */ "as ::= AS ids",
/* 156 */ "as ::= ids",
/* 157 */ "as ::=",
- /* 158 */ "from ::= FROM tablelist",
- /* 159 */ "tablelist ::= ids cpxName",
- /* 160 */ "tablelist ::= ids cpxName ids",
- /* 161 */ "tablelist ::= tablelist COMMA ids cpxName",
- /* 162 */ "tablelist ::= tablelist COMMA ids cpxName ids",
- /* 163 */ "tmvar ::= VARIABLE",
- /* 164 */ "interval_opt ::= INTERVAL LP tmvar RP",
- /* 165 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
- /* 166 */ "interval_opt ::=",
- /* 167 */ "fill_opt ::=",
- /* 168 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
- /* 169 */ "fill_opt ::= FILL LP ID RP",
- /* 170 */ "sliding_opt ::= SLIDING LP tmvar RP",
- /* 171 */ "sliding_opt ::=",
- /* 172 */ "orderby_opt ::=",
- /* 173 */ "orderby_opt ::= ORDER BY sortlist",
- /* 174 */ "sortlist ::= sortlist COMMA item sortorder",
- /* 175 */ "sortlist ::= item sortorder",
- /* 176 */ "item ::= ids cpxName",
- /* 177 */ "sortorder ::= ASC",
- /* 178 */ "sortorder ::= DESC",
- /* 179 */ "sortorder ::=",
- /* 180 */ "groupby_opt ::=",
- /* 181 */ "groupby_opt ::= GROUP BY grouplist",
- /* 182 */ "grouplist ::= grouplist COMMA item",
- /* 183 */ "grouplist ::= item",
- /* 184 */ "having_opt ::=",
- /* 185 */ "having_opt ::= HAVING expr",
- /* 186 */ "limit_opt ::=",
- /* 187 */ "limit_opt ::= LIMIT signed",
- /* 188 */ "limit_opt ::= LIMIT signed OFFSET signed",
- /* 189 */ "limit_opt ::= LIMIT signed COMMA signed",
- /* 190 */ "slimit_opt ::=",
- /* 191 */ "slimit_opt ::= SLIMIT signed",
- /* 192 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
- /* 193 */ "slimit_opt ::= SLIMIT signed COMMA signed",
- /* 194 */ "where_opt ::=",
- /* 195 */ "where_opt ::= WHERE expr",
- /* 196 */ "expr ::= LP expr RP",
- /* 197 */ "expr ::= ID",
- /* 198 */ "expr ::= ID DOT ID",
- /* 199 */ "expr ::= ID DOT STAR",
- /* 200 */ "expr ::= INTEGER",
- /* 201 */ "expr ::= MINUS INTEGER",
- /* 202 */ "expr ::= PLUS INTEGER",
- /* 203 */ "expr ::= FLOAT",
- /* 204 */ "expr ::= MINUS FLOAT",
- /* 205 */ "expr ::= PLUS FLOAT",
- /* 206 */ "expr ::= STRING",
- /* 207 */ "expr ::= NOW",
- /* 208 */ "expr ::= VARIABLE",
- /* 209 */ "expr ::= BOOL",
- /* 210 */ "expr ::= ID LP exprlist RP",
- /* 211 */ "expr ::= ID LP STAR RP",
- /* 212 */ "expr ::= expr IS NULL",
- /* 213 */ "expr ::= expr IS NOT NULL",
- /* 214 */ "expr ::= expr LT expr",
- /* 215 */ "expr ::= expr GT expr",
- /* 216 */ "expr ::= expr LE expr",
- /* 217 */ "expr ::= expr GE expr",
- /* 218 */ "expr ::= expr NE expr",
- /* 219 */ "expr ::= expr EQ expr",
- /* 220 */ "expr ::= expr AND expr",
- /* 221 */ "expr ::= expr OR expr",
- /* 222 */ "expr ::= expr PLUS expr",
- /* 223 */ "expr ::= expr MINUS expr",
- /* 224 */ "expr ::= expr STAR expr",
- /* 225 */ "expr ::= expr SLASH expr",
- /* 226 */ "expr ::= expr REM expr",
- /* 227 */ "expr ::= expr LIKE expr",
- /* 228 */ "expr ::= expr IN LP exprlist RP",
- /* 229 */ "exprlist ::= exprlist COMMA expritem",
- /* 230 */ "exprlist ::= expritem",
- /* 231 */ "expritem ::= expr",
- /* 232 */ "expritem ::=",
- /* 233 */ "cmd ::= RESET QUERY CACHE",
- /* 234 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
- /* 235 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
- /* 236 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
- /* 237 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
- /* 238 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
- /* 239 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
- /* 240 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist",
- /* 241 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids",
- /* 242 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist",
- /* 243 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids",
- /* 244 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids",
- /* 245 */ "cmd ::= KILL CONNECTION INTEGER",
- /* 246 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
- /* 247 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
+ /* 158 */ "distinct ::= DISTINCT",
+ /* 159 */ "distinct ::=",
+ /* 160 */ "from ::= FROM tablelist",
+ /* 161 */ "tablelist ::= ids cpxName",
+ /* 162 */ "tablelist ::= ids cpxName ids",
+ /* 163 */ "tablelist ::= tablelist COMMA ids cpxName",
+ /* 164 */ "tablelist ::= tablelist COMMA ids cpxName ids",
+ /* 165 */ "tmvar ::= VARIABLE",
+ /* 166 */ "interval_opt ::= INTERVAL LP tmvar RP",
+ /* 167 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
+ /* 168 */ "interval_opt ::=",
+ /* 169 */ "fill_opt ::=",
+ /* 170 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
+ /* 171 */ "fill_opt ::= FILL LP ID RP",
+ /* 172 */ "sliding_opt ::= SLIDING LP tmvar RP",
+ /* 173 */ "sliding_opt ::=",
+ /* 174 */ "orderby_opt ::=",
+ /* 175 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 176 */ "sortlist ::= sortlist COMMA item sortorder",
+ /* 177 */ "sortlist ::= item sortorder",
+ /* 178 */ "item ::= ids cpxName",
+ /* 179 */ "sortorder ::= ASC",
+ /* 180 */ "sortorder ::= DESC",
+ /* 181 */ "sortorder ::=",
+ /* 182 */ "groupby_opt ::=",
+ /* 183 */ "groupby_opt ::= GROUP BY grouplist",
+ /* 184 */ "grouplist ::= grouplist COMMA item",
+ /* 185 */ "grouplist ::= item",
+ /* 186 */ "having_opt ::=",
+ /* 187 */ "having_opt ::= HAVING expr",
+ /* 188 */ "limit_opt ::=",
+ /* 189 */ "limit_opt ::= LIMIT signed",
+ /* 190 */ "limit_opt ::= LIMIT signed OFFSET signed",
+ /* 191 */ "limit_opt ::= LIMIT signed COMMA signed",
+ /* 192 */ "slimit_opt ::=",
+ /* 193 */ "slimit_opt ::= SLIMIT signed",
+ /* 194 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
+ /* 195 */ "slimit_opt ::= SLIMIT signed COMMA signed",
+ /* 196 */ "where_opt ::=",
+ /* 197 */ "where_opt ::= WHERE expr",
+ /* 198 */ "expr ::= LP expr RP",
+ /* 199 */ "expr ::= ID",
+ /* 200 */ "expr ::= ID DOT ID",
+ /* 201 */ "expr ::= ID DOT STAR",
+ /* 202 */ "expr ::= INTEGER",
+ /* 203 */ "expr ::= MINUS INTEGER",
+ /* 204 */ "expr ::= PLUS INTEGER",
+ /* 205 */ "expr ::= FLOAT",
+ /* 206 */ "expr ::= MINUS FLOAT",
+ /* 207 */ "expr ::= PLUS FLOAT",
+ /* 208 */ "expr ::= STRING",
+ /* 209 */ "expr ::= NOW",
+ /* 210 */ "expr ::= VARIABLE",
+ /* 211 */ "expr ::= BOOL",
+ /* 212 */ "expr ::= ID LP exprlist RP",
+ /* 213 */ "expr ::= ID LP STAR RP",
+ /* 214 */ "expr ::= expr IS NULL",
+ /* 215 */ "expr ::= expr IS NOT NULL",
+ /* 216 */ "expr ::= expr LT expr",
+ /* 217 */ "expr ::= expr GT expr",
+ /* 218 */ "expr ::= expr LE expr",
+ /* 219 */ "expr ::= expr GE expr",
+ /* 220 */ "expr ::= expr NE expr",
+ /* 221 */ "expr ::= expr EQ expr",
+ /* 222 */ "expr ::= expr AND expr",
+ /* 223 */ "expr ::= expr OR expr",
+ /* 224 */ "expr ::= expr PLUS expr",
+ /* 225 */ "expr ::= expr MINUS expr",
+ /* 226 */ "expr ::= expr STAR expr",
+ /* 227 */ "expr ::= expr SLASH expr",
+ /* 228 */ "expr ::= expr REM expr",
+ /* 229 */ "expr ::= expr LIKE expr",
+ /* 230 */ "expr ::= expr IN LP exprlist RP",
+ /* 231 */ "exprlist ::= exprlist COMMA expritem",
+ /* 232 */ "exprlist ::= expritem",
+ /* 233 */ "expritem ::= expr",
+ /* 234 */ "expritem ::=",
+ /* 235 */ "cmd ::= RESET QUERY CACHE",
+ /* 236 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
+ /* 237 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
+ /* 238 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
+ /* 239 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
+ /* 240 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
+ /* 241 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
+ /* 242 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist",
+ /* 243 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids",
+ /* 244 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist",
+ /* 245 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids",
+ /* 246 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids",
+ /* 247 */ "cmd ::= KILL CONNECTION INTEGER",
+ /* 248 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
+ /* 249 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
};
#endif /* NDEBUG */
@@ -1408,51 +1411,51 @@ static void yy_destructor(
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
- case 229: /* keep */
- case 230: /* tagitemlist */
- case 251: /* columnlist */
- case 259: /* fill_opt */
- case 261: /* groupby_opt */
- case 262: /* orderby_opt */
- case 272: /* sortlist */
- case 276: /* grouplist */
+ case 230: /* keep */
+ case 231: /* tagitemlist */
+ case 252: /* columnlist */
+ case 260: /* fill_opt */
+ case 262: /* groupby_opt */
+ case 263: /* orderby_opt */
+ case 274: /* sortlist */
+ case 278: /* grouplist */
{
-taosArrayDestroy((yypminor->yy135));
+taosArrayDestroy((yypminor->yy247));
}
break;
- case 249: /* create_table_list */
+ case 250: /* create_table_list */
{
-destroyCreateTableSql((yypminor->yy38));
+destroyCreateTableSql((yypminor->yy358));
}
break;
- case 252: /* select */
+ case 253: /* select */
{
-doDestroyQuerySql((yypminor->yy30));
+doDestroyQuerySql((yypminor->yy114));
}
break;
- case 255: /* selcollist */
- case 267: /* sclp */
- case 277: /* exprlist */
+ case 256: /* selcollist */
+ case 268: /* sclp */
+ case 279: /* exprlist */
{
-tSqlExprListDestroy((yypminor->yy266));
+tSqlExprListDestroy((yypminor->yy522));
}
break;
- case 257: /* where_opt */
- case 263: /* having_opt */
- case 268: /* expr */
- case 278: /* expritem */
+ case 258: /* where_opt */
+ case 264: /* having_opt */
+ case 270: /* expr */
+ case 280: /* expritem */
{
-tSqlExprDestroy((yypminor->yy316));
+tSqlExprDestroy((yypminor->yy326));
}
break;
- case 266: /* union */
+ case 267: /* union */
{
-destroyAllSelectClause((yypminor->yy153));
+destroyAllSelectClause((yypminor->yy219));
}
break;
- case 273: /* sortitem */
+ case 275: /* sortitem */
{
-tVariantDestroy(&(yypminor->yy308));
+tVariantDestroy(&(yypminor->yy378));
}
break;
/********* End destructor definitions *****************************************/
@@ -1746,254 +1749,256 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} yyRuleInfo[] = {
- { 210, -1 }, /* (0) program ::= cmd */
- { 211, -2 }, /* (1) cmd ::= SHOW DATABASES */
- { 211, -2 }, /* (2) cmd ::= SHOW MNODES */
- { 211, -2 }, /* (3) cmd ::= SHOW DNODES */
- { 211, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */
- { 211, -2 }, /* (5) cmd ::= SHOW USERS */
- { 211, -2 }, /* (6) cmd ::= SHOW MODULES */
- { 211, -2 }, /* (7) cmd ::= SHOW QUERIES */
- { 211, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */
- { 211, -2 }, /* (9) cmd ::= SHOW STREAMS */
- { 211, -2 }, /* (10) cmd ::= SHOW VARIABLES */
- { 211, -2 }, /* (11) cmd ::= SHOW SCORES */
- { 211, -2 }, /* (12) cmd ::= SHOW GRANTS */
- { 211, -2 }, /* (13) cmd ::= SHOW VNODES */
- { 211, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */
- { 212, 0 }, /* (15) dbPrefix ::= */
- { 212, -2 }, /* (16) dbPrefix ::= ids DOT */
- { 214, 0 }, /* (17) cpxName ::= */
- { 214, -2 }, /* (18) cpxName ::= DOT ids */
- { 211, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
- { 211, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */
- { 211, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */
- { 211, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
- { 211, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */
- { 211, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
- { 211, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
- { 211, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
- { 211, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
- { 211, -5 }, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */
- { 211, -4 }, /* (29) cmd ::= DROP DATABASE ifexists ids */
- { 211, -3 }, /* (30) cmd ::= DROP DNODE ids */
- { 211, -3 }, /* (31) cmd ::= DROP USER ids */
- { 211, -3 }, /* (32) cmd ::= DROP ACCOUNT ids */
- { 211, -2 }, /* (33) cmd ::= USE ids */
- { 211, -3 }, /* (34) cmd ::= DESCRIBE ids cpxName */
- { 211, -5 }, /* (35) cmd ::= ALTER USER ids PASS ids */
- { 211, -5 }, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */
- { 211, -4 }, /* (37) cmd ::= ALTER DNODE ids ids */
- { 211, -5 }, /* (38) cmd ::= ALTER DNODE ids ids ids */
- { 211, -3 }, /* (39) cmd ::= ALTER LOCAL ids */
- { 211, -4 }, /* (40) cmd ::= ALTER LOCAL ids ids */
- { 211, -4 }, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */
- { 211, -4 }, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */
- { 211, -6 }, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
- { 213, -1 }, /* (44) ids ::= ID */
- { 213, -1 }, /* (45) ids ::= STRING */
- { 215, -2 }, /* (46) ifexists ::= IF EXISTS */
- { 215, 0 }, /* (47) ifexists ::= */
- { 218, -3 }, /* (48) ifnotexists ::= IF NOT EXISTS */
- { 218, 0 }, /* (49) ifnotexists ::= */
- { 211, -3 }, /* (50) cmd ::= CREATE DNODE ids */
- { 211, -6 }, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
- { 211, -5 }, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
- { 211, -5 }, /* (53) cmd ::= CREATE USER ids PASS ids */
- { 220, 0 }, /* (54) pps ::= */
- { 220, -2 }, /* (55) pps ::= PPS INTEGER */
- { 221, 0 }, /* (56) tseries ::= */
- { 221, -2 }, /* (57) tseries ::= TSERIES INTEGER */
- { 222, 0 }, /* (58) dbs ::= */
- { 222, -2 }, /* (59) dbs ::= DBS INTEGER */
- { 223, 0 }, /* (60) streams ::= */
- { 223, -2 }, /* (61) streams ::= STREAMS INTEGER */
- { 224, 0 }, /* (62) storage ::= */
- { 224, -2 }, /* (63) storage ::= STORAGE INTEGER */
- { 225, 0 }, /* (64) qtime ::= */
- { 225, -2 }, /* (65) qtime ::= QTIME INTEGER */
- { 226, 0 }, /* (66) users ::= */
- { 226, -2 }, /* (67) users ::= USERS INTEGER */
- { 227, 0 }, /* (68) conns ::= */
- { 227, -2 }, /* (69) conns ::= CONNS INTEGER */
- { 228, 0 }, /* (70) state ::= */
- { 228, -2 }, /* (71) state ::= STATE ids */
- { 217, -9 }, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
- { 229, -2 }, /* (73) keep ::= KEEP tagitemlist */
- { 231, -2 }, /* (74) cache ::= CACHE INTEGER */
- { 232, -2 }, /* (75) replica ::= REPLICA INTEGER */
- { 233, -2 }, /* (76) quorum ::= QUORUM INTEGER */
- { 234, -2 }, /* (77) days ::= DAYS INTEGER */
- { 235, -2 }, /* (78) minrows ::= MINROWS INTEGER */
- { 236, -2 }, /* (79) maxrows ::= MAXROWS INTEGER */
- { 237, -2 }, /* (80) blocks ::= BLOCKS INTEGER */
- { 238, -2 }, /* (81) ctime ::= CTIME INTEGER */
- { 239, -2 }, /* (82) wal ::= WAL INTEGER */
- { 240, -2 }, /* (83) fsync ::= FSYNC INTEGER */
- { 241, -2 }, /* (84) comp ::= COMP INTEGER */
- { 242, -2 }, /* (85) prec ::= PRECISION STRING */
- { 243, -2 }, /* (86) update ::= UPDATE INTEGER */
- { 244, -2 }, /* (87) cachelast ::= CACHELAST INTEGER */
- { 219, 0 }, /* (88) db_optr ::= */
- { 219, -2 }, /* (89) db_optr ::= db_optr cache */
- { 219, -2 }, /* (90) db_optr ::= db_optr replica */
- { 219, -2 }, /* (91) db_optr ::= db_optr quorum */
- { 219, -2 }, /* (92) db_optr ::= db_optr days */
- { 219, -2 }, /* (93) db_optr ::= db_optr minrows */
- { 219, -2 }, /* (94) db_optr ::= db_optr maxrows */
- { 219, -2 }, /* (95) db_optr ::= db_optr blocks */
- { 219, -2 }, /* (96) db_optr ::= db_optr ctime */
- { 219, -2 }, /* (97) db_optr ::= db_optr wal */
- { 219, -2 }, /* (98) db_optr ::= db_optr fsync */
- { 219, -2 }, /* (99) db_optr ::= db_optr comp */
- { 219, -2 }, /* (100) db_optr ::= db_optr prec */
- { 219, -2 }, /* (101) db_optr ::= db_optr keep */
- { 219, -2 }, /* (102) db_optr ::= db_optr update */
- { 219, -2 }, /* (103) db_optr ::= db_optr cachelast */
- { 216, 0 }, /* (104) alter_db_optr ::= */
- { 216, -2 }, /* (105) alter_db_optr ::= alter_db_optr replica */
- { 216, -2 }, /* (106) alter_db_optr ::= alter_db_optr quorum */
- { 216, -2 }, /* (107) alter_db_optr ::= alter_db_optr keep */
- { 216, -2 }, /* (108) alter_db_optr ::= alter_db_optr blocks */
- { 216, -2 }, /* (109) alter_db_optr ::= alter_db_optr comp */
- { 216, -2 }, /* (110) alter_db_optr ::= alter_db_optr wal */
- { 216, -2 }, /* (111) alter_db_optr ::= alter_db_optr fsync */
- { 216, -2 }, /* (112) alter_db_optr ::= alter_db_optr update */
- { 216, -2 }, /* (113) alter_db_optr ::= alter_db_optr cachelast */
- { 245, -1 }, /* (114) typename ::= ids */
- { 245, -4 }, /* (115) typename ::= ids LP signed RP */
- { 245, -2 }, /* (116) typename ::= ids UNSIGNED */
- { 246, -1 }, /* (117) signed ::= INTEGER */
- { 246, -2 }, /* (118) signed ::= PLUS INTEGER */
- { 246, -2 }, /* (119) signed ::= MINUS INTEGER */
- { 211, -3 }, /* (120) cmd ::= CREATE TABLE create_table_args */
- { 211, -3 }, /* (121) cmd ::= CREATE TABLE create_stable_args */
- { 211, -3 }, /* (122) cmd ::= CREATE STABLE create_stable_args */
- { 211, -3 }, /* (123) cmd ::= CREATE TABLE create_table_list */
- { 249, -1 }, /* (124) create_table_list ::= create_from_stable */
- { 249, -2 }, /* (125) create_table_list ::= create_table_list create_from_stable */
- { 247, -6 }, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
- { 248, -10 }, /* (127) create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
- { 250, -10 }, /* (128) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
- { 247, -5 }, /* (129) create_table_args ::= ifnotexists ids cpxName AS select */
- { 251, -3 }, /* (130) columnlist ::= columnlist COMMA column */
- { 251, -1 }, /* (131) columnlist ::= column */
- { 253, -2 }, /* (132) column ::= ids typename */
- { 230, -3 }, /* (133) tagitemlist ::= tagitemlist COMMA tagitem */
- { 230, -1 }, /* (134) tagitemlist ::= tagitem */
- { 254, -1 }, /* (135) tagitem ::= INTEGER */
- { 254, -1 }, /* (136) tagitem ::= FLOAT */
- { 254, -1 }, /* (137) tagitem ::= STRING */
- { 254, -1 }, /* (138) tagitem ::= BOOL */
- { 254, -1 }, /* (139) tagitem ::= NULL */
- { 254, -2 }, /* (140) tagitem ::= MINUS INTEGER */
- { 254, -2 }, /* (141) tagitem ::= MINUS FLOAT */
- { 254, -2 }, /* (142) tagitem ::= PLUS INTEGER */
- { 254, -2 }, /* (143) tagitem ::= PLUS FLOAT */
- { 252, -12 }, /* (144) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
- { 266, -1 }, /* (145) union ::= select */
- { 266, -3 }, /* (146) union ::= LP union RP */
- { 266, -4 }, /* (147) union ::= union UNION ALL select */
- { 266, -6 }, /* (148) union ::= union UNION ALL LP select RP */
- { 211, -1 }, /* (149) cmd ::= union */
- { 252, -2 }, /* (150) select ::= SELECT selcollist */
- { 267, -2 }, /* (151) sclp ::= selcollist COMMA */
- { 267, 0 }, /* (152) sclp ::= */
- { 255, -3 }, /* (153) selcollist ::= sclp expr as */
- { 255, -2 }, /* (154) selcollist ::= sclp STAR */
- { 269, -2 }, /* (155) as ::= AS ids */
- { 269, -1 }, /* (156) as ::= ids */
- { 269, 0 }, /* (157) as ::= */
- { 256, -2 }, /* (158) from ::= FROM tablelist */
- { 270, -2 }, /* (159) tablelist ::= ids cpxName */
- { 270, -3 }, /* (160) tablelist ::= ids cpxName ids */
- { 270, -4 }, /* (161) tablelist ::= tablelist COMMA ids cpxName */
- { 270, -5 }, /* (162) tablelist ::= tablelist COMMA ids cpxName ids */
- { 271, -1 }, /* (163) tmvar ::= VARIABLE */
- { 258, -4 }, /* (164) interval_opt ::= INTERVAL LP tmvar RP */
- { 258, -6 }, /* (165) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
- { 258, 0 }, /* (166) interval_opt ::= */
- { 259, 0 }, /* (167) fill_opt ::= */
- { 259, -6 }, /* (168) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
- { 259, -4 }, /* (169) fill_opt ::= FILL LP ID RP */
- { 260, -4 }, /* (170) sliding_opt ::= SLIDING LP tmvar RP */
- { 260, 0 }, /* (171) sliding_opt ::= */
- { 262, 0 }, /* (172) orderby_opt ::= */
- { 262, -3 }, /* (173) orderby_opt ::= ORDER BY sortlist */
- { 272, -4 }, /* (174) sortlist ::= sortlist COMMA item sortorder */
- { 272, -2 }, /* (175) sortlist ::= item sortorder */
- { 274, -2 }, /* (176) item ::= ids cpxName */
- { 275, -1 }, /* (177) sortorder ::= ASC */
- { 275, -1 }, /* (178) sortorder ::= DESC */
- { 275, 0 }, /* (179) sortorder ::= */
- { 261, 0 }, /* (180) groupby_opt ::= */
- { 261, -3 }, /* (181) groupby_opt ::= GROUP BY grouplist */
- { 276, -3 }, /* (182) grouplist ::= grouplist COMMA item */
- { 276, -1 }, /* (183) grouplist ::= item */
- { 263, 0 }, /* (184) having_opt ::= */
- { 263, -2 }, /* (185) having_opt ::= HAVING expr */
- { 265, 0 }, /* (186) limit_opt ::= */
- { 265, -2 }, /* (187) limit_opt ::= LIMIT signed */
- { 265, -4 }, /* (188) limit_opt ::= LIMIT signed OFFSET signed */
- { 265, -4 }, /* (189) limit_opt ::= LIMIT signed COMMA signed */
- { 264, 0 }, /* (190) slimit_opt ::= */
- { 264, -2 }, /* (191) slimit_opt ::= SLIMIT signed */
- { 264, -4 }, /* (192) slimit_opt ::= SLIMIT signed SOFFSET signed */
- { 264, -4 }, /* (193) slimit_opt ::= SLIMIT signed COMMA signed */
- { 257, 0 }, /* (194) where_opt ::= */
- { 257, -2 }, /* (195) where_opt ::= WHERE expr */
- { 268, -3 }, /* (196) expr ::= LP expr RP */
- { 268, -1 }, /* (197) expr ::= ID */
- { 268, -3 }, /* (198) expr ::= ID DOT ID */
- { 268, -3 }, /* (199) expr ::= ID DOT STAR */
- { 268, -1 }, /* (200) expr ::= INTEGER */
- { 268, -2 }, /* (201) expr ::= MINUS INTEGER */
- { 268, -2 }, /* (202) expr ::= PLUS INTEGER */
- { 268, -1 }, /* (203) expr ::= FLOAT */
- { 268, -2 }, /* (204) expr ::= MINUS FLOAT */
- { 268, -2 }, /* (205) expr ::= PLUS FLOAT */
- { 268, -1 }, /* (206) expr ::= STRING */
- { 268, -1 }, /* (207) expr ::= NOW */
- { 268, -1 }, /* (208) expr ::= VARIABLE */
- { 268, -1 }, /* (209) expr ::= BOOL */
- { 268, -4 }, /* (210) expr ::= ID LP exprlist RP */
- { 268, -4 }, /* (211) expr ::= ID LP STAR RP */
- { 268, -3 }, /* (212) expr ::= expr IS NULL */
- { 268, -4 }, /* (213) expr ::= expr IS NOT NULL */
- { 268, -3 }, /* (214) expr ::= expr LT expr */
- { 268, -3 }, /* (215) expr ::= expr GT expr */
- { 268, -3 }, /* (216) expr ::= expr LE expr */
- { 268, -3 }, /* (217) expr ::= expr GE expr */
- { 268, -3 }, /* (218) expr ::= expr NE expr */
- { 268, -3 }, /* (219) expr ::= expr EQ expr */
- { 268, -3 }, /* (220) expr ::= expr AND expr */
- { 268, -3 }, /* (221) expr ::= expr OR expr */
- { 268, -3 }, /* (222) expr ::= expr PLUS expr */
- { 268, -3 }, /* (223) expr ::= expr MINUS expr */
- { 268, -3 }, /* (224) expr ::= expr STAR expr */
- { 268, -3 }, /* (225) expr ::= expr SLASH expr */
- { 268, -3 }, /* (226) expr ::= expr REM expr */
- { 268, -3 }, /* (227) expr ::= expr LIKE expr */
- { 268, -5 }, /* (228) expr ::= expr IN LP exprlist RP */
- { 277, -3 }, /* (229) exprlist ::= exprlist COMMA expritem */
- { 277, -1 }, /* (230) exprlist ::= expritem */
- { 278, -1 }, /* (231) expritem ::= expr */
- { 278, 0 }, /* (232) expritem ::= */
- { 211, -3 }, /* (233) cmd ::= RESET QUERY CACHE */
- { 211, -7 }, /* (234) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
- { 211, -7 }, /* (235) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
- { 211, -7 }, /* (236) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
- { 211, -7 }, /* (237) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
- { 211, -8 }, /* (238) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
- { 211, -9 }, /* (239) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
- { 211, -7 }, /* (240) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
- { 211, -7 }, /* (241) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
- { 211, -7 }, /* (242) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
- { 211, -7 }, /* (243) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
- { 211, -8 }, /* (244) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
- { 211, -3 }, /* (245) cmd ::= KILL CONNECTION INTEGER */
- { 211, -5 }, /* (246) cmd ::= KILL STREAM INTEGER COLON INTEGER */
- { 211, -5 }, /* (247) cmd ::= KILL QUERY INTEGER COLON INTEGER */
+ { 211, -1 }, /* (0) program ::= cmd */
+ { 212, -2 }, /* (1) cmd ::= SHOW DATABASES */
+ { 212, -2 }, /* (2) cmd ::= SHOW MNODES */
+ { 212, -2 }, /* (3) cmd ::= SHOW DNODES */
+ { 212, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */
+ { 212, -2 }, /* (5) cmd ::= SHOW USERS */
+ { 212, -2 }, /* (6) cmd ::= SHOW MODULES */
+ { 212, -2 }, /* (7) cmd ::= SHOW QUERIES */
+ { 212, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */
+ { 212, -2 }, /* (9) cmd ::= SHOW STREAMS */
+ { 212, -2 }, /* (10) cmd ::= SHOW VARIABLES */
+ { 212, -2 }, /* (11) cmd ::= SHOW SCORES */
+ { 212, -2 }, /* (12) cmd ::= SHOW GRANTS */
+ { 212, -2 }, /* (13) cmd ::= SHOW VNODES */
+ { 212, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */
+ { 213, 0 }, /* (15) dbPrefix ::= */
+ { 213, -2 }, /* (16) dbPrefix ::= ids DOT */
+ { 215, 0 }, /* (17) cpxName ::= */
+ { 215, -2 }, /* (18) cpxName ::= DOT ids */
+ { 212, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
+ { 212, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */
+ { 212, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */
+ { 212, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
+ { 212, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */
+ { 212, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
+ { 212, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
+ { 212, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
+ { 212, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
+ { 212, -5 }, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */
+ { 212, -4 }, /* (29) cmd ::= DROP DATABASE ifexists ids */
+ { 212, -3 }, /* (30) cmd ::= DROP DNODE ids */
+ { 212, -3 }, /* (31) cmd ::= DROP USER ids */
+ { 212, -3 }, /* (32) cmd ::= DROP ACCOUNT ids */
+ { 212, -2 }, /* (33) cmd ::= USE ids */
+ { 212, -3 }, /* (34) cmd ::= DESCRIBE ids cpxName */
+ { 212, -5 }, /* (35) cmd ::= ALTER USER ids PASS ids */
+ { 212, -5 }, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */
+ { 212, -4 }, /* (37) cmd ::= ALTER DNODE ids ids */
+ { 212, -5 }, /* (38) cmd ::= ALTER DNODE ids ids ids */
+ { 212, -3 }, /* (39) cmd ::= ALTER LOCAL ids */
+ { 212, -4 }, /* (40) cmd ::= ALTER LOCAL ids ids */
+ { 212, -4 }, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */
+ { 212, -4 }, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */
+ { 212, -6 }, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
+ { 214, -1 }, /* (44) ids ::= ID */
+ { 214, -1 }, /* (45) ids ::= STRING */
+ { 216, -2 }, /* (46) ifexists ::= IF EXISTS */
+ { 216, 0 }, /* (47) ifexists ::= */
+ { 219, -3 }, /* (48) ifnotexists ::= IF NOT EXISTS */
+ { 219, 0 }, /* (49) ifnotexists ::= */
+ { 212, -3 }, /* (50) cmd ::= CREATE DNODE ids */
+ { 212, -6 }, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
+ { 212, -5 }, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
+ { 212, -5 }, /* (53) cmd ::= CREATE USER ids PASS ids */
+ { 221, 0 }, /* (54) pps ::= */
+ { 221, -2 }, /* (55) pps ::= PPS INTEGER */
+ { 222, 0 }, /* (56) tseries ::= */
+ { 222, -2 }, /* (57) tseries ::= TSERIES INTEGER */
+ { 223, 0 }, /* (58) dbs ::= */
+ { 223, -2 }, /* (59) dbs ::= DBS INTEGER */
+ { 224, 0 }, /* (60) streams ::= */
+ { 224, -2 }, /* (61) streams ::= STREAMS INTEGER */
+ { 225, 0 }, /* (62) storage ::= */
+ { 225, -2 }, /* (63) storage ::= STORAGE INTEGER */
+ { 226, 0 }, /* (64) qtime ::= */
+ { 226, -2 }, /* (65) qtime ::= QTIME INTEGER */
+ { 227, 0 }, /* (66) users ::= */
+ { 227, -2 }, /* (67) users ::= USERS INTEGER */
+ { 228, 0 }, /* (68) conns ::= */
+ { 228, -2 }, /* (69) conns ::= CONNS INTEGER */
+ { 229, 0 }, /* (70) state ::= */
+ { 229, -2 }, /* (71) state ::= STATE ids */
+ { 218, -9 }, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
+ { 230, -2 }, /* (73) keep ::= KEEP tagitemlist */
+ { 232, -2 }, /* (74) cache ::= CACHE INTEGER */
+ { 233, -2 }, /* (75) replica ::= REPLICA INTEGER */
+ { 234, -2 }, /* (76) quorum ::= QUORUM INTEGER */
+ { 235, -2 }, /* (77) days ::= DAYS INTEGER */
+ { 236, -2 }, /* (78) minrows ::= MINROWS INTEGER */
+ { 237, -2 }, /* (79) maxrows ::= MAXROWS INTEGER */
+ { 238, -2 }, /* (80) blocks ::= BLOCKS INTEGER */
+ { 239, -2 }, /* (81) ctime ::= CTIME INTEGER */
+ { 240, -2 }, /* (82) wal ::= WAL INTEGER */
+ { 241, -2 }, /* (83) fsync ::= FSYNC INTEGER */
+ { 242, -2 }, /* (84) comp ::= COMP INTEGER */
+ { 243, -2 }, /* (85) prec ::= PRECISION STRING */
+ { 244, -2 }, /* (86) update ::= UPDATE INTEGER */
+ { 245, -2 }, /* (87) cachelast ::= CACHELAST INTEGER */
+ { 220, 0 }, /* (88) db_optr ::= */
+ { 220, -2 }, /* (89) db_optr ::= db_optr cache */
+ { 220, -2 }, /* (90) db_optr ::= db_optr replica */
+ { 220, -2 }, /* (91) db_optr ::= db_optr quorum */
+ { 220, -2 }, /* (92) db_optr ::= db_optr days */
+ { 220, -2 }, /* (93) db_optr ::= db_optr minrows */
+ { 220, -2 }, /* (94) db_optr ::= db_optr maxrows */
+ { 220, -2 }, /* (95) db_optr ::= db_optr blocks */
+ { 220, -2 }, /* (96) db_optr ::= db_optr ctime */
+ { 220, -2 }, /* (97) db_optr ::= db_optr wal */
+ { 220, -2 }, /* (98) db_optr ::= db_optr fsync */
+ { 220, -2 }, /* (99) db_optr ::= db_optr comp */
+ { 220, -2 }, /* (100) db_optr ::= db_optr prec */
+ { 220, -2 }, /* (101) db_optr ::= db_optr keep */
+ { 220, -2 }, /* (102) db_optr ::= db_optr update */
+ { 220, -2 }, /* (103) db_optr ::= db_optr cachelast */
+ { 217, 0 }, /* (104) alter_db_optr ::= */
+ { 217, -2 }, /* (105) alter_db_optr ::= alter_db_optr replica */
+ { 217, -2 }, /* (106) alter_db_optr ::= alter_db_optr quorum */
+ { 217, -2 }, /* (107) alter_db_optr ::= alter_db_optr keep */
+ { 217, -2 }, /* (108) alter_db_optr ::= alter_db_optr blocks */
+ { 217, -2 }, /* (109) alter_db_optr ::= alter_db_optr comp */
+ { 217, -2 }, /* (110) alter_db_optr ::= alter_db_optr wal */
+ { 217, -2 }, /* (111) alter_db_optr ::= alter_db_optr fsync */
+ { 217, -2 }, /* (112) alter_db_optr ::= alter_db_optr update */
+ { 217, -2 }, /* (113) alter_db_optr ::= alter_db_optr cachelast */
+ { 246, -1 }, /* (114) typename ::= ids */
+ { 246, -4 }, /* (115) typename ::= ids LP signed RP */
+ { 246, -2 }, /* (116) typename ::= ids UNSIGNED */
+ { 247, -1 }, /* (117) signed ::= INTEGER */
+ { 247, -2 }, /* (118) signed ::= PLUS INTEGER */
+ { 247, -2 }, /* (119) signed ::= MINUS INTEGER */
+ { 212, -3 }, /* (120) cmd ::= CREATE TABLE create_table_args */
+ { 212, -3 }, /* (121) cmd ::= CREATE TABLE create_stable_args */
+ { 212, -3 }, /* (122) cmd ::= CREATE STABLE create_stable_args */
+ { 212, -3 }, /* (123) cmd ::= CREATE TABLE create_table_list */
+ { 250, -1 }, /* (124) create_table_list ::= create_from_stable */
+ { 250, -2 }, /* (125) create_table_list ::= create_table_list create_from_stable */
+ { 248, -6 }, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
+ { 249, -10 }, /* (127) create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
+ { 251, -10 }, /* (128) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
+ { 248, -5 }, /* (129) create_table_args ::= ifnotexists ids cpxName AS select */
+ { 252, -3 }, /* (130) columnlist ::= columnlist COMMA column */
+ { 252, -1 }, /* (131) columnlist ::= column */
+ { 254, -2 }, /* (132) column ::= ids typename */
+ { 231, -3 }, /* (133) tagitemlist ::= tagitemlist COMMA tagitem */
+ { 231, -1 }, /* (134) tagitemlist ::= tagitem */
+ { 255, -1 }, /* (135) tagitem ::= INTEGER */
+ { 255, -1 }, /* (136) tagitem ::= FLOAT */
+ { 255, -1 }, /* (137) tagitem ::= STRING */
+ { 255, -1 }, /* (138) tagitem ::= BOOL */
+ { 255, -1 }, /* (139) tagitem ::= NULL */
+ { 255, -2 }, /* (140) tagitem ::= MINUS INTEGER */
+ { 255, -2 }, /* (141) tagitem ::= MINUS FLOAT */
+ { 255, -2 }, /* (142) tagitem ::= PLUS INTEGER */
+ { 255, -2 }, /* (143) tagitem ::= PLUS FLOAT */
+ { 253, -12 }, /* (144) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
+ { 267, -1 }, /* (145) union ::= select */
+ { 267, -3 }, /* (146) union ::= LP union RP */
+ { 267, -4 }, /* (147) union ::= union UNION ALL select */
+ { 267, -6 }, /* (148) union ::= union UNION ALL LP select RP */
+ { 212, -1 }, /* (149) cmd ::= union */
+ { 253, -2 }, /* (150) select ::= SELECT selcollist */
+ { 268, -2 }, /* (151) sclp ::= selcollist COMMA */
+ { 268, 0 }, /* (152) sclp ::= */
+ { 256, -4 }, /* (153) selcollist ::= sclp distinct expr as */
+ { 256, -2 }, /* (154) selcollist ::= sclp STAR */
+ { 271, -2 }, /* (155) as ::= AS ids */
+ { 271, -1 }, /* (156) as ::= ids */
+ { 271, 0 }, /* (157) as ::= */
+ { 269, -1 }, /* (158) distinct ::= DISTINCT */
+ { 269, 0 }, /* (159) distinct ::= */
+ { 257, -2 }, /* (160) from ::= FROM tablelist */
+ { 272, -2 }, /* (161) tablelist ::= ids cpxName */
+ { 272, -3 }, /* (162) tablelist ::= ids cpxName ids */
+ { 272, -4 }, /* (163) tablelist ::= tablelist COMMA ids cpxName */
+ { 272, -5 }, /* (164) tablelist ::= tablelist COMMA ids cpxName ids */
+ { 273, -1 }, /* (165) tmvar ::= VARIABLE */
+ { 259, -4 }, /* (166) interval_opt ::= INTERVAL LP tmvar RP */
+ { 259, -6 }, /* (167) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
+ { 259, 0 }, /* (168) interval_opt ::= */
+ { 260, 0 }, /* (169) fill_opt ::= */
+ { 260, -6 }, /* (170) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
+ { 260, -4 }, /* (171) fill_opt ::= FILL LP ID RP */
+ { 261, -4 }, /* (172) sliding_opt ::= SLIDING LP tmvar RP */
+ { 261, 0 }, /* (173) sliding_opt ::= */
+ { 263, 0 }, /* (174) orderby_opt ::= */
+ { 263, -3 }, /* (175) orderby_opt ::= ORDER BY sortlist */
+ { 274, -4 }, /* (176) sortlist ::= sortlist COMMA item sortorder */
+ { 274, -2 }, /* (177) sortlist ::= item sortorder */
+ { 276, -2 }, /* (178) item ::= ids cpxName */
+ { 277, -1 }, /* (179) sortorder ::= ASC */
+ { 277, -1 }, /* (180) sortorder ::= DESC */
+ { 277, 0 }, /* (181) sortorder ::= */
+ { 262, 0 }, /* (182) groupby_opt ::= */
+ { 262, -3 }, /* (183) groupby_opt ::= GROUP BY grouplist */
+ { 278, -3 }, /* (184) grouplist ::= grouplist COMMA item */
+ { 278, -1 }, /* (185) grouplist ::= item */
+ { 264, 0 }, /* (186) having_opt ::= */
+ { 264, -2 }, /* (187) having_opt ::= HAVING expr */
+ { 266, 0 }, /* (188) limit_opt ::= */
+ { 266, -2 }, /* (189) limit_opt ::= LIMIT signed */
+ { 266, -4 }, /* (190) limit_opt ::= LIMIT signed OFFSET signed */
+ { 266, -4 }, /* (191) limit_opt ::= LIMIT signed COMMA signed */
+ { 265, 0 }, /* (192) slimit_opt ::= */
+ { 265, -2 }, /* (193) slimit_opt ::= SLIMIT signed */
+ { 265, -4 }, /* (194) slimit_opt ::= SLIMIT signed SOFFSET signed */
+ { 265, -4 }, /* (195) slimit_opt ::= SLIMIT signed COMMA signed */
+ { 258, 0 }, /* (196) where_opt ::= */
+ { 258, -2 }, /* (197) where_opt ::= WHERE expr */
+ { 270, -3 }, /* (198) expr ::= LP expr RP */
+ { 270, -1 }, /* (199) expr ::= ID */
+ { 270, -3 }, /* (200) expr ::= ID DOT ID */
+ { 270, -3 }, /* (201) expr ::= ID DOT STAR */
+ { 270, -1 }, /* (202) expr ::= INTEGER */
+ { 270, -2 }, /* (203) expr ::= MINUS INTEGER */
+ { 270, -2 }, /* (204) expr ::= PLUS INTEGER */
+ { 270, -1 }, /* (205) expr ::= FLOAT */
+ { 270, -2 }, /* (206) expr ::= MINUS FLOAT */
+ { 270, -2 }, /* (207) expr ::= PLUS FLOAT */
+ { 270, -1 }, /* (208) expr ::= STRING */
+ { 270, -1 }, /* (209) expr ::= NOW */
+ { 270, -1 }, /* (210) expr ::= VARIABLE */
+ { 270, -1 }, /* (211) expr ::= BOOL */
+ { 270, -4 }, /* (212) expr ::= ID LP exprlist RP */
+ { 270, -4 }, /* (213) expr ::= ID LP STAR RP */
+ { 270, -3 }, /* (214) expr ::= expr IS NULL */
+ { 270, -4 }, /* (215) expr ::= expr IS NOT NULL */
+ { 270, -3 }, /* (216) expr ::= expr LT expr */
+ { 270, -3 }, /* (217) expr ::= expr GT expr */
+ { 270, -3 }, /* (218) expr ::= expr LE expr */
+ { 270, -3 }, /* (219) expr ::= expr GE expr */
+ { 270, -3 }, /* (220) expr ::= expr NE expr */
+ { 270, -3 }, /* (221) expr ::= expr EQ expr */
+ { 270, -3 }, /* (222) expr ::= expr AND expr */
+ { 270, -3 }, /* (223) expr ::= expr OR expr */
+ { 270, -3 }, /* (224) expr ::= expr PLUS expr */
+ { 270, -3 }, /* (225) expr ::= expr MINUS expr */
+ { 270, -3 }, /* (226) expr ::= expr STAR expr */
+ { 270, -3 }, /* (227) expr ::= expr SLASH expr */
+ { 270, -3 }, /* (228) expr ::= expr REM expr */
+ { 270, -3 }, /* (229) expr ::= expr LIKE expr */
+ { 270, -5 }, /* (230) expr ::= expr IN LP exprlist RP */
+ { 279, -3 }, /* (231) exprlist ::= exprlist COMMA expritem */
+ { 279, -1 }, /* (232) exprlist ::= expritem */
+ { 280, -1 }, /* (233) expritem ::= expr */
+ { 280, 0 }, /* (234) expritem ::= */
+ { 212, -3 }, /* (235) cmd ::= RESET QUERY CACHE */
+ { 212, -7 }, /* (236) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
+ { 212, -7 }, /* (237) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
+ { 212, -7 }, /* (238) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
+ { 212, -7 }, /* (239) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
+ { 212, -8 }, /* (240) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
+ { 212, -9 }, /* (241) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
+ { 212, -7 }, /* (242) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
+ { 212, -7 }, /* (243) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
+ { 212, -7 }, /* (244) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
+ { 212, -7 }, /* (245) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
+ { 212, -8 }, /* (246) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
+ { 212, -3 }, /* (247) cmd ::= KILL CONNECTION INTEGER */
+ { 212, -5 }, /* (248) cmd ::= KILL STREAM INTEGER COLON INTEGER */
+ { 212, -5 }, /* (249) cmd ::= KILL QUERY INTEGER COLON INTEGER */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -2233,14 +2238,13 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
case 41: /* cmd ::= ALTER DATABASE ids alter_db_optr */
-{ SStrToken t = {0};
- setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy256, &t);}
+{ SStrToken t = {0}; setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy262, &t);}
break;
case 42: /* cmd ::= ALTER ACCOUNT ids acct_optr */
-{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy277);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy47);}
break;
case 43: /* cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
-{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy277);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy47);}
break;
case 44: /* ids ::= ID */
case 45: /* ids ::= STRING */ yytestcase(yyruleno==45);
@@ -2252,6 +2256,7 @@ static void yy_reduce(
break;
case 47: /* ifexists ::= */
case 49: /* ifnotexists ::= */ yytestcase(yyruleno==49);
+ case 159: /* distinct ::= */ yytestcase(yyruleno==159);
{ yymsp[1].minor.yy0.n = 0;}
break;
case 48: /* ifnotexists ::= IF NOT EXISTS */
@@ -2261,11 +2266,10 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);}
break;
case 51: /* cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
-{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy277);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy47);}
break;
case 52: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */
-{
- setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy256, &yymsp[-2].minor.yy0);}
+{ setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy262, &yymsp[-2].minor.yy0);}
break;
case 53: /* cmd ::= CREATE USER ids PASS ids */
{ setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);}
@@ -2294,20 +2298,20 @@ static void yy_reduce(
break;
case 72: /* acct_optr ::= pps tseries storage streams qtime dbs users conns state */
{
- yylhsminor.yy277.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1;
- yylhsminor.yy277.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1;
- yylhsminor.yy277.maxTimeSeries = (yymsp[-7].minor.yy0.n>0)?atoi(yymsp[-7].minor.yy0.z):-1;
- yylhsminor.yy277.maxStreams = (yymsp[-5].minor.yy0.n>0)?atoi(yymsp[-5].minor.yy0.z):-1;
- yylhsminor.yy277.maxPointsPerSecond = (yymsp[-8].minor.yy0.n>0)?atoi(yymsp[-8].minor.yy0.z):-1;
- yylhsminor.yy277.maxStorage = (yymsp[-6].minor.yy0.n>0)?strtoll(yymsp[-6].minor.yy0.z, NULL, 10):-1;
- yylhsminor.yy277.maxQueryTime = (yymsp[-4].minor.yy0.n>0)?strtoll(yymsp[-4].minor.yy0.z, NULL, 10):-1;
- yylhsminor.yy277.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
- yylhsminor.yy277.stat = yymsp[0].minor.yy0;
+ yylhsminor.yy47.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1;
+ yylhsminor.yy47.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1;
+ yylhsminor.yy47.maxTimeSeries = (yymsp[-7].minor.yy0.n>0)?atoi(yymsp[-7].minor.yy0.z):-1;
+ yylhsminor.yy47.maxStreams = (yymsp[-5].minor.yy0.n>0)?atoi(yymsp[-5].minor.yy0.z):-1;
+ yylhsminor.yy47.maxPointsPerSecond = (yymsp[-8].minor.yy0.n>0)?atoi(yymsp[-8].minor.yy0.z):-1;
+ yylhsminor.yy47.maxStorage = (yymsp[-6].minor.yy0.n>0)?strtoll(yymsp[-6].minor.yy0.z, NULL, 10):-1;
+ yylhsminor.yy47.maxQueryTime = (yymsp[-4].minor.yy0.n>0)?strtoll(yymsp[-4].minor.yy0.z, NULL, 10):-1;
+ yylhsminor.yy47.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
+ yylhsminor.yy47.stat = yymsp[0].minor.yy0;
}
- yymsp[-8].minor.yy277 = yylhsminor.yy277;
+ yymsp[-8].minor.yy47 = yylhsminor.yy47;
break;
case 73: /* keep ::= KEEP tagitemlist */
-{ yymsp[-1].minor.yy135 = yymsp[0].minor.yy135; }
+{ yymsp[-1].minor.yy247 = yymsp[0].minor.yy247; }
break;
case 74: /* cache ::= CACHE INTEGER */
case 75: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==75);
@@ -2326,208 +2330,208 @@ static void yy_reduce(
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
break;
case 88: /* db_optr ::= */
-{setDefaultCreateDbOption(&yymsp[1].minor.yy256);}
+{setDefaultCreateDbOption(&yymsp[1].minor.yy262);}
break;
case 89: /* db_optr ::= db_optr cache */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 90: /* db_optr ::= db_optr replica */
case 105: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==105);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 91: /* db_optr ::= db_optr quorum */
case 106: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==106);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 92: /* db_optr ::= db_optr days */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 93: /* db_optr ::= db_optr minrows */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 94: /* db_optr ::= db_optr maxrows */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 95: /* db_optr ::= db_optr blocks */
case 108: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==108);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 96: /* db_optr ::= db_optr ctime */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 97: /* db_optr ::= db_optr wal */
case 110: /* alter_db_optr ::= alter_db_optr wal */ yytestcase(yyruleno==110);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 98: /* db_optr ::= db_optr fsync */
case 111: /* alter_db_optr ::= alter_db_optr fsync */ yytestcase(yyruleno==111);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 99: /* db_optr ::= db_optr comp */
case 109: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==109);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 100: /* db_optr ::= db_optr prec */
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.precision = yymsp[0].minor.yy0; }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.precision = yymsp[0].minor.yy0; }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 101: /* db_optr ::= db_optr keep */
case 107: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==107);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.keep = yymsp[0].minor.yy135; }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.keep = yymsp[0].minor.yy247; }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 102: /* db_optr ::= db_optr update */
case 112: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==112);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 103: /* db_optr ::= db_optr cachelast */
case 113: /* alter_db_optr ::= alter_db_optr cachelast */ yytestcase(yyruleno==113);
-{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy256 = yylhsminor.yy256;
+{ yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy262 = yylhsminor.yy262;
break;
case 104: /* alter_db_optr ::= */
-{ setDefaultCreateDbOption(&yymsp[1].minor.yy256);}
+{ setDefaultCreateDbOption(&yymsp[1].minor.yy262);}
break;
case 114: /* typename ::= ids */
{
yymsp[0].minor.yy0.type = 0;
- tSqlSetColumnType (&yylhsminor.yy181, &yymsp[0].minor.yy0);
+ tSqlSetColumnType (&yylhsminor.yy179, &yymsp[0].minor.yy0);
}
- yymsp[0].minor.yy181 = yylhsminor.yy181;
+ yymsp[0].minor.yy179 = yylhsminor.yy179;
break;
case 115: /* typename ::= ids LP signed RP */
{
- if (yymsp[-1].minor.yy531 <= 0) {
+ if (yymsp[-1].minor.yy403 <= 0) {
yymsp[-3].minor.yy0.type = 0;
- tSqlSetColumnType(&yylhsminor.yy181, &yymsp[-3].minor.yy0);
+ tSqlSetColumnType(&yylhsminor.yy179, &yymsp[-3].minor.yy0);
} else {
- yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy531; // negative value of name length
- tSqlSetColumnType(&yylhsminor.yy181, &yymsp[-3].minor.yy0);
+ yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy403; // negative value of name length
+ tSqlSetColumnType(&yylhsminor.yy179, &yymsp[-3].minor.yy0);
}
}
- yymsp[-3].minor.yy181 = yylhsminor.yy181;
+ yymsp[-3].minor.yy179 = yylhsminor.yy179;
break;
case 116: /* typename ::= ids UNSIGNED */
{
yymsp[-1].minor.yy0.type = 0;
yymsp[-1].minor.yy0.n = ((yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z);
- tSqlSetColumnType (&yylhsminor.yy181, &yymsp[-1].minor.yy0);
+ tSqlSetColumnType (&yylhsminor.yy179, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy181 = yylhsminor.yy181;
+ yymsp[-1].minor.yy179 = yylhsminor.yy179;
break;
case 117: /* signed ::= INTEGER */
-{ yylhsminor.yy531 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[0].minor.yy531 = yylhsminor.yy531;
+{ yylhsminor.yy403 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[0].minor.yy403 = yylhsminor.yy403;
break;
case 118: /* signed ::= PLUS INTEGER */
-{ yymsp[-1].minor.yy531 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+{ yymsp[-1].minor.yy403 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
break;
case 119: /* signed ::= MINUS INTEGER */
-{ yymsp[-1].minor.yy531 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);}
+{ yymsp[-1].minor.yy403 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);}
break;
case 123: /* cmd ::= CREATE TABLE create_table_list */
-{ pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy38;}
+{ pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy358;}
break;
case 124: /* create_table_list ::= create_from_stable */
{
SCreateTableSQL* pCreateTable = calloc(1, sizeof(SCreateTableSQL));
pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo));
- taosArrayPush(pCreateTable->childTableInfo, &yymsp[0].minor.yy78);
+ taosArrayPush(pCreateTable->childTableInfo, &yymsp[0].minor.yy42);
pCreateTable->type = TSQL_CREATE_TABLE_FROM_STABLE;
- yylhsminor.yy38 = pCreateTable;
+ yylhsminor.yy358 = pCreateTable;
}
- yymsp[0].minor.yy38 = yylhsminor.yy38;
+ yymsp[0].minor.yy358 = yylhsminor.yy358;
break;
case 125: /* create_table_list ::= create_table_list create_from_stable */
{
- taosArrayPush(yymsp[-1].minor.yy38->childTableInfo, &yymsp[0].minor.yy78);
- yylhsminor.yy38 = yymsp[-1].minor.yy38;
+ taosArrayPush(yymsp[-1].minor.yy358->childTableInfo, &yymsp[0].minor.yy42);
+ yylhsminor.yy358 = yymsp[-1].minor.yy358;
}
- yymsp[-1].minor.yy38 = yylhsminor.yy38;
+ yymsp[-1].minor.yy358 = yylhsminor.yy358;
break;
case 126: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
{
- yylhsminor.yy38 = tSetCreateSqlElems(yymsp[-1].minor.yy135, NULL, NULL, TSQL_CREATE_TABLE);
- setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy358 = tSetCreateSqlElems(yymsp[-1].minor.yy247, NULL, NULL, TSQL_CREATE_TABLE);
+ setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0);
}
- yymsp[-5].minor.yy38 = yylhsminor.yy38;
+ yymsp[-5].minor.yy358 = yylhsminor.yy358;
break;
case 127: /* create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
{
- yylhsminor.yy38 = tSetCreateSqlElems(yymsp[-5].minor.yy135, yymsp[-1].minor.yy135, NULL, TSQL_CREATE_STABLE);
- setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy358 = tSetCreateSqlElems(yymsp[-5].minor.yy247, yymsp[-1].minor.yy247, NULL, TSQL_CREATE_STABLE);
+ setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
}
- yymsp[-9].minor.yy38 = yylhsminor.yy38;
+ yymsp[-9].minor.yy358 = yylhsminor.yy358;
break;
case 128: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
{
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
- yylhsminor.yy78 = createNewChildTableInfo(&yymsp[-5].minor.yy0, yymsp[-1].minor.yy135, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
+ yylhsminor.yy42 = createNewChildTableInfo(&yymsp[-5].minor.yy0, yymsp[-1].minor.yy247, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
}
- yymsp[-9].minor.yy78 = yylhsminor.yy78;
+ yymsp[-9].minor.yy42 = yylhsminor.yy42;
break;
case 129: /* create_table_args ::= ifnotexists ids cpxName AS select */
{
- yylhsminor.yy38 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy30, TSQL_CREATE_STREAM);
- setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy358 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy114, TSQL_CREATE_STREAM);
+ setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0);
}
- yymsp[-4].minor.yy38 = yylhsminor.yy38;
+ yymsp[-4].minor.yy358 = yylhsminor.yy358;
break;
case 130: /* columnlist ::= columnlist COMMA column */
-{taosArrayPush(yymsp[-2].minor.yy135, &yymsp[0].minor.yy181); yylhsminor.yy135 = yymsp[-2].minor.yy135; }
- yymsp[-2].minor.yy135 = yylhsminor.yy135;
+{taosArrayPush(yymsp[-2].minor.yy247, &yymsp[0].minor.yy179); yylhsminor.yy247 = yymsp[-2].minor.yy247; }
+ yymsp[-2].minor.yy247 = yylhsminor.yy247;
break;
case 131: /* columnlist ::= column */
-{yylhsminor.yy135 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy135, &yymsp[0].minor.yy181);}
- yymsp[0].minor.yy135 = yylhsminor.yy135;
+{yylhsminor.yy247 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy247, &yymsp[0].minor.yy179);}
+ yymsp[0].minor.yy247 = yylhsminor.yy247;
break;
case 132: /* column ::= ids typename */
{
- tSqlSetColumnInfo(&yylhsminor.yy181, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy181);
+ tSqlSetColumnInfo(&yylhsminor.yy179, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy179);
}
- yymsp[-1].minor.yy181 = yylhsminor.yy181;
+ yymsp[-1].minor.yy179 = yylhsminor.yy179;
break;
case 133: /* tagitemlist ::= tagitemlist COMMA tagitem */
-{ yylhsminor.yy135 = tVariantListAppend(yymsp[-2].minor.yy135, &yymsp[0].minor.yy308, -1); }
- yymsp[-2].minor.yy135 = yylhsminor.yy135;
+{ yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1); }
+ yymsp[-2].minor.yy247 = yylhsminor.yy247;
break;
case 134: /* tagitemlist ::= tagitem */
-{ yylhsminor.yy135 = tVariantListAppend(NULL, &yymsp[0].minor.yy308, -1); }
- yymsp[0].minor.yy135 = yylhsminor.yy135;
+{ yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1); }
+ yymsp[0].minor.yy247 = yylhsminor.yy247;
break;
case 135: /* tagitem ::= INTEGER */
case 136: /* tagitem ::= FLOAT */ yytestcase(yyruleno==136);
case 137: /* tagitem ::= STRING */ yytestcase(yyruleno==137);
case 138: /* tagitem ::= BOOL */ yytestcase(yyruleno==138);
-{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy308, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy308 = yylhsminor.yy308;
+{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy378 = yylhsminor.yy378;
break;
case 139: /* tagitem ::= NULL */
-{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy308, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy308 = yylhsminor.yy308;
+{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy378 = yylhsminor.yy378;
break;
case 140: /* tagitem ::= MINUS INTEGER */
case 141: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==141);
@@ -2537,59 +2541,59 @@ static void yy_reduce(
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type;
toTSDBType(yymsp[-1].minor.yy0.type);
- tVariantCreate(&yylhsminor.yy308, &yymsp[-1].minor.yy0);
+ tVariantCreate(&yylhsminor.yy378, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy308 = yylhsminor.yy308;
+ yymsp[-1].minor.yy378 = yylhsminor.yy378;
break;
case 144: /* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
{
- yylhsminor.yy30 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy266, yymsp[-9].minor.yy135, yymsp[-8].minor.yy316, yymsp[-4].minor.yy135, yymsp[-3].minor.yy135, &yymsp[-7].minor.yy160, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy135, &yymsp[0].minor.yy126, &yymsp[-1].minor.yy126);
+ yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy522, yymsp[-9].minor.yy247, yymsp[-8].minor.yy326, yymsp[-4].minor.yy247, yymsp[-3].minor.yy247, &yymsp[-7].minor.yy430, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy247, &yymsp[0].minor.yy204, &yymsp[-1].minor.yy204);
}
- yymsp[-11].minor.yy30 = yylhsminor.yy30;
+ yymsp[-11].minor.yy114 = yylhsminor.yy114;
break;
case 145: /* union ::= select */
-{ yylhsminor.yy153 = setSubclause(NULL, yymsp[0].minor.yy30); }
- yymsp[0].minor.yy153 = yylhsminor.yy153;
+{ yylhsminor.yy219 = setSubclause(NULL, yymsp[0].minor.yy114); }
+ yymsp[0].minor.yy219 = yylhsminor.yy219;
break;
case 146: /* union ::= LP union RP */
-{ yymsp[-2].minor.yy153 = yymsp[-1].minor.yy153; }
+{ yymsp[-2].minor.yy219 = yymsp[-1].minor.yy219; }
break;
case 147: /* union ::= union UNION ALL select */
-{ yylhsminor.yy153 = appendSelectClause(yymsp[-3].minor.yy153, yymsp[0].minor.yy30); }
- yymsp[-3].minor.yy153 = yylhsminor.yy153;
+{ yylhsminor.yy219 = appendSelectClause(yymsp[-3].minor.yy219, yymsp[0].minor.yy114); }
+ yymsp[-3].minor.yy219 = yylhsminor.yy219;
break;
case 148: /* union ::= union UNION ALL LP select RP */
-{ yylhsminor.yy153 = appendSelectClause(yymsp[-5].minor.yy153, yymsp[-1].minor.yy30); }
- yymsp[-5].minor.yy153 = yylhsminor.yy153;
+{ yylhsminor.yy219 = appendSelectClause(yymsp[-5].minor.yy219, yymsp[-1].minor.yy114); }
+ yymsp[-5].minor.yy219 = yylhsminor.yy219;
break;
case 149: /* cmd ::= union */
-{ setSqlInfo(pInfo, yymsp[0].minor.yy153, NULL, TSDB_SQL_SELECT); }
+{ setSqlInfo(pInfo, yymsp[0].minor.yy219, NULL, TSDB_SQL_SELECT); }
break;
case 150: /* select ::= SELECT selcollist */
{
- yylhsminor.yy30 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy266, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy522, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
- yymsp[-1].minor.yy30 = yylhsminor.yy30;
+ yymsp[-1].minor.yy114 = yylhsminor.yy114;
break;
case 151: /* sclp ::= selcollist COMMA */
-{yylhsminor.yy266 = yymsp[-1].minor.yy266;}
- yymsp[-1].minor.yy266 = yylhsminor.yy266;
+{yylhsminor.yy522 = yymsp[-1].minor.yy522;}
+ yymsp[-1].minor.yy522 = yylhsminor.yy522;
break;
case 152: /* sclp ::= */
-{yymsp[1].minor.yy266 = 0;}
+{yymsp[1].minor.yy522 = 0;}
break;
- case 153: /* selcollist ::= sclp expr as */
+ case 153: /* selcollist ::= sclp distinct expr as */
{
- yylhsminor.yy266 = tSqlExprListAppend(yymsp[-2].minor.yy266, yymsp[-1].minor.yy316, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0);
+ yylhsminor.yy522 = tSqlExprListAppend(yymsp[-3].minor.yy522, yymsp[-1].minor.yy326, yymsp[-2].minor.yy0.n? &yymsp[-2].minor.yy0:0, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0);
}
- yymsp[-2].minor.yy266 = yylhsminor.yy266;
+ yymsp[-3].minor.yy522 = yylhsminor.yy522;
break;
case 154: /* selcollist ::= sclp STAR */
{
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
- yylhsminor.yy266 = tSqlExprListAppend(yymsp[-1].minor.yy266, pNode, 0);
+ yylhsminor.yy522 = tSqlExprListAppend(yymsp[-1].minor.yy522, pNode, 0, 0);
}
- yymsp[-1].minor.yy266 = yylhsminor.yy266;
+ yymsp[-1].minor.yy522 = yylhsminor.yy522;
break;
case 155: /* as ::= AS ids */
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
@@ -2601,317 +2605,321 @@ static void yy_reduce(
case 157: /* as ::= */
{ yymsp[1].minor.yy0.n = 0; }
break;
- case 158: /* from ::= FROM tablelist */
-{yymsp[-1].minor.yy135 = yymsp[0].minor.yy135;}
+ case 158: /* distinct ::= DISTINCT */
+{ yylhsminor.yy0 = yymsp[0].minor.yy0; }
+ yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
- case 159: /* tablelist ::= ids cpxName */
+ case 160: /* from ::= FROM tablelist */
+{yymsp[-1].minor.yy247 = yymsp[0].minor.yy247;}
+ break;
+ case 161: /* tablelist ::= ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- yylhsminor.yy135 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
- yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[-1].minor.yy0, -1); // table alias name
+ yylhsminor.yy247 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yylhsminor.yy247, &yymsp[-1].minor.yy0, -1); // table alias name
}
- yymsp[-1].minor.yy135 = yylhsminor.yy135;
+ yymsp[-1].minor.yy247 = yylhsminor.yy247;
break;
- case 160: /* tablelist ::= ids cpxName ids */
+ case 162: /* tablelist ::= ids cpxName ids */
{
toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
- yylhsminor.yy135 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
- yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[0].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yylhsminor.yy247, &yymsp[0].minor.yy0, -1);
}
- yymsp[-2].minor.yy135 = yylhsminor.yy135;
+ yymsp[-2].minor.yy247 = yylhsminor.yy247;
break;
- case 161: /* tablelist ::= tablelist COMMA ids cpxName */
+ case 163: /* tablelist ::= tablelist COMMA ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- yylhsminor.yy135 = tVariantListAppendToken(yymsp[-3].minor.yy135, &yymsp[-1].minor.yy0, -1);
- yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yymsp[-3].minor.yy247, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yylhsminor.yy247, &yymsp[-1].minor.yy0, -1);
}
- yymsp[-3].minor.yy135 = yylhsminor.yy135;
+ yymsp[-3].minor.yy247 = yylhsminor.yy247;
break;
- case 162: /* tablelist ::= tablelist COMMA ids cpxName ids */
+ case 164: /* tablelist ::= tablelist COMMA ids cpxName ids */
{
toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
- yylhsminor.yy135 = tVariantListAppendToken(yymsp[-4].minor.yy135, &yymsp[-2].minor.yy0, -1);
- yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[0].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yymsp[-4].minor.yy247, &yymsp[-2].minor.yy0, -1);
+ yylhsminor.yy247 = tVariantListAppendToken(yylhsminor.yy247, &yymsp[0].minor.yy0, -1);
}
- yymsp[-4].minor.yy135 = yylhsminor.yy135;
+ yymsp[-4].minor.yy247 = yylhsminor.yy247;
break;
- case 163: /* tmvar ::= VARIABLE */
+ case 165: /* tmvar ::= VARIABLE */
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
- case 164: /* interval_opt ::= INTERVAL LP tmvar RP */
-{yymsp[-3].minor.yy160.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy160.offset.n = 0; yymsp[-3].minor.yy160.offset.z = NULL; yymsp[-3].minor.yy160.offset.type = 0;}
+ case 166: /* interval_opt ::= INTERVAL LP tmvar RP */
+{yymsp[-3].minor.yy430.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy430.offset.n = 0; yymsp[-3].minor.yy430.offset.z = NULL; yymsp[-3].minor.yy430.offset.type = 0;}
break;
- case 165: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
-{yymsp[-5].minor.yy160.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy160.offset = yymsp[-1].minor.yy0;}
+ case 167: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
+{yymsp[-5].minor.yy430.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy430.offset = yymsp[-1].minor.yy0;}
break;
- case 166: /* interval_opt ::= */
-{memset(&yymsp[1].minor.yy160, 0, sizeof(yymsp[1].minor.yy160));}
+ case 168: /* interval_opt ::= */
+{memset(&yymsp[1].minor.yy430, 0, sizeof(yymsp[1].minor.yy430));}
break;
- case 167: /* fill_opt ::= */
-{yymsp[1].minor.yy135 = 0; }
+ case 169: /* fill_opt ::= */
+{yymsp[1].minor.yy247 = 0; }
break;
- case 168: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
+ case 170: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{
tVariant A = {0};
toTSDBType(yymsp[-3].minor.yy0.type);
tVariantCreate(&A, &yymsp[-3].minor.yy0);
- tVariantListInsert(yymsp[-1].minor.yy135, &A, -1, 0);
- yymsp[-5].minor.yy135 = yymsp[-1].minor.yy135;
+ tVariantListInsert(yymsp[-1].minor.yy247, &A, -1, 0);
+ yymsp[-5].minor.yy247 = yymsp[-1].minor.yy247;
}
break;
- case 169: /* fill_opt ::= FILL LP ID RP */
+ case 171: /* fill_opt ::= FILL LP ID RP */
{
toTSDBType(yymsp[-1].minor.yy0.type);
- yymsp[-3].minor.yy135 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
+ yymsp[-3].minor.yy247 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
}
break;
- case 170: /* sliding_opt ::= SLIDING LP tmvar RP */
+ case 172: /* sliding_opt ::= SLIDING LP tmvar RP */
{yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; }
break;
- case 171: /* sliding_opt ::= */
+ case 173: /* sliding_opt ::= */
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; }
break;
- case 172: /* orderby_opt ::= */
-{yymsp[1].minor.yy135 = 0;}
+ case 174: /* orderby_opt ::= */
+{yymsp[1].minor.yy247 = 0;}
break;
- case 173: /* orderby_opt ::= ORDER BY sortlist */
-{yymsp[-2].minor.yy135 = yymsp[0].minor.yy135;}
+ case 175: /* orderby_opt ::= ORDER BY sortlist */
+{yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break;
- case 174: /* sortlist ::= sortlist COMMA item sortorder */
+ case 176: /* sortlist ::= sortlist COMMA item sortorder */
{
- yylhsminor.yy135 = tVariantListAppend(yymsp[-3].minor.yy135, &yymsp[-1].minor.yy308, yymsp[0].minor.yy130);
+ yylhsminor.yy247 = tVariantListAppend(yymsp[-3].minor.yy247, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222);
}
- yymsp[-3].minor.yy135 = yylhsminor.yy135;
+ yymsp[-3].minor.yy247 = yylhsminor.yy247;
break;
- case 175: /* sortlist ::= item sortorder */
+ case 177: /* sortlist ::= item sortorder */
{
- yylhsminor.yy135 = tVariantListAppend(NULL, &yymsp[-1].minor.yy308, yymsp[0].minor.yy130);
+ yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222);
}
- yymsp[-1].minor.yy135 = yylhsminor.yy135;
+ yymsp[-1].minor.yy247 = yylhsminor.yy247;
break;
- case 176: /* item ::= ids cpxName */
+ case 178: /* item ::= ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- tVariantCreate(&yylhsminor.yy308, &yymsp[-1].minor.yy0);
+ tVariantCreate(&yylhsminor.yy378, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy308 = yylhsminor.yy308;
+ yymsp[-1].minor.yy378 = yylhsminor.yy378;
break;
- case 177: /* sortorder ::= ASC */
-{ yymsp[0].minor.yy130 = TSDB_ORDER_ASC; }
+ case 179: /* sortorder ::= ASC */
+{ yymsp[0].minor.yy222 = TSDB_ORDER_ASC; }
break;
- case 178: /* sortorder ::= DESC */
-{ yymsp[0].minor.yy130 = TSDB_ORDER_DESC;}
+ case 180: /* sortorder ::= DESC */
+{ yymsp[0].minor.yy222 = TSDB_ORDER_DESC;}
break;
- case 179: /* sortorder ::= */
-{ yymsp[1].minor.yy130 = TSDB_ORDER_ASC; }
+ case 181: /* sortorder ::= */
+{ yymsp[1].minor.yy222 = TSDB_ORDER_ASC; }
break;
- case 180: /* groupby_opt ::= */
-{ yymsp[1].minor.yy135 = 0;}
+ case 182: /* groupby_opt ::= */
+{ yymsp[1].minor.yy247 = 0;}
break;
- case 181: /* groupby_opt ::= GROUP BY grouplist */
-{ yymsp[-2].minor.yy135 = yymsp[0].minor.yy135;}
+ case 183: /* groupby_opt ::= GROUP BY grouplist */
+{ yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break;
- case 182: /* grouplist ::= grouplist COMMA item */
+ case 184: /* grouplist ::= grouplist COMMA item */
{
- yylhsminor.yy135 = tVariantListAppend(yymsp[-2].minor.yy135, &yymsp[0].minor.yy308, -1);
+ yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1);
}
- yymsp[-2].minor.yy135 = yylhsminor.yy135;
+ yymsp[-2].minor.yy247 = yylhsminor.yy247;
break;
- case 183: /* grouplist ::= item */
+ case 185: /* grouplist ::= item */
{
- yylhsminor.yy135 = tVariantListAppend(NULL, &yymsp[0].minor.yy308, -1);
+ yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1);
}
- yymsp[0].minor.yy135 = yylhsminor.yy135;
+ yymsp[0].minor.yy247 = yylhsminor.yy247;
break;
- case 184: /* having_opt ::= */
- case 194: /* where_opt ::= */ yytestcase(yyruleno==194);
- case 232: /* expritem ::= */ yytestcase(yyruleno==232);
-{yymsp[1].minor.yy316 = 0;}
+ case 186: /* having_opt ::= */
+ case 196: /* where_opt ::= */ yytestcase(yyruleno==196);
+ case 234: /* expritem ::= */ yytestcase(yyruleno==234);
+{yymsp[1].minor.yy326 = 0;}
break;
- case 185: /* having_opt ::= HAVING expr */
- case 195: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==195);
-{yymsp[-1].minor.yy316 = yymsp[0].minor.yy316;}
+ case 187: /* having_opt ::= HAVING expr */
+ case 197: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==197);
+{yymsp[-1].minor.yy326 = yymsp[0].minor.yy326;}
break;
- case 186: /* limit_opt ::= */
- case 190: /* slimit_opt ::= */ yytestcase(yyruleno==190);
-{yymsp[1].minor.yy126.limit = -1; yymsp[1].minor.yy126.offset = 0;}
+ case 188: /* limit_opt ::= */
+ case 192: /* slimit_opt ::= */ yytestcase(yyruleno==192);
+{yymsp[1].minor.yy204.limit = -1; yymsp[1].minor.yy204.offset = 0;}
break;
- case 187: /* limit_opt ::= LIMIT signed */
- case 191: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==191);
-{yymsp[-1].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-1].minor.yy126.offset = 0;}
+ case 189: /* limit_opt ::= LIMIT signed */
+ case 193: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==193);
+{yymsp[-1].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-1].minor.yy204.offset = 0;}
break;
- case 188: /* limit_opt ::= LIMIT signed OFFSET signed */
-{ yymsp[-3].minor.yy126.limit = yymsp[-2].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[0].minor.yy531;}
+ case 190: /* limit_opt ::= LIMIT signed OFFSET signed */
+{ yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break;
- case 189: /* limit_opt ::= LIMIT signed COMMA signed */
-{ yymsp[-3].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[-2].minor.yy531;}
+ case 191: /* limit_opt ::= LIMIT signed COMMA signed */
+{ yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break;
- case 192: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
-{yymsp[-3].minor.yy126.limit = yymsp[-2].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[0].minor.yy531;}
+ case 194: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
+{yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break;
- case 193: /* slimit_opt ::= SLIMIT signed COMMA signed */
-{yymsp[-3].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[-2].minor.yy531;}
+ case 195: /* slimit_opt ::= SLIMIT signed COMMA signed */
+{yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break;
- case 196: /* expr ::= LP expr RP */
-{yylhsminor.yy316 = yymsp[-1].minor.yy316; yylhsminor.yy316->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy316->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 198: /* expr ::= LP expr RP */
+{yylhsminor.yy326 = yymsp[-1].minor.yy326; yylhsminor.yy326->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy326->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 197: /* expr ::= ID */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 199: /* expr ::= ID */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 198: /* expr ::= ID DOT ID */
-{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 200: /* expr ::= ID DOT ID */
+{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 199: /* expr ::= ID DOT STAR */
-{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 201: /* expr ::= ID DOT STAR */
+{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 200: /* expr ::= INTEGER */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 202: /* expr ::= INTEGER */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 201: /* expr ::= MINUS INTEGER */
- case 202: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==202);
-{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);}
- yymsp[-1].minor.yy316 = yylhsminor.yy316;
+ case 203: /* expr ::= MINUS INTEGER */
+ case 204: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==204);
+{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);}
+ yymsp[-1].minor.yy326 = yylhsminor.yy326;
break;
- case 203: /* expr ::= FLOAT */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 205: /* expr ::= FLOAT */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 204: /* expr ::= MINUS FLOAT */
- case 205: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==205);
-{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);}
- yymsp[-1].minor.yy316 = yylhsminor.yy316;
+ case 206: /* expr ::= MINUS FLOAT */
+ case 207: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==207);
+{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);}
+ yymsp[-1].minor.yy326 = yylhsminor.yy326;
break;
- case 206: /* expr ::= STRING */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 208: /* expr ::= STRING */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 207: /* expr ::= NOW */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 209: /* expr ::= NOW */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 208: /* expr ::= VARIABLE */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 210: /* expr ::= VARIABLE */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 209: /* expr ::= BOOL */
-{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 211: /* expr ::= BOOL */
+{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 210: /* expr ::= ID LP exprlist RP */
-{ yylhsminor.yy316 = tSqlExprCreateFunction(yymsp[-1].minor.yy266, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
- yymsp[-3].minor.yy316 = yylhsminor.yy316;
+ case 212: /* expr ::= ID LP exprlist RP */
+{ yylhsminor.yy326 = tSqlExprCreateFunction(yymsp[-1].minor.yy522, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
+ yymsp[-3].minor.yy326 = yylhsminor.yy326;
break;
- case 211: /* expr ::= ID LP STAR RP */
-{ yylhsminor.yy316 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
- yymsp[-3].minor.yy316 = yylhsminor.yy316;
+ case 213: /* expr ::= ID LP STAR RP */
+{ yylhsminor.yy326 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
+ yymsp[-3].minor.yy326 = yylhsminor.yy326;
break;
- case 212: /* expr ::= expr IS NULL */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, NULL, TK_ISNULL);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 214: /* expr ::= expr IS NULL */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, NULL, TK_ISNULL);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 213: /* expr ::= expr IS NOT NULL */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-3].minor.yy316, NULL, TK_NOTNULL);}
- yymsp[-3].minor.yy316 = yylhsminor.yy316;
+ case 215: /* expr ::= expr IS NOT NULL */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-3].minor.yy326, NULL, TK_NOTNULL);}
+ yymsp[-3].minor.yy326 = yylhsminor.yy326;
break;
- case 214: /* expr ::= expr LT expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LT);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 216: /* expr ::= expr LT expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LT);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 215: /* expr ::= expr GT expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_GT);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 217: /* expr ::= expr GT expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GT);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 216: /* expr ::= expr LE expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LE);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 218: /* expr ::= expr LE expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LE);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 217: /* expr ::= expr GE expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_GE);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 219: /* expr ::= expr GE expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GE);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 218: /* expr ::= expr NE expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_NE);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 220: /* expr ::= expr NE expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_NE);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 219: /* expr ::= expr EQ expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_EQ);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 221: /* expr ::= expr EQ expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_EQ);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 220: /* expr ::= expr AND expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_AND);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 222: /* expr ::= expr AND expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_AND);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 221: /* expr ::= expr OR expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_OR); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 223: /* expr ::= expr OR expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_OR); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 222: /* expr ::= expr PLUS expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_PLUS); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 224: /* expr ::= expr PLUS expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_PLUS); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 223: /* expr ::= expr MINUS expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_MINUS); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 225: /* expr ::= expr MINUS expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_MINUS); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 224: /* expr ::= expr STAR expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_STAR); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 226: /* expr ::= expr STAR expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_STAR); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 225: /* expr ::= expr SLASH expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_DIVIDE);}
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 227: /* expr ::= expr SLASH expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_DIVIDE);}
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 226: /* expr ::= expr REM expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_REM); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 228: /* expr ::= expr REM expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_REM); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 227: /* expr ::= expr LIKE expr */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LIKE); }
- yymsp[-2].minor.yy316 = yylhsminor.yy316;
+ case 229: /* expr ::= expr LIKE expr */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LIKE); }
+ yymsp[-2].minor.yy326 = yylhsminor.yy326;
break;
- case 228: /* expr ::= expr IN LP exprlist RP */
-{yylhsminor.yy316 = tSqlExprCreate(yymsp[-4].minor.yy316, (tSQLExpr*)yymsp[-1].minor.yy266, TK_IN); }
- yymsp[-4].minor.yy316 = yylhsminor.yy316;
+ case 230: /* expr ::= expr IN LP exprlist RP */
+{yylhsminor.yy326 = tSqlExprCreate(yymsp[-4].minor.yy326, (tSQLExpr*)yymsp[-1].minor.yy522, TK_IN); }
+ yymsp[-4].minor.yy326 = yylhsminor.yy326;
break;
- case 229: /* exprlist ::= exprlist COMMA expritem */
-{yylhsminor.yy266 = tSqlExprListAppend(yymsp[-2].minor.yy266,yymsp[0].minor.yy316,0);}
- yymsp[-2].minor.yy266 = yylhsminor.yy266;
+ case 231: /* exprlist ::= exprlist COMMA expritem */
+{yylhsminor.yy522 = tSqlExprListAppend(yymsp[-2].minor.yy522,yymsp[0].minor.yy326,0, 0);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 230: /* exprlist ::= expritem */
-{yylhsminor.yy266 = tSqlExprListAppend(0,yymsp[0].minor.yy316,0);}
- yymsp[0].minor.yy266 = yylhsminor.yy266;
+ case 232: /* exprlist ::= expritem */
+{yylhsminor.yy522 = tSqlExprListAppend(0,yymsp[0].minor.yy326,0, 0);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 231: /* expritem ::= expr */
-{yylhsminor.yy316 = yymsp[0].minor.yy316;}
- yymsp[0].minor.yy316 = yylhsminor.yy316;
+ case 233: /* expritem ::= expr */
+{yylhsminor.yy326 = yymsp[0].minor.yy326;}
+ yymsp[0].minor.yy326 = yylhsminor.yy326;
break;
- case 233: /* cmd ::= RESET QUERY CACHE */
+ case 235: /* cmd ::= RESET QUERY CACHE */
{ setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
break;
- case 234: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
+ case 236: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy135, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1);
+ SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 235: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
+ case 237: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -2922,14 +2930,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 236: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
+ case 238: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy135, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1);
+ SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 237: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
+ case 239: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -2940,7 +2948,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 238: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
+ case 240: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
{
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
@@ -2954,26 +2962,26 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 239: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
+ case 241: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
{
yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
toTSDBType(yymsp[-2].minor.yy0.type);
SArray* A = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
- A = tVariantListAppend(A, &yymsp[0].minor.yy308, -1);
+ A = tVariantListAppend(A, &yymsp[0].minor.yy378, -1);
SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 240: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
+ case 242: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy135, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE);
+ SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 241: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
+ case 243: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -2984,14 +2992,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 242: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
+ case 244: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy135, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE);
+ SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 243: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
+ case 245: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -3002,7 +3010,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 244: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
+ case 246: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
{
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
@@ -3016,13 +3024,13 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 245: /* cmd ::= KILL CONNECTION INTEGER */
+ case 247: /* cmd ::= KILL CONNECTION INTEGER */
{setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
break;
- case 246: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */
+ case 248: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */
{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &yymsp[-2].minor.yy0);}
break;
- case 247: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */
+ case 249: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */
{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &yymsp[-2].minor.yy0);}
break;
default:
diff --git a/src/query/tests/astTest.cpp b/src/query/tests/astTest.cpp
index 728de4357c..ce7b2f94a1 100644
--- a/src/query/tests/astTest.cpp
+++ b/src/query/tests/astTest.cpp
@@ -3,7 +3,7 @@
#include
#include
-#include "qAst.h"
+#include "texpr.h"
#include "taosmsg.h"
#include "tsdb.h"
#include "tskiplist.h"
diff --git a/src/query/tests/patternMatchTest.cpp b/src/query/tests/patternMatchTest.cpp
index fa2b58a10b..f3e0d3e119 100644
--- a/src/query/tests/patternMatchTest.cpp
+++ b/src/query/tests/patternMatchTest.cpp
@@ -3,7 +3,7 @@
#include
#include
-#include "tsqlfunction.h"
+#include "qAggMain.h"
#include "tcompare.h"
TEST(testCase, patternMatchTest) {
diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c
index ff44a2497a..4fe41b1709 100644
--- a/src/rpc/src/rpcTcp.c
+++ b/src/rpc/src/rpcTcp.c
@@ -21,21 +21,14 @@
#include "rpcLog.h"
#include "rpcHead.h"
#include "rpcTcp.h"
-#ifdef WINDOWS
-#include "wepoll.h"
-#endif
-
-#ifndef EPOLLWAKEUP
- #define EPOLLWAKEUP (1u << 29)
-#endif
typedef struct SFdObj {
void *signature;
SOCKET fd; // TCP socket FD
- int closedByApp; // 1: already closed by App
void *thandle; // handle from upper layer, like TAOS
uint32_t ip;
uint16_t port;
+ int16_t closedByApp; // 1: already closed by App
struct SThreadObj *pThreadObj;
struct SFdObj *prev;
struct SFdObj *next;
@@ -47,7 +40,7 @@ typedef struct SThreadObj {
pthread_mutex_t mutex;
uint32_t ip;
bool stop;
- SOCKET pollFd;
+ EpollFd pollFd;
int numOfFds;
int threadId;
char label[TSDB_LABEL_LEN];
@@ -59,6 +52,8 @@ typedef struct {
SOCKET fd;
uint32_t ip;
uint16_t port;
+ int8_t stop;
+ int8_t reserve;
char label[TSDB_LABEL_LEN];
int numOfThreads;
void * shandle;
@@ -132,7 +127,7 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread
break;
}
- pThreadObj->pollFd = (int64_t)epoll_create(10); // size does not matter
+ pThreadObj->pollFd = (EpollFd)epoll_create(10); // size does not matter
if (pThreadObj->pollFd < 0) {
tError("%s failed to create TCP epoll", label);
code = -1;
@@ -188,8 +183,15 @@ void taosStopTcpServer(void *handle) {
SServerObj *pServerObj = handle;
if (pServerObj == NULL) return;
- if(pServerObj->fd >=0) shutdown(pServerObj->fd, SHUT_RD);
+ pServerObj->stop = 1;
+ if (pServerObj->fd >= 0) {
+#ifdef WINDOWS
+ closesocket(pServerObj->fd);
+#else
+ shutdown(pServerObj->fd, SHUT_RD);
+#endif
+ }
if (taosCheckPthreadValid(pServerObj->thread)) {
if (taosComparePthread(pServerObj->thread, pthread_self())) {
pthread_detach(pthread_self());
@@ -230,6 +232,11 @@ static void *taosAcceptTcpConnection(void *arg) {
while (1) {
socklen_t addrlen = sizeof(caddr);
connFd = accept(pServerObj->fd, (struct sockaddr *)&caddr, &addrlen);
+ if (pServerObj->stop) {
+ tDebug("%s TCP server stop accepting new connections", pServerObj->label);
+ break;
+ }
+
if (connFd == -1) {
if (errno == EINVAL) {
tDebug("%s TCP server stop accepting new connections, exiting", pServerObj->label);
@@ -292,7 +299,7 @@ void *taosInitTcpClient(uint32_t ip, uint16_t port, char *label, int num, void *
return NULL;
}
- pThreadObj->pollFd = (SOCKET)epoll_create(10); // size does not matter
+ pThreadObj->pollFd = (EpollFd)epoll_create(10); // size does not matter
if (pThreadObj->pollFd < 0) {
tError("%s failed to create TCP client epoll", label);
free(pThreadObj);
@@ -307,14 +314,8 @@ void *taosInitTcpClient(uint32_t ip, uint16_t port, char *label, int num, void *
int code = pthread_create(&(pThreadObj->thread), &thattr, taosProcessTcpData, (void *)(pThreadObj));
pthread_attr_destroy(&thattr);
if (code != 0) {
-#ifdef __APPLE__
- if (pThreadObj->pollFd!=-1) {
- epoll_close(pThreadObj->pollFd);
- pThreadObj->pollFd = -1;
- }
-#else // __APPLE__
- taosCloseSocket(pThreadObj->pollFd);
-#endif // __APPLE__
+ EpollClose(pThreadObj->pollFd);
+ pThreadObj->pollFd = -1;
free(pThreadObj);
terrno = TAOS_SYSTEM_ERROR(errno);
tError("%s failed to create TCP read data thread(%s)", label, strerror(errno));
@@ -345,7 +346,7 @@ void *taosOpenTcpClientConnection(void *shandle, void *thandle, uint32_t ip, uin
SThreadObj * pThreadObj = shandle;
SOCKET fd = taosOpenTcpClientSocket(ip, port, pThreadObj->ip);
- if (fd < 0) return NULL;
+ if (fd <= 0) return NULL;
struct sockaddr_in sin;
uint16_t localPort = 0;
@@ -522,14 +523,10 @@ static void *taosProcessTcpData(void *param) {
if (pThreadObj->stop) break;
}
-#ifdef __APPLE__
if (pThreadObj->pollFd >=0) {
- epoll_close(pThreadObj->pollFd);
+ EpollClose(pThreadObj->pollFd);
pThreadObj->pollFd = -1;
}
-#else // __APPLE__
- if (pThreadObj->pollFd >=0) taosCloseSocket(pThreadObj->pollFd);
-#endif // __APPLE__
while (pThreadObj->pHead) {
SFdObj *pFdObj = pThreadObj->pHead;
diff --git a/src/rpc/src/rpcUdp.c b/src/rpc/src/rpcUdp.c
index 5f5a65b8f9..2599bca075 100644
--- a/src/rpc/src/rpcUdp.c
+++ b/src/rpc/src/rpcUdp.c
@@ -198,10 +198,12 @@ static void *taosRecvUdpData(void *param) {
while (1) {
dataLen = recvfrom(pConn->fd, pConn->buffer, RPC_MAX_UDP_SIZE, 0, (struct sockaddr *)&sourceAdd, &addLen);
- if(dataLen <= 0) {
- tDebug("%s UDP socket(fd:%d) receive dataLen(%d) error(%s)", pConn->label, pConn->fd, (int32_t)dataLen, strerror(errno));
+ if (dataLen <= 0) {
+ tDebug("%s UDP socket was closed, exiting(%s), dataLen:%d fd:%d", pConn->label, strerror(errno), (int32_t)dataLen,
+ pConn->fd);
+
// for windows usage, remote shutdown also returns - 1 in windows client
- if (-1 == pConn->fd) {
+ if (pConn->fd == -1) {
break;
} else {
continue;
diff --git a/src/sync/CMakeLists.txt b/src/sync/CMakeLists.txt
index 3721163f79..cc86bf704c 100644
--- a/src/sync/CMakeLists.txt
+++ b/src/sync/CMakeLists.txt
@@ -4,28 +4,13 @@ PROJECT(TDengine)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX)
- LIST(REMOVE_ITEM SRC src/syncArbitrator.c)
- ADD_LIBRARY(sync ${SRC})
- TARGET_LINK_LIBRARIES(sync tutil pthread common)
+LIST(REMOVE_ITEM SRC src/syncArbitrator.c)
+ADD_LIBRARY(sync ${SRC})
+TARGET_LINK_LIBRARIES(sync tutil pthread common)
- LIST(APPEND BIN_SRC src/syncArbitrator.c)
- LIST(APPEND BIN_SRC src/syncTcp.c)
- ADD_EXECUTABLE(tarbitrator ${BIN_SRC})
- TARGET_LINK_LIBRARIES(tarbitrator sync common osdetail tutil)
+LIST(APPEND BIN_SRC src/syncArbitrator.c)
+LIST(APPEND BIN_SRC src/syncTcp.c)
+ADD_EXECUTABLE(tarbitrator ${BIN_SRC})
+TARGET_LINK_LIBRARIES(tarbitrator sync common osdetail tutil)
- #ADD_SUBDIRECTORY(test)
-ENDIF ()
-
-IF (TD_DARWIN)
- LIST(REMOVE_ITEM SRC src/syncArbitrator.c)
- ADD_LIBRARY(sync ${SRC})
- TARGET_LINK_LIBRARIES(sync tutil pthread common)
-
- LIST(APPEND BIN_SRC src/syncArbitrator.c)
- LIST(APPEND BIN_SRC src/syncTcp.c)
- ADD_EXECUTABLE(tarbitrator ${BIN_SRC})
- TARGET_LINK_LIBRARIES(tarbitrator sync common osdetail tutil)
-
- #ADD_SUBDIRECTORY(test)
-ENDIF ()
+#ADD_SUBDIRECTORY(test)
diff --git a/src/sync/inc/syncInt.h b/src/sync/inc/syncInt.h
index eef687d647..e43140d4e6 100644
--- a/src/sync/inc/syncInt.h
+++ b/src/sync/inc/syncInt.h
@@ -82,8 +82,8 @@ typedef struct SsyncPeer {
uint64_t sversion; // track the peer version in retrieve process
uint64_t lastFileVer; // track the file version while retrieve
uint64_t lastWalVer; // track the wal version while retrieve
- int32_t syncFd;
- int32_t peerFd; // forward FD
+ SOCKET syncFd;
+ SOCKET peerFd; // forward FD
int32_t numOfRetrieves; // number of retrieves tried
int32_t fileChanged; // a flag to indicate file is changed during retrieving process
int32_t refCount;
diff --git a/src/sync/inc/syncTcp.h b/src/sync/inc/syncTcp.h
index d4674fee6b..b322c3440c 100644
--- a/src/sync/inc/syncTcp.h
+++ b/src/sync/inc/syncTcp.h
@@ -27,12 +27,12 @@ typedef struct {
int32_t bufferSize;
void (*processBrokenLink)(int64_t handleId);
int32_t (*processIncomingMsg)(int64_t handleId, void *buffer);
- void (*processIncomingConn)(int32_t fd, uint32_t ip);
+ void (*processIncomingConn)(SOCKET fd, uint32_t ip);
} SPoolInfo;
void *syncOpenTcpThreadPool(SPoolInfo *pInfo);
void syncCloseTcpThreadPool(void *);
-void *syncAllocateTcpConn(void *, int64_t rid, int32_t connFd);
+void *syncAllocateTcpConn(void *, int64_t rid, SOCKET connFd);
void syncFreeTcpConn(void *);
#ifdef __cplusplus
diff --git a/src/sync/src/syncArbitrator.c b/src/sync/src/syncArbitrator.c
index fed0774346..9fb6b0ddb7 100644
--- a/src/sync/src/syncArbitrator.c
+++ b/src/sync/src/syncArbitrator.c
@@ -27,8 +27,8 @@
#include "syncInt.h"
#include "syncTcp.h"
-static void arbSignalHandler(int32_t signum, siginfo_t *sigInfo, void *context);
-static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
+static void arbSignalHandler(int32_t signum, void *sigInfo, void *context);
+static void arbProcessIncommingConnection(SOCKET connFd, uint32_t sourceIp);
static void arbProcessBrokenLink(int64_t rid);
static int32_t arbProcessPeerMsg(int64_t rid, void *buffer);
static tsem_t tsArbSem;
@@ -36,7 +36,7 @@ static void * tsArbTcpPool;
typedef struct {
char id[TSDB_EP_LEN + 24];
- int32_t nodeFd;
+ SOCKET nodeFd;
void * pConn;
} SNodeConn;
@@ -69,12 +69,10 @@ int32_t main(int32_t argc, char *argv[]) {
}
/* Set termination handler. */
- struct sigaction act = {{0}};
- act.sa_flags = SA_SIGINFO;
- act.sa_sigaction = arbSignalHandler;
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGHUP, &act, NULL);
- sigaction(SIGINT, &act, NULL);
+ taosSetSignal(SIGTERM, arbSignalHandler);
+ taosSetSignal(SIGINT, arbSignalHandler);
+ taosSetSignal(SIGHUP, arbSignalHandler);
+ taosSetSignal(SIGABRT, arbSignalHandler);
tsAsyncLog = 0;
strcat(arbLogPath, "/arbitrator.log");
@@ -103,12 +101,12 @@ int32_t main(int32_t argc, char *argv[]) {
syncCloseTcpThreadPool(tsArbTcpPool);
sInfo("TAOS arbitrator is shut down");
- closelog();
+ closelog();
return 0;
}
-static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
+static void arbProcessIncommingConnection(SOCKET connFd, uint32_t sourceIp) {
char ipstr[24];
tinet_ntoa(ipstr, sourceIp);
sDebug("peer TCP connection from ip:%s", ipstr);
@@ -172,14 +170,13 @@ static int32_t arbProcessPeerMsg(int64_t rid, void *buffer) {
return 0;
}
-static void arbSignalHandler(int32_t signum, siginfo_t *sigInfo, void *context) {
- struct sigaction act = {{0}};
- act.sa_handler = SIG_IGN;
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGHUP, &act, NULL);
- sigaction(SIGINT, &act, NULL);
+static void arbSignalHandler(int32_t signum, void *sigInfo, void *context) {
+ taosIgnSignal(SIGTERM);
+ taosIgnSignal(SIGINT);
+ taosIgnSignal(SIGABRT);
+ taosIgnSignal(SIGHUP);
- sInfo("shut down signal is %d, sender PID:%d", signum, sigInfo->si_pid);
+ sInfo("shut down signal is %d", signum);
// inform main thread to exit
tsem_post(&tsArbSem);
diff --git a/src/sync/src/syncMain.c b/src/sync/src/syncMain.c
index 1981196525..d698432176 100644
--- a/src/sync/src/syncMain.c
+++ b/src/sync/src/syncMain.c
@@ -45,7 +45,7 @@ static void syncCheckPeerConnection(void *param, void *tmrId);
static int32_t syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId);
static void syncProcessBrokenLink(int64_t rid);
static int32_t syncProcessPeerMsg(int64_t rid, void *buffer);
-static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
+static void syncProcessIncommingConnection(SOCKET connFd, uint32_t sourceIp);
static void syncRemovePeer(SSyncPeer *pPeer);
static void syncAddArbitrator(SSyncNode *pNode);
static void syncFreeNode(void *);
@@ -544,7 +544,7 @@ static void syncClosePeerConn(SSyncPeer *pPeer) {
sDebug("%s, pfd:%d sfd:%d will be closed", pPeer->id, pPeer->peerFd, pPeer->syncFd);
taosTmrStopA(&pPeer->timer);
- taosClose(pPeer->syncFd);
+ taosCloseSocket(pPeer->syncFd);
if (pPeer->peerFd >= 0) {
pPeer->peerFd = -1;
void *pConn = pPeer->pConn;
@@ -869,7 +869,7 @@ static void syncProcessSyncRequest(char *msg, SSyncPeer *pPeer) {
if (nodeRole != TAOS_SYNC_ROLE_MASTER) {
sError("%s, I am not master anymore", pPeer->id);
- taosClose(pPeer->syncFd);
+ taosCloseSocket(pPeer->syncFd);
return;
}
@@ -1114,8 +1114,8 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
return;
}
- int32_t connFd = taosOpenTcpClientSocket(pPeer->ip, pPeer->port, 0);
- if (connFd < 0) {
+ SOCKET connFd = taosOpenTcpClientSocket(pPeer->ip, pPeer->port, 0);
+ if (connFd <= 0) {
sDebug("%s, failed to open tcp socket since %s", pPeer->id, strerror(errno));
taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
return;
@@ -1132,7 +1132,7 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
if (pPeer->isArb) tsArbOnline = 1;
} else {
sDebug("%s, failed to setup peer connection to server since %s, try later", pPeer->id, strerror(errno));
- taosClose(connFd);
+ taosCloseSocket(connFd);
taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
}
}
@@ -1171,7 +1171,7 @@ static void syncCreateRestoreDataThread(SSyncPeer *pPeer) {
SSyncNode *pNode = pPeer->pSyncNode;
nodeSStatus = TAOS_SYNC_STATUS_INIT;
sError("%s, failed to create sync restore thread, set sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
- taosClose(pPeer->syncFd);
+ taosCloseSocket(pPeer->syncFd);
syncReleasePeer(pPeer);
} else {
sInfo("%s, sync restore thread:0x%08" PRIx64 " create successfully, rid:%" PRId64, pPeer->id,
@@ -1179,7 +1179,7 @@ static void syncCreateRestoreDataThread(SSyncPeer *pPeer) {
}
}
-static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
+static void syncProcessIncommingConnection(SOCKET connFd, uint32_t sourceIp) {
char ipstr[24];
int32_t i;
diff --git a/src/sync/src/syncRestore.c b/src/sync/src/syncRestore.c
index 78520c6608..99f4ce1c17 100644
--- a/src/sync/src/syncRestore.c
+++ b/src/sync/src/syncRestore.c
@@ -128,7 +128,7 @@ static int32_t syncRestoreFile(SSyncPeer *pPeer, uint64_t *fversion) {
minfo.name[sizeof(minfo.name) - 1] = 0;
snprintf(name, sizeof(name), "%s/%s", pNode->path, minfo.name);
- int32_t dfd = open(name, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
+ int32_t dfd = open(name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRWXU | S_IRWXG | S_IRWXO);
if (dfd < 0) {
sError("%s, failed to open file:%s while restore file since %s", pPeer->id, minfo.name, strerror(errno));
break;
@@ -365,7 +365,7 @@ void *syncRestoreData(void *param) {
SSyncNode *pNode = pPeer->pSyncNode;
taosBlockSIGPIPE();
- __sync_fetch_and_add(&tsSyncNum, 1);
+ atomic_add_fetch_32(&tsSyncNum, 1);
sInfo("%s, start to restore data, sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
(*pNode->notifyRole)(pNode->vgId, TAOS_SYNC_ROLE_SYNCING);
@@ -390,9 +390,9 @@ void *syncRestoreData(void *param) {
nodeSStatus = TAOS_SYNC_STATUS_INIT;
sInfo("%s, restore data over, set sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
- taosClose(pPeer->syncFd);
+ taosCloseSocket(pPeer->syncFd);
syncCloseRecvBuffer(pNode);
- __sync_fetch_and_sub(&tsSyncNum, 1);
+ atomic_sub_fetch_32(&tsSyncNum, 1);
// The ref is obtained in both the create thread and the current thread, so it is released twice
syncReleasePeer(pPeer);
diff --git a/src/sync/src/syncRetrieve.c b/src/sync/src/syncRetrieve.c
index 7678a7d284..e748898e6e 100644
--- a/src/sync/src/syncRetrieve.c
+++ b/src/sync/src/syncRetrieve.c
@@ -14,7 +14,6 @@
*/
#define _DEFAULT_SOURCE
-// #include
#include "os.h"
#include "taoserror.h"
#include "tlog.h"
@@ -153,14 +152,14 @@ static int32_t syncRetrieveFile(SSyncPeer *pPeer) {
snprintf(name, sizeof(name), "%s/%s", pNode->path, fileInfo.name);
// send the file to peer
- int32_t sfd = open(name, O_RDONLY);
+ int32_t sfd = open(name, O_RDONLY | O_BINARY);
if (sfd < 0) {
code = -1;
sError("%s, failed to open file:%s while retrieve file since %s", pPeer->id, fileInfo.name, strerror(errno));
break;
}
- ret = taosSendFile(pPeer->syncFd, sfd, NULL, fileInfo.size);
+ ret = (int32_t)taosSendFile(pPeer->syncFd, sfd, NULL, fileInfo.size);
close(sfd);
if (ret < 0) {
code = -1;
@@ -222,13 +221,13 @@ static int32_t syncReadOneWalRecord(int32_t sfd, SWalHead *pHead) {
}
static int32_t syncRetrieveLastWal(SSyncPeer *pPeer, char *name, uint64_t fversion, int64_t offset) {
- int32_t sfd = open(name, O_RDONLY);
+ int32_t sfd = open(name, O_RDONLY | O_BINARY);
if (sfd < 0) {
sError("%s, failed to open wal:%s for retrieve since:%s", pPeer->id, name, tstrerror(errno));
return -1;
}
- int32_t code = taosLSeek(sfd, offset, SEEK_SET);
+ int32_t code = (int32_t)taosLSeek(sfd, offset, SEEK_SET);
if (code < 0) {
sError("%s, failed to seek %" PRId64 " in wal:%s for retrieve since:%s", pPeer->id, offset, name, tstrerror(errno));
close(sfd);
@@ -322,7 +321,7 @@ static int32_t syncProcessLastWal(SSyncPeer *pPeer, char *wname, int64_t index)
// if all data are read out, and no update
if (bytes == 0 && !walModified) {
// wal not closed, it means some data not flushed to disk, wait for a while
- usleep(10000);
+ taosMsleep(10);
}
// if bytes > 0, file is updated, or fversion is not reached but file still open, read again
@@ -377,14 +376,14 @@ static int32_t syncRetrieveWal(SSyncPeer *pPeer) {
size = fstat.st_size;
sDebug("%s, retrieve wal:%s size:%d", pPeer->id, fname, size);
- int32_t sfd = open(fname, O_RDONLY);
+ int32_t sfd = open(fname, O_RDONLY | O_BINARY);
if (sfd < 0) {
code = -1;
sError("%s, failed to open wal:%s for retrieve since %s, code:0x%x", pPeer->id, fname, strerror(errno), code);
break;
}
- code = taosSendFile(pPeer->syncFd, sfd, NULL, size);
+ code = (int32_t)taosSendFile(pPeer->syncFd, sfd, NULL, size);
close(sfd);
if (code < 0) {
sError("%s, failed to send wal:%s for retrieve since %s, code:0x%x", pPeer->id, fname, strerror(errno), code);
@@ -504,7 +503,7 @@ void *syncRetrieveData(void *param) {
if (pNode->notifyFlowCtrl) (*pNode->notifyFlowCtrl)(pNode->vgId, 0);
pPeer->fileChanged = 0;
- taosClose(pPeer->syncFd);
+ taosCloseSocket(pPeer->syncFd);
// The ref is obtained in both the create thread and the current thread, so it is released twice
sInfo("%s, sync retrieve data over, sstatus:%s", pPeer->id, syncStatus[pPeer->sstatus]);
diff --git a/src/sync/src/syncTcp.c b/src/sync/src/syncTcp.c
index e15f71e905..22bdc7e74e 100644
--- a/src/sync/src/syncTcp.c
+++ b/src/sync/src/syncTcp.c
@@ -27,7 +27,7 @@
typedef struct SThreadObj {
pthread_t thread;
bool stop;
- int32_t pollFd;
+ SOCKET pollFd;
int32_t numOfFds;
struct SPoolObj *pPool;
} SThreadObj;
@@ -37,13 +37,14 @@ typedef struct SPoolObj {
SThreadObj **pThread;
pthread_t thread;
int32_t nextId;
- int32_t acceptFd; // FD for accept new connection
+ SOCKET acceptFd; // FD for accept new connection
+ int8_t stop;
} SPoolObj;
typedef struct {
SThreadObj *pThread;
int64_t handleId;
- int32_t fd;
+ SOCKET fd;
int32_t closedByApp;
} SConnObj;
@@ -82,7 +83,7 @@ void *syncOpenTcpThreadPool(SPoolInfo *pInfo) {
pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE);
if (pthread_create(&(pPool->thread), &thattr, (void *)syncAcceptPeerTcpConnection, pPool) != 0) {
sError("failed to create accept thread for TCP server since %s", strerror(errno));
- close(pPool->acceptFd);
+ taosCloseSocket(pPool->acceptFd);
tfree(pPool->pThread);
tfree(pPool);
return NULL;
@@ -98,7 +99,14 @@ void syncCloseTcpThreadPool(void *param) {
SPoolObj * pPool = param;
SThreadObj *pThread;
+ pPool->stop = 1;
+
+#ifdef WINDOWS
+ closesocket(pPool->acceptFd);
+#else
shutdown(pPool->acceptFd, SHUT_RD);
+#endif
+
pthread_join(pPool->thread, NULL);
for (int32_t i = 0; i < pPool->info.numOfThreads; ++i) {
@@ -112,7 +120,7 @@ void syncCloseTcpThreadPool(void *param) {
tfree(pPool);
}
-void *syncAllocateTcpConn(void *param, int64_t rid, int32_t connFd) {
+void *syncAllocateTcpConn(void *param, int64_t rid, SOCKET connFd) {
struct epoll_event event;
SPoolObj *pPool = param;
@@ -169,7 +177,7 @@ static void taosProcessBrokenLink(SConnObj *pConn) {
pThread->numOfFds--;
epoll_ctl(pThread->pollFd, EPOLL_CTL_DEL, pConn->fd, NULL);
sDebug("%p fd:%d is removed from epoll thread, num:%d", pThread, pConn->fd, pThread->numOfFds);
- taosClose(pConn->fd);
+ taosCloseSocket(pConn->fd);
tfree(pConn);
}
@@ -233,11 +241,7 @@ static void *syncProcessTcpData(void *param) {
sDebug("%p TCP epoll thread exits", pThread);
-#ifdef __APPLE__
- epoll_close(pThread->pollFd);
-#else // __APPLE__
- close(pThread->pollFd);
-#endif // __APPLE__
+ EpollClose(pThread->pollFd);
tfree(pThread);
tfree(buffer);
return NULL;
@@ -252,7 +256,12 @@ static void *syncAcceptPeerTcpConnection(void *argv) {
while (1) {
struct sockaddr_in clientAddr;
socklen_t addrlen = sizeof(clientAddr);
- int32_t connFd = accept(pPool->acceptFd, (struct sockaddr *)&clientAddr, &addrlen);
+ SOCKET connFd = accept(pPool->acceptFd, (struct sockaddr *)&clientAddr, &addrlen);
+ if (pPool->stop) {
+ sDebug("%p TCP server accept is stopped", pPool);
+ break;
+ }
+
if (connFd < 0) {
if (errno == EINVAL) {
sDebug("%p TCP server accept is exiting...", pPool);
@@ -268,7 +277,7 @@ static void *syncAcceptPeerTcpConnection(void *argv) {
(*pInfo->processIncomingConn)(connFd, clientAddr.sin_addr.s_addr);
}
- taosClose(pPool->acceptFd);
+ taosCloseSocket(pPool->acceptFd);
return NULL;
}
@@ -281,7 +290,7 @@ static SThreadObj *syncGetTcpThread(SPoolObj *pPool) {
if (pThread == NULL) return NULL;
pThread->pPool = pPool;
- pThread->pollFd = epoll_create(10); // size does not matter
+ pThread->pollFd = (EpollFd)epoll_create(10); // size does not matter
if (pThread->pollFd < 0) {
tfree(pThread);
return NULL;
@@ -294,11 +303,7 @@ static SThreadObj *syncGetTcpThread(SPoolObj *pPool) {
pthread_attr_destroy(&thattr);
if (ret != 0) {
-#ifdef __APPLE__
- epoll_close(pThread->pollFd);
-#else // __APPLE__
- close(pThread->pollFd);
-#endif // __APPLE__
+ EpollClose(pThread->pollFd);
tfree(pThread);
return NULL;
}
diff --git a/src/tsdb/src/tsdbCommit.c b/src/tsdb/src/tsdbCommit.c
index 1c8a661c0a..b3f7f51327 100644
--- a/src/tsdb/src/tsdbCommit.c
+++ b/src/tsdb/src/tsdbCommit.c
@@ -273,11 +273,11 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe
pthread_rwlock_wrlock(&(pFileH->fhlock));
- (void)rename(helperNewHeadF(pHelper)->fname, helperHeadF(pHelper)->fname);
+ (void)taosRename(helperNewHeadF(pHelper)->fname, helperHeadF(pHelper)->fname);
pGroup->files[TSDB_FILE_TYPE_HEAD].info = helperNewHeadF(pHelper)->info;
if (newLast) {
- (void)rename(helperNewLastF(pHelper)->fname, helperLastF(pHelper)->fname);
+ (void)taosRename(helperNewLastF(pHelper)->fname, helperLastF(pHelper)->fname);
pGroup->files[TSDB_FILE_TYPE_LAST].info = helperNewLastF(pHelper)->info;
} else {
pGroup->files[TSDB_FILE_TYPE_LAST].info = helperLastF(pHelper)->info;
diff --git a/src/tsdb/src/tsdbFile.c b/src/tsdb/src/tsdbFile.c
index 5d8933d141..7a8622b110 100644
--- a/src/tsdb/src/tsdbFile.c
+++ b/src/tsdb/src/tsdbFile.c
@@ -175,7 +175,7 @@ int tsdbOpenFileH(STsdbRepo *pRepo) {
}
sprintf(fname2, "%s/%s_back_%" PRId64, tDataDir, dp->d_name, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI));
- (void)rename(fname1, fname2);
+ (void)taosRename(fname1, fname2);
tsdbDebug("vgId:%d file %s exists, backup it as %s", REPO_ID(pRepo), fname1, fname2);
@@ -339,7 +339,7 @@ SFileGroup *tsdbGetFileGroupNext(SFileGroupIter *pIter) {
int tsdbOpenFile(SFile *pFile, int oflag) {
ASSERT(!TSDB_IS_FILE_OPENED(pFile));
- pFile->fd = open(pFile->fname, oflag, 0755);
+ pFile->fd = open(pFile->fname, oflag | O_BINARY, 0755);
if (pFile->fd < 0) {
tsdbError("failed to open file %s since %s", pFile->fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c
index c770f0ff42..adab932bb6 100644
--- a/src/tsdb/src/tsdbMain.c
+++ b/src/tsdb/src/tsdbMain.c
@@ -541,7 +541,7 @@ static int32_t tsdbSaveConfig(char *rootDir, STsdbCfg *pCfg) {
goto _err;
}
- fd = open(fname, O_WRONLY | O_CREAT, 0755);
+ fd = open(fname, O_WRONLY | O_CREAT | O_BINARY, 0755);
if (fd < 0) {
tsdbError("vgId:%d failed to open file %s since %s", pCfg->tsdbId, fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
@@ -587,7 +587,7 @@ static int tsdbLoadConfig(char *rootDir, STsdbCfg *pCfg) {
goto _err;
}
- fd = open(fname, O_RDONLY);
+ fd = open(fname, O_RDONLY | O_BINARY);
if (fd < 0) {
tsdbError("failed to open file %s since %s", fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c
index 90f673eaee..4045e302c7 100644
--- a/src/tsdb/src/tsdbRead.c
+++ b/src/tsdb/src/tsdbRead.c
@@ -19,10 +19,10 @@
#include "tcompare.h"
#include "exception.h"
-#include "../../query/inc/qAst.h" // todo move to common module
#include "tlosertree.h"
#include "tsdb.h"
#include "tsdbMain.h"
+#include "texpr.h"
#define EXTRA_BYTES 2
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
@@ -111,6 +111,7 @@ typedef struct STsdbQueryHandle {
int32_t activeIndex;
bool checkFiles; // check file stage
bool cachelastrow; // check if last row cached
+ bool loadExternalRow; // load time window external data rows
void* qinfo; // query info handle, for debug purpose
int32_t type; // query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows
SFileGroup* pFileGroup;
@@ -125,6 +126,8 @@ typedef struct STsdbQueryHandle {
SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */
SLoadCompBlockInfo compBlockLoadInfo; /* record current compblock information in SQuery */
+ SArray *prev; // previous row which is before than time window
+ SArray *next; // next row which is after the query time window
SIOCostSummary cost;
} STsdbQueryHandle;
@@ -141,10 +144,10 @@ static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastK
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle);
static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SCompBlock* pBlock);
static int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
-static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win,
- STsdbQueryHandle* pQueryHandle);
-static int tsdbCheckInfoCompar(const void* key1, const void* key2);
-
+static int32_t tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win, STsdbQueryHandle* pQueryHandle);
+static int32_t tsdbCheckInfoCompar(const void* key1, const void* key2);
+static int32_t doGetExternalRow(STsdbQueryHandle* pQueryHandle, int16_t type, SMemRef* pMemRef);
+static void* doFreeColumnInfoData(SArray* pColumnInfoData);
static void tsdbInitDataBlockLoadInfo(SDataBlockLoadInfo* pBlockLoadInfo) {
pBlockLoadInfo->slot = -1;
@@ -210,6 +213,36 @@ static void tsdbMayUnTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
pQueryHandle->pMemRef = NULL;
}
+int64_t tsdbGetNumOfRowsInMemTable(TsdbQueryHandleT* pHandle) {
+ STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
+
+ size_t size = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
+ assert(pQueryHandle->activeIndex < size && pQueryHandle->activeIndex >= 0 && size >= 1);
+ STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex);
+
+
+ int64_t rows = 0;
+ SMemRef* pMemRef = pQueryHandle->pMemRef;
+ if (pMemRef == NULL) { return rows; }
+
+ STableData* pMem = NULL;
+ STableData* pIMem = NULL;
+
+ SMemTable *pMemT = (SMemTable *)(pMemRef->mem);
+ SMemTable *pIMemT = (SMemTable *)(pMemRef->imem);
+
+ if (pMemT && pCheckInfo->tableId.tid < pMemT->maxTables) {
+ pMem = pMemT->tData[pCheckInfo->tableId.tid];
+ rows += (pMem && pMem->uid == pCheckInfo->tableId.uid) ? pMem->numOfRows: 0;
+ }
+ if (pIMemT && pCheckInfo->tableId.tid < pIMemT->maxTables) {
+ pIMem = pIMemT->tData[pCheckInfo->tableId.tid];
+ rows += (pIMem && pIMem->uid == pCheckInfo->tableId.uid) ? pIMem->numOfRows: 0;
+ }
+
+ return rows;
+}
+
static SArray* createCheckInfoFromTableGroup(STsdbQueryHandle* pQueryHandle, STableGroupInfo* pGroupList, STsdbMeta* pMeta) {
size_t sizeOfGroup = taosArrayGetSize(pGroupList->pGroupList);
assert(sizeOfGroup >= 1 && pMeta != NULL);
@@ -294,6 +327,7 @@ static STsdbQueryHandle* tsdbQueryTablesImpl(TSDB_REPO_T* tsdb, STsdbQueryCond*
pQueryHandle->allocSize = 0;
pQueryHandle->locateStart = false;
pQueryHandle->pMemRef = pMemRef;
+ pQueryHandle->loadExternalRow = pCond->loadExternalRows;
if (tsdbInitReadHelper(&pQueryHandle->rhelper, (STsdbRepo*) tsdb) != 0) {
goto out_of_memory;
@@ -410,10 +444,11 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle) {
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *tsdb, STsdbQueryCond* pCond, STableGroupInfo *groupList, void* qinfo, SMemRef* pRef) {
STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo, pRef);
+ pQueryHandle->loadExternalRow = true;
if (pQueryHandle != NULL) {
- pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
changeQueryHandleForInterpQuery(pQueryHandle);
}
+
return pQueryHandle;
}
@@ -1900,17 +1935,21 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) {
pQueryHandle->activeIndex += 1;
}
+ if (pQueryHandle->loadExternalRow && pQueryHandle->window.skey == pQueryHandle->window.ekey) {
+ SMemRef* pMemRef = pQueryHandle->pMemRef;
+ doGetExternalRow(pQueryHandle, TSDB_PREV_ROW, pMemRef);
+ doGetExternalRow(pQueryHandle, TSDB_NEXT_ROW, pMemRef);
+ }
+
// no data in memtable or imemtable, decrease the memory reference.
tsdbMayUnTakeMemSnapshot(pQueryHandle);
return false;
}
+//todo not unref yet, since it is not support multi-group interpolation query
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
// filter the queried time stamp in the first place
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
- pQueryHandle->order = TSDB_ORDER_DESC;
-
- assert(pQueryHandle->window.skey == pQueryHandle->window.ekey);
// starts from the buffer in case of descending timestamp order check data blocks
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
@@ -1920,8 +1959,8 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, i);
// the first qualified table for interpolation query
- if (pQueryHandle->window.skey <= pCheckInfo->pTableObj->lastKey &&
- pCheckInfo->pTableObj->lastKey != TSKEY_INITIAL_VAL) {
+ if ((pQueryHandle->window.skey <= pCheckInfo->pTableObj->lastKey) &&
+ (pCheckInfo->pTableObj->lastKey != TSKEY_INITIAL_VAL)) {
break;
}
@@ -1938,9 +1977,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
info.lastKey = pQueryHandle->window.skey;
taosArrayPush(pQueryHandle->pTableCheckInfo, &info);
-
- // update the query time window according to the chosen last timestamp
- pQueryHandle->window = (STimeWindow) {info.lastKey, TSKEY_INITIAL_VAL};
}
static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win,
@@ -2020,7 +2056,6 @@ static void destroyHelper(void* param) {
return;
}
-
tQueryInfo* pInfo = (tQueryInfo*)param;
if (pInfo->optr != TSDB_RELATION_IN) {
tfree(pInfo->q);
@@ -2029,111 +2064,6 @@ static void destroyHelper(void* param) {
free(param);
}
-static bool getNeighborRows(STsdbQueryHandle* pQueryHandle) {
- assert (pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL);
-
- SDataBlockInfo blockInfo = {{0}, 0};
-
- pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
- pQueryHandle->order = TSDB_ORDER_DESC;
-
- if (!tsdbNextDataBlock((void*) pQueryHandle)) {
- return false;
- }
-
- tsdbRetrieveDataBlockInfo((void*) pQueryHandle, &blockInfo);
- /*SArray *pDataBlock = */tsdbRetrieveDataBlock((void*) pQueryHandle, pQueryHandle->defaultLoadColumn);
- if (terrno != TSDB_CODE_SUCCESS) {
- return false;
- }
-
- if (pQueryHandle->cur.win.ekey == pQueryHandle->window.skey) {
- // data already retrieve, discard other data rows and return
- int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
- memcpy((char*)pCol->pData, (char*)pCol->pData + pCol->info.bytes * (pQueryHandle->cur.rows - 1), pCol->info.bytes);
- }
-
- pQueryHandle->cur.win = (STimeWindow){pQueryHandle->window.skey, pQueryHandle->window.skey};
- pQueryHandle->window = pQueryHandle->cur.win;
- pQueryHandle->cur.rows = 1;
- pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
- return true;
- } else {
- STimeWindow win = (STimeWindow) {pQueryHandle->window.skey, INT64_MAX};
- STsdbQueryCond cond = {
- .order = TSDB_ORDER_ASC,
- .numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle))
- };
- cond.twindow = win;
-
- cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
- if (cond.colList == NULL) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return false;
- }
-
- for(int32_t i = 0; i < cond.numOfCols; ++i) {
- SColumnInfoData* pColInfoData = taosArrayGet(pQueryHandle->pColumns, i);
- memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
- }
-
- STsdbQueryHandle* pSecQueryHandle = tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pQueryHandle->pMemRef);
-
- tfree(cond.colList);
-
- pSecQueryHandle->pTableCheckInfo = createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey);
- if (pSecQueryHandle->pTableCheckInfo == NULL) {
- tsdbCleanupQueryHandle(pSecQueryHandle);
- return false;
- }
-
- if (!tsdbNextDataBlock((void*) pSecQueryHandle)) {
- tsdbCleanupQueryHandle(pSecQueryHandle);
- return false;
- }
-
- tsdbRetrieveDataBlockInfo((void*) pSecQueryHandle, &blockInfo);
- tsdbRetrieveDataBlock((void*) pSecQueryHandle, pSecQueryHandle->defaultLoadColumn);
-
- int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pSecQueryHandle));
- size_t si = taosArrayGetSize(pSecQueryHandle->pTableCheckInfo);
-
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
- memcpy((char*)pCol->pData, (char*)pCol->pData + pCol->info.bytes * (pQueryHandle->cur.rows - 1), pCol->info.bytes);
-
- SColumnInfoData* pCol1 = taosArrayGet(pSecQueryHandle->pColumns, i);
- assert(pCol->info.colId == pCol1->info.colId);
-
- memcpy((char*)pCol->pData + pCol->info.bytes, pCol1->pData, pCol1->info.bytes);
- }
-
- SColumnInfoData* pTSCol = taosArrayGet(pQueryHandle->pColumns, 0);
-
- // it is ascending order
- pQueryHandle->order = TSDB_ORDER_DESC;
- pQueryHandle->window = pQueryHandle->cur.win;
- pQueryHandle->cur.win = (STimeWindow){((TSKEY*)pTSCol->pData)[0], ((TSKEY*)pTSCol->pData)[1]};
- pQueryHandle->cur.rows = 2;
- pQueryHandle->cur.mixBlock = true;
-
- int32_t step = -1;// one step for ascending order traverse
- for (int32_t j = 0; j < si; ++j) {
- STableCheckInfo* pCheckInfo = (STableCheckInfo*) taosArrayGet(pQueryHandle->pTableCheckInfo, j);
- pCheckInfo->lastKey = pQueryHandle->cur.win.ekey + step;
- }
-
- tsdbCleanupQueryHandle(pSecQueryHandle);
- }
-
- //disable it after retrieve data
- pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
- pQueryHandle->checkFiles = false;
- return true;
-}
-
// handle data in cache situation
bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
@@ -2144,16 +2074,7 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
assert(numOfTables > 0);
- if (pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL) {
- SMemRef* pMemRef = pQueryHandle->pMemRef;
- tsdbMayTakeMemSnapshot(pQueryHandle);
- bool ret = getNeighborRows(pQueryHandle);
- tsdbMayUnTakeMemSnapshot(pQueryHandle);
-
- // restore the pMemRef
- pQueryHandle->pMemRef = pMemRef;
- return ret;
- } else if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
+ if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
// the last row is cached in buffer, return it directly.
// here note that the pQueryHandle->window must be the TS_INITIALIZER
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
@@ -2218,6 +2139,185 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
return ret;
}
+bool tsdbNextDataBlockWithoutMerge(TsdbQueryHandleT* pHandle) {
+ STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
+
+ int64_t stime = taosGetTimestampUs();
+ int64_t elapsedTime = stime;
+
+ size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
+ assert(numOfTables > 0);
+
+ if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
+ // the last row is cached in buffer, return it directly.
+ // here note that the pQueryHandle->window must be the TS_INITIALIZER
+ int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
+ SQueryFilePos* cur = &pQueryHandle->cur;
+
+ SDataRow pRow = NULL;
+ TSKEY key = TSKEY_INITIAL_VAL;
+ int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-1;
+
+ if (++pQueryHandle->activeIndex < numOfTables) {
+ STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex);
+ int32_t ret = tsdbGetCachedLastRow(pCheckInfo->pTableObj, &pRow, &key);
+ if (ret != TSDB_CODE_SUCCESS) {
+ return false;
+ }
+
+ copyOneRowFromMem(pQueryHandle, pQueryHandle->outputCapacity, 0, pRow, numOfCols, pCheckInfo->pTableObj);
+ tfree(pRow);
+
+ // update the last key value
+ pCheckInfo->lastKey = key + step;
+
+ cur->rows = 1; // only one row
+ cur->lastKey = key + step;
+ cur->mixBlock = true;
+ cur->win.skey = key;
+ cur->win.ekey = key;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ if (pQueryHandle->checkFiles) {
+ // check if the query range overlaps with the file data block
+ bool exists = true;
+
+ int32_t code = getDataBlocksInFiles(pQueryHandle, &exists);
+ if (code != TSDB_CODE_SUCCESS) {
+ pQueryHandle->activeIndex = 0;
+ pQueryHandle->checkFiles = false;
+
+ return false;
+ }
+
+ if (exists) {
+ pQueryHandle->cost.checkForNextTime += (taosGetTimestampUs() - stime);
+ return exists;
+ }
+
+ pQueryHandle->activeIndex = 0;
+ pQueryHandle->checkFiles = false;
+ }
+
+ elapsedTime = taosGetTimestampUs() - stime;
+ pQueryHandle->cost.checkForNextTime += elapsedTime;
+ return false;
+}
+
+static int32_t doGetExternalRow(STsdbQueryHandle* pQueryHandle, int16_t type, SMemRef* pMemRef) {
+ STsdbQueryHandle* pSecQueryHandle = NULL;
+
+ if (type == TSDB_PREV_ROW && pQueryHandle->prev) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (type == TSDB_NEXT_ROW && pQueryHandle->next) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ // prepare the structure
+ int32_t numOfCols = (int32_t) QH_GET_NUM_OF_COLS(pQueryHandle);
+
+ if (type == TSDB_PREV_ROW) {
+ pQueryHandle->prev = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
+ if (pQueryHandle->prev == NULL) {
+ terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto out_of_memory;
+ }
+ } else {
+ pQueryHandle->next = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
+ if (pQueryHandle->next == NULL) {
+ terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto out_of_memory;
+ }
+ }
+
+ SArray* row = (type == TSDB_PREV_ROW)? pQueryHandle->prev:pQueryHandle->next;
+
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
+
+ SColumnInfoData colInfo = {{0}, 0};
+ colInfo.info = pCol->info;
+ colInfo.pData = calloc(1, pCol->info.bytes);
+ if (colInfo.pData == NULL) {
+ terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto out_of_memory;
+ }
+
+ taosArrayPush(row, &colInfo);
+ }
+
+ // load the previous row
+ STsdbQueryCond cond = {.numOfCols = numOfCols, .loadExternalRows = false,};
+ if (type == TSDB_PREV_ROW) {
+ cond.order = TSDB_ORDER_DESC;
+ cond.twindow = (STimeWindow){pQueryHandle->window.skey, INT64_MIN};
+ } else {
+ cond.order = TSDB_ORDER_ASC;
+ cond.twindow = (STimeWindow){pQueryHandle->window.skey, INT64_MAX};
+ }
+
+ cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
+ if (cond.colList == NULL) {
+ terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto out_of_memory;
+ }
+
+ for (int32_t i = 0; i < cond.numOfCols; ++i) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pQueryHandle->pColumns, i);
+ memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
+ }
+
+ pSecQueryHandle = tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pMemRef);
+
+ tfree(cond.colList);
+ pSecQueryHandle->pTableCheckInfo = createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey);
+ if (pSecQueryHandle->pTableCheckInfo == NULL) {
+ terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto out_of_memory;
+ }
+
+ if (!tsdbNextDataBlock((void*)pSecQueryHandle)) {
+ // no result in current query, free the corresponding result rows structure
+ if (type == TSDB_PREV_ROW) {
+ pQueryHandle->prev = doFreeColumnInfoData(pQueryHandle->prev);
+ } else {
+ pQueryHandle->next = doFreeColumnInfoData(pQueryHandle->next);
+ }
+
+ goto out_of_memory;
+ }
+
+ SDataBlockInfo blockInfo = {{0}, 0};
+ tsdbRetrieveDataBlockInfo((void*)pSecQueryHandle, &blockInfo);
+ tsdbRetrieveDataBlock((void*)pSecQueryHandle, pSecQueryHandle->defaultLoadColumn);
+
+ row = (type == TSDB_PREV_ROW)? pQueryHandle->prev:pQueryHandle->next;
+ int32_t pos = (type == TSDB_PREV_ROW)?pSecQueryHandle->cur.rows - 1:0;
+
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pCol = taosArrayGet(row, i);
+ SColumnInfoData* s = taosArrayGet(pSecQueryHandle->pColumns, i);
+ memcpy((char*)pCol->pData, (char*)s->pData + s->info.bytes * pos, pCol->info.bytes);
+ }
+
+out_of_memory:
+ tsdbCleanupQueryHandle(pSecQueryHandle);
+ return terrno;
+}
+
+SArray* tsdbGetExternalRow(TsdbQueryHandleT *pHandle, SMemRef* pMemRef, int16_t type) {
+ STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
+ assert(type == TSDB_PREV_ROW || type == TSDB_NEXT_ROW);
+ return (type == TSDB_PREV_ROW)? pQueryHandle->prev:pQueryHandle->next;
+}
+
/*
* 1. no data at all (pTable->lastKey = TSKEY_INITIAL_VAL), just return TSKEY_INITIAL_VAL
* 2. has data but not loaded, just return lastKey but not set pRes
@@ -2716,7 +2816,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, tExprNode* pExpr)
};
getTableListfromSkipList(pExpr, pSTable->pIndex, pRes, &supp);
- tExprTreeDestroy(&pExpr, destroyHelper);
+ tExprTreeDestroy(pExpr, destroyHelper);
return TSDB_CODE_SUCCESS;
}
@@ -2773,10 +2873,10 @@ int32_t tsdbQuerySTableByTagCond(TSDB_REPO_T* tsdb, uint64_t uid, TSKEY skey, co
if (expr == NULL) {
expr = exprTreeFromBinary(pTagCond, len);
} else {
- CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, expr, NULL);
+ CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, expr, NULL);
tExprNode* tagExpr = exprTreeFromBinary(pTagCond, len);
if (tagExpr != NULL) {
- CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, tagExpr, NULL);
+ CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, tagExpr, NULL);
tExprNode* tbnameExpr = expr;
expr = calloc(1, sizeof(tExprNode));
if (expr == NULL) {
@@ -2890,6 +2990,21 @@ int32_t tsdbGetTableGroupFromIdList(TSDB_REPO_T* tsdb, SArray* pTableIdList, STa
return TSDB_CODE_SUCCESS;
}
+static void* doFreeColumnInfoData(SArray* pColumnInfoData) {
+ if (pColumnInfoData == NULL) {
+ return NULL;
+ }
+
+ size_t cols = taosArrayGetSize(pColumnInfoData);
+ for (int32_t i = 0; i < cols; ++i) {
+ SColumnInfoData* pColInfo = taosArrayGet(pColumnInfoData, i);
+ tfree(pColInfo->pData);
+ }
+
+ taosArrayDestroy(pColumnInfoData);
+ return NULL;
+}
+
void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*)queryHandle;
if (pQueryHandle == NULL) {
@@ -2907,14 +3022,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
taosArrayDestroy(pQueryHandle->pTableCheckInfo);
}
- if (pQueryHandle->pColumns != NULL) {
- size_t cols = taosArrayGetSize(pQueryHandle->pColumns);
- for (int32_t i = 0; i < cols; ++i) {
- SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i);
- tfree(pColInfo->pData);
- }
- taosArrayDestroy(pQueryHandle->pColumns);
- }
+ pQueryHandle->pColumns = doFreeColumnInfoData(pQueryHandle->pColumns);
taosArrayDestroy(pQueryHandle->defaultLoadColumn);
tfree(pQueryHandle->pDataBlockInfo);
@@ -2928,6 +3036,9 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
tdFreeDataCols(pQueryHandle->pDataCols);
pQueryHandle->pDataCols = NULL;
+ pQueryHandle->prev = doFreeColumnInfoData(pQueryHandle->prev);
+ pQueryHandle->next = doFreeColumnInfoData(pQueryHandle->next);
+
SIOCostSummary* pCost = &pQueryHandle->cost;
tsdbDebug("%p :io-cost summary: statis-info:%"PRId64" us, datablock:%" PRId64" us, check data:%"PRId64" us, %p",
pQueryHandle, pCost->statisInfoLoadTime, pCost->blockLoadTime, pCost->checkForNextTime, pQueryHandle->qinfo);
diff --git a/src/util/inc/tsocket.h b/src/util/inc/tsocket.h
index a339955cc0..35b591b61e 100644
--- a/src/util/inc/tsocket.h
+++ b/src/util/inc/tsocket.h
@@ -20,11 +20,15 @@
extern "C" {
#endif
+#ifdef WINDOWS
+#include "wepoll.h"
+#endif
+
int32_t taosReadn(SOCKET sock, char *buffer, int32_t len);
int32_t taosWriteMsg(SOCKET fd, void *ptr, int32_t nbytes);
int32_t taosReadMsg(SOCKET fd, void *ptr, int32_t nbytes);
int32_t taosNonblockwrite(SOCKET fd, char *ptr, int32_t nbytes);
-int32_t taosCopyFds(SOCKET sfd, SOCKET dfd, int64_t len);
+int32_t taosCopyFds(SOCKET sfd, int32_t dfd, int64_t len);
int32_t taosSetNonblocking(SOCKET sock, int32_t on);
SOCKET taosOpenUdpSocket(uint32_t localIp, uint16_t localPort);
diff --git a/src/util/inc/tstoken.h b/src/util/inc/tstoken.h
index b36d0017e8..7af03d96af 100644
--- a/src/util/inc/tstoken.h
+++ b/src/util/inc/tstoken.h
@@ -27,6 +27,9 @@ extern "C" {
#define TSQL_TBNAME "TBNAME"
#define TSQL_TBNAME_L "tbname"
+#define TSQL_BLOCK_DIST "_BLOCK_DIST"
+#define TSQL_BLOCK_DIST_L "_block_dist"
+
// used to denote the minimum unite in sql parsing
typedef struct SStrToken {
uint32_t n;
diff --git a/src/util/src/tfile.c b/src/util/src/tfile.c
index 64fea2843b..dd621b3199 100644
--- a/src/util/src/tfile.c
+++ b/src/util/src/tfile.c
@@ -54,12 +54,12 @@ static int64_t tfOpenImp(int32_t fd) {
}
int64_t tfOpen(const char *pathname, int32_t flags) {
- int32_t fd = open(pathname, flags);
+ int32_t fd = open(pathname, flags | O_BINARY);
return tfOpenImp(fd);
}
int64_t tfOpenM(const char *pathname, int32_t flags, mode_t mode) {
- int32_t fd = open(pathname, flags, mode);
+ int32_t fd = open(pathname, flags | O_BINARY, mode);
return tfOpenImp(fd);
}
diff --git a/src/util/src/tkvstore.c b/src/util/src/tkvstore.c
index 2b1d13c78b..0abba410b0 100644
--- a/src/util/src/tkvstore.c
+++ b/src/util/src/tkvstore.c
@@ -50,7 +50,7 @@ static void * tdDecodeKVRecord(void *buf, SKVRecord *pRecord);
static int tdRestoreKVStore(SKVStore *pStore);
int tdCreateKVStore(char *fname) {
- int fd = open(fname, O_RDWR | O_CREAT, 0755);
+ int fd = open(fname, O_RDWR | O_CREAT | O_BINARY, 0755);
if (fd < 0) {
uError("failed to open file %s since %s", fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
@@ -96,14 +96,14 @@ SKVStore *tdOpenKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH
SKVStore *pStore = tdNewKVStore(fname, iFunc, aFunc, appH);
if (pStore == NULL) return NULL;
- pStore->fd = open(pStore->fname, O_RDWR);
+ pStore->fd = open(pStore->fname, O_RDWR | O_BINARY);
if (pStore->fd < 0) {
uError("failed to open file %s since %s", pStore->fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
- pStore->sfd = open(pStore->fsnap, O_RDONLY);
+ pStore->sfd = open(pStore->fsnap, O_RDONLY | O_BINARY);
if (pStore->sfd < 0) {
if (errno != ENOENT) {
uError("failed to open file %s since %s", pStore->fsnap, strerror(errno));
@@ -172,14 +172,14 @@ void tdCloseKVStore(SKVStore *pStore) { tdFreeKVStore(pStore); }
int tdKVStoreStartCommit(SKVStore *pStore) {
ASSERT(pStore->fd < 0);
- pStore->fd = open(pStore->fname, O_RDWR);
+ pStore->fd = open(pStore->fname, O_RDWR | O_BINARY);
if (pStore->fd < 0) {
uError("failed to open file %s since %s", pStore->fname, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
- pStore->sfd = open(pStore->fsnap, O_WRONLY | O_CREAT, 0755);
+ pStore->sfd = open(pStore->fsnap, O_WRONLY | O_CREAT | O_BINARY, 0755);
if (pStore->sfd < 0) {
uError("failed to open file %s since %s", pStore->fsnap, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
@@ -336,7 +336,7 @@ void tsdbGetStoreInfo(char *fname, uint32_t *magic, int64_t *size) {
char buf[TD_KVSTORE_HEADER_SIZE] = "\0";
SStoreInfo info = {0};
- int fd = open(fname, O_RDONLY);
+ int fd = open(fname, O_RDONLY | O_BINARY);
if (fd < 0) goto _err;
if (taosRead(fd, buf, TD_KVSTORE_HEADER_SIZE) < TD_KVSTORE_HEADER_SIZE) goto _err;
diff --git a/src/util/src/tnettest.c b/src/util/src/tnettest.c
index e1b834b949..fe6dfb493d 100644
--- a/src/util/src/tnettest.c
+++ b/src/util/src/tnettest.c
@@ -48,7 +48,7 @@ static void *taosNetBindUdpPort(void *sarg) {
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
- if ((serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
+ if ((serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
uError("failed to create UDP socket since %s", strerror(errno));
return NULL;
}
@@ -104,7 +104,7 @@ static void *taosNetBindTcpPort(void *sarg) {
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
- STestInfo *pinfo = sarg;
+ STestInfo *pinfo = sarg;
int32_t port = pinfo->port;
SOCKET serverSocket;
int32_t addr_len = sizeof(clientAddr);
@@ -133,7 +133,6 @@ static void *taosNetBindTcpPort(void *sarg) {
return NULL;
}
-
if (taosKeepTcpAlive(serverSocket) < 0) {
uError("failed to set tcp server keep-alive option since %s", strerror(errno));
taosCloseSocket(serverSocket);
@@ -178,8 +177,8 @@ static void *taosNetBindTcpPort(void *sarg) {
}
static int32_t taosNetCheckTcpPort(STestInfo *info) {
- SOCKET clientSocket;
- char buffer[BUFFER_SIZE] = {0};
+ SOCKET clientSocket;
+ char buffer[BUFFER_SIZE] = {0};
if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
uError("failed to create TCP client socket since %s", strerror(errno));
diff --git a/src/util/src/tsocket.c b/src/util/src/tsocket.c
index 4bfd7a855b..57e262e5cf 100644
--- a/src/util/src/tsocket.c
+++ b/src/util/src/tsocket.c
@@ -241,7 +241,7 @@ int32_t taosReadn(SOCKET fd, char *ptr, int32_t nbytes) {
SOCKET taosOpenUdpSocket(uint32_t ip, uint16_t port) {
struct sockaddr_in localAddr;
- SOCKET sockFd;
+ SOCKET sockFd;
int32_t bufSize = 1024000;
uDebug("open udp socket:0x%x:%hu", ip, port);
@@ -251,7 +251,7 @@ SOCKET taosOpenUdpSocket(uint32_t ip, uint16_t port) {
localAddr.sin_addr.s_addr = ip;
localAddr.sin_port = (uint16_t)htons(port);
- if ((sockFd = (int32_t)socket(AF_INET, SOCK_DGRAM, 0)) <= 2) {
+ if ((sockFd = socket(AF_INET, SOCK_DGRAM, 0)) <= 2) {
uError("failed to open udp socket: %d (%s)", errno, strerror(errno));
taosCloseSocketNoCheck(sockFd);
return -1;
@@ -280,13 +280,13 @@ SOCKET taosOpenUdpSocket(uint32_t ip, uint16_t port) {
}
SOCKET taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t clientIp) {
- SOCKET sockFd = 0;
+ SOCKET sockFd = 0;
int32_t ret;
struct sockaddr_in serverAddr, clientAddr;
int32_t bufSize = 1024 * 1024;
sockFd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-
+
if (sockFd <= 2) {
uError("failed to open the socket: %d (%s)", errno, strerror(errno));
taosCloseSocketNoCheck(sockFd);
@@ -409,7 +409,7 @@ SOCKET taosOpenTcpServerSocket(uint32_t ip, uint16_t port) {
serverAdd.sin_addr.s_addr = ip;
serverAdd.sin_port = (uint16_t)htons(port);
- if ((sockFd = (int32_t)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 2) {
+ if ((sockFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 2) {
uError("failed to open TCP socket: %d (%s)", errno, strerror(errno));
taosCloseSocketNoCheck(sockFd);
return -1;
@@ -452,7 +452,7 @@ void tinet_ntoa(char *ipstr, uint32_t ip) {
#define COPY_SIZE 32768
// sendfile shall be used
-int32_t taosCopyFds(SOCKET sfd, SOCKET dfd, int64_t len) {
+int32_t taosCopyFds(SOCKET sfd, int32_t dfd, int64_t len) {
int64_t leftLen;
int32_t readLen, writeLen;
char temp[COPY_SIZE];
diff --git a/src/vnode/CMakeLists.txt b/src/vnode/CMakeLists.txt
index 3a26172411..5d77d48ebf 100644
--- a/src/vnode/CMakeLists.txt
+++ b/src/vnode/CMakeLists.txt
@@ -1,6 +1,7 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
PROJECT(TDengine)
+INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/tsdb/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
@@ -9,13 +10,5 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(vnode ${SRC})
- TARGET_LINK_LIBRARIES(vnode tsdb tcq)
-ENDIF ()
-
-IF (TD_DARWIN)
- ADD_LIBRARY(vnode ${SRC})
- TARGET_LINK_LIBRARIES(vnode tsdb tcq)
-ENDIF ()
-
+ADD_LIBRARY(vnode ${SRC})
+TARGET_LINK_LIBRARIES(vnode tsdb tcq)
diff --git a/src/vnode/src/vnodeCfg.c b/src/vnode/src/vnodeCfg.c
index 0b32f97939..1ea774afae 100644
--- a/src/vnode/src/vnodeCfg.c
+++ b/src/vnode/src/vnodeCfg.c
@@ -78,7 +78,7 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
goto PARSE_VCFG_ERROR;
}
- len = fread(content, 1, maxLen, fp);
+ len = (int32_t)fread(content, 1, maxLen, fp);
if (len <= 0) {
vError("vgId:%d, failed to read %s, content is null", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
@@ -103,14 +103,14 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
vError("vgId:%d, failed to read %s, cfgVersion not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.dbCfgVersion = dbCfgVersion->valueint;
+ vnodeMsg.cfg.dbCfgVersion = (int32_t)dbCfgVersion->valueint;
cJSON *vgCfgVersion = cJSON_GetObjectItem(root, "vgCfgVersion");
if (!vgCfgVersion || vgCfgVersion->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, vgCfgVersion not found", pVnode->vgId, file);
vnodeMsg.cfg.vgCfgVersion = 0;
} else {
- vnodeMsg.cfg.vgCfgVersion = vgCfgVersion->valueint;
+ vnodeMsg.cfg.vgCfgVersion = (int32_t)vgCfgVersion->valueint;
}
cJSON *cacheBlockSize = cJSON_GetObjectItem(root, "cacheBlockSize");
@@ -118,56 +118,56 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
vError("vgId:%d, failed to read %s, cacheBlockSize not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.cacheBlockSize = cacheBlockSize->valueint;
+ vnodeMsg.cfg.cacheBlockSize = (int32_t)cacheBlockSize->valueint;
cJSON *totalBlocks = cJSON_GetObjectItem(root, "totalBlocks");
if (!totalBlocks || totalBlocks->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, totalBlocks not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.totalBlocks = totalBlocks->valueint;
+ vnodeMsg.cfg.totalBlocks = (int32_t)totalBlocks->valueint;
cJSON *daysPerFile = cJSON_GetObjectItem(root, "daysPerFile");
if (!daysPerFile || daysPerFile->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, daysPerFile not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.daysPerFile = daysPerFile->valueint;
+ vnodeMsg.cfg.daysPerFile = (int32_t)daysPerFile->valueint;
cJSON *daysToKeep = cJSON_GetObjectItem(root, "daysToKeep");
if (!daysToKeep || daysToKeep->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, daysToKeep not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.daysToKeep = daysToKeep->valueint;
+ vnodeMsg.cfg.daysToKeep = (int32_t)daysToKeep->valueint;
cJSON *daysToKeep1 = cJSON_GetObjectItem(root, "daysToKeep1");
if (!daysToKeep1 || daysToKeep1->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, daysToKeep1 not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.daysToKeep1 = daysToKeep1->valueint;
+ vnodeMsg.cfg.daysToKeep1 = (int32_t)daysToKeep1->valueint;
cJSON *daysToKeep2 = cJSON_GetObjectItem(root, "daysToKeep2");
if (!daysToKeep2 || daysToKeep2->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, daysToKeep2 not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.daysToKeep2 = daysToKeep2->valueint;
+ vnodeMsg.cfg.daysToKeep2 = (int32_t)daysToKeep2->valueint;
cJSON *minRowsPerFileBlock = cJSON_GetObjectItem(root, "minRowsPerFileBlock");
if (!minRowsPerFileBlock || minRowsPerFileBlock->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, minRowsPerFileBlock not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.minRowsPerFileBlock = minRowsPerFileBlock->valueint;
+ vnodeMsg.cfg.minRowsPerFileBlock = (int32_t)minRowsPerFileBlock->valueint;
cJSON *maxRowsPerFileBlock = cJSON_GetObjectItem(root, "maxRowsPerFileBlock");
if (!maxRowsPerFileBlock || maxRowsPerFileBlock->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, maxRowsPerFileBlock not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.maxRowsPerFileBlock = maxRowsPerFileBlock->valueint;
+ vnodeMsg.cfg.maxRowsPerFileBlock = (int32_t)maxRowsPerFileBlock->valueint;
cJSON *precision = cJSON_GetObjectItem(root, "precision");
if (!precision || precision->type != cJSON_Number) {
@@ -195,7 +195,7 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
vError("vgId:%d, failed to read %s, fsyncPeriod not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- vnodeMsg.cfg.fsyncPeriod = fsyncPeriod->valueint;
+ vnodeMsg.cfg.fsyncPeriod = (int32_t)fsyncPeriod->valueint;
cJSON *wals = cJSON_GetObjectItem(root, "wals");
if (!wals || wals->type != cJSON_Number) {
@@ -258,7 +258,7 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
vError("vgId:%d, failed to read %s, nodeId not found", pVnode->vgId, file);
goto PARSE_VCFG_ERROR;
}
- node->nodeId = nodeId->valueint;
+ node->nodeId = (int32_t)nodeId->valueint;
cJSON *nodeEp = cJSON_GetObjectItem(nodeInfo, "nodeEp");
if (!nodeEp || nodeEp->type != cJSON_String || nodeEp->valuestring == NULL) {
diff --git a/src/vnode/src/vnodeVersion.c b/src/vnode/src/vnodeVersion.c
index fb3b3ebd9e..68fa32b2de 100644
--- a/src/vnode/src/vnodeVersion.c
+++ b/src/vnode/src/vnodeVersion.c
@@ -41,7 +41,7 @@ int32_t vnodeReadVersion(SVnodeObj *pVnode) {
goto PARSE_VER_ERROR;
}
- len = fread(content, 1, maxLen, fp);
+ len = (int32_t)fread(content, 1, maxLen, fp);
if (len <= 0) {
vError("vgId:%d, failed to read %s, content is null", pVnode->vgId, file);
goto PARSE_VER_ERROR;
diff --git a/src/vnode/src/vnodeWorker.c b/src/vnode/src/vnodeWorker.c
index d6053cf18e..6fb79d10fe 100644
--- a/src/vnode/src/vnodeWorker.c
+++ b/src/vnode/src/vnodeWorker.c
@@ -109,7 +109,7 @@ static void vnodeStopMWorker() {
void vnodeCleanupMWorker() {
for (int32_t i = 0; i < tsVMWorkerPool.maxNum; ++i) {
SVMWorker *pWorker = tsVMWorkerPool.worker + i;
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
taosQsetThreadResume(tsVMWorkerQset);
}
vDebug("vmworker:%d is closed", i);
@@ -118,7 +118,7 @@ void vnodeCleanupMWorker() {
for (int32_t i = 0; i < tsVMWorkerPool.maxNum; ++i) {
SVMWorker *pWorker = tsVMWorkerPool.worker + i;
vDebug("vmworker:%d start to join", i);
- if (pWorker->thread) {
+ if (taosCheckPthreadValid(pWorker->thread)) {
pthread_join(pWorker->thread, NULL);
}
vDebug("vmworker:%d join success", i);
diff --git a/src/vnode/src/vnodeWrite.c b/src/vnode/src/vnodeWrite.c
index b1df7bc19f..99b7e7b628 100644
--- a/src/vnode/src/vnodeWrite.c
+++ b/src/vnode/src/vnodeWrite.c
@@ -333,7 +333,7 @@ static int32_t vnodePerformFlowCtrl(SVWriteMsg *pWrite) {
if (pVnode->queuedWMsg < MAX_QUEUED_MSG_NUM && pVnode->flowctrlLevel <= 0) return 0;
if (tsEnableFlowCtrl == 0) {
- int32_t ms = pow(2, pVnode->flowctrlLevel + 2);
+ int32_t ms = (int32_t)pow(2, pVnode->flowctrlLevel + 2);
if (ms > 100) ms = 100;
vTrace("vgId:%d, msg:%p, app:%p, perform flowctrl for %d ms", pVnode->vgId, pWrite, pWrite->rpcMsg.ahandle, ms);
taosMsleep(ms);
diff --git a/src/wal/CMakeLists.txt b/src/wal/CMakeLists.txt
index d3cd86df50..6f35cb9ba7 100644
--- a/src/wal/CMakeLists.txt
+++ b/src/wal/CMakeLists.txt
@@ -4,14 +4,6 @@ PROJECT(TDengine)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
-IF (TD_LINUX)
- ADD_LIBRARY(twal ${SRC})
- TARGET_LINK_LIBRARIES(twal tutil common)
- ADD_SUBDIRECTORY(test)
-ENDIF ()
-
-IF (TD_DARWIN)
- ADD_LIBRARY(twal ${SRC})
- TARGET_LINK_LIBRARIES(twal tutil common)
- ADD_SUBDIRECTORY(test)
-ENDIF ()
+ADD_LIBRARY(twal ${SRC})
+TARGET_LINK_LIBRARIES(twal tutil common)
+ADD_SUBDIRECTORY(test)
diff --git a/src/wal/src/walMgmt.c b/src/wal/src/walMgmt.c
index 72ea239817..39ce2657aa 100644
--- a/src/wal/src/walMgmt.c
+++ b/src/wal/src/walMgmt.c
@@ -44,7 +44,7 @@ int32_t walInit() {
return code;
}
- wInfo("wal module is initialized, refId:%d", tsWal.refId);
+ wInfo("wal module is initialized, rsetId:%d", tsWal.refId);
return code;
}
@@ -203,14 +203,14 @@ static int32_t walCreateThread() {
}
pthread_attr_destroy(&thAttr);
- wDebug("wal thread is launched");
+ wDebug("wal thread is launched, thread:0x%08" PRIx64, taosGetPthreadId(tsWal.thread));
return TSDB_CODE_SUCCESS;
}
static void walStopThread() {
tsWal.stop = 1;
- if (tsWal.thread) {
+ if (taosCheckPthreadValid(tsWal.thread)) {
pthread_join(tsWal.thread, NULL);
}
diff --git a/src/wal/src/walWrite.c b/src/wal/src/walWrite.c
index e67127d6e4..0eda6ff786 100644
--- a/src/wal/src/walWrite.c
+++ b/src/wal/src/walWrite.c
@@ -272,7 +272,7 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch
SWalHead *pHead = buffer;
while (1) {
- int32_t ret = tfRead(tfd, pHead, sizeof(SWalHead));
+ int32_t ret = (int32_t)tfRead(tfd, pHead, sizeof(SWalHead));
if (ret == 0) break;
if (ret < 0) {
@@ -307,7 +307,7 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch
}
}
- ret = tfRead(tfd, pHead->cont, pHead->len);
+ ret = (int32_t)tfRead(tfd, pHead->cont, pHead->len);
if (ret < 0) {
wError("vgId:%d, file:%s, failed to read wal body since %s", pWal->vgId, name, strerror(errno));
code = TAOS_SYSTEM_ERROR(errno);
diff --git a/tests/pytest/insert/unsigenedTinyint.py b/tests/pytest/insert/unsigenedTinyint.py
new file mode 100644
index 0000000000..1c0634b69a
--- /dev/null
+++ b/tests/pytest/insert/unsigenedTinyint.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+import sys
+from util.log import *
+from util.cases import *
+from util.sql import *
+
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+
+ def run(self):
+ tdSql.prepare()
+
+ tdLog.info('=============== step1')
+ tdLog.info('create table tb (ts timestamp, speed tinyint unsigned)')
+ tdSql.execute('create table tb (ts timestamp, speed tinyint unsigned)')
+ tdLog.info("insert into tb values (now, NULL)")
+ tdSql.execute("insert into tb values (now, NULL)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(1)')
+ tdSql.checkRows(1)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step2')
+ tdLog.info("insert into tb values (now+1m, -1) -x step2")
+ tdSql.error("insert into tb values (now+1m, -1) ")
+ tdLog.info("insert into tb values (now+1m, NULL)")
+ tdSql.execute("insert into tb values (now+1m, NULL)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(2)')
+ tdSql.checkRows(2)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step3')
+ tdLog.info("insert into tb values (now+2m, 254)")
+ tdSql.execute("insert into tb values (now+2m, 254)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(3)')
+ tdSql.checkRows(3)
+ tdLog.info('tdSql.checkData(0, 1, 254)')
+ tdSql.checkData(0, 1, 254)
+ tdLog.info('=============== step4')
+ tdLog.info("insert into tb values (now+3m, 255) -x step4")
+ tdSql.error("insert into tb values (now+3m, 255)")
+ tdLog.info("insert into tb values (now+3m, NULL)")
+ tdSql.execute("insert into tb values (now+3m, NULL)")
+ tdLog.info('select * from tb')
+ tdSql.query('select * from tb')
+ tdLog.info('tdSql.checkRow(4)')
+ tdSql.checkRows(4)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step5')
+ tdLog.info("insert into tb values (now+4m, a2)")
+ tdSql.error("insert into tb values (now+4m, a2)")
+ tdLog.info("insert into tb values (now+4m, 0)")
+ tdSql.execute("insert into tb values (now+4m, 0)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(5)')
+ tdSql.checkRows(5)
+ tdLog.info('tdSql.checkData(0, 1, 0)')
+ tdSql.checkData(0, 1, 0)
+ tdLog.info('=============== step6')
+ tdLog.info("insert into tb values (now+5m, 2a)")
+ tdSql.error("insert into tb values (now+5m, 2a)")
+ tdLog.info("insert into tb values (now+5m, 2)")
+ tdSql.execute("insert into tb values (now+5m, 2)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(6)')
+ tdSql.checkRows(6)
+ tdLog.info('tdSql.checkData(0, 1, 2)')
+ tdSql.checkData(0, 1, 2)
+ tdLog.info('=============== step7')
+ tdLog.info("insert into tb values (now+6m, 2a'1)")
+ tdSql.error("insert into tb values (now+6m, 2a'1)")
+ tdLog.info("insert into tb values (now+6m, 2)")
+ tdSql.execute("insert into tb values (now+6m, 2)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(7)')
+ tdSql.checkRows(7)
+ tdLog.info('tdSql.checkData(0, 1, 2)')
+ tdSql.checkData(0, 1, 2)
+ tdLog.info('drop database db')
+ tdSql.execute('drop database db')
+ tdLog.info('show databases')
+ tdSql.query('show databases')
+ tdLog.info('tdSql.checkRow(0)')
+ tdSql.checkRows(0)
+# convert end
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/script/general/http/grafana.sim b/tests/script/general/http/grafana.sim
index 128994640d..ca2f62a368 100644
--- a/tests/script/general/http/grafana.sim
+++ b/tests/script/general/http/grafana.sim
@@ -84,7 +84,7 @@ endi
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/grafana/root/1/login
print 6-> $system_content
-if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
+if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
return -1
endi
diff --git a/tests/script/general/http/restful.sim b/tests/script/general/http/restful.sim
index a06e899d93..fdde975238 100644
--- a/tests/script/general/http/restful.sim
+++ b/tests/script/general/http/restful.sim
@@ -1,12 +1,10 @@
system sh/stop_dnodes.sh
-sleep 2000
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c wallevel -v 0
system sh/cfg.sh -n dnode1 -c http -v 1
system sh/cfg.sh -n dnode1 -c httpEnableRecordSql -v 1
system sh/exec.sh -n dnode1 -s start
-sleep 2000
sql connect
print ============================ dnode1 start
diff --git a/tests/script/general/http/restful_full.sim b/tests/script/general/http/restful_full.sim
index 69f8206347..12f8cc5c38 100644
--- a/tests/script/general/http/restful_full.sim
+++ b/tests/script/general/http/restful_full.sim
@@ -57,12 +57,18 @@ if $system_content != @{"status":"error","code":3,"desc":"Authentication failure
endi
#8
-system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
+system_content curl -H 'Authorization: Beare eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
print 8-> $system_content
if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
return -1
endi
+system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
+print 8-> $system_content
+if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
+ return -1
+endi
+
system_content curl -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
print 9-> $system_content
if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
diff --git a/tests/script/general/parser/interp_test.sim b/tests/script/general/parser/interp_test.sim
index 819e5741d3..2860180830 100644
--- a/tests/script/general/parser/interp_test.sim
+++ b/tests/script/general/parser/interp_test.sim
@@ -638,209 +638,293 @@ if $data24 != NULL then
return -1
endi
- ## interp(*) from stb + group by + fill(prev)
- $t = $ts0 + 1000
- sql select interp(*) from $stb where ts = $t fill(prev) group by tbname
- print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
- print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
- if $rows != $tbNum then
- return -1
- endi
- if $data00 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data01 != 0 then
- return -1
- endi
- if $data02 != 0 then
- return -1
- endi
- if $data03 != 0.00000 then
- return -1
- endi
- if $data04 != 0.000000000 then
- return -1
- endi
- if $data05 != 0 then
- return -1
- endi
- if $data06 != 0 then
- return -1
- endi
- if $data07 != 1 then
- return -1
- endi
- if $data08 != binary0 then
- return -1
- endi
- if $data09 != nchar0 then
- return -1
- endi
- if $data20 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data21 != 0 then
- return -1
- endi
- if $data22 != NULL then
- return -1
- endi
- if $data23 != 0.00000 then
- return -1
- endi
- if $data24 != NULL then
- return -1
- endi
- if $data25 != 0 then
- return -1
- endi
- if $data26 != 0 then
- return -1
- endi
- if $data27 != 1 then
- return -1
- endi
- if $data28 != binary0 then
- return -1
- endi
- if $data29 != nchar0 then
- return -1
- endi
+## interp(*) from stb + group by + fill(prev)
+$t = $ts0 + 1000
+sql select interp(*) from $stb where ts = $t fill(prev) group by tbname
+print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
+print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
+if $rows != $tbNum then
+ return -1
+endi
+if $data00 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data01 != 0 then
+ return -1
+endi
+if $data02 != 0 then
+ return -1
+endi
+if $data03 != 0.00000 then
+ return -1
+endi
+if $data04 != 0.000000000 then
+ return -1
+endi
+if $data05 != 0 then
+ return -1
+endi
+if $data06 != 0 then
+ return -1
+endi
+if $data07 != 1 then
+ return -1
+endi
+if $data08 != binary0 then
+ return -1
+endi
+if $data09 != nchar0 then
+ return -1
+endi
+if $data20 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data21 != 0 then
+ return -1
+endi
+if $data22 != NULL then
+ return -1
+endi
+if $data23 != 0.00000 then
+ return -1
+endi
+if $data24 != NULL then
+ return -1
+endi
+if $data25 != 0 then
+ return -1
+endi
+if $data26 != 0 then
+ return -1
+endi
+if $data27 != 1 then
+ return -1
+endi
+if $data28 != binary0 then
+ return -1
+endi
+if $data29 != nchar0 then
+ return -1
+endi
- ## interp(*) from stb + group by + fill(linear)
- $t = $ts0 + 1000
- sql select interp(*) from $stb where ts = $t fill(linear) group by tbname
- print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
- print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
- if $rows != $tbNum then
- return -1
- endi
- if $data00 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data01 != 0 then
- return -1
- endi
- if $data02 != 0 then
- return -1
- endi
- if $data03 != 0.00167 then
- return -1
- endi
- if $data04 != 0.001666667 then
- return -1
- endi
- if $data05 != 0 then
- return -1
- endi
- if $data06 != 0 then
- return -1
- endi
- if $data07 != NULL then
- return -1
- endi
- if $data08 != NULL then
- return -1
- endi
- if $data09 != NULL then
- return -1
- endi
- if $data20 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data21 != 0 then
- return -1
- endi
- if $data22 != NULL then
- return -1
- endi
- if $data23 != 0.00167 then
- return -1
- endi
- if $data24 != NULL then
- return -1
- endi
- if $data25 != 0 then
- return -1
- endi
- if $data26 != 0 then
- return -1
- endi
- if $data27 != NULL then
- return -1
- endi
- if $data28 != NULL then
- return -1
- endi
- if $data29 != NULL then
- return -1
- endi
+## interp(*) from stb + group by + fill(linear)
+$t = $ts0 + 1000
+sql select interp(*) from $stb where ts = $t fill(linear) group by tbname
+print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
+print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
+if $rows != $tbNum then
+ return -1
+endi
+if $data00 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data01 != 0 then
+ return -1
+endi
+if $data02 != 0 then
+ return -1
+endi
+if $data03 != 0.00167 then
+ return -1
+endi
+if $data04 != 0.001666667 then
+ return -1
+endi
+if $data05 != 0 then
+ return -1
+endi
+if $data06 != 0 then
+ return -1
+endi
+if $data07 != NULL then
+ return -1
+endi
+if $data08 != NULL then
+ return -1
+endi
+if $data09 != NULL then
+ return -1
+endi
+if $data20 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data21 != 0 then
+ return -1
+endi
+if $data22 != NULL then
+ return -1
+endi
+if $data23 != 0.00167 then
+ return -1
+endi
+if $data24 != NULL then
+ return -1
+endi
+if $data25 != 0 then
+ return -1
+endi
+if $data26 != 0 then
+ return -1
+endi
+if $data27 != NULL then
+ return -1
+endi
+if $data28 != NULL then
+ return -1
+endi
+if $data29 != NULL then
+ return -1
+endi
- ## interp(*) from stb + group by + fill(value)
- $t = $ts0 + 1000
- sql select interp(*) from $stb where ts = $t fill(value, -1, -2) group by tbname
- print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
- print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
- if $rows != $tbNum then
- return -1
- endi
- if $data00 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data01 != -2 then
- return -1
- endi
- if $data02 != -2 then
- return -1
- endi
- if $data03 != -2.00000 then
- return -1
- endi
- if $data04 != -2.000000000 then
- return -1
- endi
- if $data05 != -2 then
- return -1
- endi
- if $data06 != -2 then
- return -1
- endi
- if $data07 != 1 then
- return -1
- endi
- if $data08 != NULL then
- return -1
- endi
- if $data09 != NULL then
- return -1
- endi
- if $data20 != @18-09-17 09:00:01.000@ then
- return -1
- endi
- if $data21 != -2 then
- return -1
- endi
- if $data22 != -2 then
- return -1
- endi
- if $data23 != -2.00000 then
- return -1
- endi
- if $data24 != -2.000000000 then
- return -1
- endi
- if $data25 != -2 then
- return -1
- endi
- if $data26 != -2 then
- return -1
- endi
- if $data27 != 1 then
- return -1
- endi
- if $data28 != NULL then
- return -1
- endi
- if $data29 != NULL then
- return -1
- endi
+ ## interp(*) from stb + group by + fill(value)
+$t = $ts0 + 1000
+sql select interp(*) from $stb where ts = $t fill(value, -1, -2) group by tbname
+print ====== 0:$data00, 1:$data01, 2:$data02, 3:$data03, 4:$data04, 5:$data05, 6:$data06, 7:$data07, 8:$data08, 9:$data09
+print ====== 0:$data20, 1:$data21, 2:$data22, 3:$data23, 4:$data24, 5:$data25, 6:$data26, 7:$data27, 8:$data28, 9:$data29
+if $rows != $tbNum then
+ return -1
+endi
+if $data00 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data01 != -2 then
+ return -1
+endi
+if $data02 != -2 then
+ return -1
+endi
+if $data03 != -2.00000 then
+ return -1
+endi
+if $data04 != -2.000000000 then
+ return -1
+endi
+if $data05 != -2 then
+ return -1
+endi
+if $data06 != -2 then
+ return -1
+endi
+if $data07 != 1 then
+ return -1
+endi
+if $data08 != NULL then
+ return -1
+endi
+if $data09 != NULL then
+ return -1
+endi
+if $data20 != @18-09-17 09:00:01.000@ then
+ return -1
+endi
+if $data21 != -2 then
+ return -1
+endi
+if $data22 != -2 then
+ return -1
+endi
+if $data23 != -2.00000 then
+ return -1
+endi
+if $data24 != -2.000000000 then
+ return -1
+endi
+if $data25 != -2 then
+ return -1
+endi
+if $data26 != -2 then
+ return -1
+endi
+if $data27 != 1 then
+ return -1
+endi
+if $data28 != NULL then
+ return -1
+endi
+if $data29 != NULL then
+ return -1
+endi
+
+sql_error select interp(ts,c1) from intp_tb0 where ts>'2018-11-25 19:19:00' and ts<'2018-11-25 19:19:12';
+sql select interp(ts,c1) from intp_tb0 where ts>'2018-11-25 19:19:00' and ts<'2018-11-25 19:19:12' interval(1s) fill(linear);
+if $rows != 0 then
+ return -1
+endi
+
+sql select interp(c1) from intp_tb0 where ts>'2018-11-25 18:09:00' and ts<'2018-11-25 19:20:12' interval(18m);
+if $rows != 1 then
+ return -1
+endi
+
+if $data00 != @18-11-25 18:30:00.000@ then
+ return -1
+endi
+
+if $data01 != 3 then
+ return -1
+endi
+
+sql select interp(c1,c3,c4,ts) from intp_tb0 where ts>'2018-11-25 18:09:00' and ts<'2018-11-25 19:20:12' interval(18m) fill(linear)
+if $rows != 5 then
+ return -1
+endi
+
+if $data00 != @18-11-25 17:54:00.000@ then
+ return -1
+endi
+
+if $data01 != 0 then
+ return -1
+endi
+
+if $data02 != 0.00000 then
+ return -1
+endi
+
+if $data03 != 0.000000000 then
+ return -1
+endi
+
+if $data04 != @18-11-25 17:54:00.000@ then
+ return -1
+endi
+
+if $data10 != @18-11-25 18:12:00.000@ then
+ return -1
+endi
+
+if $data11 != 1 then
+ return -1
+endi
+
+if $data12 != 1.20000 then
+ return -1
+endi
+
+if $data13 != 1.200000000 then
+ return -1
+endi
+
+if $data14 != @18-11-25 18:12:00.000@ then
+ return -1
+endi
+
+if $data40 != @18-11-25 19:06:00.000@ then
+ return -1
+endi
+
+if $data41 != 6 then
+ return -1
+endi
+
+if $data42 != 6.60000 then
+ return -1
+endi
+
+if $data43 != 6.600000000 then
+ return -1
+endi
+
+if $data44 != @18-11-25 19:06:00.000@ then
+ return -1
+endi
\ No newline at end of file
diff --git a/tests/script/general/parser/select_distinct_tag.sim b/tests/script/general/parser/select_distinct_tag.sim
new file mode 100644
index 0000000000..7ea9dc444f
--- /dev/null
+++ b/tests/script/general/parser/select_distinct_tag.sim
@@ -0,0 +1,61 @@
+system sh/stop_dnodes.sh
+
+system sh/deploy.sh -n dnode1 -i 1
+system sh/cfg.sh -n dnode1 -c walLevel -v 0
+system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 5
+system sh/exec.sh -n dnode1 -s start
+sleep 100
+sql connect
+
+$dbPrefix = sav_db
+$tbPrefix = sav_tb
+$stbPrefix = sav_stb
+$tbNum = 20
+$rowNum = 10
+$totalNum = $tbNum * $rowNum
+$ts0 = 1537146000000
+$delta = 600000
+print ========== alter.sim
+$i = 0
+$db = $dbPrefix
+$stb = $stbPrefix
+
+sql drop database if exists $db
+sql create database $db
+sql use $db
+print ====== create tables
+sql create table $stb (ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 smallint, c6 tinyint, c7 bool, c8 binary(10), c9 nchar(10)) tags(t1 int, t2 int)
+
+$i = 0
+$ts = $ts0
+while $i < $tbNum
+ $tb = $tbPrefix . $i
+ sql create table $tb using $stb tags( $i , 0 )
+ $i = $i + 1
+endw
+
+print ====== table created
+
+#### select distinct tag
+sql select distinct t1 from $stb
+if $rows != $tbNum then
+ return -1
+endi
+
+#### select distinct tag
+sql select distinct t2 from $stb
+if $rows != 1 then
+ print $rows
+ return -1
+endi
+
+#### unsupport sql
+sql_error select distinct t1, t2 from &stb
+
+sql drop database $db
+sql show databases
+if $rows != 0 then
+ return -1
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
diff --git a/tests/script/general/parser/stableOp.sim b/tests/script/general/parser/stableOp.sim
index 133de95b9c..f4b1bd4b8a 100644
--- a/tests/script/general/parser/stableOp.sim
+++ b/tests/script/general/parser/stableOp.sim
@@ -1,6 +1,5 @@
system sh/stop_dnodes.sh
-
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c walLevel -v 0
system sh/exec.sh -n dnode1 -s start
@@ -78,7 +77,6 @@ if $rows != 0 then
return -1
endi
-
sql DROP STABLE $stb
sql show stables
diff --git a/tests/script/general/parser/testSuite.sim b/tests/script/general/parser/testSuite.sim
index 90cccb80e5..1868ff9683 100644
--- a/tests/script/general/parser/testSuite.sim
+++ b/tests/script/general/parser/testSuite.sim
@@ -105,3 +105,5 @@ sleep 100
run general/parser/sliding.sim
sleep 100
run general/parser/function.sim
+sleep 100
+run general/parse/stableOp.sim
diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt
index 90d01b7215..b5f608f3d3 100644
--- a/tests/script/jenkins/basic.txt
+++ b/tests/script/jenkins/basic.txt
@@ -159,6 +159,7 @@ cd ../../../debug; make
./test.sh -f general/parser/union.sim
./test.sh -f general/parser/topbot.sim
./test.sh -f general/parser/function.sim
+./test.sh -f general/parser/select_distinct_tag.sim
./test.sh -f general/stable/disk.sim
./test.sh -f general/stable/dnode3.sim
diff --git a/tests/script/jenkins/wbasic.txt b/tests/script/jenkins/wbasic.txt
new file mode 100644
index 0000000000..984b15fc5a
--- /dev/null
+++ b/tests/script/jenkins/wbasic.txt
@@ -0,0 +1,393 @@
+wtest.bat -f issue/TD-2677.sim
+wtest.bat -f issue/TD-2680.sim
+wtest.bat -f issue/TD-2713.sim
+
+wtest.bat -f general/alter/cached_schema_after_alter.sim
+wtest.bat -f general/alter/count.sim
+wtest.bat -f general/alter/dnode.sim
+wtest.bat -f general/alter/import.sim
+wtest.bat -f general/alter/insert1.sim
+wtest.bat -f general/alter/insert2.sim
+wtest.bat -f general/alter/metrics.sim
+wtest.bat -f general/alter/table.sim
+
+wtest.bat -f general/cache/new_metrics.sim
+wtest.bat -f general/cache/restart_metrics.sim
+wtest.bat -f general/cache/restart_table.sim
+
+wtest.bat -f general/connection/connection.sim
+
+wtest.bat -f general/column/commit.sim
+wtest.bat -f general/column/metrics.sim
+wtest.bat -f general/column/table.sim
+
+wtest.bat -f general/compress/commitlog.sim
+wtest.bat -f general/compress/compress.sim
+wtest.bat -f general/compress/compress2.sim
+wtest.bat -f general/compress/uncompress.sim
+
+wtest.bat -f general/compute/avg.sim
+wtest.bat -f general/compute/bottom.sim
+wtest.bat -f general/compute/count.sim
+wtest.bat -f general/compute/diff.sim
+wtest.bat -f general/compute/diff2.sim
+wtest.bat -f general/compute/first.sim
+wtest.bat -f general/compute/interval.sim
+wtest.bat -f general/compute/last.sim
+wtest.bat -f general/compute/leastsquare.sim
+wtest.bat -f general/compute/max.sim
+wtest.bat -f general/compute/min.sim
+wtest.bat -f general/compute/null.sim
+wtest.bat -f general/compute/percentile.sim
+wtest.bat -f general/compute/stddev.sim
+wtest.bat -f general/compute/sum.sim
+wtest.bat -f general/compute/top.sim
+
+wtest.bat -f general/db/alter_option.sim
+wtest.bat -f general/db/alter_tables_d2.sim
+wtest.bat -f general/db/alter_tables_v1.sim
+wtest.bat -f general/db/alter_tables_v4.sim
+wtest.bat -f general/db/alter_vgroups.sim
+wtest.bat -f general/db/basic.sim
+wtest.bat -f general/db/basic1.sim
+wtest.bat -f general/db/basic2.sim
+wtest.bat -f general/db/basic3.sim
+wtest.bat -f general/db/basic4.sim
+wtest.bat -f general/db/basic5.sim
+wtest.bat -f general/db/delete_reuse1.sim
+wtest.bat -f general/db/delete_reuse2.sim
+wtest.bat -f general/db/delete_reusevnode.sim
+wtest.bat -f general/db/delete_reusevnode2.sim
+wtest.bat -f general/db/delete_writing1.sim
+wtest.bat -f general/db/delete_writing2.sim
+wtest.bat -f general/db/delete.sim
+wtest.bat -f general/db/len.sim
+wtest.bat -f general/db/repeat.sim
+wtest.bat -f general/db/tables.sim
+wtest.bat -f general/db/vnodes.sim
+wtest.bat -f general/db/nosuchfile.sim
+
+wtest.bat -f general/field/2.sim
+wtest.bat -f general/field/3.sim
+wtest.bat -f general/field/4.sim
+wtest.bat -f general/field/5.sim
+wtest.bat -f general/field/6.sim
+wtest.bat -f general/field/bigint.sim
+wtest.bat -f general/field/binary.sim
+wtest.bat -f general/field/bool.sim
+wtest.bat -f general/field/single.sim
+wtest.bat -f general/field/smallint.sim
+wtest.bat -f general/field/tinyint.sim
+
+wtest.bat -f general/http/autocreate.sim
+wtest.bat -f general/http/chunked.sim
+wtest.bat -f general/http/gzip.sim
+wtest.bat -f general/http/restful.sim
+wtest.bat -f general/http/restful_insert.sim
+wtest.bat -f general/http/restful_limit.sim
+wtest.bat -f general/http/restful_full.sim
+wtest.bat -f general/http/prepare.sim
+wtest.bat -f general/http/telegraf.sim
+wtest.bat -f general/http/grafana_bug.sim
+wtest.bat -f general/http/grafana.sim
+
+wtest.bat -f general/import/basic.sim
+wtest.bat -f general/import/commit.sim
+wtest.bat -f general/import/large.sim
+wtest.bat -f general/import/replica1.sim
+
+wtest.bat -f general/insert/basic.sim
+wtest.bat -f general/insert/insert_drop.sim
+wtest.bat -f general/insert/query_block1_memory.sim
+wtest.bat -f general/insert/query_block2_memory.sim
+wtest.bat -f general/insert/query_block1_file.sim
+wtest.bat -f general/insert/query_block2_file.sim
+wtest.bat -f general/insert/query_file_memory.sim
+wtest.bat -f general/insert/query_multi_file.sim
+wtest.bat -f general/insert/tcp.sim
+
+wtest.bat -f general/parser/alter.sim
+wtest.bat -f general/parser/alter1.sim
+wtest.bat -f general/parser/alter_stable.sim
+wtest.bat -f general/parser/auto_create_tb.sim
+wtest.bat -f general/parser/auto_create_tb_drop_tb.sim
+wtest.bat -f general/parser/col_arithmetic_operation.sim
+wtest.bat -f general/parser/columnValue.sim
+wtest.bat -f general/parser/commit.sim
+wtest.bat -f general/parser/create_db.sim
+wtest.bat -f general/parser/create_mt.sim
+wtest.bat -f general/parser/create_tb.sim
+wtest.bat -f general/parser/dbtbnameValidate.sim
+wtest.bat -f general/parser/import_commit1.sim
+wtest.bat -f general/parser/import_commit2.sim
+wtest.bat -f general/parser/import_commit3.sim
+wtest.bat -f general/parser/insert_tb.sim
+wtest.bat -f general/parser/first_last.sim
+wtest.bat -f general/parser/lastrow.sim
+wtest.bat -f general/parser/nchar.sim
+wtest.bat -f general/parser/null_char.sim
+wtest.bat -f general/parser/single_row_in_tb.sim
+wtest.bat -f general/parser/select_from_cache_disk.sim
+wtest.bat -f general/parser/mixed_blocks.sim
+wtest.bat -f general/parser/selectResNum.sim
+wtest.bat -f general/parser/limit.sim
+wtest.bat -f general/parser/limit1.sim
+wtest.bat -f general/parser/limit1_tblocks100.sim
+wtest.bat -f general/parser/select_across_vnodes.sim
+wtest.bat -f general/parser/slimit1.sim
+wtest.bat -f general/parser/tbnameIn.sim
+wtest.bat -f general/parser/projection_limit_offset.sim
+wtest.bat -f general/parser/limit2.sim
+wtest.bat -f general/parser/fill.sim
+wtest.bat -f general/parser/fill_stb.sim
+wtest.bat -f general/parser/where.sim
+wtest.bat -f general/parser/slimit.sim
+wtest.bat -f general/parser/select_with_tags.sim
+wtest.bat -f general/parser/interp.sim
+wtest.bat -f general/parser/tags_dynamically_specifiy.sim
+wtest.bat -f general/parser/groupby.sim
+wtest.bat -f general/parser/set_tag_vals.sim
+wtest.bat -f general/parser/tags_filter.sim
+wtest.bat -f general/parser/slimit_alter_tags.sim
+wtest.bat -f general/parser/join.sim
+wtest.bat -f general/parser/join_multivnode.sim
+wtest.bat -f general/parser/binary_escapeCharacter.sim
+wtest.bat -f general/parser/repeatAlter.sim
+wtest.bat -f general/parser/union.sim
+wtest.bat -f general/parser/topbot.sim
+wtest.bat -f general/parser/function.sim
+
+wtest.bat -f general/stable/disk.sim
+wtest.bat -f general/stable/dnode3.sim
+wtest.bat -f general/stable/metrics.sim
+wtest.bat -f general/stable/refcount.sim
+wtest.bat -f general/stable/show.sim
+wtest.bat -f general/stable/values.sim
+wtest.bat -f general/stable/vnode3.sim
+
+wtest.bat -f general/table/autocreate.sim
+wtest.bat -f general/table/basic1.sim
+wtest.bat -f general/table/basic2.sim
+wtest.bat -f general/table/basic3.sim
+wtest.bat -f general/table/bigint.sim
+wtest.bat -f general/table/binary.sim
+wtest.bat -f general/table/bool.sim
+wtest.bat -f general/table/column_name.sim
+wtest.bat -f general/table/column_num.sim
+wtest.bat -f general/table/column_value.sim
+wtest.bat -f general/table/column2.sim
+wtest.bat -f general/table/date.sim
+wtest.bat -f general/table/db.table.sim
+wtest.bat -f general/table/delete_reuse1.sim
+wtest.bat -f general/table/delete_reuse2.sim
+wtest.bat -f general/table/delete_writing.sim
+wtest.bat -f general/table/describe.sim
+wtest.bat -f general/table/double.sim
+wtest.bat -f general/table/fill.sim
+wtest.bat -f general/table/float.sim
+wtest.bat -f general/table/int.sim
+wtest.bat -f general/table/limit.sim
+wtest.bat -f general/table/smallint.sim
+wtest.bat -f general/table/table_len.sim
+wtest.bat -f general/table/table.sim
+wtest.bat -f general/table/tinyint.sim
+wtest.bat -f general/table/vgroup.sim
+
+wtest.bat -f general/tag/3.sim
+wtest.bat -f general/tag/4.sim
+wtest.bat -f general/tag/5.sim
+wtest.bat -f general/tag/6.sim
+wtest.bat -f general/tag/add.sim
+wtest.bat -f general/tag/bigint.sim
+wtest.bat -f general/tag/binary_binary.sim
+wtest.bat -f general/tag/binary.sim
+wtest.bat -f general/tag/bool_binary.sim
+wtest.bat -f general/tag/bool_int.sim
+wtest.bat -f general/tag/bool.sim
+wtest.bat -f general/tag/change.sim
+wtest.bat -f general/tag/column.sim
+wtest.bat -f general/tag/commit.sim
+wtest.bat -f general/tag/create.sim
+wtest.bat -f general/tag/delete.sim
+wtest.bat -f general/tag/double.sim
+wtest.bat -f general/tag/filter.sim
+wtest.bat -f general/tag/float.sim
+wtest.bat -f general/tag/int_binary.sim
+wtest.bat -f general/tag/int_float.sim
+wtest.bat -f general/tag/int.sim
+wtest.bat -f general/tag/set.sim
+wtest.bat -f general/tag/smallint.sim
+wtest.bat -f general/tag/tinyint.sim
+
+wtest.bat -f general/user/authority.sim
+wtest.bat -f general/user/monitor.sim
+wtest.bat -f general/user/pass_alter.sim
+wtest.bat -f general/user/pass_len.sim
+wtest.bat -f general/user/user_create.sim
+wtest.bat -f general/user/user_len.sim
+
+wtest.bat -f general/vector/metrics_field.sim
+wtest.bat -f general/vector/metrics_mix.sim
+wtest.bat -f general/vector/metrics_query.sim
+wtest.bat -f general/vector/metrics_tag.sim
+wtest.bat -f general/vector/metrics_time.sim
+wtest.bat -f general/vector/multi.sim
+wtest.bat -f general/vector/single.sim
+wtest.bat -f general/vector/table_field.sim
+wtest.bat -f general/vector/table_mix.sim
+wtest.bat -f general/vector/table_query.sim
+wtest.bat -f general/vector/table_time.sim
+
+wtest.bat -f general/wal/sync.sim
+wtest.bat -f general/wal/kill.sim
+wtest.bat -f general/wal/maxtables.sim
+
+wtest.bat -f unique/account/account_create.sim
+wtest.bat -f unique/account/account_delete.sim
+wtest.bat -f unique/account/account_len.sim
+wtest.bat -f unique/account/authority.sim
+wtest.bat -f unique/account/basic.sim
+wtest.bat -f unique/account/paras.sim
+wtest.bat -f unique/account/pass_alter.sim
+wtest.bat -f unique/account/pass_len.sim
+wtest.bat -f unique/account/usage.sim
+wtest.bat -f unique/account/user_create.sim
+wtest.bat -f unique/account/user_len.sim
+
+wtest.bat -f unique/big/balance.sim
+wtest.bat -f unique/big/maxvnodes.sim
+wtest.bat -f unique/big/tcp.sim
+
+wtest.bat -f unique/cluster/alter.sim
+wtest.bat -f unique/cluster/balance1.sim
+wtest.bat -f unique/cluster/balance2.sim
+wtest.bat -f unique/cluster/balance3.sim
+wtest.bat -f unique/cluster/cache.sim
+wtest.bat -f unique/cluster/vgroup100.sim
+
+wtest.bat -f unique/column/replica3.sim
+
+wtest.bat -f unique/db/commit.sim
+wtest.bat -f unique/db/delete.sim
+wtest.bat -f unique/db/delete_part.sim
+wtest.bat -f unique/db/replica_add12.sim
+wtest.bat -f unique/db/replica_add13.sim
+wtest.bat -f unique/db/replica_add23.sim
+wtest.bat -f unique/db/replica_reduce21.sim
+wtest.bat -f unique/db/replica_reduce32.sim
+wtest.bat -f unique/db/replica_reduce31.sim
+wtest.bat -f unique/db/replica_part.sim
+
+wtest.bat -f unique/dnode/alternativeRole.sim
+wtest.bat -f unique/dnode/monitor.sim
+wtest.bat -f unique/dnode/monitor_bug.sim
+wtest.bat -f unique/dnode/simple.sim
+wtest.bat -f unique/dnode/balance1.sim
+wtest.bat -f unique/dnode/balance2.sim
+wtest.bat -f unique/dnode/balance3.sim
+wtest.bat -f unique/dnode/balancex.sim
+wtest.bat -f unique/dnode/data1.sim
+wtest.bat -f unique/dnode/m2.sim
+wtest.bat -f unique/dnode/m3.sim
+wtest.bat -f unique/dnode/lossdata.sim
+wtest.bat -f unique/dnode/offline1.sim
+wtest.bat -f unique/dnode/offline2.sim
+wtest.bat -f unique/dnode/offline3.sim
+wtest.bat -f unique/dnode/reason.sim
+wtest.bat -f unique/dnode/remove1.sim
+wtest.bat -f unique/dnode/remove2.sim
+wtest.bat -f unique/dnode/vnode_clean.sim
+
+wtest.bat -f unique/http/admin.sim
+wtest.bat -f unique/http/opentsdb.sim
+
+wtest.bat -f unique/import/replica2.sim
+wtest.bat -f unique/import/replica3.sim
+
+wtest.bat -f unique/stable/balance_replica1.sim
+wtest.bat -f unique/stable/dnode2_stop.sim
+wtest.bat -f unique/stable/dnode2.sim
+wtest.bat -f unique/stable/dnode3.sim
+wtest.bat -f unique/stable/replica2_dnode4.sim
+wtest.bat -f unique/stable/replica2_vnode3.sim
+wtest.bat -f unique/stable/replica3_dnode6.sim
+wtest.bat -f unique/stable/replica3_vnode3.sim
+
+wtest.bat -f unique/mnode/mgmt20.sim
+wtest.bat -f unique/mnode/mgmt21.sim
+wtest.bat -f unique/mnode/mgmt22.sim
+wtest.bat -f unique/mnode/mgmt23.sim
+wtest.bat -f unique/mnode/mgmt24.sim
+wtest.bat -f unique/mnode/mgmt25.sim
+wtest.bat -f unique/mnode/mgmt26.sim
+wtest.bat -f unique/mnode/mgmt30.sim
+wtest.bat -f unique/mnode/mgmt33.sim
+wtest.bat -f unique/mnode/mgmt34.sim
+wtest.bat -f unique/mnode/mgmtr2.sim
+
+wtest.bat -f unique/vnode/many.sim
+wtest.bat -f unique/vnode/replica2_basic2.sim
+wtest.bat -f unique/vnode/replica2_repeat.sim
+wtest.bat -f unique/vnode/replica3_basic.sim
+wtest.bat -f unique/vnode/replica3_repeat.sim
+wtest.bat -f unique/vnode/replica3_vgroup.sim
+
+wtest.bat -f general/stream/metrics_del.sim
+wtest.bat -f general/stream/metrics_replica1_vnoden.sim
+wtest.bat -f general/stream/restart_stream.sim
+wtest.bat -f general/stream/stream_3.sim
+wtest.bat -f general/stream/stream_restart.sim
+wtest.bat -f general/stream/table_del.sim
+wtest.bat -f general/stream/table_replica1_vnoden.sim
+
+wtest.bat -f unique/arbitrator/check_cluster_cfg_para.sim
+#wtest.bat -f unique/arbitrator/dn2_mn1_cache_file_sync.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_full_createTableFail.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_multiCreateDropTable.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_nw_disable_timeout_autoDropDnode.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_replica2_wal1_AddDelDnode.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_replica_change_dropDnod.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_replica_change.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_stopDnode_timeout.sim
+# lower the priority while file corruption
+#wtest.bat -f unique/arbitrator/dn3_mn1_vnode_change.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_vnode_corruptFile_offline.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_vnode_corruptFile_online.sim
+#wtest.bat -f unique/arbitrator/dn3_mn1_vnode_createErrData_online.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_vnode_noCorruptFile_offline.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_vnode_delDir.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_r2_vnode_delDir.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_r3_vnode_delDir.sim
+wtest.bat -f unique/arbitrator/dn3_mn1_vnode_nomaster.sim
+wtest.bat -f unique/arbitrator/dn3_mn2_killDnode.sim
+wtest.bat -f unique/arbitrator/insert_duplicationTs.sim
+wtest.bat -f unique/arbitrator/offline_replica2_alterTable_online.sim
+wtest.bat -f unique/arbitrator/offline_replica2_alterTag_online.sim
+wtest.bat -f unique/arbitrator/offline_replica2_createTable_online.sim
+wtest.bat -f unique/arbitrator/offline_replica2_dropDb_online.sim
+wtest.bat -f unique/arbitrator/offline_replica2_dropTable_online.sim
+wtest.bat -f unique/arbitrator/offline_replica3_alterTable_online.sim
+wtest.bat -f unique/arbitrator/offline_replica3_alterTag_online.sim
+wtest.bat -f unique/arbitrator/offline_replica3_createTable_online.sim
+wtest.bat -f unique/arbitrator/offline_replica3_dropDb_online.sim
+wtest.bat -f unique/arbitrator/offline_replica3_dropTable_online.sim
+wtest.bat -f unique/arbitrator/replica_changeWithArbitrator.sim
+wtest.bat -f unique/arbitrator/sync_replica2_alterTable_add.sim
+wtest.bat -f unique/arbitrator/sync_replica2_alterTable_drop.sim
+
+wtest.bat -f unique/arbitrator/sync_replica2_dropDb.sim
+wtest.bat -f unique/arbitrator/sync_replica2_dropTable.sim
+wtest.bat -f unique/arbitrator/sync_replica3_alterTable_add.sim
+wtest.bat -f unique/arbitrator/sync_replica3_alterTable_drop.sim
+wtest.bat -f unique/arbitrator/sync_replica3_dropDb.sim
+wtest.bat -f unique/arbitrator/sync_replica3_dropTable.sim
+
+wtest.bat -f unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
+wtest.bat -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
+wtest.bat -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir_stopAll_starAll.sim
+wtest.bat -f unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
+
+wtest.bat -f general/connection/test_old_data.sim
+wtest.bat -f unique/dnode/datatrans_3node.sim
+wtest.bat -f unique/dnode/datatrans_3node_2.sim
+
diff --git a/tests/script/sh/cfg.bat b/tests/script/sh/cfg.bat
new file mode 100644
index 0000000000..49ab34383a
--- /dev/null
+++ b/tests/script/sh/cfg.bat
@@ -0,0 +1,42 @@
+@echo off
+
+if %1 == -n set NODE_NAME=%2
+if %1 == -c set CONFIG_NAME=%2
+if %1 == -v set CONFIG_VALUE=%2
+if %3 == -n set NODE_NAME=%4
+if %3 == -c set CONFIG_NAME=%4
+if %3 == -v set CONFIG_VALUE=%4
+if %5 == -n set NODE_NAME=%6
+if %5 == -c set CONFIG_NAME=%6
+if %5 == -v set CONFIG_VALUE=%6
+
+rem echo NODE_NAME: %NODE_NAME%
+rem echo NODE: %NODE%
+
+set SCRIPT_DIR=%~dp0..\
+rem echo SCRIPT_DIR: %SCRIPT_DIR%
+
+set BUILD_DIR=%SCRIPT_DIR%..\..\..\debug\build\bin\
+set TSIM=%BUILD_DIR%tsim
+rem echo BUILD_DIR: %BUILD_DIR%
+rem echo TSIM: %TSIM%
+
+set SIM_DIR=%SCRIPT_DIR%..\..\..\sim\
+rem echo SIM_DIR: %SIM_DIR%
+
+set NODE_DIR=%SIM_DIR%%NODE_NAME%\
+rem echo NODE_DIR: %NODE_DIR%
+
+set CFG_DIR=%NODE_DIR%cfg\
+rem echo CFG_DIR: %CFG_DIR%
+
+set LOG_DIR=%NODE_DIR%log\
+rem echo LOG_DIR: %LOG_DIR%
+
+set DATA_DIR=%NODE_DIR%data\
+rem echo DATA_DIR: %DATA_DIR%
+
+set TAOS_CFG=%CFG_DIR%taos.cfg
+rem echo TAOS_CFG: %TAOS_CFG%
+
+echo %CONFIG_NAME% %CONFIG_VALUE% >> %TAOS_CFG%
diff --git a/tests/script/sh/deploy.bat b/tests/script/sh/deploy.bat
new file mode 100644
index 0000000000..04c7b8a660
--- /dev/null
+++ b/tests/script/sh/deploy.bat
@@ -0,0 +1,106 @@
+@echo off
+
+rem echo Executing deploy.sh
+
+if %1 == -n set NODE_NAME=%2
+if %1 == -i set NODE=%2
+if %3 == -n set NODE_NAME=%4
+if %3 == -i set NODE=%4
+
+rem echo NODE_NAME: %NODE_NAME%
+rem echo NODE: %NODE%
+
+set SCRIPT_DIR=%~dp0..\
+rem echo SCRIPT_DIR: %SCRIPT_DIR%
+
+set BUILD_DIR=%SCRIPT_DIR%..\..\..\debug\build\bin\
+set TSIM=%BUILD_DIR%tsim
+rem echo BUILD_DIR: %BUILD_DIR%
+rem echo TSIM: %TSIM%
+
+set SIM_DIR=%SCRIPT_DIR%..\..\..\sim\
+rem echo SIM_DIR: %SIM_DIR%
+
+set NODE_DIR=%SIM_DIR%%NODE_NAME%\
+rem echo NODE_DIR: %NODE_DIR%
+
+set CFG_DIR=%NODE_DIR%cfg\
+rem echo CFG_DIR: %CFG_DIR%
+
+set LOG_DIR=%NODE_DIR%log\
+rem echo LOG_DIR: %LOG_DIR%
+
+set DATA_DIR=%NODE_DIR%data\
+rem echo DATA_DIR: %DATA_DIR%
+
+set TAOS_CFG=%CFG_DIR%taos.cfg
+rem echo TAOS_CFG: %TAOS_CFG%
+
+if not exist %SIM_DIR% mkdir %SIM_DIR%
+if not exist %NODE_DIR% mkdir %NODE_DIR%
+if exist %CFG_DIR% rmdir /s/q %CFG_DIR%
+if exist %LOG_DIR% rmdir /s/q %LOG_DIR%
+if exist %DATA_DIR% rmdir /s/q %DATA_DIR%
+if not exist %CFG_DIR% mkdir %CFG_DIR%
+if not exist %LOG_DIR% mkdir %LOG_DIR%
+if not exist %DATA_DIR% mkdir %DATA_DIR%
+
+if %NODE% == 1 set NODE=7100
+if %NODE% == 2 set NODE=7200
+if %NODE% == 3 set NODE=7300
+if %NODE% == 4 set NODE=7400
+if %NODE% == 5 set NODE=7500
+if %NODE% == 6 set NODE=7600
+if %NODE% == 7 set NODE=7700
+if %NODE% == 8 set NODE=7800
+
+rem set "fqdn="
+for /f "skip=1" %%A in (
+ 'wmic computersystem get caption'
+) do if not defined fqdn set "fqdn=%%A"
+
+echo firstEp %fqdn%:7100 > %TAOS_CFG%
+echo fqdn %fqdn% >> %TAOS_CFG%
+echo serverPort %NODE% >> %TAOS_CFG%
+echo dataDir %DATA_DIR% >> %TAOS_CFG%
+echo logDir %LOG_DIR% >> %TAOS_CFG%
+echo debugFlag 0 >> %TAOS_CFG%
+echo mDebugFlag 143 >> %TAOS_CFG%
+echo sdbDebugFlag 143 >> %TAOS_CFG%
+echo dDebugFlag 143 >> %TAOS_CFG%
+echo vDebugFlag 143 >> %TAOS_CFG%
+echo tsdbDebugFlag 143 >> %TAOS_CFG%
+echo cDebugFlag 143 >> %TAOS_CFG%
+echo jnidebugFlag 143 >> %TAOS_CFG%
+echo odbcdebugFlag 143 >> %TAOS_CFG%
+echo httpDebugFlag 143 >> %TAOS_CFG%
+echo monDebugFlag 143 >> %TAOS_CFG%
+echo mqttDebugFlag 143 >> %TAOS_CFG%
+echo qdebugFlag 143 >> %TAOS_CFG%
+echo rpcDebugFlag 143 >> %TAOS_CFG%
+echo tmrDebugFlag 131 >> %TAOS_CFG%
+echo udebugFlag 143 >> %TAOS_CFG%
+echo sdebugFlag 143 >> %TAOS_CFG%
+echo wdebugFlag 143 >> %TAOS_CFG%
+echo cqdebugFlag 143 >> %TAOS_CFG%
+echo monitor 0 >> %TAOS_CFG%
+echo monitorInterval 1 >> %TAOS_CFG%
+echo http 0 >> %TAOS_CFG%
+echo slaveQuery 0 >> %TAOS_CFG%
+echo numOfThreadsPerCore 2.0 >> %TAOS_CFG%
+echo defaultPass taosdata >> %TAOS_CFG%
+echo numOfLogLines 20000000 >> %TAOS_CFG%
+echo mnodeEqualVnodeNum 0 >> %TAOS_CFG%
+echo balanceInterval 1 >> %TAOS_CFG%
+echo clog 2 >> %TAOS_CFG%
+echo days 10 >> %TAOS_CFG%
+echo statusInterval 1 >> %TAOS_CFG%
+echo maxVgroupsPerDb 4 >> %TAOS_CFG%
+echo minTablesPerVnode 4 >> %TAOS_CFG%
+echo maxTablesPerVnode 1000 >> %TAOS_CFG%
+echo tableIncStepPerVnode 10000 >> %TAOS_CFG%
+echo asyncLog 0 >> %TAOS_CFG%
+echo numOfMnodes 1 >> %TAOS_CFG%
+echo locale en_US.UTF-8 >> %TAOS_CFG%
+echo fsync 0 >> %TAOS_CFG%
+echo telemetryReporting 0 >> %TAOS_CFG%
diff --git a/tests/script/sh/exec.bat b/tests/script/sh/exec.bat
new file mode 100644
index 0000000000..6651c7aa8f
--- /dev/null
+++ b/tests/script/sh/exec.bat
@@ -0,0 +1,48 @@
+@echo off
+
+rem echo Executing exec.sh
+
+if %1 == -n set NODE_NAME=%2
+if %1 == -s set EXEC_OPTON=%2
+if %3 == -n set NODE_NAME=%4
+if %3 == -s set EXEC_OPTON=%4
+
+rem echo NODE_NAME: %NODE_NAME%
+rem echo NODE: %EXEC_OPTON%
+
+set SCRIPT_DIR=%~dp0..\
+rem echo SCRIPT_DIR: %SCRIPT_DIR%
+
+set BUILD_DIR=%SCRIPT_DIR%..\..\..\debug\build\bin\
+set TAOSD=%BUILD_DIR%taosd
+rem echo BUILD_DIR: %BUILD_DIR%
+rem echo TAOSD: %TAOSD%
+
+set SIM_DIR=%SCRIPT_DIR%..\..\..\sim\
+rem echo SIM_DIR: %SIM_DIR%
+
+set NODE_DIR=%SIM_DIR%%NODE_NAME%\
+rem echo NODE_DIR: %NODE_DIR%
+
+set CFG_DIR=%NODE_DIR%cfg\
+rem echo CFG_DIR: %CFG_DIR%
+
+set TAOS_CFG=%CFG_DIR%taos.cfg
+rem echo TAOS_CFG: %TAOS_CFG%
+
+if %EXEC_OPTON% == start (
+ echo start %TAOSD% -c %CFG_DIR%
+ start %TAOSD% -c %CFG_DIR%
+)
+
+if %EXEC_OPTON% == stop (
+ rem echo wmic process where "name='taosd.exe' and CommandLine like '%%%NODE_NAME%%%'" list INSTANCE
+ rem wmic process where "name='taosd.exe' and CommandLine like '%%%NODE_NAME%%%'" call terminate > NUL 2>&1
+
+ for /f "tokens=1 skip=1" %%A in (
+ 'wmic process where "name='taosd.exe' and CommandLine like '%%%NODE_NAME%%%'" get processId '
+ ) do (
+ rem echo taskkill /IM %%A
+ taskkill /IM %%A > NUL 2>&1
+ )
+)
diff --git a/tests/script/sh/stop_dnodes.bat b/tests/script/sh/stop_dnodes.bat
new file mode 100644
index 0000000000..ab7af2ca92
--- /dev/null
+++ b/tests/script/sh/stop_dnodes.bat
@@ -0,0 +1,6 @@
+@echo off
+
+rem echo taskkill /F /IM taosd.exe
+
+wmic process where "name='taosd.exe'" call terminate > NUL 2>&1
+taskkill /F /IM taosd.exe > NUL 2>&1
\ No newline at end of file
diff --git a/tests/script/unique/http/admin.sim b/tests/script/unique/http/admin.sim
index acc28a4e13..1d67a7f86b 100644
--- a/tests/script/unique/http/admin.sim
+++ b/tests/script/unique/http/admin.sim
@@ -69,13 +69,13 @@ endi
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.' -d 'show databases' 127.0.0.1:7111/admin/login/root/1
print 7-> $system_content
-if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
+if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
return -1
endi
system_content curl -H 'Authorization: Taosd eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' 127.0.0.1:7111/admin/login/root/1
print 8-> $system_content
-if $system_content != @{"status":"error","code":4389,"desc":"invalid taosd Authorization"}@ then
+if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
return -1
endi
diff --git a/tests/script/wtest.bat b/tests/script/wtest.bat
index 6cdd63b42d..0b5cdda527 100644
--- a/tests/script/wtest.bat
+++ b/tests/script/wtest.bat
@@ -1,29 +1,30 @@
@echo off
echo TDengine in windows
-echo Start TDengine Testing Case ...
+rem echo Start TDengine Testing Case ...
set "SCRIPT_DIR=%~dp0"
-echo SCRIPT_DIR: %SCRIPT_DIR%
+rem echo SCRIPT_DIR: %SCRIPT_DIR%
-set "BUILD_DIR=%~dp0..\..\debug\32\build\bin"
-set "TSIM=%~dp0..\..\debug\32\build\bin\tsim"
-echo BUILD_DIR: %BUILD_DIR%
+set "BUILD_DIR=%SCRIPT_DIR%..\..\..\debug\build\bin\"
+set "TSIM=%BUILD_DIR%tsim"
+rem echo BUILD_DIR: %BUILD_DIR%
+rem echo TSIM: %TSIM%
-set "SIM_DIR=%~dp0..\..\sim"
-echo SIM_DIR: %SIM_DIR%
+set "SIM_DIR=%SCRIPT_DIR%..\..\..\sim\"
+rem echo SIM_DIR: %SIM_DIR%
-set "TSIM_DIR=%~dp0..\..\sim\tsim"
-echo TSIM_DIR: %TSIM_DIR%
+set "TSIM_DIR=%SIM_DIR%tsim\"
+rem echo TSIM_DIR: %TSIM_DIR%
-set "CFG_DIR=%~dp0..\..\sim\tsim\cfg"
-echo CFG_DIR: %CFG_DIR%
+set "CFG_DIR=%TSIM_DIR%cfg\"
+rem echo CFG_DIR: %CFG_DIR%
-set "LOG_DIR=%~dp0..\..\sim\tsim\log"
-echo LOG_DIR: %LOG_DIR%
+set "LOG_DIR=%TSIM_DIR%log\"
+rem echo LOG_DIR: %LOG_DIR%
-set "TAOS_CFG=%~dp0..\..\sim\tsim\cfg\taos.cfg"
-echo TAOS_CFG: %TAOS_CFG%
+set "TAOS_CFG=%CFG_DIR%taos.cfg"
+rem echo TAOS_CFG: %TAOS_CFG%
if not exist %SIM_DIR% mkdir %SIM_DIR%
if not exist %TSIM_DIR% mkdir %TSIM_DIR%
@@ -32,29 +33,30 @@ if exist %LOG_DIR% rmdir /s/q %LOG_DIR%
if not exist %CFG_DIR% mkdir %CFG_DIR%
if not exist %LOG_DIR% mkdir %LOG_DIR%
-echo firstEp %FIRSTEP% > %TAOS_CFG%
-echo serverPort 6030 >> %TAOS_CFG%
-echo wal 2 >> %TAOS_CFG%
-echo asyncLog 0 >> %TAOS_CFG%
-echo locale en_US.UTF-8 >> %TAOS_CFG%
-echo logDir %LOG_DIR% >> %TAOS_CFG%
-echo scriptDir %SCRIPT_DIR% >> %TAOS_CFG%
-echo numOfLogLines 100000000 >> %TAOS_CFG%
-echo tmrDebugFlag 131 >> %TAOS_CFG%
-echo rpcDebugFlag 143 >> %TAOS_CFG%
-echo cDebugFlag 143 >> %TAOS_CFG%
-echo qdebugFlag 143 >> %TAOS_CFG%
-echo udebugFlag 143 >> %TAOS_CFG%
+rem set "fqdn="
+for /f "skip=1" %%A in (
+ 'wmic computersystem get caption'
+) do if not defined fqdn set "fqdn=%%A"
-set "FILE_NAME=windows\testSuite.sim"
-set "FIRSTEP=192.168.1.182"
+echo firstEp %fqdn% > %TAOS_CFG%
+echo fqdn %fqdn% >> %TAOS_CFG%
+echo serverPort 7100 >> %TAOS_CFG%
+echo logDir %LOG_DIR% >> %TAOS_CFG%
+echo scriptDir %SCRIPT_DIR% >> %TAOS_CFG%
+echo numOfLogLines 100000000 >> %TAOS_CFG%
+echo rpcDebugFlag 143 >> %TAOS_CFG%
+echo tmrDebugFlag 131 >> %TAOS_CFG%
+echo cDebugFlag 143 >> %TAOS_CFG%
+echo udebugFlag 143 >> %TAOS_CFG%
+echo wal 0 >> %TAOS_CFG%
+echo asyncLog 0 >> %TAOS_CFG%
+echo locale en_US.UTF-8 >> %TAOS_CFG%
+echo enableCoreFile 1 >> %TAOS_CFG%
+
+set "FILE_NAME=testSuite.sim"
if "%1" == "-f" set "FILE_NAME=%2"
-if "%1" == "-h" set "FIRSTEP=%2"
-if "%3" == "-f" set "FILE_NAME=%4"
-if "%3" == "-h" set "FIRSTEP=%4"
-echo FILE_NAME: %FILE_NAME%
-echo FIRSTEP: %FIRSTEP%
+rem echo FILE_NAME: %FILE_NAME%
echo ExcuteCmd: %tsim% -c %CFG_DIR% -f %FILE_NAME%
-%tsim% -c %CFG_DIR% -f %FILE_NAME%
\ No newline at end of file
+%TSIM% -c %CFG_DIR% -f %FILE_NAME%
\ No newline at end of file
diff --git a/tests/tsim/src/simExe.c b/tests/tsim/src/simExe.c
index a23dff13be..83ca46599c 100644
--- a/tests/tsim/src/simExe.c
+++ b/tests/tsim/src/simExe.c
@@ -301,11 +301,37 @@ bool simExecuteRunBackCmd(SScript *script, char *option) {
return true;
}
+void simReplaceShToBat(char *dst) {
+ char* sh = strstr(dst, ".sh");
+ if (sh != NULL) {
+ int32_t dstLen = (int32_t)strlen(dst);
+ char *end = dst + dstLen;
+ *(end + 1) = 0;
+
+ for (char *p = end; p >= sh; p--) {
+ *(p + 1) = *p;
+ }
+
+ sh[0] = '.';
+ sh[1] = 'b';
+ sh[2] = 'a';
+ sh[3] = 't';
+ sh[4] = ' ';
+ }
+
+ simDebug("system cmd is %s", dst);
+}
+
bool simExecuteSystemCmd(SScript *script, char *option) {
char buf[4096] = {0};
+#ifndef WINDOWS
sprintf(buf, "cd %s; ", tsScriptDir);
simVisuallizeOption(script, option, buf + strlen(buf));
+#else
+ sprintf(buf, "%s%s", tsScriptDir, option);
+ simReplaceShToBat(buf);
+#endif
simLogSql(buf, true);
int32_t code = system(buf);
@@ -314,9 +340,7 @@ bool simExecuteSystemCmd(SScript *script, char *option) {
simError("script:%s, failed to execute %s , code %d, errno:%d %s, repeatTimes:%d", script->fileName, buf, code,
errno, strerror(errno), repeatTimes);
taosMsleep(1000);
-#ifdef LINUX
- signal(SIGCHLD, SIG_DFL);
-#endif
+ taosDflSignal(SIGCHLD);
if (repeatTimes++ >= 10) {
exit(0);
}
diff --git a/tests/tsim/src/simMain.c b/tests/tsim/src/simMain.c
index f30442ef41..990ea71413 100644
--- a/tests/tsim/src/simMain.c
+++ b/tests/tsim/src/simMain.c
@@ -22,7 +22,7 @@
bool simAsyncQuery = false;
bool simExecSuccess = false;
-void simHandleSignal(int32_t signo) {
+void simHandleSignal(int32_t signo, void *sigInfo, void *context) {
simSystemCleanUp();
exit(1);
}
@@ -52,7 +52,7 @@ int32_t main(int32_t argc, char *argv[]) {
}
simInfo("simulator is running ...");
- signal(SIGINT, simHandleSignal);
+ taosSetSignal(SIGINT, simHandleSignal);
SScript *script = simParseScript(scriptFile);
if (script == NULL) {
@@ -64,7 +64,7 @@ int32_t main(int32_t argc, char *argv[]) {
simExecuteScript(script);
int32_t ret = simExecSuccess ? 0 : -1;
- simError("execute result %d", ret);
+ simInfo("execute result %d", ret);
return ret;
}
\ No newline at end of file
diff --git a/tests/tsim/src/simSystem.c b/tests/tsim/src/simSystem.c
index 2a1048334a..3a409ecbf9 100644
--- a/tests/tsim/src/simSystem.c
+++ b/tests/tsim/src/simSystem.c
@@ -81,8 +81,8 @@ char *simParseHostName(char *varName) {
}
bool simSystemInit() {
- taosGetFqdn(simHostName);
taos_init();
+ taosGetFqdn(simHostName);
simInitsimCmdList();
memset(simScriptList, 0, sizeof(SScript *) * MAX_MAIN_SCRIPT_NUM);
return true;