提交 63a6fcd7 编写于 作者: H Hongze Cheng

Merge branch 'develop' into feature/TD-1925_new

...@@ -133,7 +133,9 @@ cmake .. -G "NMake Makefiles" ...@@ -133,7 +133,9 @@ cmake .. -G "NMake Makefiles"
nmake 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. Please specify "x64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
``` ```
mkdir debug && cd debug mkdir debug && cd debug
...@@ -142,7 +144,7 @@ cmake .. -G "NMake Makefiles" ...@@ -142,7 +144,7 @@ cmake .. -G "NMake Makefiles"
nmake 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 mkdir debug && cd debug
cmake .. -G "NMake Makefiles" cmake .. -G "NMake Makefiles"
......
...@@ -99,14 +99,14 @@ static FORCE_INLINE SQueryInfo* tscGetQueryInfoDetail(SSqlCmd* pCmd, int32_t sub ...@@ -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); 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); void tscSortRemoveDataBlockDupRows(STableDataBlocks* dataBuf);
SParamInfo* tscAddParamToDataBlock(STableDataBlocks* pDataBlock, char type, uint8_t timePrec, int16_t bytes, SParamInfo* tscAddParamToDataBlock(STableDataBlocks* pDataBlock, char type, uint8_t timePrec, int16_t bytes,
uint32_t offset); uint32_t offset);
void* tscDestroyBlockArrayList(SArray* pDataBlockList); void* tscDestroyBlockArrayList(SArray* pDataBlockList);
void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable); void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable, bool removeMeta);
int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock); int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock);
int32_t tscMergeTableDataBlocks(SSqlObj* pSql, bool freeBlockMap); int32_t tscMergeTableDataBlocks(SSqlObj* pSql, bool freeBlockMap);
......
...@@ -22,15 +22,15 @@ extern "C" { ...@@ -22,15 +22,15 @@ extern "C" {
#include "os.h" #include "os.h"
#include "qAggMain.h"
#include "taos.h" #include "taos.h"
#include "taosdef.h" #include "taosdef.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tarray.h" #include "tarray.h"
#include "tglobal.h"
#include "tsqlfunction.h"
#include "tutil.h"
#include "tcache.h" #include "tcache.h"
#include "tglobal.h"
#include "tref.h" #include "tref.h"
#include "tutil.h"
#include "qExecutor.h" #include "qExecutor.h"
#include "qSqlparser.h" #include "qSqlparser.h"
...@@ -223,6 +223,8 @@ typedef struct SQueryInfo { ...@@ -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 int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
int16_t resColumnId; // result column id int16_t resColumnId; // result column id
bool distinctTag; // distinct tag or not
} SQueryInfo; } SQueryInfo;
typedef struct { typedef struct {
...@@ -411,7 +413,7 @@ void tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo); ...@@ -411,7 +413,7 @@ void tscRestoreSQLFuncForSTableQuery(SQueryInfo *pQueryInfo);
int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo); int32_t tscCreateResPointerInfo(SSqlRes *pRes, SQueryInfo *pQueryInfo);
void tscSetResRawPtr(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 * free query result of the sql object
......
...@@ -351,7 +351,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) { ...@@ -351,7 +351,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
if (pCmd->command == TSDB_SQL_SELECT) { if (pCmd->command == TSDB_SQL_SELECT) {
tscDebug("%p redo parse sql string and proceed", pSql); tscDebug("%p redo parse sql string and proceed", pSql);
pCmd->parseFinished = false; pCmd->parseFinished = false;
tscResetSqlCmdObj(pCmd); tscResetSqlCmd(pCmd, true);
code = tsParseSql(pSql, true); code = tsParseSql(pSql, true);
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) { if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "tscLocalMerge.h" #include "tscLocalMerge.h"
#include "tscSubquery.h" #include "tscSubquery.h"
#include "os.h" #include "os.h"
#include "qAst.h" #include "texpr.h"
#include "tlosertree.h" #include "tlosertree.h"
#include "tscLog.h" #include "tscLog.h"
#include "tscUtil.h" #include "tscUtil.h"
...@@ -1101,7 +1101,7 @@ static int64_t getNumOfResultLocal(SQueryInfo *pQueryInfo, SQLFunctionCtx *pCtx) ...@@ -1101,7 +1101,7 @@ static int64_t getNumOfResultLocal(SQueryInfo *pQueryInfo, SQLFunctionCtx *pCtx)
* the number of output result is decided by main output * the number of output result is decided by main output
*/ */
int32_t functionId = pCtx[j].functionId; 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; continue;
} }
...@@ -1183,7 +1183,7 @@ bool needToMerge(SQueryInfo *pQueryInfo, SLocalMerger *pLocalMerge, tFilePage *t ...@@ -1183,7 +1183,7 @@ bool needToMerge(SQueryInfo *pQueryInfo, SLocalMerger *pLocalMerge, tFilePage *t
int16_t functionId = pLocalMerge->pCtx[0].functionId; int16_t functionId = pLocalMerge->pCtx[0].functionId;
// todo opt performance // 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 ret = 1; // disable merge procedure
} else { } else {
tOrderDescriptor *pDesc = pLocalMerge->pDesc; tOrderDescriptor *pDesc = pLocalMerge->pDesc;
......
...@@ -1036,11 +1036,7 @@ static int32_t validateDataSource(SSqlCmd *pCmd, int8_t type, const char *sql) { ...@@ -1036,11 +1036,7 @@ static int32_t validateDataSource(SSqlCmd *pCmd, int8_t type, const char *sql) {
} }
/** /**
* usage: insert into table1 values() () table2 values()() * parse insert sql
*
* @param str
* @param acct
* @param db
* @param pSql * @param pSql
* @return * @return
*/ */
...@@ -1343,10 +1339,11 @@ int tsParseSql(SSqlObj *pSql, bool initial) { ...@@ -1343,10 +1339,11 @@ int tsParseSql(SSqlObj *pSql, bool initial) {
// make a backup as tsParseInsertSql may modify the string // make a backup as tsParseInsertSql may modify the string
char* sqlstr = strdup(pSql->sqlstr); char* sqlstr = strdup(pSql->sqlstr);
ret = tsParseInsertSql(pSql); 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); free(sqlstr);
} else { } else {
tscResetSqlCmdObj(pCmd); tscResetSqlCmd(pCmd, true);
free(pSql->sqlstr); free(pSql->sqlstr);
pSql->sqlstr = sqlstr; pSql->sqlstr = sqlstr;
pSql->parseRetry++; pSql->parseRetry++;
...@@ -1358,7 +1355,7 @@ int tsParseSql(SSqlObj *pSql, bool initial) { ...@@ -1358,7 +1355,7 @@ int tsParseSql(SSqlObj *pSql, bool initial) {
SSqlInfo SQLInfo = qSQLParse(pSql->sqlstr); SSqlInfo SQLInfo = qSQLParse(pSql->sqlstr);
ret = tscToSQLCmd(pSql, &SQLInfo); ret = tscToSQLCmd(pSql, &SQLInfo);
if (ret == TSDB_CODE_TSC_INVALID_SQL && pSql->parseRetry == 0 && SQLInfo.type == TSDB_SQL_NULL) { if (ret == TSDB_CODE_TSC_INVALID_SQL && pSql->parseRetry == 0 && SQLInfo.type == TSDB_SQL_NULL) {
tscResetSqlCmdObj(pCmd); tscResetSqlCmd(pCmd, true);
pSql->parseRetry++; pSql->parseRetry++;
ret = tscToSQLCmd(pSql, &SQLInfo); ret = tscToSQLCmd(pSql, &SQLInfo);
} }
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "os.h" #include "os.h"
#include "ttype.h" #include "ttype.h"
#include "qAst.h" #include "texpr.h"
#include "taos.h" #include "taos.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tcompare.h" #include "tcompare.h"
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#define COLUMN_INDEX_INITIAL_VAL (-3) #define COLUMN_INDEX_INITIAL_VAL (-3)
#define COLUMN_INDEX_INITIALIZER \ #define COLUMN_INDEX_INITIALIZER \
{ COLUMN_INDEX_INITIAL_VAL, COLUMN_INDEX_INITIAL_VAL } { 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 "," #define TBNAME_LIST_SEP ","
typedef struct SColumnList { // todo refactor typedef struct SColumnList { // todo refactor
...@@ -902,12 +902,16 @@ int32_t parseSlidingClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQu ...@@ -902,12 +902,16 @@ int32_t parseSlidingClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQu
int32_t tscSetTableFullName(STableMetaInfo* pTableMetaInfo, SStrToken* pTableName, SSqlObj* pSql) { int32_t tscSetTableFullName(STableMetaInfo* pTableMetaInfo, SStrToken* pTableName, SSqlObj* pSql) {
const char* msg1 = "name too long"; const char* msg1 = "name too long";
const char* msg2 = "acctId too long";
SSqlCmd* pCmd = &pSql->cmd; SSqlCmd* pCmd = &pSql->cmd;
int32_t code = TSDB_CODE_SUCCESS; int32_t code = TSDB_CODE_SUCCESS;
if (hasSpecifyDB(pTableName)) { // db has been specified in sql string so we ignore current db path if (hasSpecifyDB(pTableName)) { // db has been specified in sql string so we ignore current db path
tNameSetAcctId(&pTableMetaInfo->name, getAccountId(pSql)); code = tNameSetAcctId(&pTableMetaInfo->name, getAccountId(pSql));
if (code != 0) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
}
char name[TSDB_TABLE_FNAME_LEN] = {0}; char name[TSDB_TABLE_FNAME_LEN] = {0};
strncpy(name, pTableName->z, pTableName->n); strncpy(name, pTableName->z, pTableName->n);
...@@ -1354,7 +1358,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t ...@@ -1354,7 +1358,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
int32_t ret = exprTreeFromSqlExpr(pCmd, &pNode, pItem->pNode, pQueryInfo, colList, NULL); int32_t ret = exprTreeFromSqlExpr(pCmd, &pNode, pItem->pNode, pQueryInfo, colList, NULL);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
taosArrayDestroy(colList); taosArrayDestroy(colList);
tExprTreeDestroy(&pNode, NULL); tExprTreeDestroy(pNode, NULL);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
} }
...@@ -1363,9 +1367,9 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t ...@@ -1363,9 +1367,9 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
for(int32_t k = 0; k < numOfNode; ++k) { for(int32_t k = 0; k < numOfNode; ++k) {
SColIndex* pIndex = taosArrayGet(colList, k); SColIndex* pIndex = taosArrayGet(colList, k);
if (TSDB_COL_IS_TAG(pIndex->flag)) { if (TSDB_COL_IS_TAG(pIndex->flag)) {
tExprTreeDestroy(&pNode, NULL); tExprTreeDestroy(pNode, NULL);
taosArrayDestroy(colList); taosArrayDestroy(colList);
tExprTreeDestroy(&pNode, NULL);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
} }
} }
...@@ -1392,7 +1396,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t ...@@ -1392,7 +1396,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
tbufCloseWriter(&bw); tbufCloseWriter(&bw);
taosArrayDestroy(colList); taosArrayDestroy(colList);
tExprTreeDestroy(&pNode, NULL); tExprTreeDestroy(pNode, NULL);
} else { } else {
columnList.num = 0; columnList.num = 0;
columnList.ids[0] = (SColumnIndex) {0, 0}; columnList.ids[0] = (SColumnIndex) {0, 0};
...@@ -1424,7 +1428,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t ...@@ -1424,7 +1428,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); int32_t ret = exprTreeFromSqlExpr(pCmd, &pArithExprInfo->pExpr, pItem->pNode, pQueryInfo, NULL, &pArithExprInfo->uid);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
tExprTreeDestroy(&pArithExprInfo->pExpr, NULL); tExprTreeDestroy(pArithExprInfo->pExpr, NULL);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "invalid expression in select clause"); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "invalid expression in select clause");
} }
...@@ -1501,23 +1505,39 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) { ...@@ -1501,23 +1505,39 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) {
pQueryInfo->type |= TSDB_QUERY_TYPE_PROJECTION_QUERY; 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) { int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable, bool joinQuery, bool intervalQuery) {
assert(pSelection != NULL && pCmd != NULL); assert(pSelection != NULL && pCmd != NULL);
const char* msg2 = "functions can not be mixed up"; const char* msg2 = "functions can not be mixed up";
const char* msg3 = "not support query expression"; const char* msg3 = "not support query expression";
const char* msg5 = "invalid function name"; const char* msg5 = "invalid function name";
const char* msg6 = "only support distinct one tag";
SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(pCmd, clauseIndex); SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(pCmd, clauseIndex);
if (pQueryInfo->colList == NULL) { if (pQueryInfo->colList == NULL) {
pQueryInfo->colList = taosArrayInit(4, POINTER_BYTES); pQueryInfo->colList = taosArrayInit(4, POINTER_BYTES);
} }
bool hasDistinct = false;
for (int32_t i = 0; i < pSelection->nExpr; ++i) { for (int32_t i = 0; i < pSelection->nExpr; ++i) {
int32_t outputIndex = (int32_t)tscSqlExprNumOfExprs(pQueryInfo); int32_t outputIndex = (int32_t)tscSqlExprNumOfExprs(pQueryInfo);
tSqlExprItem* pItem = &pSelection->a[i]; tSqlExprItem* pItem = &pSelection->a[i];
if (hasDistinct == false) {
hasDistinct = (pItem->distinct == true);
}
// project on all fields // project on all fields
int32_t optr = pItem->pNode->nSQLOptr; int32_t optr = pItem->pNode->nSQLOptr;
...@@ -1551,6 +1571,13 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel ...@@ -1551,6 +1571,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. // there is only one user-defined column in the final result field, add the timestamp column.
size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList); size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList);
if (numOfSrcCols <= 0 && !tscQueryTags(pQueryInfo)) { if (numOfSrcCols <= 0 && !tscQueryTags(pQueryInfo)) {
...@@ -1727,6 +1754,9 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t ...@@ -1727,6 +1754,9 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
SSchema colSchema = tGetTableNameColumnSchema(); SSchema colSchema = tGetTableNameColumnSchema();
tscAddSpecialColumnForSelect(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG); 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 { } else {
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex); STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
...@@ -2194,6 +2224,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col ...@@ -2194,6 +2224,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if (getColumnIndexByName(pCmd, &pParamElem->pNode->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) { if (getColumnIndexByName(pCmd, &pParamElem->pNode->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
} }
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
} }
...@@ -2402,6 +2433,14 @@ static bool isTablenameToken(SStrToken* token) { ...@@ -2402,6 +2433,14 @@ static bool isTablenameToken(SStrToken* token) {
return (strncasecmp(TSQL_TBNAME_L, tmpToken.z, tmpToken.n) == 0 && tmpToken.n == strlen(TSQL_TBNAME_L)); 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) { static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken* pToken) {
STableMeta* pTableMeta = tscGetMetaInfo(pQueryInfo, index)->pTableMeta; STableMeta* pTableMeta = tscGetMetaInfo(pQueryInfo, index)->pTableMeta;
...@@ -2431,6 +2470,8 @@ int32_t doGetColumnIndexByName(SSqlCmd* pCmd, SStrToken* pToken, SQueryInfo* pQu ...@@ -2431,6 +2470,8 @@ int32_t doGetColumnIndexByName(SSqlCmd* pCmd, SStrToken* pToken, SQueryInfo* pQu
if (isTablenameToken(pToken)) { if (isTablenameToken(pToken)) {
pIndex->columnIndex = TSDB_TBNAME_COLUMN_INDEX; 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) { } else if (strncasecmp(pToken->z, DEFAULT_PRIMARY_TIMESTAMP_COL_NAME, pToken->n) == 0) {
pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX; pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX;
} else { } else {
...@@ -2672,7 +2713,6 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -2672,7 +2713,6 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
} }
} }
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
...@@ -4303,7 +4343,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE ...@@ -4303,7 +4343,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
doCompactQueryExpr(pExpr); doCompactQueryExpr(pExpr);
tSqlExprDestroy(p1); tSqlExprDestroy(p1);
tExprTreeDestroy(&p, NULL); tExprTreeDestroy(p, NULL);
taosArrayDestroy(colList); taosArrayDestroy(colList);
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) { if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
...@@ -4524,10 +4564,10 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery ...@@ -4524,10 +4564,10 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
} }
size_t size = tscNumOfFields(pQueryInfo); size_t numOfFields = tscNumOfFields(pQueryInfo);
if (pQueryInfo->fillVal == NULL) { if (pQueryInfo->fillVal == NULL) {
pQueryInfo->fillVal = calloc(size, sizeof(int64_t)); pQueryInfo->fillVal = calloc(numOfFields, sizeof(int64_t));
if (pQueryInfo->fillVal == NULL) { if (pQueryInfo->fillVal == NULL) {
return TSDB_CODE_TSC_OUT_OF_MEMORY; return TSDB_CODE_TSC_OUT_OF_MEMORY;
} }
...@@ -4537,7 +4577,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery ...@@ -4537,7 +4577,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
pQueryInfo->fillType = TSDB_FILL_NONE; pQueryInfo->fillType = TSDB_FILL_NONE;
} else if (strncasecmp(pItem->pVar.pz, "null", 4) == 0 && pItem->pVar.nLen == 4) { } else if (strncasecmp(pItem->pVar.pz, "null", 4) == 0 && pItem->pVar.nLen == 4) {
pQueryInfo->fillType = TSDB_FILL_NULL; 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); TAOS_FIELD* pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
setNull((char*)&pQueryInfo->fillVal[i], pField->type, pField->bytes); setNull((char*)&pQueryInfo->fillVal[i], pField->type, pField->bytes);
} }
...@@ -4551,7 +4591,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery ...@@ -4551,7 +4591,7 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
pQueryInfo->fillType = TSDB_FILL_SET_VALUE; pQueryInfo->fillType = TSDB_FILL_SET_VALUE;
size_t num = taosArrayGetSize(pFillToken); size_t num = taosArrayGetSize(pFillToken);
if (num == 1) { if (num == 1) { // no actual value, return with error code
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
...@@ -4562,11 +4602,11 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery ...@@ -4562,11 +4602,11 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery
if (tscIsPointInterpQuery(pQueryInfo)) { if (tscIsPointInterpQuery(pQueryInfo)) {
startPos = 0; startPos = 0;
if (numOfFillVal > size) { if (numOfFillVal > numOfFields) {
numOfFillVal = (int32_t)size; numOfFillVal = (int32_t)numOfFields;
} }
} else { } 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; int32_t j = 1;
...@@ -4586,10 +4626,10 @@ int32_t parseFillClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQuery ...@@ -4586,10 +4626,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); 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); TAOS_FIELD* pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
if (pField->type == TSDB_DATA_TYPE_BINARY || pField->type == TSDB_DATA_TYPE_NCHAR) { if (pField->type == TSDB_DATA_TYPE_BINARY || pField->type == TSDB_DATA_TYPE_NCHAR) {
...@@ -4640,6 +4680,12 @@ int32_t parseOrderbyClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu ...@@ -4640,6 +4680,12 @@ int32_t parseOrderbyClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu
setDefaultOrderInfo(pQueryInfo); setDefaultOrderInfo(pQueryInfo);
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); 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) { if (pQuerySql->pSortOrder == NULL) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
......
...@@ -2228,6 +2228,8 @@ int tscProcessRetrieveRspFromNode(SSqlObj *pSql) { ...@@ -2228,6 +2228,8 @@ int tscProcessRetrieveRspFromNode(SSqlObj *pSql) {
SSqlRes *pRes = &pSql->res; SSqlRes *pRes = &pSql->res;
SSqlCmd *pCmd = &pSql->cmd; SSqlCmd *pCmd = &pSql->cmd;
assert(pRes->rspLen >= sizeof(SRetrieveTableRsp));
SRetrieveTableRsp *pRetrieve = (SRetrieveTableRsp *)pRes->pRsp; SRetrieveTableRsp *pRetrieve = (SRetrieveTableRsp *)pRes->pRsp;
if (pRetrieve == NULL) { if (pRetrieve == NULL) {
pRes->code = TSDB_CODE_TSC_OUT_OF_MEMORY; pRes->code = TSDB_CODE_TSC_OUT_OF_MEMORY;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "hash.h" #include "hash.h"
#include "os.h" #include "os.h"
#include "qAst.h" #include "texpr.h"
#include "tkey.h" #include "tkey.h"
#include "tcache.h" #include "tcache.h"
#include "tnote.h" #include "tnote.h"
...@@ -110,6 +110,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa ...@@ -110,6 +110,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
rpcClose(pDnodeConn); rpcClose(pDnodeConn);
free(pObj->tscCorMgmtEpSet); free(pObj->tscCorMgmtEpSet);
free(pObj); free(pObj);
return NULL;
} }
memcpy(pObj->tscCorMgmtEpSet, &corMgmtEpSet, sizeof(SRpcCorEpSet)); memcpy(pObj->tscCorMgmtEpSet, &corMgmtEpSet, sizeof(SRpcCorEpSet));
...@@ -936,7 +937,7 @@ int taos_validate_sql(TAOS *taos, const char *sql) { ...@@ -936,7 +937,7 @@ int taos_validate_sql(TAOS *taos, const char *sql) {
static int tscParseTblNameList(SSqlObj *pSql, const char *tblNameList, int32_t tblListLen) { static int tscParseTblNameList(SSqlObj *pSql, const char *tblNameList, int32_t tblListLen) {
// must before clean the sqlcmd object // must before clean the sqlcmd object
tscResetSqlCmdObj(&pSql->cmd); tscResetSqlCmd(&pSql->cmd, false);
SSqlCmd *pCmd = &pSql->cmd; SSqlCmd *pCmd = &pSql->cmd;
......
...@@ -191,9 +191,10 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf ...@@ -191,9 +191,10 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pStream->pSql->cmd, 0, 0); STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pStream->pSql->cmd, 0, 0);
assert(0); char name[TSDB_TABLE_FNAME_LEN] = {0};
// char* name = pTableMetaInfo->name; tNameExtractFullName(&pTableMetaInfo->name, name);
// taosHashRemove(tscTableMetaInfo, name, strnlen(name, TSDB_TABLE_FNAME_LEN));
taosHashRemove(tscTableMetaInfo, name, strnlen(name, TSDB_TABLE_FNAME_LEN));
pTableMetaInfo->vgroupList = tscVgroupInfoClear(pTableMetaInfo->vgroupList); pTableMetaInfo->vgroupList = tscVgroupInfoClear(pTableMetaInfo->vgroupList);
tscSetRetryTimer(pStream, pStream->pSql, retryDelay); tscSetRetryTimer(pStream, pStream->pSql, retryDelay);
...@@ -292,8 +293,8 @@ static void tscProcessStreamRetrieveResult(void *param, TAOS_RES *res, int numOf ...@@ -292,8 +293,8 @@ static void tscProcessStreamRetrieveResult(void *param, TAOS_RES *res, int numOf
pStream->stime += 1; pStream->stime += 1;
} }
// tscDebug("%p stream:%p, query on:%s, fetch result completed, fetched rows:%" PRId64, pSql, pStream, pTableMetaInfo->name, tscDebug("%p stream:%p, query on:%s, fetch result completed, fetched rows:%" PRId64, pSql, pStream, tNameGetTableName(&pTableMetaInfo->name),
// pStream->numOfRes); pStream->numOfRes);
tfree(pTableMetaInfo->pTableMeta); tfree(pTableMetaInfo->pTableMeta);
...@@ -556,8 +557,8 @@ static void tscCreateStream(void *param, TAOS_RES *res, int code) { ...@@ -556,8 +557,8 @@ static void tscCreateStream(void *param, TAOS_RES *res, int code) {
taosTmrReset(tscProcessStreamTimer, (int32_t)starttime, pStream, tscTmr, &pStream->pTimer); 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, 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); pStream, tNameGetTableName(&pTableMetaInfo->name), pStream->interval.interval, pStream->interval.sliding, starttime, pSql->sqlstr);
} }
void tscSetStreamDestTable(SSqlStream* pStream, const char* dstTable) { void tscSetStreamDestTable(SSqlStream* pStream, const char* dstTable) {
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "os.h" #include "os.h"
#include "qAst.h" #include "texpr.h"
#include "qTsbuf.h" #include "qTsbuf.h"
#include "tcompare.h" #include "tcompare.h"
#include "tscLog.h" #include "tscLog.h"
...@@ -582,13 +582,14 @@ void freeJoinSubqueryObj(SSqlObj* pSql) { ...@@ -582,13 +582,14 @@ void freeJoinSubqueryObj(SSqlObj* pSql) {
pSql->subState.numOfSub = 0; 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)) { if (subAndCheckDone(pSqlSub, pSqlObj, pSupporter->subqueryIndex)) {
tscError("%p all subquery return and query failed, global code:%s", pSqlObj, tstrerror(pSqlObj->res.code)); tscError("%p all subquery return and query failed, global code:%s", pSqlObj, tstrerror(pSqlObj->res.code));
freeJoinSubqueryObj(pSqlObj); freeJoinSubqueryObj(pSqlObj);
return; return 0;
} }
return 1;
//tscDestroyJoinSupporter(pSupporter); //tscDestroyJoinSupporter(pSupporter);
} }
...@@ -835,7 +836,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -835,7 +836,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
if (pParentSql->res.code != TSDB_CODE_SUCCESS) { 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); 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); tscAsyncResultOnError(pParentSql);
...@@ -850,7 +853,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -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); tscError("%p sub query failed, code:%s, index:%d", pSql, tstrerror(numOfRows), pSupporter->subqueryIndex);
pParentSql->res.code = numOfRows; pParentSql->res.code = numOfRows;
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
return; return;
...@@ -867,7 +872,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -867,7 +872,9 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
tscError("%p failed to malloc memory", pSql); tscError("%p failed to malloc memory", pSql);
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno); pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
return; return;
...@@ -985,7 +992,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -985,7 +992,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
if (pParentSql->res.code != TSDB_CODE_SUCCESS) { 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); 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); tscAsyncResultOnError(pParentSql);
...@@ -999,7 +1008,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -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); tscError("%p sub query failed, code:%s, index:%d", pSql, tstrerror(numOfRows), pSupporter->subqueryIndex);
pParentSql->res.code = numOfRows; pParentSql->res.code = numOfRows;
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)){
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
return; return;
...@@ -1014,7 +1025,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -1014,7 +1025,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno); pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
...@@ -1032,7 +1045,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow ...@@ -1032,7 +1045,9 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
pParentSql->res.code = TAOS_SYSTEM_ERROR(errno); pParentSql->res.code = TAOS_SYSTEM_ERROR(errno);
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)){
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
...@@ -1129,7 +1144,9 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR ...@@ -1129,7 +1144,9 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR
if (pParentSql->res.code != TSDB_CODE_SUCCESS) { 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); 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); tscAsyncResultOnError(pParentSql);
...@@ -1472,7 +1489,9 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) { ...@@ -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 // retrieve actual query results from vnode during the second stage join subquery
if (pParentSql->res.code != TSDB_CODE_SUCCESS) { 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); 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); tscAsyncResultOnError(pParentSql);
...@@ -1486,7 +1505,10 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) { ...@@ -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)); tscError("%p abort query, code:%s, global code:%s", pSql, tstrerror(code), tstrerror(pParentSql->res.code));
pParentSql->res.code = code; pParentSql->res.code = code;
quitAllSubquery(pSql, pParentSql, pSupporter); if (quitAllSubquery(pSql, pParentSql, pSupporter)) {
return;
}
tscAsyncResultOnError(pParentSql); tscAsyncResultOnError(pParentSql);
return; return;
...@@ -2441,7 +2463,7 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows) ...@@ -2441,7 +2463,7 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
pParentObj->cmd.parseFinished = false; 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: // 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. // 1. the table Id(tid & uid) may have been update, the submit block needs to be updated accordingly.
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "tscUtil.h" #include "tscUtil.h"
#include "hash.h" #include "hash.h"
#include "os.h" #include "os.h"
#include "qAst.h" #include "texpr.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tkey.h" #include "tkey.h"
#include "tmd5.h" #include "tmd5.h"
...@@ -381,7 +381,7 @@ void tscFreeQueryInfo(SSqlCmd* pCmd) { ...@@ -381,7 +381,7 @@ void tscFreeQueryInfo(SSqlCmd* pCmd) {
tfree(pCmd->pQueryInfo); tfree(pCmd->pQueryInfo);
} }
void tscResetSqlCmdObj(SSqlCmd* pCmd) { void tscResetSqlCmd(SSqlCmd* pCmd, bool removeMeta) {
pCmd->command = 0; pCmd->command = 0;
pCmd->numOfCols = 0; pCmd->numOfCols = 0;
pCmd->count = 0; pCmd->count = 0;
...@@ -399,7 +399,7 @@ void tscResetSqlCmdObj(SSqlCmd* pCmd) { ...@@ -399,7 +399,7 @@ void tscResetSqlCmdObj(SSqlCmd* pCmd) {
pCmd->numOfTables = 0; pCmd->numOfTables = 0;
tfree(pCmd->pTableNameList); tfree(pCmd->pTableNameList);
pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList); pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList, removeMeta);
pCmd->pDataBlocks = tscDestroyBlockArrayList(pCmd->pDataBlocks); pCmd->pDataBlocks = tscDestroyBlockArrayList(pCmd->pDataBlocks);
tscFreeQueryInfo(pCmd); tscFreeQueryInfo(pCmd);
} }
...@@ -501,7 +501,7 @@ void tscFreeSqlObj(SSqlObj* pSql) { ...@@ -501,7 +501,7 @@ void tscFreeSqlObj(SSqlObj* pSql) {
pSql->self = 0; pSql->self = 0;
tscFreeSqlResult(pSql); tscFreeSqlResult(pSql);
tscResetSqlCmdObj(pCmd); tscResetSqlCmd(pCmd, false);
tfree(pCmd->tagData.data); tfree(pCmd->tagData.data);
pCmd->tagData.dataLen = 0; pCmd->tagData.dataLen = 0;
...@@ -515,7 +515,7 @@ void tscFreeSqlObj(SSqlObj* pSql) { ...@@ -515,7 +515,7 @@ void tscFreeSqlObj(SSqlObj* pSql) {
free(pSql); free(pSql);
} }
void tscDestroyDataBlock(STableDataBlocks* pDataBlock) { void tscDestroyDataBlock(STableDataBlocks* pDataBlock, bool removeMeta) {
if (pDataBlock == NULL) { if (pDataBlock == NULL) {
return; return;
} }
...@@ -528,6 +528,13 @@ void tscDestroyDataBlock(STableDataBlocks* pDataBlock) { ...@@ -528,6 +528,13 @@ void tscDestroyDataBlock(STableDataBlocks* pDataBlock) {
tfree(pDataBlock->pTableMeta); 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); tfree(pDataBlock);
} }
...@@ -563,21 +570,21 @@ void* tscDestroyBlockArrayList(SArray* pDataBlockList) { ...@@ -563,21 +570,21 @@ void* tscDestroyBlockArrayList(SArray* pDataBlockList) {
size_t size = taosArrayGetSize(pDataBlockList); size_t size = taosArrayGetSize(pDataBlockList);
for (int32_t i = 0; i < size; i++) { for (int32_t i = 0; i < size; i++) {
void* d = taosArrayGetP(pDataBlockList, i); void* d = taosArrayGetP(pDataBlockList, i);
tscDestroyDataBlock(d); tscDestroyDataBlock(d, false);
} }
taosArrayDestroy(pDataBlockList); taosArrayDestroy(pDataBlockList);
return NULL; return NULL;
} }
void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable) { void* tscDestroyBlockHashTable(SHashObj* pBlockHashTable, bool removeMeta) {
if (pBlockHashTable == NULL) { if (pBlockHashTable == NULL) {
return NULL; return NULL;
} }
STableDataBlocks** p = taosHashIterate(pBlockHashTable, NULL); STableDataBlocks** p = taosHashIterate(pBlockHashTable, NULL);
while(p) { while(p) {
tscDestroyDataBlock(*p); tscDestroyDataBlock(*p, removeMeta);
p = taosHashIterate(pBlockHashTable, p); p = taosHashIterate(pBlockHashTable, p);
} }
...@@ -791,7 +798,7 @@ static void extractTableNameList(SSqlCmd* pCmd, bool freeBlockMap) { ...@@ -791,7 +798,7 @@ static void extractTableNameList(SSqlCmd* pCmd, bool freeBlockMap) {
} }
if (freeBlockMap) { if (freeBlockMap) {
pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList); pCmd->pTableBlockHashList = tscDestroyBlockHashTable(pCmd->pTableBlockHashList, false);
} }
} }
...@@ -1047,7 +1054,7 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) { ...@@ -1047,7 +1054,7 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
SInternalField* pInfo = taosArrayGet(pFieldInfo->internalField, i); SInternalField* pInfo = taosArrayGet(pFieldInfo->internalField, i);
if (pInfo->pArithExprInfo != NULL) { if (pInfo->pArithExprInfo != NULL) {
tExprTreeDestroy(&pInfo->pArithExprInfo->pExpr, NULL); tExprTreeDestroy(pInfo->pArithExprInfo->pExpr, NULL);
SSqlFuncMsg* pFuncMsg = &pInfo->pArithExprInfo->base; SSqlFuncMsg* pFuncMsg = &pInfo->pArithExprInfo->base;
for(int32_t j = 0; j < pFuncMsg->numOfParams; ++j) { for(int32_t j = 0; j < pFuncMsg->numOfParams; ++j) {
...@@ -1080,6 +1087,8 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol ...@@ -1080,6 +1087,8 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol
// set the correct columnIndex index // set the correct columnIndex index
if (pColIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX) { if (pColIndex->columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
pExpr->colInfo.colId = 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) { } else if (pColIndex->columnIndex <= TSDB_UD_COLUMN_INDEX) {
pExpr->colInfo.colId = pColIndex->columnIndex; pExpr->colInfo.colId = pColIndex->columnIndex;
} else { } else {
...@@ -1496,7 +1505,7 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId, int32_t ...@@ -1496,7 +1505,7 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId, int32_t
return false; 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; return true;
} }
......
...@@ -31,6 +31,15 @@ extern "C" { ...@@ -31,6 +31,15 @@ extern "C" {
struct tExprNode; struct tExprNode;
struct SSchema; 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 { enum {
TSQL_NODE_DUMMY = 0x0, TSQL_NODE_DUMMY = 0x0,
TSQL_NODE_EXPR = 0x1, TSQL_NODE_EXPR = 0x1,
...@@ -38,9 +47,6 @@ enum { ...@@ -38,9 +47,6 @@ enum {
TSQL_NODE_VALUE = 0x4, 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 * 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 { ...@@ -52,12 +58,6 @@ typedef struct tQueryInfo {
bool indexed; // indexed columns bool indexed; // indexed columns
} tQueryInfo; } tQueryInfo;
typedef struct SExprTraverseSupp {
__result_filter_fn_t nodeFilterFn;
__do_filter_suppl_fn_t setupInfoFn;
void * pExtInfo;
} SExprTraverseSupp;
typedef struct tExprNode { typedef struct tExprNode {
uint8_t nodeType; uint8_t nodeType;
union { union {
...@@ -74,19 +74,27 @@ typedef struct tExprNode { ...@@ -74,19 +74,27 @@ typedef struct tExprNode {
}; };
} tExprNode; } tExprNode;
void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, void *param, int32_t order, typedef struct SExprTraverseSupp {
char *(*cb)(void *, const char*, int32_t)); __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* exprTreeFromBinary(const void* data, size_t size);
tExprNode* exprTreeFromTableName(const char* tbnameCond); tExprNode* exprTreeFromTableName(const char* tbnameCond);
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree); 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); 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 #ifdef __cplusplus
} }
#endif #endif
......
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TDENGINE_NAME_H #ifndef TDENGINE_NAME_H
#define TDENGINE_NAME_H #define TDENGINE_NAME_H
...@@ -45,6 +60,8 @@ void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable); ...@@ -45,6 +60,8 @@ void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable);
SSchema tGetTableNameColumnSchema(); SSchema tGetTableNameColumnSchema();
SSchema tGetBlockDistColumnSchema();
SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name); SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name);
bool tscValidateTableNameLength(size_t len); bool tscValidateTableNameLength(size_t len);
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
#include "os.h" #include "os.h"
#include "qArithmeticOperator.h"
#include "ttype.h" #include "ttype.h"
#include "tutil.h" #include "tutil.h"
#include "tarithoperator.h"
#define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \ #define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
{ \ { \
......
...@@ -16,18 +16,15 @@ ...@@ -16,18 +16,15 @@
#include "os.h" #include "os.h"
#include "exception.h" #include "exception.h"
#include "qArithmeticOperator.h"
#include "qAst.h"
#include "taosdef.h" #include "taosdef.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tarray.h" #include "tarray.h"
#include "tbuffer.h" #include "tbuffer.h"
#include "tcompare.h" #include "tcompare.h"
#include "tname.h"
#include "tschemautil.h"
#include "tsdb.h" #include "tsdb.h"
#include "tskiplist.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) { static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
if (pLeft->nodeType == TSQL_NODE_COL) { if (pLeft->nodeType == TSQL_NODE_COL) {
...@@ -102,13 +99,15 @@ static void reverseCopy(char* dest, const char* src, int16_t type, int32_t numOf ...@@ -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) { if (pNode == NULL) {
return; return;
} }
if (pNode->nodeType == TSQL_NODE_EXPR) { if (pNode->nodeType == TSQL_NODE_EXPR) {
tExprTreeDestroy(&pNode, fp); doExprTreeDestroy(&pNode, fp);
} else if (pNode->nodeType == TSQL_NODE_VALUE) { } else if (pNode->nodeType == TSQL_NODE_VALUE) {
tVariantDestroy(pNode->pVal); tVariantDestroy(pNode->pVal);
} else if (pNode->nodeType == TSQL_NODE_COL) { } else if (pNode->nodeType == TSQL_NODE_COL) {
...@@ -118,14 +117,14 @@ void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) { ...@@ -118,14 +117,14 @@ void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
free(pNode); free(pNode);
} }
void tExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) { static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
if (*pExpr == NULL) { if (*pExpr == NULL) {
return; return;
} }
if ((*pExpr)->nodeType == TSQL_NODE_EXPR) { if ((*pExpr)->nodeType == TSQL_NODE_EXPR) {
tExprTreeDestroy(&(*pExpr)->_node.pLeft, fp); doExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
tExprTreeDestroy(&(*pExpr)->_node.pRight, fp); doExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
if (fp != NULL) { if (fp != NULL) {
fp((*pExpr)->_node.info); fp((*pExpr)->_node.info);
...@@ -270,8 +269,9 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, ...@@ -270,8 +269,9 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
} }
} }
free(pLeftOutput); tfree(pdata);
free(pRightOutput); tfree(pLeftOutput);
tfree(pRightOutput);
} }
static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) { static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) {
...@@ -342,7 +342,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) { ...@@ -342,7 +342,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
} }
tExprNode* pExpr = exception_calloc(1, sizeof(tExprNode)); 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); pExpr->nodeType = tbufReadUint8(br);
if (pExpr->nodeType == TSQL_NODE_VALUE) { if (pExpr->nodeType == TSQL_NODE_VALUE) {
...@@ -396,7 +396,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) { ...@@ -396,7 +396,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
int32_t anchor = CLEANUP_GET_ANCHOR(); int32_t anchor = CLEANUP_GET_ANCHOR();
tExprNode* expr = exception_calloc(1, sizeof(tExprNode)); 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; expr->nodeType = TSQL_NODE_EXPR;
......
...@@ -39,6 +39,14 @@ SSchema tGetTableNameColumnSchema() { ...@@ -39,6 +39,14 @@ SSchema tGetTableNameColumnSchema() {
tstrncpy(s.name, TSQL_TBNAME_L, TSDB_COL_NAME_LEN); tstrncpy(s.name, TSQL_TBNAME_L, TSDB_COL_NAME_LEN);
return s; 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 tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name) {
SSchema s = {0}; SSchema s = {0};
...@@ -367,6 +375,9 @@ int32_t tNameSetAcctId(SName* dst, const char* acct) { ...@@ -367,6 +375,9 @@ int32_t tNameSetAcctId(SName* dst, const char* acct) {
} }
tstrncpy(dst->acctId, acct, tListLen(dst->acctId)); tstrncpy(dst->acctId, acct, tListLen(dst->acctId));
assert(strlen(dst->acctId) > 0);
return 0; return 0;
} }
...@@ -383,12 +394,14 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) { ...@@ -383,12 +394,14 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
int32_t len = (int32_t)(p - str); int32_t len = (int32_t)(p - str);
// too long account id or too long db name // too long account id or too long db name
if (len >= tListLen(dst->acctId) || len == 0) { if ((len >= tListLen(dst->acctId)) || (len <= 0)) {
return -1; return -1;
} }
memcpy (dst->acctId, str, len); memcpy (dst->acctId, str, len);
dst->acctId[len] = 0; dst->acctId[len] = 0;
assert(strlen(dst->acctId) > 0);
} }
if ((type & T_NAME_DB) == T_NAME_DB) { if ((type & T_NAME_DB) == T_NAME_DB) {
...@@ -404,7 +417,7 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) { ...@@ -404,7 +417,7 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
} }
// too long account id or too long db name // too long account id or too long db name
if (len >= tListLen(dst->dbname) || len == 0) { if ((len >= tListLen(dst->dbname)) || (len <= 0)) {
return -1; return -1;
} }
...@@ -419,7 +432,7 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) { ...@@ -419,7 +432,7 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
int32_t len = (int32_t) strlen(start); int32_t len = (int32_t) strlen(start);
// too long account id or too long db name // too long account id or too long db name
if (len >= tListLen(dst->tname) || len == 0) { if ((len >= tListLen(dst->tname)) || (len <= 0)) {
return -1; return -1;
} }
......
...@@ -235,7 +235,9 @@ do { \ ...@@ -235,7 +235,9 @@ do { \
#define TSDB_MAX_REPLICA 5 #define TSDB_MAX_REPLICA 5
#define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_TBNAME_COLUMN_INDEX (-1)
#define TSDB_BLOCK_DIST_COLUMN_INDEX (-2)
#define TSDB_UD_COLUMN_INDEX (-100) #define TSDB_UD_COLUMN_INDEX (-100)
#define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta
#define TSDB_MIN_CACHE_BLOCK_SIZE 1 #define TSDB_MIN_CACHE_BLOCK_SIZE 1
......
...@@ -113,7 +113,9 @@ void tsdbClearTableCfg(STableCfg *config); ...@@ -113,7 +113,9 @@ void tsdbClearTableCfg(STableCfg *config);
void *tsdbGetTableTagVal(const void *pTable, int32_t colId, int16_t type, int16_t bytes); void *tsdbGetTableTagVal(const void *pTable, int32_t colId, int16_t type, int16_t bytes);
char *tsdbGetTableName(void *pTable); char *tsdbGetTableName(void *pTable);
#define TSDB_TABLEID(_table) ((STableId *)(_table)) #define TSDB_TABLEID(_table) ((STableId*) (_table))
#define TSDB_PREV_ROW 0x1
#define TSDB_NEXT_ROW 0x2
STableCfg *tsdbCreateTableCfgFromMsg(SMDCreateTableMsg *pMsg); STableCfg *tsdbCreateTableCfgFromMsg(SMDCreateTableMsg *pMsg);
...@@ -140,7 +142,6 @@ typedef struct { ...@@ -140,7 +142,6 @@ typedef struct {
int64_t tableTotalDataSize; // In bytes int64_t tableTotalDataSize; // In bytes
int64_t tableTotalDiskSize; // In bytes int64_t tableTotalDiskSize; // In bytes
} STableInfo; } STableInfo;
STableInfo *tsdbGetTableInfo(STsdbRepo *pRepo, STableId tid);
// -- FOR INSERT DATA // -- FOR INSERT DATA
/** /**
...@@ -162,6 +163,7 @@ typedef struct STsdbQueryCond { ...@@ -162,6 +163,7 @@ typedef struct STsdbQueryCond {
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; int32_t numOfCols;
SColumnInfo *colList; SColumnInfo *colList;
bool loadExternalRows; // load external rows or not
} STsdbQueryCond; } STsdbQueryCond;
typedef struct SMemRef { typedef struct SMemRef {
...@@ -233,6 +235,16 @@ SArray *tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle); ...@@ -233,6 +235,16 @@ SArray *tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle);
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList,
void *qinfo, SMemRef *pRef); void *qinfo, SMemRef *pRef);
/**
* get num of rows in mem table
*
* @param pHandle
* @return row size
*/
int64_t tsdbGetNumOfRowsInMemTable(TsdbQueryHandleT* pHandle);
/** /**
* move to next block if exists * move to next block if exists
* *
...@@ -240,6 +252,15 @@ TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond * ...@@ -240,6 +252,15 @@ TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond *
* @return * @return
*/ */
bool tsdbNextDataBlock(TsdbQueryHandleT *pQueryHandle); 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 * Get current data block information
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#ifndef TDENGINE_TTOKENDEF_H #ifndef TDENGINE_TTOKENDEF_H
#define TDENGINE_TTOKENDEF_H #define TDENGINE_TTOKENDEF_H
#define TK_ID 1 #define TK_ID 1
#define TK_BOOL 2 #define TK_BOOL 2
#define TK_TINYINT 3 #define TK_TINYINT 3
...@@ -127,104 +128,104 @@ ...@@ -127,104 +128,104 @@
#define TK_SELECT 109 #define TK_SELECT 109
#define TK_UNION 110 #define TK_UNION 110
#define TK_ALL 111 #define TK_ALL 111
#define TK_FROM 112 #define TK_DISTINCT 112
#define TK_VARIABLE 113 #define TK_FROM 113
#define TK_INTERVAL 114 #define TK_VARIABLE 114
#define TK_FILL 115 #define TK_INTERVAL 115
#define TK_SLIDING 116 #define TK_FILL 116
#define TK_ORDER 117 #define TK_SLIDING 117
#define TK_BY 118 #define TK_ORDER 118
#define TK_ASC 119 #define TK_BY 119
#define TK_DESC 120 #define TK_ASC 120
#define TK_GROUP 121 #define TK_DESC 121
#define TK_HAVING 122 #define TK_GROUP 122
#define TK_LIMIT 123 #define TK_HAVING 123
#define TK_OFFSET 124 #define TK_LIMIT 124
#define TK_SLIMIT 125 #define TK_OFFSET 125
#define TK_SOFFSET 126 #define TK_SLIMIT 126
#define TK_WHERE 127 #define TK_SOFFSET 127
#define TK_NOW 128 #define TK_WHERE 128
#define TK_RESET 129 #define TK_NOW 129
#define TK_QUERY 130 #define TK_RESET 130
#define TK_ADD 131 #define TK_QUERY 131
#define TK_COLUMN 132 #define TK_ADD 132
#define TK_TAG 133 #define TK_COLUMN 133
#define TK_CHANGE 134 #define TK_TAG 134
#define TK_SET 135 #define TK_CHANGE 135
#define TK_KILL 136 #define TK_SET 136
#define TK_CONNECTION 137 #define TK_KILL 137
#define TK_STREAM 138 #define TK_CONNECTION 138
#define TK_COLON 139 #define TK_STREAM 139
#define TK_ABORT 140 #define TK_COLON 140
#define TK_AFTER 141 #define TK_ABORT 141
#define TK_ATTACH 142 #define TK_AFTER 142
#define TK_BEFORE 143 #define TK_ATTACH 143
#define TK_BEGIN 144 #define TK_BEFORE 144
#define TK_CASCADE 145 #define TK_BEGIN 145
#define TK_CLUSTER 146 #define TK_CASCADE 146
#define TK_CONFLICT 147 #define TK_CLUSTER 147
#define TK_COPY 148 #define TK_CONFLICT 148
#define TK_DEFERRED 149 #define TK_COPY 149
#define TK_DELIMITERS 150 #define TK_DEFERRED 150
#define TK_DETACH 151 #define TK_DELIMITERS 151
#define TK_EACH 152 #define TK_DETACH 152
#define TK_END 153 #define TK_EACH 153
#define TK_EXPLAIN 154 #define TK_END 154
#define TK_FAIL 155 #define TK_EXPLAIN 155
#define TK_FOR 156 #define TK_FAIL 156
#define TK_IGNORE 157 #define TK_FOR 157
#define TK_IMMEDIATE 158 #define TK_IGNORE 158
#define TK_INITIALLY 159 #define TK_IMMEDIATE 159
#define TK_INSTEAD 160 #define TK_INITIALLY 160
#define TK_MATCH 161 #define TK_INSTEAD 161
#define TK_KEY 162 #define TK_MATCH 162
#define TK_OF 163 #define TK_KEY 163
#define TK_RAISE 164 #define TK_OF 164
#define TK_REPLACE 165 #define TK_RAISE 165
#define TK_RESTRICT 166 #define TK_REPLACE 166
#define TK_ROW 167 #define TK_RESTRICT 167
#define TK_STATEMENT 168 #define TK_ROW 168
#define TK_TRIGGER 169 #define TK_STATEMENT 169
#define TK_VIEW 170 #define TK_TRIGGER 170
#define TK_COUNT 171 #define TK_VIEW 171
#define TK_SUM 172 #define TK_COUNT 172
#define TK_AVG 173 #define TK_SUM 173
#define TK_MIN 174 #define TK_AVG 174
#define TK_MAX 175 #define TK_MIN 175
#define TK_FIRST 176 #define TK_MAX 176
#define TK_LAST 177 #define TK_FIRST 177
#define TK_TOP 178 #define TK_LAST 178
#define TK_BOTTOM 179 #define TK_TOP 179
#define TK_STDDEV 180 #define TK_BOTTOM 180
#define TK_PERCENTILE 181 #define TK_STDDEV 181
#define TK_APERCENTILE 182 #define TK_PERCENTILE 182
#define TK_LEASTSQUARES 183 #define TK_APERCENTILE 183
#define TK_HISTOGRAM 184 #define TK_LEASTSQUARES 184
#define TK_DIFF 185 #define TK_HISTOGRAM 185
#define TK_SPREAD 186 #define TK_DIFF 186
#define TK_TWA 187 #define TK_SPREAD 187
#define TK_INTERP 188 #define TK_TWA 188
#define TK_LAST_ROW 189 #define TK_INTERP 189
#define TK_RATE 190 #define TK_LAST_ROW 190
#define TK_IRATE 191 #define TK_RATE 191
#define TK_SUM_RATE 192 #define TK_IRATE 192
#define TK_SUM_IRATE 193 #define TK_SUM_RATE 193
#define TK_AVG_RATE 194 #define TK_SUM_IRATE 194
#define TK_AVG_IRATE 195 #define TK_AVG_RATE 195
#define TK_TBID 196 #define TK_AVG_IRATE 196
#define TK_SEMI 197 #define TK_TBID 197
#define TK_NONE 198 #define TK_SEMI 198
#define TK_PREV 199 #define TK_NONE 199
#define TK_LINEAR 200 #define TK_PREV 200
#define TK_IMPORT 201 #define TK_LINEAR 201
#define TK_METRIC 202 #define TK_IMPORT 202
#define TK_TBNAME 203 #define TK_METRIC 203
#define TK_JOIN 204 #define TK_TBNAME 204
#define TK_METRICS 205 #define TK_JOIN 205
#define TK_INSERT 206 #define TK_METRICS 206
#define TK_INTO 207 #define TK_INSERT 207
#define TK_VALUES 208 #define TK_INTO 208
#define TK_VALUES 209
#define TK_SPACE 300 #define TK_SPACE 300
......
...@@ -45,6 +45,7 @@ typedef struct tstr { ...@@ -45,6 +45,7 @@ typedef struct tstr {
case TSDB_DATA_TYPE_USMALLINT: \ case TSDB_DATA_TYPE_USMALLINT: \
(_v) = (_finalType)GET_UINT16_VAL(_data); \ (_v) = (_finalType)GET_UINT16_VAL(_data); \
break; \ break; \
case TSDB_DATA_TYPE_TIMESTAMP:\
case TSDB_DATA_TYPE_BIGINT: \ case TSDB_DATA_TYPE_BIGINT: \
(_v) = (_finalType)(GET_INT64_VAL(_data)); \ (_v) = (_finalType)(GET_INT64_VAL(_data)); \
break; \ break; \
...@@ -66,6 +67,43 @@ typedef struct tstr { ...@@ -66,6 +67,43 @@ typedef struct tstr {
} \ } \
} while (0) } 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_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_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) #define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE)
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
*/ */
int64_t user_mktime64(const unsigned int year0, const unsigned int mon0, int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
const unsigned int day, const unsigned int hour, 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; unsigned int mon = mon0, year = year0;
...@@ -61,12 +61,6 @@ int64_t user_mktime64(const unsigned int year0, const unsigned int mon0, ...@@ -61,12 +61,6 @@ int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
res = res*24; res = res*24;
res = ((res + hour) * 60 + min) * 60 + sec; res = ((res + hour) * 60 + min) * 60 + sec;
#ifdef _MSC_VER
#if _MSC_VER >= 1900
int64_t timezone = _timezone;
#endif
#endif
return (res + timezone); return (res + timezone);
} }
...@@ -219,7 +213,7 @@ int32_t parseTimeWithTz(char* timestr, int64_t* time, int32_t timePrec) { ...@@ -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 */ /* mktime will be affected by TZ, set by using taos_options */
#ifdef WINDOWS #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); //int64_t seconds = gmtime(&tm);
#else #else
int64_t seconds = timegm(&tm); int64_t seconds = timegm(&tm);
...@@ -276,7 +270,13 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) { ...@@ -276,7 +270,13 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
return -1; 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; int64_t fraction = 0;
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef TDENGINE_TSQLFUNCTION_H #ifndef TDENGINE_QAGGMAIN_H
#define TDENGINE_TSQLFUNCTION_H #define TDENGINE_QAGGMAIN_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -97,11 +97,7 @@ 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 ',' // to denote the output area has data, not null value
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG) #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_ASC_FORWARD_STEP 1
#define QUERY_DESC_FORWARD_STEP -1 #define QUERY_DESC_FORWARD_STEP -1
...@@ -153,7 +149,7 @@ typedef struct SResultRowCellInfo { ...@@ -153,7 +149,7 @@ typedef struct SResultRowCellInfo {
typedef struct SPoint1 { typedef struct SPoint1 {
int64_t key; int64_t key;
double val; union{double val; char* ptr;};
} SPoint1; } SPoint1;
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowCellInfo))) #define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowCellInfo)))
...@@ -279,4 +275,4 @@ static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, uint32_t b ...@@ -279,4 +275,4 @@ static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, uint32_t b
} }
#endif #endif
#endif // TDENGINE_TSQLFUNCTION_H #endif // TDENGINE_QAGGMAIN_H
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "os.h" #include "os.h"
#include "hash.h" #include "hash.h"
#include "qAggMain.h"
#include "qFill.h" #include "qFill.h"
#include "qResultbuf.h" #include "qResultbuf.h"
#include "qSqlparser.h" #include "qSqlparser.h"
...@@ -27,7 +28,6 @@ ...@@ -27,7 +28,6 @@
#include "tarray.h" #include "tarray.h"
#include "tlockfree.h" #include "tlockfree.h"
#include "tsdb.h" #include "tsdb.h"
#include "tsqlfunction.h"
struct SColumnFilterElem; struct SColumnFilterElem;
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type); typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
...@@ -169,6 +169,7 @@ typedef struct SQuery { ...@@ -169,6 +169,7 @@ typedef struct SQuery {
int32_t pos; int32_t pos;
tFilePage** sdata; tFilePage** sdata;
STableQueryInfo* current; 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; SSingleColumnFilterInfo* pFilterInfo;
...@@ -194,6 +195,7 @@ typedef struct SQueryRuntimeEnv { ...@@ -194,6 +195,7 @@ typedef struct SQueryRuntimeEnv {
bool hasTagResults; // if there are tag values in final result or not bool hasTagResults; // if there are tag values in final result or not
bool timeWindowInterpo;// if the time window start/end required interpolation bool timeWindowInterpo;// if the time window start/end required interpolation
bool queryWindowIdentical; // all query time windows are identical for all tables in one group 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 interBufSize; // intermediate buffer sizse
int32_t prevGroupId; // previous executed group id int32_t prevGroupId; // previous executed group id
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
......
...@@ -86,7 +86,7 @@ bool taosFillHasMoreResults(SFillInfo* pFillInfo); ...@@ -86,7 +86,7 @@ bool taosFillHasMoreResults(SFillInfo* pFillInfo);
int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows); 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); int64_t taosFillResultDataBlock(SFillInfo* pFillInfo, tFilePage** output, int32_t capacity);
......
...@@ -200,6 +200,7 @@ typedef struct tSQLExpr { ...@@ -200,6 +200,7 @@ typedef struct tSQLExpr {
typedef struct tSqlExprItem { typedef struct tSqlExprItem {
tSQLExpr *pNode; // The list of expressions tSQLExpr *pNode; // The list of expressions
char * aliasName; // alias name, null-terminated string char * aliasName; // alias name, null-terminated string
bool distinct;
} tSqlExprItem; } tSqlExprItem;
// todo refactor by using SArray // todo refactor by using SArray
...@@ -232,7 +233,7 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType); ...@@ -232,7 +233,7 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType);
void tSqlExprDestroy(tSQLExpr *pExpr); 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); void tSqlExprListDestroy(tSQLExprList *pList);
......
...@@ -161,7 +161,7 @@ cmd ::= ALTER DNODE ids(X) ids(Y). { setDCLSQLElems(pInfo, TSDB_SQL ...@@ -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 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). { 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 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) 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);} 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;} ...@@ -186,7 +186,7 @@ ifnotexists(X) ::= . { X.n = 0;}
cmd ::= CREATE DNODE ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &X);} cmd ::= CREATE DNODE ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &X);}
cmd ::= CREATE ACCOUNT ids(X) PASS ids(Y) acct_optr(Z). cmd ::= CREATE ACCOUNT ids(X) PASS ids(Y) acct_optr(Z).
{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &X, &Y, &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);} cmd ::= CREATE USER ids(X) PASS ids(Y). { setCreateUserSql(pInfo, &X, &Y);}
pps(Y) ::= . { Y.n = 0; } pps(Y) ::= . { Y.n = 0; }
...@@ -457,13 +457,13 @@ select(A) ::= SELECT(T) selcollist(W). { ...@@ -457,13 +457,13 @@ select(A) ::= SELECT(T) selcollist(W). {
%destructor sclp {tSqlExprListDestroy($$);} %destructor sclp {tSqlExprListDestroy($$);}
sclp(A) ::= selcollist(X) COMMA. {A = X;} sclp(A) ::= selcollist(X) COMMA. {A = X;}
sclp(A) ::= . {A = 0;} sclp(A) ::= . {A = 0;}
selcollist(A) ::= sclp(P) expr(X) as(Y). { selcollist(A) ::= sclp(P) distinct(Z) expr(X) as(Y). {
A = tSqlExprListAppend(P, X, Y.n?&Y:0); A = tSqlExprListAppend(P, X, Z.n? &Z:0, Y.n?&Y:0);
} }
selcollist(A) ::= sclp(P) STAR. { selcollist(A) ::= sclp(P) STAR. {
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL); tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
A = tSqlExprListAppend(P, pNode, 0); A = tSqlExprListAppend(P, pNode, 0, 0);
} }
// An option "AS <id>" phrase that can follow one of the expressions that // An option "AS <id>" phrase that can follow one of the expressions that
...@@ -474,6 +474,10 @@ as(X) ::= AS ids(Y). { X = Y; } ...@@ -474,6 +474,10 @@ as(X) ::= AS ids(Y). { X = Y; }
as(X) ::= ids(Y). { X = Y; } as(X) ::= ids(Y). { X = Y; }
as(X) ::= . { X.n = 0; } as(X) ::= . { X.n = 0; }
%type distinct {SStrToken}
distinct(X) ::= DISTINCT(Y). { X = Y; }
distinct(X) ::= . { X.n = 0;}
// A complete FROM clause. // A complete FROM clause.
%type from {SArray*} %type from {SArray*}
// current not support query from no-table // 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, ...@@ -681,8 +685,8 @@ expr(A) ::= expr(X) IN LP exprlist(Y) RP. {A = tSqlExprCreate(X, (tSQLExpr*)Y,
%type expritem {tSQLExpr*} %type expritem {tSQLExpr*}
%destructor expritem {tSqlExprDestroy($$);} %destructor expritem {tSqlExprDestroy($$);}
exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSqlExprListAppend(X,Y,0);} exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSqlExprListAppend(X,Y,0, 0);}
exprlist(A) ::= expritem(X). {A = tSqlExprListAppend(0,X,0);} exprlist(A) ::= expritem(X). {A = tSqlExprListAppend(0,X,0, 0);}
expritem(A) ::= expr(X). {A = X;} expritem(A) ::= expr(X). {A = X;}
expritem(A) ::= . {A = 0;} expritem(A) ::= . {A = 0;}
......
...@@ -14,17 +14,17 @@ ...@@ -14,17 +14,17 @@
*/ */
#include "os.h" #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 "qFill.h"
#include "qHistogram.h" #include "qHistogram.h"
#include "qPercentile.h" #include "qPercentile.h"
#include "qTsbuf.h" #include "qTsbuf.h"
#include "taosdef.h"
#include "taosmsg.h"
#include "queryLog.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_LIST(x) (((char *)((x)->aInputElemBuf)) + ((x)->startOffset) * ((x)->inputBytes))
#define GET_INPUT_DATA(x, y) (GET_INPUT_DATA_LIST(x) + (y) * (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) { ...@@ -3776,89 +3776,67 @@ void twa_function_finalizer(SQLFunctionCtx *pCtx) {
* *
* @param 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);
if (pCtx->size == 1) { static void interp_function_impl(SQLFunctionCtx *pCtx) {
char *pData = GET_INPUT_DATA_LIST(pCtx); int32_t type = (int32_t) pCtx->param[2].i64;
assignVal(pCtx->aOutputBuf, pData, pCtx->inputBytes, pCtx->inputType); if (type == TSDB_FILL_NONE) {
} 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
return; return;
} }
if (pInfo->primaryCol == 1) { if (pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP) {
*(TSKEY *) pCtx->aOutputBuf = pInfo->ts; *(TSKEY *) pCtx->aOutputBuf = pCtx->nStartQueryTimestamp;
} else { } else {
if (pInfo->type == TSDB_FILL_NULL) { if (pCtx->start.key == INT64_MIN) {
if (pCtx->outputType == TSDB_DATA_TYPE_BINARY || pCtx->outputType == TSDB_DATA_TYPE_NCHAR) { assert(pCtx->end.key == INT64_MIN);
setVardataNull(pCtx->aOutputBuf, pCtx->outputType); return;
} else {
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
} }
SET_VAL(pCtx, pCtx->size, 1); if (type == TSDB_FILL_NULL) {
} else if (pInfo->type == TSDB_FILL_SET_VALUE) { setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
} else if (type == TSDB_FILL_SET_VALUE) {
tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true); tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true);
} else if (pInfo->type == TSDB_FILL_PREV) { } else if (type == TSDB_FILL_PREV) {
char *data = GET_INPUT_DATA(pCtx, 0); if (IS_NUMERIC_TYPE(pCtx->inputType) || pCtx->inputType == TSDB_DATA_TYPE_BOOL) {
assignVal(pCtx->aOutputBuf, data, pCtx->outputBytes, pCtx->outputType); SET_TYPED_DATA(pCtx->aOutputBuf, pCtx->inputType, pCtx->start.val);
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 { } else {
taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point); assignVal(pCtx->aOutputBuf, pCtx->start.ptr, pCtx->outputBytes, pCtx->inputType);
} }
} else if (srcType == TSDB_DATA_TYPE_FLOAT) { } else if (type == TSDB_FILL_LINEAR) {
point1.val = data1; SPoint point1 = {.key = pCtx->start.key, .val = &pCtx->start.val};
point2.val = data2; SPoint point2 = {.key = pCtx->end.key, .val = &pCtx->end.val};
SPoint point = {.key = pCtx->nStartQueryTimestamp, .val = pCtx->aOutputBuf};
if (isNull(data1, srcType) || isNull(data2, srcType)) { 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); setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} else { } else {
taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point); taosGetLinearInterpolationVal(&point, pCtx->outputType, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
} }
} else {
if (srcType == TSDB_DATA_TYPE_BINARY || srcType == TSDB_DATA_TYPE_NCHAR) {
setVardataNull(pCtx->aOutputBuf, pCtx->inputType);
} else { } else {
setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes); setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} }
} }
} }
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);
} }
SET_VAL(pCtx, pCtx->size, 1);
} }
static bool ts_comp_function_setup(SQLFunctionCtx *pCtx) { static bool ts_comp_function_setup(SQLFunctionCtx *pCtx) {
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "exception.h" #include "exception.h"
#include "hash.h" #include "hash.h"
#include "qAst.h" #include "texpr.h"
#include "qExecutor.h" #include "qExecutor.h"
#include "qResultbuf.h" #include "qResultbuf.h"
#include "qUtil.h" #include "qUtil.h"
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "queryLog.h" #include "queryLog.h"
#include "tlosertree.h" #include "tlosertree.h"
#include "ttype.h" #include "ttype.h"
#include "tcompare.h"
#define MAX_ROWS_PER_RESBUF_PAGE ((1u<<12) - 1) #define MAX_ROWS_PER_RESBUF_PAGE ((1u<<12) - 1)
...@@ -90,6 +91,13 @@ typedef struct { ...@@ -90,6 +91,13 @@ typedef struct {
STSCursor cur; STSCursor cur;
} SQueryStatusInfo; } SQueryStatusInfo;
typedef struct {
SArray *dataBlockInfos;
int64_t firstSeekTimeUs;
int64_t numOfRowsInMemTable;
char *result;
} STableBlockDist;
#if 0 #if 0
static UNUSED_FUNC void *u_malloc (size_t __size) { static UNUSED_FUNC void *u_malloc (size_t __size) {
uint32_t v = rand(); uint32_t v = rand();
...@@ -408,7 +416,7 @@ static bool isTopBottomQuery(SQuery *pQuery) { ...@@ -408,7 +416,7 @@ static bool isTopBottomQuery(SQuery *pQuery) {
static bool timeWindowInterpoRequired(SQuery *pQuery) { static bool timeWindowInterpoRequired(SQuery *pQuery) {
for(int32_t i = 0; i < pQuery->numOfOutput; ++i) { for(int32_t i = 0; i < pQuery->numOfOutput; ++i) {
int32_t functionId = pQuery->pExpr1[i].base.functionId; int32_t functionId = pQuery->pExpr1[i].base.functionId;
if (functionId == TSDB_FUNC_TWA) { if (functionId == TSDB_FUNC_TWA || functionId == TSDB_FUNC_INTERP) {
return true; return true;
} }
} }
...@@ -818,6 +826,7 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo ...@@ -818,6 +826,7 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo
return num; 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) { static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow *pWin, int32_t offset, int32_t forwardStep, TSKEY *tsCol, int32_t numOfTotal) {
SQuery *pQuery = pRuntimeEnv->pQuery; SQuery *pQuery = pRuntimeEnv->pQuery;
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx; SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
...@@ -825,8 +834,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow ...@@ -825,8 +834,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow
bool hasPrev = pCtx[0].preAggVals.isSet; bool hasPrev = pCtx[0].preAggVals.isSet;
for (int32_t k = 0; k < pQuery->numOfOutput; ++k) { for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
pCtx[k].nStartQueryTimestamp = pWin->skey;
pCtx[k].size = forwardStep; pCtx[k].size = forwardStep;
pCtx[k].nStartQueryTimestamp = pWin->skey;
pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? offset : offset - (forwardStep - 1); pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? offset : offset - (forwardStep - 1);
int32_t functionId = pQuery->pExpr1[k].base.functionId; int32_t functionId = pQuery->pExpr1[k].base.functionId;
...@@ -1029,7 +1038,8 @@ static void setNotInterpoWindowKey(SQLFunctionCtx* pCtx, int32_t numOfOutput, in ...@@ -1029,7 +1038,8 @@ static void setNotInterpoWindowKey(SQLFunctionCtx* pCtx, int32_t numOfOutput, in
} }
// window start key interpolation // 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; SQuery* pQuery = pRuntimeEnv->pQuery;
TSKEY curTs = tsCols[pos]; TSKEY curTs = tsCols[pos];
...@@ -1118,6 +1128,8 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc ...@@ -1118,6 +1128,8 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
assert(pDataBlock != NULL); assert(pDataBlock != NULL);
SQuery* pQuery = pRuntimeEnv->pQuery; SQuery* pQuery = pRuntimeEnv->pQuery;
int32_t fillType = pQuery->fillType;
int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order); int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, 0); SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, 0);
...@@ -1126,7 +1138,7 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc ...@@ -1126,7 +1138,7 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP); bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP);
if (!done) { if (!done) {
int32_t startRowIndex = startPos; 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) { if (interp) {
setResultRowInterpo(pResult, RESULT_ROW_START_INTERP); setResultRowInterpo(pResult, RESULT_ROW_START_INTERP);
} }
...@@ -1134,6 +1146,12 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc ...@@ -1134,6 +1146,12 @@ static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBloc
setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP); 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); done = resultRowInterpolated(pResult, RESULT_ROW_END_INTERP);
if (!done) { if (!done) {
int32_t endRowIndex = startPos + (forwardStep - 1) * step; int32_t endRowIndex = startPos + (forwardStep - 1) * step;
...@@ -1259,7 +1277,7 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis * ...@@ -1259,7 +1277,7 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
for (int32_t k = 0; k < pQuery->numOfOutput; ++k) { for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
int32_t functionId = pQuery->pExpr1[k].base.functionId; int32_t functionId = pQuery->pExpr1[k].base.functionId;
if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) { if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
pCtx[k].nStartQueryTimestamp = pDataBlockInfo->window.skey; pCtx[k].nStartQueryTimestamp = pQuery->window.skey;
aAggs[functionId].xFunction(&pCtx[k]); aAggs[functionId].xFunction(&pCtx[k]);
} }
} }
...@@ -1423,18 +1441,20 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx ...@@ -1423,18 +1441,20 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
return true; return true;
} }
void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDataBlock, TSKEY prevTs, int32_t prevRowIndex, TSKEY curTs, int32_t curRowIndex, TSKEY windowKey, int32_t type) { void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv *pRuntimeEnv, SArray *pDataBlock, TSKEY prevTs,
SQuery* pQuery = pRuntimeEnv->pQuery; 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) { for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
int32_t functionId = pQuery->pExpr1[k].base.functionId; 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; pRuntimeEnv->pCtx[k].start.key = INT64_MIN;
continue; continue;
} }
SColIndex* pColIndex = &pQuery->pExpr1[k].base.colInfo; SColIndex * pColIndex = &pQuery->pExpr1[k].base.colInfo;
int16_t index = pColIndex->colIndex; int16_t index = pColIndex->colIndex;
SColumnInfoData* pColInfo = taosArrayGet(pDataBlock, index); SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, index);
assert(pColInfo->info.colId == pColIndex->colId && curTs != windowKey); assert(pColInfo->info.colId == pColIndex->colId && curTs != windowKey);
double v1 = 0, v2 = 0, v = 0; double v1 = 0, v2 = 0, v = 0;
...@@ -1450,7 +1470,9 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa ...@@ -1450,7 +1470,9 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa
SPoint point1 = (SPoint){.key = prevTs, .val = &v1}; SPoint point1 = (SPoint){.key = prevTs, .val = &v1};
SPoint point2 = (SPoint){.key = curTs, .val = &v2}; SPoint point2 = (SPoint){.key = curTs, .val = &v2};
SPoint point = (SPoint){.key = windowKey, .val = &v}; SPoint point = (SPoint){.key = windowKey, .val = &v};
taosGetLinearInterpolationVal(TSDB_DATA_TYPE_DOUBLE, &point1, &point2, &point);
if (functionId == TSDB_FUNC_TWA) {
taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
if (type == RESULT_ROW_START_INTERP) { if (type == RESULT_ROW_START_INTERP) {
pRuntimeEnv->pCtx[k].start.key = point.key; pRuntimeEnv->pCtx[k].start.key = point.key;
...@@ -1459,6 +1481,15 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa ...@@ -1459,6 +1481,15 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa
pRuntimeEnv->pCtx[k].end.key = point.key; pRuntimeEnv->pCtx[k].end.key = point.key;
pRuntimeEnv->pCtx[k].end.val = v; pRuntimeEnv->pCtx[k].end.val = v;
} }
} else {
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 ...@@ -1796,13 +1827,7 @@ void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY
pCtx->preAggVals.statis.max = pBlockInfo->window.ekey; pCtx->preAggVals.statis.max = pBlockInfo->window.ekey;
} }
} else if (functionId == TSDB_FUNC_INTERP) { } else if (functionId == TSDB_FUNC_INTERP) {
SResultRowCellInfo* pInfo = GET_RES_INFO(pCtx); pCtx->param[2].i64 = (int8_t) pQuery->fillType;
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);
if (pQuery->fillVal != NULL) { if (pQuery->fillVal != NULL) {
if (isNull((const char*) &pQuery->fillVal[colIndex], pCtx->inputType)) { if (isNull((const char*) &pQuery->fillVal[colIndex], pCtx->inputType)) {
pCtx->param[1].nType = TSDB_DATA_TYPE_NULL; pCtx->param[1].nType = TSDB_DATA_TYPE_NULL;
...@@ -1908,6 +1933,10 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order ...@@ -1908,6 +1933,10 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
if (pIndex->colId == TSDB_TBNAME_COLUMN_INDEX) { // todo refactor if (pIndex->colId == TSDB_TBNAME_COLUMN_INDEX) { // todo refactor
SSchema s = tGetTableNameColumnSchema(); 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->inputBytes = s.bytes;
pCtx->inputType = s.type; pCtx->inputType = s.type;
} else { } else {
...@@ -2579,7 +2608,6 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo * pW ...@@ -2579,7 +2608,6 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo * pW
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf > 0) { if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf > 0) {
*status = BLK_DATA_ALL_NEEDED; *status = BLK_DATA_ALL_NEEDED;
} else { // check if this data block is required to load } else { // check if this data block is required to load
// Calculate all time windows that are overlapping or contain current data block. // 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 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)) { if (QUERY_IS_INTERVAL_QUERY(pQuery) && overlapWithTimeWindow(pQuery, pBlockInfo)) {
...@@ -2818,6 +2846,10 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) { ...@@ -2818,6 +2846,10 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
while (tsdbNextDataBlock(pQueryHandle)) { while (tsdbNextDataBlock(pQueryHandle)) {
summary->totalBlocks += 1; summary->totalBlocks += 1;
if (IS_MASTER_SCAN(pRuntimeEnv)) {
pQuery->numOfCheckedBlocks += 1;
}
if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) { if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED); longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
} }
...@@ -3557,7 +3589,7 @@ void setQueryStatus(SQuery *pQuery, int8_t status) { ...@@ -3557,7 +3589,7 @@ void setQueryStatus(SQuery *pQuery, int8_t status) {
} }
} }
bool needScanDataBlocksAgain(SQueryRuntimeEnv *pRuntimeEnv) { bool needRepeatScan(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery *pQuery = pRuntimeEnv->pQuery; SQuery *pQuery = pRuntimeEnv->pQuery;
bool toContinue = false; bool toContinue = false;
...@@ -3684,6 +3716,67 @@ static void restoreTimeWindow(STableGroupInfo* pTableGroupInfo, STsdbQueryCond* ...@@ -3684,6 +3716,67 @@ static void restoreTimeWindow(STableGroupInfo* pTableGroupInfo, STsdbQueryCond*
pKeyInfo->lastKey = pCond->twindow.skey; 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) { void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
SQInfo *pQInfo = (SQInfo *) GET_QINFO_ADDR(pRuntimeEnv); SQInfo *pQInfo = (SQInfo *) GET_QINFO_ADDR(pRuntimeEnv);
SQuery *pQuery = pRuntimeEnv->pQuery; SQuery *pQuery = pRuntimeEnv->pQuery;
...@@ -3711,7 +3804,7 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) { ...@@ -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 // restore the status code and jump out of loop
if (pRuntimeEnv->scanFlag == REPEAT_SCAN) { if (pRuntimeEnv->scanFlag == REPEAT_SCAN) {
pQuery->status = qstatus.status; pQuery->status = qstatus.status;
...@@ -3737,17 +3830,9 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) { ...@@ -3737,17 +3830,9 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
qDebug("QInfo:%p start to repeat scan data blocks due to query func required, qrange:%"PRId64"-%"PRId64, pQInfo, qDebug("QInfo:%p start to repeat scan data blocks due to query func required, qrange:%"PRId64"-%"PRId64, pQInfo,
cond.twindow.skey, cond.twindow.ekey); 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); setEnvBeforeReverseScan(pRuntimeEnv, &qstatus);
// reverse scan from current position // reverse scan from current position
...@@ -3755,6 +3840,9 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) { ...@@ -3755,6 +3840,9 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
doScanAllDataBlocks(pRuntimeEnv); doScanAllDataBlocks(pRuntimeEnv);
clearEnvAfterReverseScan(pRuntimeEnv, &qstatus); clearEnvAfterReverseScan(pRuntimeEnv, &qstatus);
}
handleInterpolationQuery(pQInfo);
} }
void finalizeQueryResult(SQueryRuntimeEnv *pRuntimeEnv) { void finalizeQueryResult(SQueryRuntimeEnv *pRuntimeEnv) {
...@@ -4377,7 +4465,59 @@ static void updateOffsetVal(SQueryRuntimeEnv *pRuntimeEnv, SDataBlockInfo *pBloc ...@@ -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), 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); 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) { void skipBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery *pQuery = pRuntimeEnv->pQuery; SQuery *pQuery = pRuntimeEnv->pQuery;
...@@ -4891,6 +5031,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) { ...@@ -4891,6 +5031,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
.order = pQuery->order.order, .order = pQuery->order.order,
.colList = pQuery->colList, .colList = pQuery->colList,
.numOfCols = pQuery->numOfCols, .numOfCols = pQuery->numOfCols,
.loadExternalRows = false,
}; };
// todo refactor // todo refactor
...@@ -4985,6 +5126,7 @@ STsdbQueryCond createTsdbQueryCond(SQuery* pQuery, STimeWindow* win) { ...@@ -4985,6 +5126,7 @@ STsdbQueryCond createTsdbQueryCond(SQuery* pQuery, STimeWindow* win) {
.colList = pQuery->colList, .colList = pQuery->colList,
.order = pQuery->order.order, .order = pQuery->order.order,
.numOfCols = pQuery->numOfCols, .numOfCols = pQuery->numOfCols,
.loadExternalRows = false,
}; };
TIME_WINDOW_COPY(cond.twindow, *win); TIME_WINDOW_COPY(cond.twindow, *win);
...@@ -5728,15 +5870,13 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) { ...@@ -5728,15 +5870,13 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
} }
scanOneTableDataBlocks(pRuntimeEnv, newStartKey); scanOneTableDataBlocks(pRuntimeEnv, newStartKey);
assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
finalizeQueryResult(pRuntimeEnv); finalizeQueryResult(pRuntimeEnv);
// skip offset result rows // skip offset result rows
pQuery->rec.rows = 0; pQuery->rec.rows = 0;
// not fill or no result generated during this query // 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 // all data scanned, the group by normal column can return
int32_t numOfClosed = numOfClosedResultRows(&pRuntimeEnv->windowResInfo); int32_t numOfClosed = numOfClosedResultRows(&pRuntimeEnv->windowResInfo);
if (pQuery->limit.offset > numOfClosed) { if (pQuery->limit.offset > numOfClosed) {
...@@ -5771,7 +5911,7 @@ static void tableQueryImpl(SQInfo *pQInfo) { ...@@ -5771,7 +5911,7 @@ static void tableQueryImpl(SQInfo *pQInfo) {
SQuery * pQuery = pRuntimeEnv->pQuery; SQuery * pQuery = pRuntimeEnv->pQuery;
if (hasNotReturnedResults(pRuntimeEnv)) { 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 * 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. * So, we do keep in this procedure instead of launching retrieve procedure for next results.
...@@ -5830,6 +5970,58 @@ static void tableQueryImpl(SQInfo *pQInfo) { ...@@ -5830,6 +5970,58 @@ static void tableQueryImpl(SQInfo *pQInfo) {
pRuntimeEnv->summary.elapsedTime += (taosGetTimestampUs() - st); pRuntimeEnv->summary.elapsedTime += (taosGetTimestampUs() - st);
assert(pQInfo->tableqinfoGroupInfo.numOfTables == 1); 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) { static void stableQueryImpl(SQInfo *pQInfo) {
SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv; SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
...@@ -5857,8 +6049,11 @@ static int32_t getColumnIndexInSource(SQueryTableMsg *pQueryMsg, SSqlFuncMsg *pE ...@@ -5857,8 +6049,11 @@ static int32_t getColumnIndexInSource(SQueryTableMsg *pQueryMsg, SSqlFuncMsg *pE
if (TSDB_COL_IS_TAG(pExprMsg->colInfo.flag)) { if (TSDB_COL_IS_TAG(pExprMsg->colInfo.flag)) {
if (pExprMsg->colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { if (pExprMsg->colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
return 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) { while(j < pQueryMsg->numOfTags) {
if (pExprMsg->colInfo.colId == pTagCols[j].colId) { if (pExprMsg->colInfo.colId == pTagCols[j].colId) {
return j; return j;
...@@ -6314,6 +6509,10 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num ...@@ -6314,6 +6509,10 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num
SSchema s = tGetTableNameColumnSchema(); SSchema s = tGetTableNameColumnSchema();
type = s.type; type = s.type;
bytes = s.bytes; 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) { } else if (pExprs[i].base.colInfo.colId <= TSDB_UD_COLUMN_INDEX) {
// it is a user-defined constant value column // it is a user-defined constant value column
assert(pExprs[i].base.functionId == TSDB_FUNC_PRJ); assert(pExprs[i].base.functionId == TSDB_FUNC_PRJ);
...@@ -6327,7 +6526,7 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num ...@@ -6327,7 +6526,7 @@ static int32_t createQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t num
} else { } else {
int32_t j = getColumnIndexInSource(pQueryMsg, &pExprs[i].base, pTagCols); int32_t j = getColumnIndexInSource(pQueryMsg, &pExprs[i].base, pTagCols);
if (TSDB_COL_IS_TAG(pExprs[i].base.colInfo.flag)) { 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; return TSDB_CODE_QRY_INVALID_MSG;
} }
} else { } else {
...@@ -6497,7 +6696,7 @@ static void doUpdateExprColumnIndex(SQuery *pQuery) { ...@@ -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 ...@@ -6700,9 +6899,10 @@ static SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SSqlGroupbyExpr *pGrou
index += 1; index += 1;
} }
} }
colIdCheck(pQuery); 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); qDebug("qmsg:%p QInfo:%p created", pQueryMsg, pQInfo);
return pQInfo; return pQInfo;
...@@ -6719,7 +6919,8 @@ _cleanup_query: ...@@ -6719,7 +6919,8 @@ _cleanup_query:
for (int32_t i = 0; i < numOfOutput; ++i) { for (int32_t i = 0; i < numOfOutput; ++i) {
SExprInfo* pExprInfo = &pExprs[i]; SExprInfo* pExprInfo = &pExprs[i];
if (pExprInfo->pExpr != NULL) { 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) { ...@@ -6835,7 +7036,7 @@ static void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr) {
for (int32_t i = 0; i < numOfExpr; ++i) { for (int32_t i = 0; i < numOfExpr; ++i) {
if (pExprInfo[i].pExpr != NULL) { if (pExprInfo[i].pExpr != NULL) {
tExprNodeDestroy(pExprInfo[i].pExpr, NULL); tExprTreeDestroy(pExprInfo[i].pExpr, NULL);
} }
} }
...@@ -7212,6 +7413,8 @@ bool qTableQuery(qinfo_t qinfo) { ...@@ -7212,6 +7413,8 @@ bool qTableQuery(qinfo_t qinfo) {
buildTagQueryResult(pQInfo); buildTagQueryResult(pQInfo);
} else if (pQInfo->runtimeEnv.stableQuery) { } else if (pQInfo->runtimeEnv.stableQuery) {
stableQueryImpl(pQInfo); stableQueryImpl(pQInfo);
} else if (pQInfo->runtimeEnv.queryBlockDist){
buildTableBlockDistResult(pQInfo);
} else { } else {
tableQueryImpl(pQInfo); tableQueryImpl(pQInfo);
} }
......
...@@ -12,13 +12,13 @@ ...@@ -12,13 +12,13 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "os.h"
#include "qExtbuffer.h" #include "qExtbuffer.h"
#include "os.h"
#include "qAggMain.h"
#include "queryLog.h" #include "queryLog.h"
#include "taos.h" #include "taos.h"
#include "taosdef.h" #include "taosdef.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tsqlfunction.h"
#include "tulog.h" #include "tulog.h"
#define COLMODEL_GET_VAL(data, schema, allrow, rowId, colId) \ #define COLMODEL_GET_VAL(data, schema, allrow, rowId, colId) \
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
#include "os.h" #include "os.h"
#include "qAggMain.h"
#include "taosdef.h" #include "taosdef.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tsqlfunction.h"
#include "ttype.h" #include "ttype.h"
#include "qFill.h" #include "qFill.h"
...@@ -120,7 +120,7 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, tFilePage** data, char** sr ...@@ -120,7 +120,7 @@ static void doFillOneRowResult(SFillInfo* pFillInfo, tFilePage** data, char** sr
point1 = (SPoint){.key = *(TSKEY*)(prev), .val = prev + pCol->col.offset}; point1 = (SPoint){.key = *(TSKEY*)(prev), .val = prev + pCol->col.offset};
point2 = (SPoint){.key = ts, .val = srcData[i] + pFillInfo->index * bytes}; point2 = (SPoint){.key = ts, .val = srcData[i] + pFillInfo->index * bytes};
point = (SPoint){.key = pFillInfo->currentKey, .val = val1}; point = (SPoint){.key = pFillInfo->currentKey, .val = val1};
taosGetLinearInterpolationVal(type, &point1, &point2, &point); taosGetLinearInterpolationVal(&point, type, &point1, &point2, type);
} }
} else { } else {
setNullValueForRow(pFillInfo, data, pFillInfo->numOfCols, index); setNullValueForRow(pFillInfo, data, pFillInfo->numOfCols, index);
...@@ -479,25 +479,13 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, TSKEY ekey, int32_t ma ...@@ -479,25 +479,13 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, TSKEY ekey, int32_t ma
return (numOfRes > maxNumOfRows) ? maxNumOfRows : numOfRes; return (numOfRes > maxNumOfRows) ? maxNumOfRows : numOfRes;
} }
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) {
double v1 = -1; double v1 = -1, v2 = -1;
double v2 = -1; GET_TYPED_DATA(v1, double, inputType, point1->val);
GET_TYPED_DATA(v2, double, inputType, point2->val);
GET_TYPED_DATA(v1, double, type, point1->val);
GET_TYPED_DATA(v2, double, type, point2->val);
double r = DO_INTERPOLATION(v1, v2, point1->key, point2->key, point->key); double r = DO_INTERPOLATION(v1, v2, point1->key, point2->key, point->key);
SET_TYPED_DATA(point->val, outputType, r);
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);
}
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
......
...@@ -71,7 +71,7 @@ abort_parse: ...@@ -71,7 +71,7 @@ abort_parse:
return sqlInfo; return sqlInfo;
} }
tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pToken) { tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pDistinct, SStrToken *pToken) {
if (pList == NULL) { if (pList == NULL) {
pList = calloc(1, sizeof(tSQLExprList)); pList = calloc(1, sizeof(tSQLExprList));
} }
...@@ -97,6 +97,7 @@ tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken ...@@ -97,6 +97,7 @@ tSQLExprList *tSqlExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken
strdequote(pItem->aliasName); strdequote(pItem->aliasName);
} }
pItem->distinct = (pDistinct != NULL);
} }
return pList; return pList;
} }
......
...@@ -115,6 +115,11 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) { ...@@ -115,6 +115,11 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) {
GET_TYPED_DATA(v, int64_t, pBucket->type, value); GET_TYPED_DATA(v, int64_t, pBucket->type, value);
int32_t index = -1; int32_t index = -1;
if (v > pBucket->range.i64MaxVal || v < pBucket->range.i64MinVal) {
return index;
}
// divide the value range into 1024 buckets // divide the value range into 1024 buckets
uint64_t span = pBucket->range.i64MaxVal - pBucket->range.i64MinVal; uint64_t span = pBucket->range.i64MaxVal - pBucket->range.i64MinVal;
if (span < pBucket->numOfSlots) { if (span < pBucket->numOfSlots) {
...@@ -128,7 +133,7 @@ int32_t tBucketIntHash(tMemBucket *pBucket, const void *value) { ...@@ -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; return index;
} }
...@@ -137,6 +142,11 @@ int32_t tBucketUintHash(tMemBucket *pBucket, const void *value) { ...@@ -137,6 +142,11 @@ int32_t tBucketUintHash(tMemBucket *pBucket, const void *value) {
GET_TYPED_DATA(v, uint64_t, pBucket->type, value); GET_TYPED_DATA(v, uint64_t, pBucket->type, value);
int32_t index = -1; int32_t index = -1;
if (v > pBucket->range.u64MaxVal || v < pBucket->range.u64MinVal) {
return index;
}
// divide the value range into 1024 buckets // divide the value range into 1024 buckets
uint64_t span = pBucket->range.u64MaxVal - pBucket->range.u64MinVal; uint64_t span = pBucket->range.u64MaxVal - pBucket->range.u64MinVal;
if (span < pBucket->numOfSlots) { if (span < pBucket->numOfSlots) {
...@@ -150,7 +160,7 @@ int32_t tBucketUintHash(tMemBucket *pBucket, const void *value) { ...@@ -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; return index;
} }
...@@ -164,6 +174,10 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value) { ...@@ -164,6 +174,10 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value) {
int32_t index = -1; int32_t index = -1;
if (v > pBucket->range.dMaxVal || v < pBucket->range.dMinVal) {
return index;
}
// divide a range of [dMinVal, dMaxVal] into 1024 buckets // divide a range of [dMinVal, dMaxVal] into 1024 buckets
double span = pBucket->range.dMaxVal - pBucket->range.dMinVal; double span = pBucket->range.dMaxVal - pBucket->range.dMinVal;
if (span < pBucket->numOfSlots) { if (span < pBucket->numOfSlots) {
...@@ -177,7 +191,7 @@ int32_t tBucketDoubleHash(tMemBucket *pBucket, const void *value) { ...@@ -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; return index;
} }
...@@ -309,9 +323,13 @@ int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size) { ...@@ -309,9 +323,13 @@ int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size) {
int32_t bytes = pBucket->bytes; int32_t bytes = pBucket->bytes;
for (int32_t i = 0; i < size; ++i) { for (int32_t i = 0; i < size; ++i) {
char *d = (char *) data + i * bytes; char *d = (char *) data + i * bytes;
count += 1;
int32_t index = (pBucket->hashFunc)(pBucket, d); int32_t index = (pBucket->hashFunc)(pBucket, d);
if (index < 0) {
continue;
}
count += 1;
tMemBucketSlot *pSlot = &pBucket->pSlots[index]; tMemBucketSlot *pSlot = &pBucket->pSlots[index];
tMemBucketUpdateBoundingBox(&pSlot->range, d, pBucket->type); tMemBucketUpdateBoundingBox(&pSlot->range, d, pBucket->type);
......
...@@ -240,6 +240,7 @@ static SKeyword keywordTable[] = { ...@@ -240,6 +240,7 @@ static SKeyword keywordTable[] = {
{"AVG_RATE", TK_AVG_RATE}, {"AVG_RATE", TK_AVG_RATE},
{"AVG_IRATE", TK_AVG_IRATE}, {"AVG_IRATE", TK_AVG_IRATE},
{"CACHELAST", TK_CACHELAST}, {"CACHELAST", TK_CACHELAST},
{"DISTINCT", TK_DISTINCT},
}; };
static const char isIdChar[] = { static const char isIdChar[] = {
......
...@@ -97,27 +97,27 @@ ...@@ -97,27 +97,27 @@
#endif #endif
/************* Begin control #defines *****************************************/ /************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int #define YYCODETYPE unsigned short int
#define YYNOCODE 280 #define YYNOCODE 282
#define YYACTIONTYPE unsigned short int #define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SStrToken #define ParseTOKENTYPE SStrToken
typedef union { typedef union {
int yyinit; int yyinit;
ParseTOKENTYPE yy0; ParseTOKENTYPE yy0;
SQuerySQL* yy30; SCreatedTableInfo yy42;
SCreateTableSQL* yy38; SCreateAcctInfo yy47;
SCreatedTableInfo yy78; SQuerySQL* yy114;
SLimitVal yy126; TAOS_FIELD yy179;
int yy130; SLimitVal yy204;
SArray* yy135; SSubclauseInfo* yy219;
SSubclauseInfo* yy153; int yy222;
SIntervalVal yy160; SArray* yy247;
TAOS_FIELD yy181; SCreateDbInfo yy262;
SCreateDbInfo yy256; tSQLExpr* yy326;
tSQLExprList* yy266; SCreateTableSQL* yy358;
SCreateAcctInfo yy277; tVariant yy378;
tVariant yy308; int64_t yy403;
tSQLExpr* yy316; SIntervalVal yy430;
int64_t yy531; tSQLExprList* yy522;
} YYMINORTYPE; } YYMINORTYPE;
#ifndef YYSTACKDEPTH #ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100 #define YYSTACKDEPTH 100
...@@ -127,17 +127,17 @@ typedef union { ...@@ -127,17 +127,17 @@ typedef union {
#define ParseARG_FETCH SSqlInfo* pInfo = yypParser->pInfo #define ParseARG_FETCH SSqlInfo* pInfo = yypParser->pInfo
#define ParseARG_STORE yypParser->pInfo = pInfo #define ParseARG_STORE yypParser->pInfo = pInfo
#define YYFALLBACK 1 #define YYFALLBACK 1
#define YYNSTATE 282 #define YYNSTATE 283
#define YYNRULE 248 #define YYNRULE 250
#define YYNTOKEN 209 #define YYNTOKEN 210
#define YY_MAX_SHIFT 281 #define YY_MAX_SHIFT 282
#define YY_MIN_SHIFTREDUCE 461 #define YY_MIN_SHIFTREDUCE 463
#define YY_MAX_SHIFTREDUCE 708 #define YY_MAX_SHIFTREDUCE 712
#define YY_ERROR_ACTION 709 #define YY_ERROR_ACTION 713
#define YY_ACCEPT_ACTION 710 #define YY_ACCEPT_ACTION 714
#define YY_NO_ACTION 711 #define YY_NO_ACTION 715
#define YY_MIN_REDUCE 712 #define YY_MIN_REDUCE 716
#define YY_MAX_REDUCE 959 #define YY_MAX_REDUCE 965
/************* End control #defines *******************************************/ /************* End control #defines *******************************************/
/* Define the yytestcase() macro to be a no-op if is not already defined /* Define the yytestcase() macro to be a no-op if is not already defined
...@@ -203,243 +203,241 @@ typedef union { ...@@ -203,243 +203,241 @@ typedef union {
** yy_default[] Default action for each state. ** yy_default[] Default action for each state.
** **
*********** Begin parsing tables **********************************************/ *********** Begin parsing tables **********************************************/
#define YY_ACTTAB_COUNT (622) #define YY_ACTTAB_COUNT (615)
static const YYACTIONTYPE yy_action[] = { static const YYACTIONTYPE yy_action[] = {
/* 0 */ 158, 505, 158, 710, 281, 857, 15, 578, 182, 506, /* 0 */ 872, 507, 159, 714, 282, 159, 15, 580, 183, 508,
/* 10 */ 941, 185, 942, 41, 42, 157, 43, 44, 26, 179, /* 10 */ 663, 186, 948, 41, 42, 947, 43, 44, 26, 158,
/* 20 */ 190, 35, 505, 505, 231, 47, 45, 49, 46, 868, /* 20 */ 191, 35, 507, 507, 232, 47, 45, 49, 46, 163,
/* 30 */ 506, 506, 846, 40, 39, 256, 255, 38, 37, 36, /* 30 */ 508, 508, 850, 40, 39, 257, 256, 38, 37, 36,
/* 40 */ 41, 42, 162, 43, 44, 857, 951, 190, 35, 178, /* 40 */ 41, 42, 118, 43, 44, 861, 664, 191, 35, 179,
/* 50 */ 279, 231, 47, 45, 49, 46, 180, 195, 843, 214, /* 50 */ 280, 232, 47, 45, 49, 46, 181, 869, 847, 215,
/* 60 */ 40, 39, 938, 61, 38, 37, 36, 462, 463, 464, /* 60 */ 40, 39, 957, 123, 38, 37, 36, 464, 465, 466,
/* 70 */ 465, 466, 467, 468, 469, 470, 471, 472, 473, 280, /* 70 */ 467, 468, 469, 470, 471, 472, 473, 474, 475, 281,
/* 80 */ 198, 846, 204, 41, 42, 865, 43, 44, 246, 266, /* 80 */ 91, 196, 205, 41, 42, 267, 43, 44, 839, 247,
/* 90 */ 190, 35, 158, 834, 231, 47, 45, 49, 46, 122, /* 90 */ 191, 35, 159, 944, 232, 47, 45, 49, 46, 123,
/* 100 */ 122, 184, 942, 40, 39, 122, 62, 38, 37, 36, /* 100 */ 220, 185, 948, 40, 39, 850, 62, 38, 37, 36,
/* 110 */ 20, 244, 274, 273, 243, 242, 241, 272, 240, 271, /* 110 */ 20, 245, 275, 274, 244, 243, 242, 273, 241, 272,
/* 120 */ 270, 269, 239, 268, 267, 38, 37, 36, 813, 657, /* 120 */ 271, 270, 240, 269, 268, 901, 267, 227, 817, 661,
/* 130 */ 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, /* 130 */ 805, 806, 807, 808, 809, 810, 811, 812, 813, 814,
/* 140 */ 811, 812, 814, 815, 42, 200, 43, 44, 253, 252, /* 140 */ 815, 816, 818, 819, 42, 208, 43, 44, 642, 643,
/* 150 */ 190, 35, 937, 275, 231, 47, 45, 49, 46, 228, /* 150 */ 191, 35, 212, 211, 232, 47, 45, 49, 46, 229,
/* 160 */ 895, 66, 226, 40, 39, 115, 894, 38, 37, 36, /* 160 */ 861, 67, 21, 40, 39, 247, 276, 38, 37, 36,
/* 170 */ 26, 43, 44, 32, 26, 190, 35, 846, 207, 231, /* 170 */ 32, 43, 44, 197, 180, 191, 35, 849, 70, 232,
/* 180 */ 47, 45, 49, 46, 26, 211, 210, 754, 40, 39, /* 180 */ 47, 45, 49, 46, 16, 38, 37, 36, 40, 39,
/* 190 */ 146, 845, 38, 37, 36, 189, 670, 117, 835, 661, /* 190 */ 850, 123, 38, 37, 36, 190, 674, 72, 26, 665,
/* 200 */ 71, 664, 26, 667, 763, 189, 670, 146, 193, 661, /* 200 */ 167, 668, 667, 671, 670, 61, 168, 836, 837, 25,
/* 210 */ 843, 664, 194, 667, 843, 189, 670, 16, 26, 661, /* 210 */ 840, 103, 102, 166, 190, 674, 758, 199, 665, 147,
/* 220 */ 936, 664, 249, 667, 843, 10, 21, 186, 187, 70, /* 220 */ 668, 767, 671, 20, 147, 275, 274, 187, 188, 841,
/* 230 */ 132, 230, 837, 166, 32, 196, 69, 186, 187, 167, /* 230 */ 273, 231, 272, 271, 270, 838, 269, 268, 846, 198,
/* 240 */ 250, 615, 843, 122, 102, 101, 165, 186, 187, 174, /* 240 */ 823, 21, 249, 821, 822, 943, 187, 188, 824, 32,
/* 250 */ 20, 26, 274, 273, 219, 905, 254, 272, 843, 271, /* 250 */ 826, 827, 825, 900, 828, 829, 123, 3, 137, 47,
/* 260 */ 270, 269, 607, 268, 267, 832, 833, 25, 836, 819, /* 260 */ 45, 49, 46, 29, 78, 74, 77, 40, 39, 617,
/* 270 */ 216, 90, 817, 818, 21, 246, 266, 820, 68, 822, /* 270 */ 214, 38, 37, 36, 233, 601, 759, 174, 598, 147,
/* 280 */ 823, 821, 32, 824, 825, 47, 45, 49, 46, 258, /* 280 */ 599, 26, 600, 201, 89, 93, 254, 253, 26, 942,
/* 290 */ 33, 843, 199, 40, 39, 48, 26, 38, 37, 36, /* 290 */ 83, 98, 101, 92, 26, 48, 153, 149, 26, 95,
/* 300 */ 197, 217, 213, 248, 67, 48, 27, 669, 659, 173, /* 300 */ 175, 26, 151, 106, 105, 104, 202, 203, 673, 26,
/* 310 */ 278, 277, 109, 755, 232, 48, 146, 669, 599, 638, /* 310 */ 69, 40, 39, 200, 48, 38, 37, 36, 68, 194,
/* 320 */ 639, 596, 668, 597, 844, 598, 612, 669, 175, 40, /* 320 */ 10, 847, 63, 672, 71, 133, 195, 673, 847, 279,
/* 330 */ 39, 22, 668, 38, 37, 36, 842, 160, 625, 88, /* 330 */ 278, 110, 250, 666, 847, 669, 251, 614, 847, 255,
/* 340 */ 92, 188, 668, 119, 660, 82, 97, 100, 91, 201, /* 340 */ 116, 847, 672, 22, 621, 848, 609, 259, 32, 847,
/* 350 */ 202, 99, 98, 629, 94, 3, 136, 161, 52, 152, /* 350 */ 218, 629, 633, 634, 217, 27, 120, 52, 18, 693,
/* 360 */ 148, 29, 77, 73, 76, 150, 105, 104, 103, 630, /* 360 */ 675, 189, 53, 176, 17, 17, 590, 677, 56, 235,
/* 370 */ 689, 671, 53, 56, 18, 17, 17, 663, 163, 666, /* 370 */ 591, 27, 100, 99, 27, 52, 82, 81, 12, 11,
/* 380 */ 662, 588, 665, 4, 81, 80, 27, 234, 589, 164, /* 380 */ 161, 602, 54, 59, 162, 579, 57, 88, 87, 14,
/* 390 */ 57, 54, 27, 52, 12, 11, 87, 86, 59, 603, /* 390 */ 13, 605, 603, 606, 604, 115, 113, 164, 165, 171,
/* 400 */ 577, 604, 14, 13, 601, 170, 602, 673, 114, 112, /* 400 */ 911, 172, 170, 4, 157, 169, 160, 910, 192, 907,
/* 410 */ 171, 169, 156, 168, 159, 859, 904, 191, 901, 116, /* 410 */ 906, 193, 258, 117, 871, 33, 878, 880, 119, 863,
/* 420 */ 900, 192, 257, 867, 600, 872, 874, 887, 118, 886, /* 420 */ 893, 892, 134, 135, 132, 136, 769, 32, 239, 155,
/* 430 */ 133, 134, 32, 131, 135, 765, 238, 154, 30, 247, /* 430 */ 30, 248, 766, 216, 962, 79, 961, 114, 959, 138,
/* 440 */ 762, 956, 78, 955, 953, 137, 251, 950, 84, 113, /* 440 */ 252, 956, 85, 955, 628, 953, 221, 139, 182, 225,
/* 450 */ 949, 947, 138, 783, 31, 28, 155, 752, 93, 750, /* 450 */ 787, 31, 28, 58, 156, 756, 94, 860, 55, 50,
/* 460 */ 215, 95, 96, 748, 624, 58, 747, 203, 147, 745, /* 460 */ 754, 96, 230, 124, 228, 125, 97, 752, 126, 127,
/* 470 */ 744, 743, 742, 220, 741, 55, 149, 50, 181, 229, /* 470 */ 226, 128, 224, 222, 751, 34, 204, 148, 90, 749,
/* 480 */ 224, 856, 227, 124, 151, 738, 736, 734, 732, 730, /* 480 */ 260, 261, 262, 748, 747, 746, 745, 263, 150, 152,
/* 490 */ 225, 223, 221, 153, 34, 218, 89, 63, 64, 259, /* 490 */ 742, 740, 264, 738, 736, 734, 265, 154, 266, 219,
/* 500 */ 260, 888, 261, 262, 264, 263, 265, 276, 708, 205, /* 500 */ 64, 65, 894, 277, 712, 206, 207, 177, 237, 238,
/* 510 */ 206, 707, 208, 209, 706, 176, 236, 237, 694, 177, /* 510 */ 711, 178, 173, 209, 75, 210, 710, 698, 217, 213,
/* 520 */ 172, 212, 74, 216, 65, 609, 746, 60, 233, 106, /* 520 */ 750, 611, 107, 60, 744, 234, 142, 141, 788, 140,
/* 530 */ 6, 183, 740, 141, 107, 140, 784, 139, 142, 144, /* 530 */ 143, 144, 146, 145, 1, 108, 743, 2, 109, 735,
/* 540 */ 143, 145, 739, 1, 108, 841, 731, 2, 626, 129, /* 540 */ 66, 6, 184, 630, 845, 121, 223, 131, 129, 130,
/* 550 */ 127, 125, 123, 126, 128, 120, 222, 130, 631, 121, /* 550 */ 635, 122, 5, 23, 7, 8, 24, 676, 9, 19,
/* 560 */ 23, 7, 8, 672, 24, 5, 9, 674, 19, 72, /* 560 */ 678, 71, 73, 236, 548, 544, 542, 541, 540, 537,
/* 570 */ 235, 546, 542, 70, 540, 539, 538, 535, 509, 245, /* 570 */ 511, 246, 76, 27, 51, 582, 80, 84, 581, 578,
/* 580 */ 79, 75, 27, 83, 51, 580, 579, 576, 530, 528, /* 580 */ 532, 86, 530, 522, 528, 524, 526, 520, 518, 550,
/* 590 */ 520, 526, 522, 85, 524, 518, 516, 548, 547, 545, /* 590 */ 549, 547, 546, 545, 543, 539, 538, 52, 509, 479,
/* 600 */ 544, 543, 541, 537, 536, 52, 507, 477, 475, 110, /* 600 */ 477, 716, 715, 715, 715, 715, 715, 715, 715, 715,
/* 610 */ 712, 711, 711, 711, 711, 711, 711, 711, 711, 711, /* 610 */ 715, 715, 715, 111, 112,
/* 620 */ 711, 111,
}; };
static const YYCODETYPE yy_lookahead[] = { static const YYCODETYPE yy_lookahead[] = {
/* 0 */ 268, 1, 268, 210, 211, 252, 268, 5, 230, 9, /* 0 */ 214, 1, 270, 211, 212, 270, 270, 5, 231, 9,
/* 10 */ 278, 277, 278, 13, 14, 268, 16, 17, 213, 266, /* 10 */ 1, 279, 280, 13, 14, 280, 16, 17, 214, 270,
/* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 213, /* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 270,
/* 30 */ 9, 9, 254, 33, 34, 33, 34, 37, 38, 39, /* 30 */ 9, 9, 255, 33, 34, 33, 34, 37, 38, 39,
/* 40 */ 13, 14, 268, 16, 17, 252, 254, 20, 21, 212, /* 40 */ 13, 14, 214, 16, 17, 253, 37, 20, 21, 213,
/* 50 */ 213, 24, 25, 26, 27, 28, 251, 230, 253, 266, /* 50 */ 214, 24, 25, 26, 27, 28, 252, 271, 254, 267,
/* 60 */ 33, 34, 268, 218, 37, 38, 39, 45, 46, 47, /* 60 */ 33, 34, 255, 214, 37, 38, 39, 45, 46, 47,
/* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, /* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
/* 80 */ 66, 254, 60, 13, 14, 269, 16, 17, 77, 79, /* 80 */ 74, 231, 60, 13, 14, 79, 16, 17, 0, 77,
/* 90 */ 20, 21, 268, 248, 24, 25, 26, 27, 28, 213, /* 90 */ 20, 21, 270, 270, 24, 25, 26, 27, 28, 214,
/* 100 */ 213, 277, 278, 33, 34, 213, 106, 37, 38, 39, /* 100 */ 272, 279, 280, 33, 34, 255, 106, 37, 38, 39,
/* 110 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 110 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
/* 120 */ 96, 97, 98, 99, 100, 37, 38, 39, 229, 102, /* 120 */ 96, 97, 98, 99, 100, 276, 79, 278, 230, 102,
/* 130 */ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, /* 130 */ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
/* 140 */ 241, 242, 243, 244, 14, 131, 16, 17, 134, 135, /* 140 */ 242, 243, 244, 245, 14, 131, 16, 17, 120, 121,
/* 150 */ 20, 21, 268, 230, 24, 25, 26, 27, 28, 272, /* 150 */ 20, 21, 138, 139, 24, 25, 26, 27, 28, 274,
/* 160 */ 274, 274, 276, 33, 34, 101, 274, 37, 38, 39, /* 160 */ 253, 276, 101, 33, 34, 77, 231, 37, 38, 39,
/* 170 */ 213, 16, 17, 109, 213, 20, 21, 254, 130, 24, /* 170 */ 109, 16, 17, 66, 267, 20, 21, 255, 219, 24,
/* 180 */ 25, 26, 27, 28, 213, 137, 138, 217, 33, 34, /* 180 */ 25, 26, 27, 28, 44, 37, 38, 39, 33, 34,
/* 190 */ 220, 254, 37, 38, 39, 1, 2, 213, 0, 5, /* 190 */ 255, 214, 37, 38, 39, 1, 2, 219, 214, 5,
/* 200 */ 218, 7, 213, 9, 217, 1, 2, 220, 251, 5, /* 200 */ 60, 7, 5, 9, 7, 219, 66, 248, 249, 250,
/* 210 */ 253, 7, 251, 9, 253, 1, 2, 44, 213, 5, /* 210 */ 251, 71, 72, 73, 1, 2, 218, 66, 5, 221,
/* 220 */ 268, 7, 251, 9, 253, 101, 101, 33, 34, 105, /* 220 */ 7, 218, 9, 86, 221, 88, 89, 33, 34, 251,
/* 230 */ 106, 37, 250, 60, 109, 66, 218, 33, 34, 66, /* 230 */ 93, 37, 95, 96, 97, 249, 99, 100, 254, 132,
/* 240 */ 251, 37, 253, 213, 71, 72, 73, 33, 34, 268, /* 240 */ 230, 101, 135, 233, 234, 270, 33, 34, 238, 109,
/* 250 */ 86, 213, 88, 89, 270, 246, 251, 93, 253, 95, /* 250 */ 240, 241, 242, 276, 244, 245, 214, 61, 62, 25,
/* 260 */ 96, 97, 102, 99, 100, 247, 248, 249, 250, 229, /* 260 */ 26, 27, 28, 67, 68, 69, 70, 33, 34, 37,
/* 270 */ 110, 74, 232, 233, 101, 77, 79, 237, 255, 239, /* 270 */ 130, 37, 38, 39, 15, 2, 218, 137, 5, 221,
/* 280 */ 240, 241, 109, 243, 244, 25, 26, 27, 28, 251, /* 280 */ 7, 214, 9, 132, 61, 62, 135, 136, 214, 270,
/* 290 */ 267, 253, 213, 33, 34, 101, 213, 37, 38, 39, /* 290 */ 67, 68, 69, 70, 214, 101, 61, 62, 214, 76,
/* 300 */ 131, 102, 129, 134, 274, 101, 107, 113, 1, 136, /* 300 */ 270, 214, 67, 68, 69, 70, 33, 34, 114, 214,
/* 310 */ 63, 64, 65, 217, 15, 101, 220, 113, 2, 119, /* 310 */ 256, 33, 34, 214, 101, 37, 38, 39, 276, 252,
/* 320 */ 120, 5, 128, 7, 245, 9, 107, 113, 268, 33, /* 320 */ 101, 254, 268, 129, 105, 106, 252, 114, 254, 63,
/* 330 */ 34, 112, 128, 37, 38, 39, 253, 268, 102, 61, /* 330 */ 64, 65, 252, 5, 254, 7, 252, 107, 254, 252,
/* 340 */ 62, 59, 128, 107, 37, 67, 68, 69, 70, 33, /* 340 */ 101, 254, 129, 113, 112, 246, 102, 252, 109, 254,
/* 350 */ 34, 74, 75, 102, 76, 61, 62, 268, 107, 61, /* 350 */ 102, 102, 102, 102, 110, 107, 107, 107, 107, 102,
/* 360 */ 62, 67, 68, 69, 70, 67, 68, 69, 70, 102, /* 360 */ 102, 59, 107, 270, 107, 107, 102, 108, 107, 102,
/* 370 */ 102, 102, 107, 107, 107, 107, 107, 5, 268, 7, /* 370 */ 102, 107, 74, 75, 107, 107, 133, 134, 133, 134,
/* 380 */ 5, 102, 7, 101, 132, 133, 107, 102, 102, 268, /* 380 */ 270, 108, 127, 101, 270, 103, 125, 133, 134, 133,
/* 390 */ 124, 126, 107, 107, 132, 133, 132, 133, 101, 5, /* 390 */ 134, 5, 5, 7, 7, 61, 62, 270, 270, 270,
/* 400 */ 103, 7, 132, 133, 5, 268, 7, 108, 61, 62, /* 400 */ 247, 270, 270, 101, 270, 270, 270, 247, 247, 247,
/* 410 */ 268, 268, 268, 268, 268, 252, 246, 246, 246, 213, /* 410 */ 247, 247, 247, 214, 214, 269, 214, 214, 214, 253,
/* 420 */ 246, 246, 246, 213, 108, 213, 213, 275, 213, 275, /* 420 */ 277, 277, 214, 214, 257, 214, 214, 109, 214, 214,
/* 430 */ 213, 213, 109, 256, 213, 213, 213, 213, 213, 213, /* 430 */ 214, 214, 214, 253, 214, 214, 214, 59, 214, 214,
/* 440 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 59, /* 440 */ 214, 214, 214, 214, 114, 214, 273, 214, 273, 273,
/* 450 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, /* 450 */ 214, 214, 214, 124, 214, 214, 214, 266, 126, 123,
/* 460 */ 252, 213, 213, 213, 113, 123, 213, 213, 213, 213, /* 460 */ 214, 214, 118, 265, 122, 264, 214, 214, 263, 262,
/* 470 */ 213, 213, 213, 271, 213, 125, 213, 122, 271, 117, /* 470 */ 117, 261, 116, 115, 214, 128, 214, 214, 85, 214,
/* 480 */ 271, 265, 121, 263, 213, 213, 213, 213, 213, 213, /* 480 */ 84, 49, 81, 214, 214, 214, 214, 83, 214, 214,
/* 490 */ 116, 115, 114, 213, 127, 214, 85, 214, 214, 84, /* 490 */ 214, 214, 53, 214, 214, 214, 82, 214, 80, 215,
/* 500 */ 49, 214, 81, 83, 82, 53, 80, 77, 5, 139, /* 500 */ 215, 215, 215, 77, 5, 140, 5, 215, 215, 215,
/* 510 */ 5, 5, 139, 5, 5, 214, 214, 214, 87, 214, /* 510 */ 5, 215, 215, 140, 219, 5, 5, 87, 110, 131,
/* 520 */ 214, 130, 218, 110, 107, 102, 214, 111, 104, 215, /* 520 */ 215, 102, 216, 111, 215, 104, 223, 227, 229, 228,
/* 530 */ 101, 1, 214, 222, 215, 226, 228, 227, 225, 224, /* 530 */ 226, 224, 222, 225, 220, 216, 215, 217, 216, 215,
/* 540 */ 223, 221, 214, 219, 215, 252, 214, 216, 102, 258, /* 540 */ 107, 101, 1, 102, 253, 101, 101, 258, 260, 259,
/* 550 */ 260, 262, 264, 261, 259, 101, 101, 257, 102, 101, /* 550 */ 102, 101, 101, 107, 119, 119, 107, 102, 101, 101,
/* 560 */ 107, 118, 118, 102, 107, 101, 101, 108, 101, 74, /* 560 */ 108, 105, 74, 104, 9, 5, 5, 5, 5, 5,
/* 570 */ 104, 9, 5, 105, 5, 5, 5, 5, 78, 15, /* 570 */ 78, 15, 74, 107, 16, 5, 134, 134, 5, 102,
/* 580 */ 133, 74, 107, 133, 16, 5, 5, 102, 5, 5, /* 580 */ 5, 134, 5, 5, 5, 5, 5, 5, 5, 5,
/* 590 */ 5, 5, 5, 133, 5, 5, 5, 5, 5, 5, /* 590 */ 5, 5, 5, 5, 5, 5, 5, 107, 78, 59,
/* 600 */ 5, 5, 5, 5, 5, 107, 78, 59, 58, 21, /* 600 */ 58, 0, 281, 281, 281, 281, 281, 281, 281, 281,
/* 610 */ 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 610 */ 281, 281, 281, 21, 21, 281, 281, 281, 281, 281,
/* 620 */ 279, 21, 279, 279, 279, 279, 279, 279, 279, 279, /* 620 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 630 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 630 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 640 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 640 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 650 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 650 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 660 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 660 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 670 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 670 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 680 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 680 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 690 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 690 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 700 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 700 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 710 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 710 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 720 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 720 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 730 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 730 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 740 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 740 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 750 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 750 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 760 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 760 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 770 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 770 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 780 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 780 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 790 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 790 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 800 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 800 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 810 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 810 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 820 */ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, /* 820 */ 281, 281, 281, 281, 281,
/* 830 */ 279,
}; };
#define YY_SHIFT_COUNT (281) #define YY_SHIFT_COUNT (282)
#define YY_SHIFT_MIN (0) #define YY_SHIFT_MIN (0)
#define YY_SHIFT_MAX (610) #define YY_SHIFT_MAX (601)
static const unsigned short int yy_shift_ofst[] = { static const unsigned short int yy_shift_ofst[] = {
/* 0 */ 173, 24, 164, 11, 194, 214, 21, 21, 21, 21, /* 0 */ 140, 24, 137, 12, 194, 213, 21, 21, 21, 21,
/* 10 */ 21, 21, 21, 21, 21, 0, 22, 214, 316, 316, /* 10 */ 21, 21, 21, 21, 21, 0, 22, 213, 273, 273,
/* 20 */ 316, 125, 21, 21, 21, 198, 21, 21, 197, 11, /* 20 */ 273, 61, 21, 21, 21, 88, 21, 21, 6, 12,
/* 30 */ 10, 10, 622, 204, 214, 214, 214, 214, 214, 214, /* 30 */ 47, 47, 615, 213, 213, 213, 213, 213, 213, 213,
/* 40 */ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, /* 40 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
/* 50 */ 214, 316, 316, 2, 2, 2, 2, 2, 2, 2, /* 50 */ 213, 273, 273, 2, 2, 2, 2, 2, 2, 2,
/* 60 */ 64, 21, 21, 21, 21, 21, 200, 200, 219, 21, /* 60 */ 239, 21, 21, 232, 21, 21, 21, 28, 28, 230,
/* 70 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 70 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* 80 */ 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, /* 90 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* 100 */ 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, /* 110 */ 21, 21, 21, 21, 21, 21, 318, 378, 378, 378,
/* 120 */ 351, 351, 390, 342, 350, 355, 362, 361, 374, 376, /* 120 */ 330, 330, 330, 378, 329, 332, 336, 344, 342, 353,
/* 130 */ 378, 367, 323, 390, 390, 390, 11, 390, 390, 411, /* 130 */ 356, 358, 347, 318, 378, 378, 378, 12, 378, 378,
/* 140 */ 415, 451, 421, 420, 452, 422, 426, 390, 430, 390, /* 140 */ 393, 396, 432, 401, 404, 439, 414, 418, 378, 426,
/* 150 */ 430, 390, 430, 390, 622, 622, 27, 70, 70, 70, /* 150 */ 378, 426, 378, 426, 378, 615, 615, 27, 70, 70,
/* 160 */ 130, 155, 260, 260, 260, 278, 294, 298, 296, 296, /* 160 */ 70, 130, 155, 234, 234, 234, 223, 196, 235, 278,
/* 170 */ 296, 296, 14, 48, 88, 88, 124, 169, 247, 160, /* 170 */ 278, 278, 278, 151, 14, 148, 148, 219, 107, 266,
/* 180 */ 199, 236, 251, 267, 268, 269, 372, 375, 307, 282, /* 180 */ 244, 248, 249, 250, 251, 257, 258, 197, 328, 9,
/* 190 */ 299, 265, 266, 279, 285, 286, 252, 262, 264, 297, /* 190 */ 302, 259, 255, 261, 264, 267, 268, 243, 245, 254,
/* 200 */ 270, 394, 399, 277, 347, 503, 370, 505, 506, 373, /* 200 */ 282, 256, 386, 387, 298, 334, 499, 365, 501, 505,
/* 210 */ 508, 509, 431, 391, 413, 423, 416, 424, 429, 417, /* 210 */ 373, 510, 511, 430, 388, 408, 419, 412, 421, 440,
/* 220 */ 446, 454, 530, 455, 456, 458, 453, 443, 457, 444, /* 220 */ 433, 441, 444, 541, 445, 448, 450, 446, 435, 449,
/* 230 */ 461, 464, 459, 465, 424, 467, 466, 468, 495, 562, /* 230 */ 436, 455, 451, 452, 457, 421, 458, 459, 456, 488,
/* 240 */ 567, 569, 570, 571, 572, 500, 564, 507, 447, 475, /* 240 */ 555, 560, 561, 562, 563, 564, 492, 556, 498, 442,
/* 250 */ 475, 568, 450, 460, 475, 580, 581, 485, 475, 583, /* 250 */ 466, 466, 558, 443, 447, 466, 570, 573, 477, 466,
/* 260 */ 584, 585, 586, 587, 589, 590, 591, 592, 593, 594, /* 260 */ 575, 577, 578, 579, 580, 581, 582, 583, 584, 585,
/* 270 */ 595, 596, 597, 598, 599, 498, 528, 588, 600, 548, /* 270 */ 586, 587, 588, 589, 590, 591, 490, 520, 592, 593,
/* 280 */ 550, 610, /* 280 */ 540, 542, 601,
}; };
#define YY_REDUCE_COUNT (155) #define YY_REDUCE_COUNT (156)
#define YY_REDUCE_MIN (-268) #define YY_REDUCE_MIN (-268)
#define YY_REDUCE_MAX (332) #define YY_REDUCE_MAX (324)
static const short yy_reduce_ofst[] = { static const short yy_reduce_ofst[] = {
/* 0 */ -207, -101, 40, 18, -266, -176, -195, -114, -113, -43, /* 0 */ -208, -102, 10, -41, -268, -178, -196, -151, -115, 67,
/* 10 */ -39, -29, -11, 5, 38, -184, -163, -268, -222, -173, /* 10 */ 74, 80, 84, 87, 95, -214, -164, -265, -223, -150,
/* 20 */ -77, -247, -16, -108, 30, -18, 79, 83, -30, -155, /* 20 */ -65, -93, -172, -23, 42, -22, 99, -16, -2, -14,
/* 30 */ -13, 96, 23, -262, -253, -226, -206, -116, -48, -19, /* 30 */ 3, 58, 54, -264, -251, -241, -177, -25, 19, 30,
/* 40 */ 60, 69, 89, 110, 121, 137, 142, 143, 144, 145, /* 40 */ 93, 110, 114, 127, 128, 129, 131, 132, 134, 135,
/* 50 */ 146, -208, -63, 9, 170, 171, 172, 174, 175, 176, /* 50 */ 136, -193, -78, 153, 160, 161, 162, 163, 164, 165,
/* 60 */ 163, 206, 210, 212, 213, 215, 152, 154, 177, 217, /* 60 */ 166, 199, 200, 146, 202, 203, 204, 143, 144, 167,
/* 70 */ 218, 221, 222, 223, 224, 225, 226, 227, 228, 229, /* 70 */ 208, 209, 211, 212, 214, 215, 216, 217, 218, 220,
/* 80 */ 230, 231, 232, 233, 234, 235, 237, 238, 239, 240, /* 80 */ 221, 222, 224, 225, 226, 227, 228, 229, 231, 233,
/* 90 */ 241, 242, 243, 244, 245, 246, 248, 249, 250, 253, /* 90 */ 236, 237, 238, 240, 241, 242, 246, 247, 252, 253,
/* 100 */ 254, 255, 256, 257, 258, 259, 261, 263, 271, 272, /* 100 */ 260, 262, 263, 265, 269, 270, 271, 272, 274, 275,
/* 110 */ 273, 274, 275, 276, 280, 208, 281, 283, 284, 202, /* 110 */ 276, 277, 279, 280, 281, 283, 180, 284, 285, 286,
/* 120 */ 207, 209, 287, 216, 288, 220, 289, 292, 290, 295, /* 120 */ 173, 175, 176, 287, 191, 198, 201, 205, 207, 210,
/* 130 */ 291, 300, 293, 301, 302, 303, 304, 305, 306, 308, /* 130 */ 288, 290, 289, 291, 292, 293, 294, 295, 296, 297,
/* 140 */ 310, 309, 311, 313, 317, 315, 320, 312, 314, 318, /* 140 */ 299, 301, 300, 303, 304, 307, 308, 310, 305, 306,
/* 150 */ 319, 328, 329, 332, 324, 331, /* 150 */ 309, 319, 321, 322, 324, 314, 320,
}; };
static const YYACTIONTYPE yy_default[] = { static const YYACTIONTYPE yy_default[] = {
/* 0 */ 709, 764, 753, 761, 944, 944, 709, 709, 709, 709, /* 0 */ 713, 768, 757, 765, 950, 950, 713, 713, 713, 713,
/* 10 */ 709, 709, 709, 709, 709, 869, 727, 944, 709, 709, /* 10 */ 713, 713, 713, 713, 713, 873, 731, 950, 713, 713,
/* 20 */ 709, 709, 709, 709, 709, 761, 709, 709, 766, 761, /* 20 */ 713, 713, 713, 713, 713, 765, 713, 713, 770, 765,
/* 30 */ 766, 766, 864, 709, 709, 709, 709, 709, 709, 709, /* 30 */ 770, 770, 868, 713, 713, 713, 713, 713, 713, 713,
/* 40 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 40 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 50 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 50 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 60 */ 709, 709, 709, 871, 873, 709, 891, 891, 862, 709, /* 60 */ 713, 713, 713, 875, 877, 879, 713, 897, 897, 866,
/* 70 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 70 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 80 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 80 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 90 */ 709, 709, 709, 751, 709, 749, 709, 709, 709, 709, /* 90 */ 713, 713, 713, 713, 755, 713, 753, 713, 713, 713,
/* 100 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 737, /* 100 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 110 */ 709, 709, 709, 709, 709, 709, 729, 729, 729, 709, /* 110 */ 741, 713, 713, 713, 713, 713, 713, 733, 733, 733,
/* 120 */ 709, 709, 729, 898, 902, 896, 884, 892, 883, 879, /* 120 */ 713, 713, 713, 733, 904, 908, 902, 890, 898, 889,
/* 130 */ 878, 906, 709, 729, 729, 729, 761, 729, 729, 782, /* 130 */ 885, 884, 912, 713, 733, 733, 733, 765, 733, 733,
/* 140 */ 780, 778, 770, 776, 772, 774, 768, 729, 759, 729, /* 140 */ 786, 784, 782, 774, 780, 776, 778, 772, 733, 763,
/* 150 */ 759, 729, 759, 729, 800, 816, 709, 907, 943, 897, /* 150 */ 733, 763, 733, 763, 733, 804, 820, 713, 913, 949,
/* 160 */ 933, 932, 939, 931, 930, 709, 709, 709, 926, 927, /* 160 */ 903, 939, 938, 945, 937, 936, 713, 713, 713, 932,
/* 170 */ 929, 928, 709, 709, 935, 934, 709, 709, 709, 709, /* 170 */ 933, 935, 934, 713, 713, 941, 940, 713, 713, 713,
/* 180 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 909, /* 180 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 190 */ 709, 903, 899, 709, 709, 709, 709, 709, 709, 826, /* 190 */ 915, 713, 909, 905, 713, 713, 713, 713, 713, 713,
/* 200 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 200 */ 830, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 210 */ 709, 709, 709, 709, 861, 709, 709, 709, 709, 870, /* 210 */ 713, 713, 713, 713, 713, 865, 713, 713, 713, 713,
/* 220 */ 709, 709, 709, 709, 709, 709, 893, 709, 885, 709, /* 220 */ 876, 713, 713, 713, 713, 713, 713, 899, 713, 891,
/* 230 */ 709, 709, 709, 709, 838, 709, 709, 709, 709, 709, /* 230 */ 713, 713, 713, 713, 713, 842, 713, 713, 713, 713,
/* 240 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 954, /* 240 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 250 */ 952, 709, 709, 709, 948, 709, 709, 709, 946, 709, /* 250 */ 960, 958, 713, 713, 713, 954, 713, 713, 713, 952,
/* 260 */ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, /* 260 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
/* 270 */ 709, 709, 709, 709, 709, 785, 709, 735, 733, 709, /* 270 */ 713, 713, 713, 713, 713, 713, 789, 713, 739, 737,
/* 280 */ 725, 709, /* 280 */ 713, 729, 713,
}; };
/********** End of lemon-generated parsing tables *****************************/ /********** End of lemon-generated parsing tables *****************************/
...@@ -571,6 +569,7 @@ static const YYCODETYPE yyFallback[] = { ...@@ -571,6 +569,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* SELECT => nothing */ 0, /* SELECT => nothing */
0, /* UNION => nothing */ 0, /* UNION => nothing */
1, /* ALL => ID */ 1, /* ALL => ID */
0, /* DISTINCT => nothing */
0, /* FROM => nothing */ 0, /* FROM => nothing */
0, /* VARIABLE => nothing */ 0, /* VARIABLE => nothing */
0, /* INTERVAL => nothing */ 0, /* INTERVAL => nothing */
...@@ -866,173 +865,175 @@ static const char *const yyTokenName[] = { ...@@ -866,173 +865,175 @@ static const char *const yyTokenName[] = {
/* 109 */ "SELECT", /* 109 */ "SELECT",
/* 110 */ "UNION", /* 110 */ "UNION",
/* 111 */ "ALL", /* 111 */ "ALL",
/* 112 */ "FROM", /* 112 */ "DISTINCT",
/* 113 */ "VARIABLE", /* 113 */ "FROM",
/* 114 */ "INTERVAL", /* 114 */ "VARIABLE",
/* 115 */ "FILL", /* 115 */ "INTERVAL",
/* 116 */ "SLIDING", /* 116 */ "FILL",
/* 117 */ "ORDER", /* 117 */ "SLIDING",
/* 118 */ "BY", /* 118 */ "ORDER",
/* 119 */ "ASC", /* 119 */ "BY",
/* 120 */ "DESC", /* 120 */ "ASC",
/* 121 */ "GROUP", /* 121 */ "DESC",
/* 122 */ "HAVING", /* 122 */ "GROUP",
/* 123 */ "LIMIT", /* 123 */ "HAVING",
/* 124 */ "OFFSET", /* 124 */ "LIMIT",
/* 125 */ "SLIMIT", /* 125 */ "OFFSET",
/* 126 */ "SOFFSET", /* 126 */ "SLIMIT",
/* 127 */ "WHERE", /* 127 */ "SOFFSET",
/* 128 */ "NOW", /* 128 */ "WHERE",
/* 129 */ "RESET", /* 129 */ "NOW",
/* 130 */ "QUERY", /* 130 */ "RESET",
/* 131 */ "ADD", /* 131 */ "QUERY",
/* 132 */ "COLUMN", /* 132 */ "ADD",
/* 133 */ "TAG", /* 133 */ "COLUMN",
/* 134 */ "CHANGE", /* 134 */ "TAG",
/* 135 */ "SET", /* 135 */ "CHANGE",
/* 136 */ "KILL", /* 136 */ "SET",
/* 137 */ "CONNECTION", /* 137 */ "KILL",
/* 138 */ "STREAM", /* 138 */ "CONNECTION",
/* 139 */ "COLON", /* 139 */ "STREAM",
/* 140 */ "ABORT", /* 140 */ "COLON",
/* 141 */ "AFTER", /* 141 */ "ABORT",
/* 142 */ "ATTACH", /* 142 */ "AFTER",
/* 143 */ "BEFORE", /* 143 */ "ATTACH",
/* 144 */ "BEGIN", /* 144 */ "BEFORE",
/* 145 */ "CASCADE", /* 145 */ "BEGIN",
/* 146 */ "CLUSTER", /* 146 */ "CASCADE",
/* 147 */ "CONFLICT", /* 147 */ "CLUSTER",
/* 148 */ "COPY", /* 148 */ "CONFLICT",
/* 149 */ "DEFERRED", /* 149 */ "COPY",
/* 150 */ "DELIMITERS", /* 150 */ "DEFERRED",
/* 151 */ "DETACH", /* 151 */ "DELIMITERS",
/* 152 */ "EACH", /* 152 */ "DETACH",
/* 153 */ "END", /* 153 */ "EACH",
/* 154 */ "EXPLAIN", /* 154 */ "END",
/* 155 */ "FAIL", /* 155 */ "EXPLAIN",
/* 156 */ "FOR", /* 156 */ "FAIL",
/* 157 */ "IGNORE", /* 157 */ "FOR",
/* 158 */ "IMMEDIATE", /* 158 */ "IGNORE",
/* 159 */ "INITIALLY", /* 159 */ "IMMEDIATE",
/* 160 */ "INSTEAD", /* 160 */ "INITIALLY",
/* 161 */ "MATCH", /* 161 */ "INSTEAD",
/* 162 */ "KEY", /* 162 */ "MATCH",
/* 163 */ "OF", /* 163 */ "KEY",
/* 164 */ "RAISE", /* 164 */ "OF",
/* 165 */ "REPLACE", /* 165 */ "RAISE",
/* 166 */ "RESTRICT", /* 166 */ "REPLACE",
/* 167 */ "ROW", /* 167 */ "RESTRICT",
/* 168 */ "STATEMENT", /* 168 */ "ROW",
/* 169 */ "TRIGGER", /* 169 */ "STATEMENT",
/* 170 */ "VIEW", /* 170 */ "TRIGGER",
/* 171 */ "COUNT", /* 171 */ "VIEW",
/* 172 */ "SUM", /* 172 */ "COUNT",
/* 173 */ "AVG", /* 173 */ "SUM",
/* 174 */ "MIN", /* 174 */ "AVG",
/* 175 */ "MAX", /* 175 */ "MIN",
/* 176 */ "FIRST", /* 176 */ "MAX",
/* 177 */ "LAST", /* 177 */ "FIRST",
/* 178 */ "TOP", /* 178 */ "LAST",
/* 179 */ "BOTTOM", /* 179 */ "TOP",
/* 180 */ "STDDEV", /* 180 */ "BOTTOM",
/* 181 */ "PERCENTILE", /* 181 */ "STDDEV",
/* 182 */ "APERCENTILE", /* 182 */ "PERCENTILE",
/* 183 */ "LEASTSQUARES", /* 183 */ "APERCENTILE",
/* 184 */ "HISTOGRAM", /* 184 */ "LEASTSQUARES",
/* 185 */ "DIFF", /* 185 */ "HISTOGRAM",
/* 186 */ "SPREAD", /* 186 */ "DIFF",
/* 187 */ "TWA", /* 187 */ "SPREAD",
/* 188 */ "INTERP", /* 188 */ "TWA",
/* 189 */ "LAST_ROW", /* 189 */ "INTERP",
/* 190 */ "RATE", /* 190 */ "LAST_ROW",
/* 191 */ "IRATE", /* 191 */ "RATE",
/* 192 */ "SUM_RATE", /* 192 */ "IRATE",
/* 193 */ "SUM_IRATE", /* 193 */ "SUM_RATE",
/* 194 */ "AVG_RATE", /* 194 */ "SUM_IRATE",
/* 195 */ "AVG_IRATE", /* 195 */ "AVG_RATE",
/* 196 */ "TBID", /* 196 */ "AVG_IRATE",
/* 197 */ "SEMI", /* 197 */ "TBID",
/* 198 */ "NONE", /* 198 */ "SEMI",
/* 199 */ "PREV", /* 199 */ "NONE",
/* 200 */ "LINEAR", /* 200 */ "PREV",
/* 201 */ "IMPORT", /* 201 */ "LINEAR",
/* 202 */ "METRIC", /* 202 */ "IMPORT",
/* 203 */ "TBNAME", /* 203 */ "METRIC",
/* 204 */ "JOIN", /* 204 */ "TBNAME",
/* 205 */ "METRICS", /* 205 */ "JOIN",
/* 206 */ "INSERT", /* 206 */ "METRICS",
/* 207 */ "INTO", /* 207 */ "INSERT",
/* 208 */ "VALUES", /* 208 */ "INTO",
/* 209 */ "error", /* 209 */ "VALUES",
/* 210 */ "program", /* 210 */ "error",
/* 211 */ "cmd", /* 211 */ "program",
/* 212 */ "dbPrefix", /* 212 */ "cmd",
/* 213 */ "ids", /* 213 */ "dbPrefix",
/* 214 */ "cpxName", /* 214 */ "ids",
/* 215 */ "ifexists", /* 215 */ "cpxName",
/* 216 */ "alter_db_optr", /* 216 */ "ifexists",
/* 217 */ "acct_optr", /* 217 */ "alter_db_optr",
/* 218 */ "ifnotexists", /* 218 */ "acct_optr",
/* 219 */ "db_optr", /* 219 */ "ifnotexists",
/* 220 */ "pps", /* 220 */ "db_optr",
/* 221 */ "tseries", /* 221 */ "pps",
/* 222 */ "dbs", /* 222 */ "tseries",
/* 223 */ "streams", /* 223 */ "dbs",
/* 224 */ "storage", /* 224 */ "streams",
/* 225 */ "qtime", /* 225 */ "storage",
/* 226 */ "users", /* 226 */ "qtime",
/* 227 */ "conns", /* 227 */ "users",
/* 228 */ "state", /* 228 */ "conns",
/* 229 */ "keep", /* 229 */ "state",
/* 230 */ "tagitemlist", /* 230 */ "keep",
/* 231 */ "cache", /* 231 */ "tagitemlist",
/* 232 */ "replica", /* 232 */ "cache",
/* 233 */ "quorum", /* 233 */ "replica",
/* 234 */ "days", /* 234 */ "quorum",
/* 235 */ "minrows", /* 235 */ "days",
/* 236 */ "maxrows", /* 236 */ "minrows",
/* 237 */ "blocks", /* 237 */ "maxrows",
/* 238 */ "ctime", /* 238 */ "blocks",
/* 239 */ "wal", /* 239 */ "ctime",
/* 240 */ "fsync", /* 240 */ "wal",
/* 241 */ "comp", /* 241 */ "fsync",
/* 242 */ "prec", /* 242 */ "comp",
/* 243 */ "update", /* 243 */ "prec",
/* 244 */ "cachelast", /* 244 */ "update",
/* 245 */ "typename", /* 245 */ "cachelast",
/* 246 */ "signed", /* 246 */ "typename",
/* 247 */ "create_table_args", /* 247 */ "signed",
/* 248 */ "create_stable_args", /* 248 */ "create_table_args",
/* 249 */ "create_table_list", /* 249 */ "create_stable_args",
/* 250 */ "create_from_stable", /* 250 */ "create_table_list",
/* 251 */ "columnlist", /* 251 */ "create_from_stable",
/* 252 */ "select", /* 252 */ "columnlist",
/* 253 */ "column", /* 253 */ "select",
/* 254 */ "tagitem", /* 254 */ "column",
/* 255 */ "selcollist", /* 255 */ "tagitem",
/* 256 */ "from", /* 256 */ "selcollist",
/* 257 */ "where_opt", /* 257 */ "from",
/* 258 */ "interval_opt", /* 258 */ "where_opt",
/* 259 */ "fill_opt", /* 259 */ "interval_opt",
/* 260 */ "sliding_opt", /* 260 */ "fill_opt",
/* 261 */ "groupby_opt", /* 261 */ "sliding_opt",
/* 262 */ "orderby_opt", /* 262 */ "groupby_opt",
/* 263 */ "having_opt", /* 263 */ "orderby_opt",
/* 264 */ "slimit_opt", /* 264 */ "having_opt",
/* 265 */ "limit_opt", /* 265 */ "slimit_opt",
/* 266 */ "union", /* 266 */ "limit_opt",
/* 267 */ "sclp", /* 267 */ "union",
/* 268 */ "expr", /* 268 */ "sclp",
/* 269 */ "as", /* 269 */ "distinct",
/* 270 */ "tablelist", /* 270 */ "expr",
/* 271 */ "tmvar", /* 271 */ "as",
/* 272 */ "sortlist", /* 272 */ "tablelist",
/* 273 */ "sortitem", /* 273 */ "tmvar",
/* 274 */ "item", /* 274 */ "sortlist",
/* 275 */ "sortorder", /* 275 */ "sortitem",
/* 276 */ "grouplist", /* 276 */ "item",
/* 277 */ "exprlist", /* 277 */ "sortorder",
/* 278 */ "expritem", /* 278 */ "grouplist",
/* 279 */ "exprlist",
/* 280 */ "expritem",
}; };
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
...@@ -1193,101 +1194,103 @@ static const char *const yyRuleName[] = { ...@@ -1193,101 +1194,103 @@ static const char *const yyRuleName[] = {
/* 150 */ "select ::= SELECT selcollist", /* 150 */ "select ::= SELECT selcollist",
/* 151 */ "sclp ::= selcollist COMMA", /* 151 */ "sclp ::= selcollist COMMA",
/* 152 */ "sclp ::=", /* 152 */ "sclp ::=",
/* 153 */ "selcollist ::= sclp expr as", /* 153 */ "selcollist ::= sclp distinct expr as",
/* 154 */ "selcollist ::= sclp STAR", /* 154 */ "selcollist ::= sclp STAR",
/* 155 */ "as ::= AS ids", /* 155 */ "as ::= AS ids",
/* 156 */ "as ::= ids", /* 156 */ "as ::= ids",
/* 157 */ "as ::=", /* 157 */ "as ::=",
/* 158 */ "from ::= FROM tablelist", /* 158 */ "distinct ::= DISTINCT",
/* 159 */ "tablelist ::= ids cpxName", /* 159 */ "distinct ::=",
/* 160 */ "tablelist ::= ids cpxName ids", /* 160 */ "from ::= FROM tablelist",
/* 161 */ "tablelist ::= tablelist COMMA ids cpxName", /* 161 */ "tablelist ::= ids cpxName",
/* 162 */ "tablelist ::= tablelist COMMA ids cpxName ids", /* 162 */ "tablelist ::= ids cpxName ids",
/* 163 */ "tmvar ::= VARIABLE", /* 163 */ "tablelist ::= tablelist COMMA ids cpxName",
/* 164 */ "interval_opt ::= INTERVAL LP tmvar RP", /* 164 */ "tablelist ::= tablelist COMMA ids cpxName ids",
/* 165 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP", /* 165 */ "tmvar ::= VARIABLE",
/* 166 */ "interval_opt ::=", /* 166 */ "interval_opt ::= INTERVAL LP tmvar RP",
/* 167 */ "fill_opt ::=", /* 167 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
/* 168 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP", /* 168 */ "interval_opt ::=",
/* 169 */ "fill_opt ::= FILL LP ID RP", /* 169 */ "fill_opt ::=",
/* 170 */ "sliding_opt ::= SLIDING LP tmvar RP", /* 170 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
/* 171 */ "sliding_opt ::=", /* 171 */ "fill_opt ::= FILL LP ID RP",
/* 172 */ "orderby_opt ::=", /* 172 */ "sliding_opt ::= SLIDING LP tmvar RP",
/* 173 */ "orderby_opt ::= ORDER BY sortlist", /* 173 */ "sliding_opt ::=",
/* 174 */ "sortlist ::= sortlist COMMA item sortorder", /* 174 */ "orderby_opt ::=",
/* 175 */ "sortlist ::= item sortorder", /* 175 */ "orderby_opt ::= ORDER BY sortlist",
/* 176 */ "item ::= ids cpxName", /* 176 */ "sortlist ::= sortlist COMMA item sortorder",
/* 177 */ "sortorder ::= ASC", /* 177 */ "sortlist ::= item sortorder",
/* 178 */ "sortorder ::= DESC", /* 178 */ "item ::= ids cpxName",
/* 179 */ "sortorder ::=", /* 179 */ "sortorder ::= ASC",
/* 180 */ "groupby_opt ::=", /* 180 */ "sortorder ::= DESC",
/* 181 */ "groupby_opt ::= GROUP BY grouplist", /* 181 */ "sortorder ::=",
/* 182 */ "grouplist ::= grouplist COMMA item", /* 182 */ "groupby_opt ::=",
/* 183 */ "grouplist ::= item", /* 183 */ "groupby_opt ::= GROUP BY grouplist",
/* 184 */ "having_opt ::=", /* 184 */ "grouplist ::= grouplist COMMA item",
/* 185 */ "having_opt ::= HAVING expr", /* 185 */ "grouplist ::= item",
/* 186 */ "limit_opt ::=", /* 186 */ "having_opt ::=",
/* 187 */ "limit_opt ::= LIMIT signed", /* 187 */ "having_opt ::= HAVING expr",
/* 188 */ "limit_opt ::= LIMIT signed OFFSET signed", /* 188 */ "limit_opt ::=",
/* 189 */ "limit_opt ::= LIMIT signed COMMA signed", /* 189 */ "limit_opt ::= LIMIT signed",
/* 190 */ "slimit_opt ::=", /* 190 */ "limit_opt ::= LIMIT signed OFFSET signed",
/* 191 */ "slimit_opt ::= SLIMIT signed", /* 191 */ "limit_opt ::= LIMIT signed COMMA signed",
/* 192 */ "slimit_opt ::= SLIMIT signed SOFFSET signed", /* 192 */ "slimit_opt ::=",
/* 193 */ "slimit_opt ::= SLIMIT signed COMMA signed", /* 193 */ "slimit_opt ::= SLIMIT signed",
/* 194 */ "where_opt ::=", /* 194 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
/* 195 */ "where_opt ::= WHERE expr", /* 195 */ "slimit_opt ::= SLIMIT signed COMMA signed",
/* 196 */ "expr ::= LP expr RP", /* 196 */ "where_opt ::=",
/* 197 */ "expr ::= ID", /* 197 */ "where_opt ::= WHERE expr",
/* 198 */ "expr ::= ID DOT ID", /* 198 */ "expr ::= LP expr RP",
/* 199 */ "expr ::= ID DOT STAR", /* 199 */ "expr ::= ID",
/* 200 */ "expr ::= INTEGER", /* 200 */ "expr ::= ID DOT ID",
/* 201 */ "expr ::= MINUS INTEGER", /* 201 */ "expr ::= ID DOT STAR",
/* 202 */ "expr ::= PLUS INTEGER", /* 202 */ "expr ::= INTEGER",
/* 203 */ "expr ::= FLOAT", /* 203 */ "expr ::= MINUS INTEGER",
/* 204 */ "expr ::= MINUS FLOAT", /* 204 */ "expr ::= PLUS INTEGER",
/* 205 */ "expr ::= PLUS FLOAT", /* 205 */ "expr ::= FLOAT",
/* 206 */ "expr ::= STRING", /* 206 */ "expr ::= MINUS FLOAT",
/* 207 */ "expr ::= NOW", /* 207 */ "expr ::= PLUS FLOAT",
/* 208 */ "expr ::= VARIABLE", /* 208 */ "expr ::= STRING",
/* 209 */ "expr ::= BOOL", /* 209 */ "expr ::= NOW",
/* 210 */ "expr ::= ID LP exprlist RP", /* 210 */ "expr ::= VARIABLE",
/* 211 */ "expr ::= ID LP STAR RP", /* 211 */ "expr ::= BOOL",
/* 212 */ "expr ::= expr IS NULL", /* 212 */ "expr ::= ID LP exprlist RP",
/* 213 */ "expr ::= expr IS NOT NULL", /* 213 */ "expr ::= ID LP STAR RP",
/* 214 */ "expr ::= expr LT expr", /* 214 */ "expr ::= expr IS NULL",
/* 215 */ "expr ::= expr GT expr", /* 215 */ "expr ::= expr IS NOT NULL",
/* 216 */ "expr ::= expr LE expr", /* 216 */ "expr ::= expr LT expr",
/* 217 */ "expr ::= expr GE expr", /* 217 */ "expr ::= expr GT expr",
/* 218 */ "expr ::= expr NE expr", /* 218 */ "expr ::= expr LE expr",
/* 219 */ "expr ::= expr EQ expr", /* 219 */ "expr ::= expr GE expr",
/* 220 */ "expr ::= expr AND expr", /* 220 */ "expr ::= expr NE expr",
/* 221 */ "expr ::= expr OR expr", /* 221 */ "expr ::= expr EQ expr",
/* 222 */ "expr ::= expr PLUS expr", /* 222 */ "expr ::= expr AND expr",
/* 223 */ "expr ::= expr MINUS expr", /* 223 */ "expr ::= expr OR expr",
/* 224 */ "expr ::= expr STAR expr", /* 224 */ "expr ::= expr PLUS expr",
/* 225 */ "expr ::= expr SLASH expr", /* 225 */ "expr ::= expr MINUS expr",
/* 226 */ "expr ::= expr REM expr", /* 226 */ "expr ::= expr STAR expr",
/* 227 */ "expr ::= expr LIKE expr", /* 227 */ "expr ::= expr SLASH expr",
/* 228 */ "expr ::= expr IN LP exprlist RP", /* 228 */ "expr ::= expr REM expr",
/* 229 */ "exprlist ::= exprlist COMMA expritem", /* 229 */ "expr ::= expr LIKE expr",
/* 230 */ "exprlist ::= expritem", /* 230 */ "expr ::= expr IN LP exprlist RP",
/* 231 */ "expritem ::= expr", /* 231 */ "exprlist ::= exprlist COMMA expritem",
/* 232 */ "expritem ::=", /* 232 */ "exprlist ::= expritem",
/* 233 */ "cmd ::= RESET QUERY CACHE", /* 233 */ "expritem ::= expr",
/* 234 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist", /* 234 */ "expritem ::=",
/* 235 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids", /* 235 */ "cmd ::= RESET QUERY CACHE",
/* 236 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist", /* 236 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
/* 237 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids", /* 237 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
/* 238 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids", /* 238 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
/* 239 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem", /* 239 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
/* 240 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist", /* 240 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
/* 241 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids", /* 241 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
/* 242 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist", /* 242 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist",
/* 243 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids", /* 243 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids",
/* 244 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids", /* 244 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist",
/* 245 */ "cmd ::= KILL CONNECTION INTEGER", /* 245 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids",
/* 246 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER", /* 246 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids",
/* 247 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER", /* 247 */ "cmd ::= KILL CONNECTION INTEGER",
/* 248 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
/* 249 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
}; };
#endif /* NDEBUG */ #endif /* NDEBUG */
...@@ -1408,51 +1411,51 @@ static void yy_destructor( ...@@ -1408,51 +1411,51 @@ static void yy_destructor(
** inside the C code. ** inside the C code.
*/ */
/********* Begin destructor definitions ***************************************/ /********* Begin destructor definitions ***************************************/
case 229: /* keep */ case 230: /* keep */
case 230: /* tagitemlist */ case 231: /* tagitemlist */
case 251: /* columnlist */ case 252: /* columnlist */
case 259: /* fill_opt */ case 260: /* fill_opt */
case 261: /* groupby_opt */ case 262: /* groupby_opt */
case 262: /* orderby_opt */ case 263: /* orderby_opt */
case 272: /* sortlist */ case 274: /* sortlist */
case 276: /* grouplist */ case 278: /* grouplist */
{ {
taosArrayDestroy((yypminor->yy135)); taosArrayDestroy((yypminor->yy247));
} }
break; break;
case 249: /* create_table_list */ case 250: /* create_table_list */
{ {
destroyCreateTableSql((yypminor->yy38)); destroyCreateTableSql((yypminor->yy358));
} }
break; break;
case 252: /* select */ case 253: /* select */
{ {
doDestroyQuerySql((yypminor->yy30)); doDestroyQuerySql((yypminor->yy114));
} }
break; break;
case 255: /* selcollist */ case 256: /* selcollist */
case 267: /* sclp */ case 268: /* sclp */
case 277: /* exprlist */ case 279: /* exprlist */
{ {
tSqlExprListDestroy((yypminor->yy266)); tSqlExprListDestroy((yypminor->yy522));
} }
break; break;
case 257: /* where_opt */ case 258: /* where_opt */
case 263: /* having_opt */ case 264: /* having_opt */
case 268: /* expr */ case 270: /* expr */
case 278: /* expritem */ case 280: /* expritem */
{ {
tSqlExprDestroy((yypminor->yy316)); tSqlExprDestroy((yypminor->yy326));
} }
break; break;
case 266: /* union */ case 267: /* union */
{ {
destroyAllSelectClause((yypminor->yy153)); destroyAllSelectClause((yypminor->yy219));
} }
break; break;
case 273: /* sortitem */ case 275: /* sortitem */
{ {
tVariantDestroy(&(yypminor->yy308)); tVariantDestroy(&(yypminor->yy378));
} }
break; break;
/********* End destructor definitions *****************************************/ /********* End destructor definitions *****************************************/
...@@ -1746,254 +1749,256 @@ static const struct { ...@@ -1746,254 +1749,256 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} yyRuleInfo[] = { } yyRuleInfo[] = {
{ 210, -1 }, /* (0) program ::= cmd */ { 211, -1 }, /* (0) program ::= cmd */
{ 211, -2 }, /* (1) cmd ::= SHOW DATABASES */ { 212, -2 }, /* (1) cmd ::= SHOW DATABASES */
{ 211, -2 }, /* (2) cmd ::= SHOW MNODES */ { 212, -2 }, /* (2) cmd ::= SHOW MNODES */
{ 211, -2 }, /* (3) cmd ::= SHOW DNODES */ { 212, -2 }, /* (3) cmd ::= SHOW DNODES */
{ 211, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */ { 212, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */
{ 211, -2 }, /* (5) cmd ::= SHOW USERS */ { 212, -2 }, /* (5) cmd ::= SHOW USERS */
{ 211, -2 }, /* (6) cmd ::= SHOW MODULES */ { 212, -2 }, /* (6) cmd ::= SHOW MODULES */
{ 211, -2 }, /* (7) cmd ::= SHOW QUERIES */ { 212, -2 }, /* (7) cmd ::= SHOW QUERIES */
{ 211, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */ { 212, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */
{ 211, -2 }, /* (9) cmd ::= SHOW STREAMS */ { 212, -2 }, /* (9) cmd ::= SHOW STREAMS */
{ 211, -2 }, /* (10) cmd ::= SHOW VARIABLES */ { 212, -2 }, /* (10) cmd ::= SHOW VARIABLES */
{ 211, -2 }, /* (11) cmd ::= SHOW SCORES */ { 212, -2 }, /* (11) cmd ::= SHOW SCORES */
{ 211, -2 }, /* (12) cmd ::= SHOW GRANTS */ { 212, -2 }, /* (12) cmd ::= SHOW GRANTS */
{ 211, -2 }, /* (13) cmd ::= SHOW VNODES */ { 212, -2 }, /* (13) cmd ::= SHOW VNODES */
{ 211, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */ { 212, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */
{ 212, 0 }, /* (15) dbPrefix ::= */ { 213, 0 }, /* (15) dbPrefix ::= */
{ 212, -2 }, /* (16) dbPrefix ::= ids DOT */ { 213, -2 }, /* (16) dbPrefix ::= ids DOT */
{ 214, 0 }, /* (17) cpxName ::= */ { 215, 0 }, /* (17) cpxName ::= */
{ 214, -2 }, /* (18) cpxName ::= DOT ids */ { 215, -2 }, /* (18) cpxName ::= DOT ids */
{ 211, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */ { 212, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
{ 211, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */ { 212, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */
{ 211, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */ { 212, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */
{ 211, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */ { 212, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
{ 211, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */ { 212, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */
{ 211, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */ { 212, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
{ 211, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */ { 212, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
{ 211, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */ { 212, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
{ 211, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */ { 212, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
{ 211, -5 }, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */ { 212, -5 }, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */
{ 211, -4 }, /* (29) cmd ::= DROP DATABASE ifexists ids */ { 212, -4 }, /* (29) cmd ::= DROP DATABASE ifexists ids */
{ 211, -3 }, /* (30) cmd ::= DROP DNODE ids */ { 212, -3 }, /* (30) cmd ::= DROP DNODE ids */
{ 211, -3 }, /* (31) cmd ::= DROP USER ids */ { 212, -3 }, /* (31) cmd ::= DROP USER ids */
{ 211, -3 }, /* (32) cmd ::= DROP ACCOUNT ids */ { 212, -3 }, /* (32) cmd ::= DROP ACCOUNT ids */
{ 211, -2 }, /* (33) cmd ::= USE ids */ { 212, -2 }, /* (33) cmd ::= USE ids */
{ 211, -3 }, /* (34) cmd ::= DESCRIBE ids cpxName */ { 212, -3 }, /* (34) cmd ::= DESCRIBE ids cpxName */
{ 211, -5 }, /* (35) cmd ::= ALTER USER ids PASS ids */ { 212, -5 }, /* (35) cmd ::= ALTER USER ids PASS ids */
{ 211, -5 }, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */ { 212, -5 }, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */
{ 211, -4 }, /* (37) cmd ::= ALTER DNODE ids ids */ { 212, -4 }, /* (37) cmd ::= ALTER DNODE ids ids */
{ 211, -5 }, /* (38) cmd ::= ALTER DNODE ids ids ids */ { 212, -5 }, /* (38) cmd ::= ALTER DNODE ids ids ids */
{ 211, -3 }, /* (39) cmd ::= ALTER LOCAL ids */ { 212, -3 }, /* (39) cmd ::= ALTER LOCAL ids */
{ 211, -4 }, /* (40) cmd ::= ALTER LOCAL ids ids */ { 212, -4 }, /* (40) cmd ::= ALTER LOCAL ids ids */
{ 211, -4 }, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */ { 212, -4 }, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */
{ 211, -4 }, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */ { 212, -4 }, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */
{ 211, -6 }, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */ { 212, -6 }, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
{ 213, -1 }, /* (44) ids ::= ID */ { 214, -1 }, /* (44) ids ::= ID */
{ 213, -1 }, /* (45) ids ::= STRING */ { 214, -1 }, /* (45) ids ::= STRING */
{ 215, -2 }, /* (46) ifexists ::= IF EXISTS */ { 216, -2 }, /* (46) ifexists ::= IF EXISTS */
{ 215, 0 }, /* (47) ifexists ::= */ { 216, 0 }, /* (47) ifexists ::= */
{ 218, -3 }, /* (48) ifnotexists ::= IF NOT EXISTS */ { 219, -3 }, /* (48) ifnotexists ::= IF NOT EXISTS */
{ 218, 0 }, /* (49) ifnotexists ::= */ { 219, 0 }, /* (49) ifnotexists ::= */
{ 211, -3 }, /* (50) cmd ::= CREATE DNODE ids */ { 212, -3 }, /* (50) cmd ::= CREATE DNODE ids */
{ 211, -6 }, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */ { 212, -6 }, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
{ 211, -5 }, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */ { 212, -5 }, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
{ 211, -5 }, /* (53) cmd ::= CREATE USER ids PASS ids */ { 212, -5 }, /* (53) cmd ::= CREATE USER ids PASS ids */
{ 220, 0 }, /* (54) pps ::= */ { 221, 0 }, /* (54) pps ::= */
{ 220, -2 }, /* (55) pps ::= PPS INTEGER */ { 221, -2 }, /* (55) pps ::= PPS INTEGER */
{ 221, 0 }, /* (56) tseries ::= */ { 222, 0 }, /* (56) tseries ::= */
{ 221, -2 }, /* (57) tseries ::= TSERIES INTEGER */ { 222, -2 }, /* (57) tseries ::= TSERIES INTEGER */
{ 222, 0 }, /* (58) dbs ::= */ { 223, 0 }, /* (58) dbs ::= */
{ 222, -2 }, /* (59) dbs ::= DBS INTEGER */ { 223, -2 }, /* (59) dbs ::= DBS INTEGER */
{ 223, 0 }, /* (60) streams ::= */ { 224, 0 }, /* (60) streams ::= */
{ 223, -2 }, /* (61) streams ::= STREAMS INTEGER */ { 224, -2 }, /* (61) streams ::= STREAMS INTEGER */
{ 224, 0 }, /* (62) storage ::= */ { 225, 0 }, /* (62) storage ::= */
{ 224, -2 }, /* (63) storage ::= STORAGE INTEGER */ { 225, -2 }, /* (63) storage ::= STORAGE INTEGER */
{ 225, 0 }, /* (64) qtime ::= */ { 226, 0 }, /* (64) qtime ::= */
{ 225, -2 }, /* (65) qtime ::= QTIME INTEGER */ { 226, -2 }, /* (65) qtime ::= QTIME INTEGER */
{ 226, 0 }, /* (66) users ::= */ { 227, 0 }, /* (66) users ::= */
{ 226, -2 }, /* (67) users ::= USERS INTEGER */ { 227, -2 }, /* (67) users ::= USERS INTEGER */
{ 227, 0 }, /* (68) conns ::= */ { 228, 0 }, /* (68) conns ::= */
{ 227, -2 }, /* (69) conns ::= CONNS INTEGER */ { 228, -2 }, /* (69) conns ::= CONNS INTEGER */
{ 228, 0 }, /* (70) state ::= */ { 229, 0 }, /* (70) state ::= */
{ 228, -2 }, /* (71) state ::= STATE ids */ { 229, -2 }, /* (71) state ::= STATE ids */
{ 217, -9 }, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */ { 218, -9 }, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
{ 229, -2 }, /* (73) keep ::= KEEP tagitemlist */ { 230, -2 }, /* (73) keep ::= KEEP tagitemlist */
{ 231, -2 }, /* (74) cache ::= CACHE INTEGER */ { 232, -2 }, /* (74) cache ::= CACHE INTEGER */
{ 232, -2 }, /* (75) replica ::= REPLICA INTEGER */ { 233, -2 }, /* (75) replica ::= REPLICA INTEGER */
{ 233, -2 }, /* (76) quorum ::= QUORUM INTEGER */ { 234, -2 }, /* (76) quorum ::= QUORUM INTEGER */
{ 234, -2 }, /* (77) days ::= DAYS INTEGER */ { 235, -2 }, /* (77) days ::= DAYS INTEGER */
{ 235, -2 }, /* (78) minrows ::= MINROWS INTEGER */ { 236, -2 }, /* (78) minrows ::= MINROWS INTEGER */
{ 236, -2 }, /* (79) maxrows ::= MAXROWS INTEGER */ { 237, -2 }, /* (79) maxrows ::= MAXROWS INTEGER */
{ 237, -2 }, /* (80) blocks ::= BLOCKS INTEGER */ { 238, -2 }, /* (80) blocks ::= BLOCKS INTEGER */
{ 238, -2 }, /* (81) ctime ::= CTIME INTEGER */ { 239, -2 }, /* (81) ctime ::= CTIME INTEGER */
{ 239, -2 }, /* (82) wal ::= WAL INTEGER */ { 240, -2 }, /* (82) wal ::= WAL INTEGER */
{ 240, -2 }, /* (83) fsync ::= FSYNC INTEGER */ { 241, -2 }, /* (83) fsync ::= FSYNC INTEGER */
{ 241, -2 }, /* (84) comp ::= COMP INTEGER */ { 242, -2 }, /* (84) comp ::= COMP INTEGER */
{ 242, -2 }, /* (85) prec ::= PRECISION STRING */ { 243, -2 }, /* (85) prec ::= PRECISION STRING */
{ 243, -2 }, /* (86) update ::= UPDATE INTEGER */ { 244, -2 }, /* (86) update ::= UPDATE INTEGER */
{ 244, -2 }, /* (87) cachelast ::= CACHELAST INTEGER */ { 245, -2 }, /* (87) cachelast ::= CACHELAST INTEGER */
{ 219, 0 }, /* (88) db_optr ::= */ { 220, 0 }, /* (88) db_optr ::= */
{ 219, -2 }, /* (89) db_optr ::= db_optr cache */ { 220, -2 }, /* (89) db_optr ::= db_optr cache */
{ 219, -2 }, /* (90) db_optr ::= db_optr replica */ { 220, -2 }, /* (90) db_optr ::= db_optr replica */
{ 219, -2 }, /* (91) db_optr ::= db_optr quorum */ { 220, -2 }, /* (91) db_optr ::= db_optr quorum */
{ 219, -2 }, /* (92) db_optr ::= db_optr days */ { 220, -2 }, /* (92) db_optr ::= db_optr days */
{ 219, -2 }, /* (93) db_optr ::= db_optr minrows */ { 220, -2 }, /* (93) db_optr ::= db_optr minrows */
{ 219, -2 }, /* (94) db_optr ::= db_optr maxrows */ { 220, -2 }, /* (94) db_optr ::= db_optr maxrows */
{ 219, -2 }, /* (95) db_optr ::= db_optr blocks */ { 220, -2 }, /* (95) db_optr ::= db_optr blocks */
{ 219, -2 }, /* (96) db_optr ::= db_optr ctime */ { 220, -2 }, /* (96) db_optr ::= db_optr ctime */
{ 219, -2 }, /* (97) db_optr ::= db_optr wal */ { 220, -2 }, /* (97) db_optr ::= db_optr wal */
{ 219, -2 }, /* (98) db_optr ::= db_optr fsync */ { 220, -2 }, /* (98) db_optr ::= db_optr fsync */
{ 219, -2 }, /* (99) db_optr ::= db_optr comp */ { 220, -2 }, /* (99) db_optr ::= db_optr comp */
{ 219, -2 }, /* (100) db_optr ::= db_optr prec */ { 220, -2 }, /* (100) db_optr ::= db_optr prec */
{ 219, -2 }, /* (101) db_optr ::= db_optr keep */ { 220, -2 }, /* (101) db_optr ::= db_optr keep */
{ 219, -2 }, /* (102) db_optr ::= db_optr update */ { 220, -2 }, /* (102) db_optr ::= db_optr update */
{ 219, -2 }, /* (103) db_optr ::= db_optr cachelast */ { 220, -2 }, /* (103) db_optr ::= db_optr cachelast */
{ 216, 0 }, /* (104) alter_db_optr ::= */ { 217, 0 }, /* (104) alter_db_optr ::= */
{ 216, -2 }, /* (105) alter_db_optr ::= alter_db_optr replica */ { 217, -2 }, /* (105) alter_db_optr ::= alter_db_optr replica */
{ 216, -2 }, /* (106) alter_db_optr ::= alter_db_optr quorum */ { 217, -2 }, /* (106) alter_db_optr ::= alter_db_optr quorum */
{ 216, -2 }, /* (107) alter_db_optr ::= alter_db_optr keep */ { 217, -2 }, /* (107) alter_db_optr ::= alter_db_optr keep */
{ 216, -2 }, /* (108) alter_db_optr ::= alter_db_optr blocks */ { 217, -2 }, /* (108) alter_db_optr ::= alter_db_optr blocks */
{ 216, -2 }, /* (109) alter_db_optr ::= alter_db_optr comp */ { 217, -2 }, /* (109) alter_db_optr ::= alter_db_optr comp */
{ 216, -2 }, /* (110) alter_db_optr ::= alter_db_optr wal */ { 217, -2 }, /* (110) alter_db_optr ::= alter_db_optr wal */
{ 216, -2 }, /* (111) alter_db_optr ::= alter_db_optr fsync */ { 217, -2 }, /* (111) alter_db_optr ::= alter_db_optr fsync */
{ 216, -2 }, /* (112) alter_db_optr ::= alter_db_optr update */ { 217, -2 }, /* (112) alter_db_optr ::= alter_db_optr update */
{ 216, -2 }, /* (113) alter_db_optr ::= alter_db_optr cachelast */ { 217, -2 }, /* (113) alter_db_optr ::= alter_db_optr cachelast */
{ 245, -1 }, /* (114) typename ::= ids */ { 246, -1 }, /* (114) typename ::= ids */
{ 245, -4 }, /* (115) typename ::= ids LP signed RP */ { 246, -4 }, /* (115) typename ::= ids LP signed RP */
{ 245, -2 }, /* (116) typename ::= ids UNSIGNED */ { 246, -2 }, /* (116) typename ::= ids UNSIGNED */
{ 246, -1 }, /* (117) signed ::= INTEGER */ { 247, -1 }, /* (117) signed ::= INTEGER */
{ 246, -2 }, /* (118) signed ::= PLUS INTEGER */ { 247, -2 }, /* (118) signed ::= PLUS INTEGER */
{ 246, -2 }, /* (119) signed ::= MINUS INTEGER */ { 247, -2 }, /* (119) signed ::= MINUS INTEGER */
{ 211, -3 }, /* (120) cmd ::= CREATE TABLE create_table_args */ { 212, -3 }, /* (120) cmd ::= CREATE TABLE create_table_args */
{ 211, -3 }, /* (121) cmd ::= CREATE TABLE create_stable_args */ { 212, -3 }, /* (121) cmd ::= CREATE TABLE create_stable_args */
{ 211, -3 }, /* (122) cmd ::= CREATE STABLE create_stable_args */ { 212, -3 }, /* (122) cmd ::= CREATE STABLE create_stable_args */
{ 211, -3 }, /* (123) cmd ::= CREATE TABLE create_table_list */ { 212, -3 }, /* (123) cmd ::= CREATE TABLE create_table_list */
{ 249, -1 }, /* (124) create_table_list ::= create_from_stable */ { 250, -1 }, /* (124) create_table_list ::= create_from_stable */
{ 249, -2 }, /* (125) create_table_list ::= create_table_list create_from_stable */ { 250, -2 }, /* (125) create_table_list ::= create_table_list create_from_stable */
{ 247, -6 }, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */ { 248, -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 */ { 249, -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 */ { 251, -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 */ { 248, -5 }, /* (129) create_table_args ::= ifnotexists ids cpxName AS select */
{ 251, -3 }, /* (130) columnlist ::= columnlist COMMA column */ { 252, -3 }, /* (130) columnlist ::= columnlist COMMA column */
{ 251, -1 }, /* (131) columnlist ::= column */ { 252, -1 }, /* (131) columnlist ::= column */
{ 253, -2 }, /* (132) column ::= ids typename */ { 254, -2 }, /* (132) column ::= ids typename */
{ 230, -3 }, /* (133) tagitemlist ::= tagitemlist COMMA tagitem */ { 231, -3 }, /* (133) tagitemlist ::= tagitemlist COMMA tagitem */
{ 230, -1 }, /* (134) tagitemlist ::= tagitem */ { 231, -1 }, /* (134) tagitemlist ::= tagitem */
{ 254, -1 }, /* (135) tagitem ::= INTEGER */ { 255, -1 }, /* (135) tagitem ::= INTEGER */
{ 254, -1 }, /* (136) tagitem ::= FLOAT */ { 255, -1 }, /* (136) tagitem ::= FLOAT */
{ 254, -1 }, /* (137) tagitem ::= STRING */ { 255, -1 }, /* (137) tagitem ::= STRING */
{ 254, -1 }, /* (138) tagitem ::= BOOL */ { 255, -1 }, /* (138) tagitem ::= BOOL */
{ 254, -1 }, /* (139) tagitem ::= NULL */ { 255, -1 }, /* (139) tagitem ::= NULL */
{ 254, -2 }, /* (140) tagitem ::= MINUS INTEGER */ { 255, -2 }, /* (140) tagitem ::= MINUS INTEGER */
{ 254, -2 }, /* (141) tagitem ::= MINUS FLOAT */ { 255, -2 }, /* (141) tagitem ::= MINUS FLOAT */
{ 254, -2 }, /* (142) tagitem ::= PLUS INTEGER */ { 255, -2 }, /* (142) tagitem ::= PLUS INTEGER */
{ 254, -2 }, /* (143) tagitem ::= PLUS FLOAT */ { 255, -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 */ { 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 */
{ 266, -1 }, /* (145) union ::= select */ { 267, -1 }, /* (145) union ::= select */
{ 266, -3 }, /* (146) union ::= LP union RP */ { 267, -3 }, /* (146) union ::= LP union RP */
{ 266, -4 }, /* (147) union ::= union UNION ALL select */ { 267, -4 }, /* (147) union ::= union UNION ALL select */
{ 266, -6 }, /* (148) union ::= union UNION ALL LP select RP */ { 267, -6 }, /* (148) union ::= union UNION ALL LP select RP */
{ 211, -1 }, /* (149) cmd ::= union */ { 212, -1 }, /* (149) cmd ::= union */
{ 252, -2 }, /* (150) select ::= SELECT selcollist */ { 253, -2 }, /* (150) select ::= SELECT selcollist */
{ 267, -2 }, /* (151) sclp ::= selcollist COMMA */ { 268, -2 }, /* (151) sclp ::= selcollist COMMA */
{ 267, 0 }, /* (152) sclp ::= */ { 268, 0 }, /* (152) sclp ::= */
{ 255, -3 }, /* (153) selcollist ::= sclp expr as */ { 256, -4 }, /* (153) selcollist ::= sclp distinct expr as */
{ 255, -2 }, /* (154) selcollist ::= sclp STAR */ { 256, -2 }, /* (154) selcollist ::= sclp STAR */
{ 269, -2 }, /* (155) as ::= AS ids */ { 271, -2 }, /* (155) as ::= AS ids */
{ 269, -1 }, /* (156) as ::= ids */ { 271, -1 }, /* (156) as ::= ids */
{ 269, 0 }, /* (157) as ::= */ { 271, 0 }, /* (157) as ::= */
{ 256, -2 }, /* (158) from ::= FROM tablelist */ { 269, -1 }, /* (158) distinct ::= DISTINCT */
{ 270, -2 }, /* (159) tablelist ::= ids cpxName */ { 269, 0 }, /* (159) distinct ::= */
{ 270, -3 }, /* (160) tablelist ::= ids cpxName ids */ { 257, -2 }, /* (160) from ::= FROM tablelist */
{ 270, -4 }, /* (161) tablelist ::= tablelist COMMA ids cpxName */ { 272, -2 }, /* (161) tablelist ::= ids cpxName */
{ 270, -5 }, /* (162) tablelist ::= tablelist COMMA ids cpxName ids */ { 272, -3 }, /* (162) tablelist ::= ids cpxName ids */
{ 271, -1 }, /* (163) tmvar ::= VARIABLE */ { 272, -4 }, /* (163) tablelist ::= tablelist COMMA ids cpxName */
{ 258, -4 }, /* (164) interval_opt ::= INTERVAL LP tmvar RP */ { 272, -5 }, /* (164) tablelist ::= tablelist COMMA ids cpxName ids */
{ 258, -6 }, /* (165) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */ { 273, -1 }, /* (165) tmvar ::= VARIABLE */
{ 258, 0 }, /* (166) interval_opt ::= */ { 259, -4 }, /* (166) interval_opt ::= INTERVAL LP tmvar RP */
{ 259, 0 }, /* (167) fill_opt ::= */ { 259, -6 }, /* (167) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
{ 259, -6 }, /* (168) fill_opt ::= FILL LP ID COMMA tagitemlist RP */ { 259, 0 }, /* (168) interval_opt ::= */
{ 259, -4 }, /* (169) fill_opt ::= FILL LP ID RP */ { 260, 0 }, /* (169) fill_opt ::= */
{ 260, -4 }, /* (170) sliding_opt ::= SLIDING LP tmvar RP */ { 260, -6 }, /* (170) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{ 260, 0 }, /* (171) sliding_opt ::= */ { 260, -4 }, /* (171) fill_opt ::= FILL LP ID RP */
{ 262, 0 }, /* (172) orderby_opt ::= */ { 261, -4 }, /* (172) sliding_opt ::= SLIDING LP tmvar RP */
{ 262, -3 }, /* (173) orderby_opt ::= ORDER BY sortlist */ { 261, 0 }, /* (173) sliding_opt ::= */
{ 272, -4 }, /* (174) sortlist ::= sortlist COMMA item sortorder */ { 263, 0 }, /* (174) orderby_opt ::= */
{ 272, -2 }, /* (175) sortlist ::= item sortorder */ { 263, -3 }, /* (175) orderby_opt ::= ORDER BY sortlist */
{ 274, -2 }, /* (176) item ::= ids cpxName */ { 274, -4 }, /* (176) sortlist ::= sortlist COMMA item sortorder */
{ 275, -1 }, /* (177) sortorder ::= ASC */ { 274, -2 }, /* (177) sortlist ::= item sortorder */
{ 275, -1 }, /* (178) sortorder ::= DESC */ { 276, -2 }, /* (178) item ::= ids cpxName */
{ 275, 0 }, /* (179) sortorder ::= */ { 277, -1 }, /* (179) sortorder ::= ASC */
{ 261, 0 }, /* (180) groupby_opt ::= */ { 277, -1 }, /* (180) sortorder ::= DESC */
{ 261, -3 }, /* (181) groupby_opt ::= GROUP BY grouplist */ { 277, 0 }, /* (181) sortorder ::= */
{ 276, -3 }, /* (182) grouplist ::= grouplist COMMA item */ { 262, 0 }, /* (182) groupby_opt ::= */
{ 276, -1 }, /* (183) grouplist ::= item */ { 262, -3 }, /* (183) groupby_opt ::= GROUP BY grouplist */
{ 263, 0 }, /* (184) having_opt ::= */ { 278, -3 }, /* (184) grouplist ::= grouplist COMMA item */
{ 263, -2 }, /* (185) having_opt ::= HAVING expr */ { 278, -1 }, /* (185) grouplist ::= item */
{ 265, 0 }, /* (186) limit_opt ::= */ { 264, 0 }, /* (186) having_opt ::= */
{ 265, -2 }, /* (187) limit_opt ::= LIMIT signed */ { 264, -2 }, /* (187) having_opt ::= HAVING expr */
{ 265, -4 }, /* (188) limit_opt ::= LIMIT signed OFFSET signed */ { 266, 0 }, /* (188) limit_opt ::= */
{ 265, -4 }, /* (189) limit_opt ::= LIMIT signed COMMA signed */ { 266, -2 }, /* (189) limit_opt ::= LIMIT signed */
{ 264, 0 }, /* (190) slimit_opt ::= */ { 266, -4 }, /* (190) limit_opt ::= LIMIT signed OFFSET signed */
{ 264, -2 }, /* (191) slimit_opt ::= SLIMIT signed */ { 266, -4 }, /* (191) limit_opt ::= LIMIT signed COMMA signed */
{ 264, -4 }, /* (192) slimit_opt ::= SLIMIT signed SOFFSET signed */ { 265, 0 }, /* (192) slimit_opt ::= */
{ 264, -4 }, /* (193) slimit_opt ::= SLIMIT signed COMMA signed */ { 265, -2 }, /* (193) slimit_opt ::= SLIMIT signed */
{ 257, 0 }, /* (194) where_opt ::= */ { 265, -4 }, /* (194) slimit_opt ::= SLIMIT signed SOFFSET signed */
{ 257, -2 }, /* (195) where_opt ::= WHERE expr */ { 265, -4 }, /* (195) slimit_opt ::= SLIMIT signed COMMA signed */
{ 268, -3 }, /* (196) expr ::= LP expr RP */ { 258, 0 }, /* (196) where_opt ::= */
{ 268, -1 }, /* (197) expr ::= ID */ { 258, -2 }, /* (197) where_opt ::= WHERE expr */
{ 268, -3 }, /* (198) expr ::= ID DOT ID */ { 270, -3 }, /* (198) expr ::= LP expr RP */
{ 268, -3 }, /* (199) expr ::= ID DOT STAR */ { 270, -1 }, /* (199) expr ::= ID */
{ 268, -1 }, /* (200) expr ::= INTEGER */ { 270, -3 }, /* (200) expr ::= ID DOT ID */
{ 268, -2 }, /* (201) expr ::= MINUS INTEGER */ { 270, -3 }, /* (201) expr ::= ID DOT STAR */
{ 268, -2 }, /* (202) expr ::= PLUS INTEGER */ { 270, -1 }, /* (202) expr ::= INTEGER */
{ 268, -1 }, /* (203) expr ::= FLOAT */ { 270, -2 }, /* (203) expr ::= MINUS INTEGER */
{ 268, -2 }, /* (204) expr ::= MINUS FLOAT */ { 270, -2 }, /* (204) expr ::= PLUS INTEGER */
{ 268, -2 }, /* (205) expr ::= PLUS FLOAT */ { 270, -1 }, /* (205) expr ::= FLOAT */
{ 268, -1 }, /* (206) expr ::= STRING */ { 270, -2 }, /* (206) expr ::= MINUS FLOAT */
{ 268, -1 }, /* (207) expr ::= NOW */ { 270, -2 }, /* (207) expr ::= PLUS FLOAT */
{ 268, -1 }, /* (208) expr ::= VARIABLE */ { 270, -1 }, /* (208) expr ::= STRING */
{ 268, -1 }, /* (209) expr ::= BOOL */ { 270, -1 }, /* (209) expr ::= NOW */
{ 268, -4 }, /* (210) expr ::= ID LP exprlist RP */ { 270, -1 }, /* (210) expr ::= VARIABLE */
{ 268, -4 }, /* (211) expr ::= ID LP STAR RP */ { 270, -1 }, /* (211) expr ::= BOOL */
{ 268, -3 }, /* (212) expr ::= expr IS NULL */ { 270, -4 }, /* (212) expr ::= ID LP exprlist RP */
{ 268, -4 }, /* (213) expr ::= expr IS NOT NULL */ { 270, -4 }, /* (213) expr ::= ID LP STAR RP */
{ 268, -3 }, /* (214) expr ::= expr LT expr */ { 270, -3 }, /* (214) expr ::= expr IS NULL */
{ 268, -3 }, /* (215) expr ::= expr GT expr */ { 270, -4 }, /* (215) expr ::= expr IS NOT NULL */
{ 268, -3 }, /* (216) expr ::= expr LE expr */ { 270, -3 }, /* (216) expr ::= expr LT expr */
{ 268, -3 }, /* (217) expr ::= expr GE expr */ { 270, -3 }, /* (217) expr ::= expr GT expr */
{ 268, -3 }, /* (218) expr ::= expr NE expr */ { 270, -3 }, /* (218) expr ::= expr LE expr */
{ 268, -3 }, /* (219) expr ::= expr EQ expr */ { 270, -3 }, /* (219) expr ::= expr GE expr */
{ 268, -3 }, /* (220) expr ::= expr AND expr */ { 270, -3 }, /* (220) expr ::= expr NE expr */
{ 268, -3 }, /* (221) expr ::= expr OR expr */ { 270, -3 }, /* (221) expr ::= expr EQ expr */
{ 268, -3 }, /* (222) expr ::= expr PLUS expr */ { 270, -3 }, /* (222) expr ::= expr AND expr */
{ 268, -3 }, /* (223) expr ::= expr MINUS expr */ { 270, -3 }, /* (223) expr ::= expr OR expr */
{ 268, -3 }, /* (224) expr ::= expr STAR expr */ { 270, -3 }, /* (224) expr ::= expr PLUS expr */
{ 268, -3 }, /* (225) expr ::= expr SLASH expr */ { 270, -3 }, /* (225) expr ::= expr MINUS expr */
{ 268, -3 }, /* (226) expr ::= expr REM expr */ { 270, -3 }, /* (226) expr ::= expr STAR expr */
{ 268, -3 }, /* (227) expr ::= expr LIKE expr */ { 270, -3 }, /* (227) expr ::= expr SLASH expr */
{ 268, -5 }, /* (228) expr ::= expr IN LP exprlist RP */ { 270, -3 }, /* (228) expr ::= expr REM expr */
{ 277, -3 }, /* (229) exprlist ::= exprlist COMMA expritem */ { 270, -3 }, /* (229) expr ::= expr LIKE expr */
{ 277, -1 }, /* (230) exprlist ::= expritem */ { 270, -5 }, /* (230) expr ::= expr IN LP exprlist RP */
{ 278, -1 }, /* (231) expritem ::= expr */ { 279, -3 }, /* (231) exprlist ::= exprlist COMMA expritem */
{ 278, 0 }, /* (232) expritem ::= */ { 279, -1 }, /* (232) exprlist ::= expritem */
{ 211, -3 }, /* (233) cmd ::= RESET QUERY CACHE */ { 280, -1 }, /* (233) expritem ::= expr */
{ 211, -7 }, /* (234) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */ { 280, 0 }, /* (234) expritem ::= */
{ 211, -7 }, /* (235) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */ { 212, -3 }, /* (235) cmd ::= RESET QUERY CACHE */
{ 211, -7 }, /* (236) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */ { 212, -7 }, /* (236) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{ 211, -7 }, /* (237) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */ { 212, -7 }, /* (237) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
{ 211, -8 }, /* (238) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */ { 212, -7 }, /* (238) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{ 211, -9 }, /* (239) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */ { 212, -7 }, /* (239) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
{ 211, -7 }, /* (240) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */ { 212, -8 }, /* (240) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
{ 211, -7 }, /* (241) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */ { 212, -9 }, /* (241) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
{ 211, -7 }, /* (242) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */ { 212, -7 }, /* (242) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
{ 211, -7 }, /* (243) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */ { 212, -7 }, /* (243) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
{ 211, -8 }, /* (244) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */ { 212, -7 }, /* (244) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
{ 211, -3 }, /* (245) cmd ::= KILL CONNECTION INTEGER */ { 212, -7 }, /* (245) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
{ 211, -5 }, /* (246) cmd ::= KILL STREAM INTEGER COLON INTEGER */ { 212, -8 }, /* (246) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
{ 211, -5 }, /* (247) cmd ::= KILL QUERY INTEGER COLON INTEGER */ { 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 */ static void yy_accept(yyParser*); /* Forward Declaration */
...@@ -2233,14 +2238,13 @@ static void yy_reduce( ...@@ -2233,14 +2238,13 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break; break;
case 41: /* cmd ::= ALTER DATABASE ids alter_db_optr */ case 41: /* cmd ::= ALTER DATABASE ids alter_db_optr */
{ SStrToken t = {0}; { SStrToken t = {0}; setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy262, &t);}
setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy256, &t);}
break; break;
case 42: /* cmd ::= ALTER ACCOUNT ids acct_optr */ 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; break;
case 43: /* cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */ 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; break;
case 44: /* ids ::= ID */ case 44: /* ids ::= ID */
case 45: /* ids ::= STRING */ yytestcase(yyruleno==45); case 45: /* ids ::= STRING */ yytestcase(yyruleno==45);
...@@ -2252,6 +2256,7 @@ static void yy_reduce( ...@@ -2252,6 +2256,7 @@ static void yy_reduce(
break; break;
case 47: /* ifexists ::= */ case 47: /* ifexists ::= */
case 49: /* ifnotexists ::= */ yytestcase(yyruleno==49); case 49: /* ifnotexists ::= */ yytestcase(yyruleno==49);
case 159: /* distinct ::= */ yytestcase(yyruleno==159);
{ yymsp[1].minor.yy0.n = 0;} { yymsp[1].minor.yy0.n = 0;}
break; break;
case 48: /* ifnotexists ::= IF NOT EXISTS */ case 48: /* ifnotexists ::= IF NOT EXISTS */
...@@ -2261,11 +2266,10 @@ static void yy_reduce( ...@@ -2261,11 +2266,10 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);} { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);}
break; break;
case 51: /* cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */ 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; break;
case 52: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */ case 52: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */
{ { setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy262, &yymsp[-2].minor.yy0);}
setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy256, &yymsp[-2].minor.yy0);}
break; break;
case 53: /* cmd ::= CREATE USER ids PASS ids */ case 53: /* cmd ::= CREATE USER ids PASS ids */
{ setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);} { setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);}
...@@ -2294,20 +2298,20 @@ static void yy_reduce( ...@@ -2294,20 +2298,20 @@ static void yy_reduce(
break; break;
case 72: /* acct_optr ::= pps tseries storage streams qtime dbs users conns state */ 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.yy47.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.yy47.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.yy47.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.yy47.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.yy47.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.yy47.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.yy47.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.yy47.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
yylhsminor.yy277.stat = yymsp[0].minor.yy0; yylhsminor.yy47.stat = yymsp[0].minor.yy0;
} }
yymsp[-8].minor.yy277 = yylhsminor.yy277; yymsp[-8].minor.yy47 = yylhsminor.yy47;
break; break;
case 73: /* keep ::= KEEP tagitemlist */ case 73: /* keep ::= KEEP tagitemlist */
{ yymsp[-1].minor.yy135 = yymsp[0].minor.yy135; } { yymsp[-1].minor.yy247 = yymsp[0].minor.yy247; }
break; break;
case 74: /* cache ::= CACHE INTEGER */ case 74: /* cache ::= CACHE INTEGER */
case 75: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==75); case 75: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==75);
...@@ -2326,208 +2330,208 @@ static void yy_reduce( ...@@ -2326,208 +2330,208 @@ static void yy_reduce(
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
break; break;
case 88: /* db_optr ::= */ case 88: /* db_optr ::= */
{setDefaultCreateDbOption(&yymsp[1].minor.yy256);} {setDefaultCreateDbOption(&yymsp[1].minor.yy262);}
break; break;
case 89: /* db_optr ::= db_optr cache */ case 89: /* db_optr ::= db_optr cache */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 90: /* db_optr ::= db_optr replica */ case 90: /* db_optr ::= db_optr replica */
case 105: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==105); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 91: /* db_optr ::= db_optr quorum */ case 91: /* db_optr ::= db_optr quorum */
case 106: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==106); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 92: /* db_optr ::= db_optr days */ case 92: /* db_optr ::= db_optr days */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 93: /* db_optr ::= db_optr minrows */ case 93: /* db_optr ::= db_optr minrows */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 94: /* db_optr ::= db_optr maxrows */ case 94: /* db_optr ::= db_optr maxrows */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 95: /* db_optr ::= db_optr blocks */ case 95: /* db_optr ::= db_optr blocks */
case 108: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==108); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 96: /* db_optr ::= db_optr ctime */ case 96: /* db_optr ::= db_optr ctime */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 97: /* db_optr ::= db_optr wal */ case 97: /* db_optr ::= db_optr wal */
case 110: /* alter_db_optr ::= alter_db_optr wal */ yytestcase(yyruleno==110); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 98: /* db_optr ::= db_optr fsync */ case 98: /* db_optr ::= db_optr fsync */
case 111: /* alter_db_optr ::= alter_db_optr fsync */ yytestcase(yyruleno==111); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 99: /* db_optr ::= db_optr comp */ case 99: /* db_optr ::= db_optr comp */
case 109: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==109); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 100: /* db_optr ::= db_optr prec */ case 100: /* db_optr ::= db_optr prec */
{ yylhsminor.yy256 = yymsp[-1].minor.yy256; yylhsminor.yy256.precision = yymsp[0].minor.yy0; } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.precision = yymsp[0].minor.yy0; }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 101: /* db_optr ::= db_optr keep */ case 101: /* db_optr ::= db_optr keep */
case 107: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==107); 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; } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.keep = yymsp[0].minor.yy247; }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 102: /* db_optr ::= db_optr update */ case 102: /* db_optr ::= db_optr update */
case 112: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==112); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 103: /* db_optr ::= db_optr cachelast */ case 103: /* db_optr ::= db_optr cachelast */
case 113: /* alter_db_optr ::= alter_db_optr cachelast */ yytestcase(yyruleno==113); 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); } { yylhsminor.yy262 = yymsp[-1].minor.yy262; yylhsminor.yy262.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[-1].minor.yy256 = yylhsminor.yy256; yymsp[-1].minor.yy262 = yylhsminor.yy262;
break; break;
case 104: /* alter_db_optr ::= */ case 104: /* alter_db_optr ::= */
{ setDefaultCreateDbOption(&yymsp[1].minor.yy256);} { setDefaultCreateDbOption(&yymsp[1].minor.yy262);}
break; break;
case 114: /* typename ::= ids */ case 114: /* typename ::= ids */
{ {
yymsp[0].minor.yy0.type = 0; 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; break;
case 115: /* typename ::= ids LP signed RP */ 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; yymsp[-3].minor.yy0.type = 0;
tSqlSetColumnType(&yylhsminor.yy181, &yymsp[-3].minor.yy0); tSqlSetColumnType(&yylhsminor.yy179, &yymsp[-3].minor.yy0);
} else { } else {
yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy531; // negative value of name length yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy403; // negative value of name length
tSqlSetColumnType(&yylhsminor.yy181, &yymsp[-3].minor.yy0); tSqlSetColumnType(&yylhsminor.yy179, &yymsp[-3].minor.yy0);
} }
} }
yymsp[-3].minor.yy181 = yylhsminor.yy181; yymsp[-3].minor.yy179 = yylhsminor.yy179;
break; break;
case 116: /* typename ::= ids UNSIGNED */ case 116: /* typename ::= ids UNSIGNED */
{ {
yymsp[-1].minor.yy0.type = 0; 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); 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; break;
case 117: /* signed ::= INTEGER */ case 117: /* signed ::= INTEGER */
{ yylhsminor.yy531 = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy403 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
yymsp[0].minor.yy531 = yylhsminor.yy531; yymsp[0].minor.yy403 = yylhsminor.yy403;
break; break;
case 118: /* signed ::= PLUS INTEGER */ 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; break;
case 119: /* signed ::= MINUS INTEGER */ 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; break;
case 123: /* cmd ::= CREATE TABLE create_table_list */ 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; break;
case 124: /* create_table_list ::= create_from_stable */ case 124: /* create_table_list ::= create_from_stable */
{ {
SCreateTableSQL* pCreateTable = calloc(1, sizeof(SCreateTableSQL)); SCreateTableSQL* pCreateTable = calloc(1, sizeof(SCreateTableSQL));
pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo)); 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; 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; break;
case 125: /* create_table_list ::= create_table_list create_from_stable */ case 125: /* create_table_list ::= create_table_list create_from_stable */
{ {
taosArrayPush(yymsp[-1].minor.yy38->childTableInfo, &yymsp[0].minor.yy78); taosArrayPush(yymsp[-1].minor.yy358->childTableInfo, &yymsp[0].minor.yy42);
yylhsminor.yy38 = yymsp[-1].minor.yy38; yylhsminor.yy358 = yymsp[-1].minor.yy358;
} }
yymsp[-1].minor.yy38 = yylhsminor.yy38; yymsp[-1].minor.yy358 = yylhsminor.yy358;
break; break;
case 126: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */ case 126: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
{ {
yylhsminor.yy38 = tSetCreateSqlElems(yymsp[-1].minor.yy135, NULL, NULL, TSQL_CREATE_TABLE); yylhsminor.yy358 = tSetCreateSqlElems(yymsp[-1].minor.yy247, NULL, NULL, TSQL_CREATE_TABLE);
setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0); setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0);
} }
yymsp[-5].minor.yy38 = yylhsminor.yy38; yymsp[-5].minor.yy358 = yylhsminor.yy358;
break; break;
case 127: /* create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */ 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); yylhsminor.yy358 = tSetCreateSqlElems(yymsp[-5].minor.yy247, yymsp[-1].minor.yy247, NULL, TSQL_CREATE_STABLE);
setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n; yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0); setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
} }
yymsp[-9].minor.yy38 = yylhsminor.yy38; yymsp[-9].minor.yy358 = yylhsminor.yy358;
break; break;
case 128: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */ 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[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
yymsp[-8].minor.yy0.n += yymsp[-7].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; break;
case 129: /* create_table_args ::= ifnotexists ids cpxName AS select */ case 129: /* create_table_args ::= ifnotexists ids cpxName AS select */
{ {
yylhsminor.yy38 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy30, TSQL_CREATE_STREAM); yylhsminor.yy358 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy114, TSQL_CREATE_STREAM);
setSqlInfo(pInfo, yylhsminor.yy38, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n; yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0); setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0);
} }
yymsp[-4].minor.yy38 = yylhsminor.yy38; yymsp[-4].minor.yy358 = yylhsminor.yy358;
break; break;
case 130: /* columnlist ::= columnlist COMMA column */ case 130: /* columnlist ::= columnlist COMMA column */
{taosArrayPush(yymsp[-2].minor.yy135, &yymsp[0].minor.yy181); yylhsminor.yy135 = yymsp[-2].minor.yy135; } {taosArrayPush(yymsp[-2].minor.yy247, &yymsp[0].minor.yy179); yylhsminor.yy247 = yymsp[-2].minor.yy247; }
yymsp[-2].minor.yy135 = yylhsminor.yy135; yymsp[-2].minor.yy247 = yylhsminor.yy247;
break; break;
case 131: /* columnlist ::= column */ case 131: /* columnlist ::= column */
{yylhsminor.yy135 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy135, &yymsp[0].minor.yy181);} {yylhsminor.yy247 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy247, &yymsp[0].minor.yy179);}
yymsp[0].minor.yy135 = yylhsminor.yy135; yymsp[0].minor.yy247 = yylhsminor.yy247;
break; break;
case 132: /* column ::= ids typename */ 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; break;
case 133: /* tagitemlist ::= tagitemlist COMMA tagitem */ case 133: /* tagitemlist ::= tagitemlist COMMA tagitem */
{ 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; break;
case 134: /* tagitemlist ::= tagitem */ case 134: /* tagitemlist ::= tagitem */
{ 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; break;
case 135: /* tagitem ::= INTEGER */ case 135: /* tagitem ::= INTEGER */
case 136: /* tagitem ::= FLOAT */ yytestcase(yyruleno==136); case 136: /* tagitem ::= FLOAT */ yytestcase(yyruleno==136);
case 137: /* tagitem ::= STRING */ yytestcase(yyruleno==137); case 137: /* tagitem ::= STRING */ yytestcase(yyruleno==137);
case 138: /* tagitem ::= BOOL */ yytestcase(yyruleno==138); case 138: /* tagitem ::= BOOL */ yytestcase(yyruleno==138);
{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy308, &yymsp[0].minor.yy0); } { toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
yymsp[0].minor.yy308 = yylhsminor.yy308; yymsp[0].minor.yy378 = yylhsminor.yy378;
break; break;
case 139: /* tagitem ::= NULL */ case 139: /* tagitem ::= NULL */
{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy308, &yymsp[0].minor.yy0); } { yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
yymsp[0].minor.yy308 = yylhsminor.yy308; yymsp[0].minor.yy378 = yylhsminor.yy378;
break; break;
case 140: /* tagitem ::= MINUS INTEGER */ case 140: /* tagitem ::= MINUS INTEGER */
case 141: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==141); case 141: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==141);
...@@ -2537,59 +2541,59 @@ static void yy_reduce( ...@@ -2537,59 +2541,59 @@ static void yy_reduce(
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type; yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type;
toTSDBType(yymsp[-1].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; 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 */ 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; break;
case 145: /* union ::= select */ case 145: /* union ::= select */
{ yylhsminor.yy153 = setSubclause(NULL, yymsp[0].minor.yy30); } { yylhsminor.yy219 = setSubclause(NULL, yymsp[0].minor.yy114); }
yymsp[0].minor.yy153 = yylhsminor.yy153; yymsp[0].minor.yy219 = yylhsminor.yy219;
break; break;
case 146: /* union ::= LP union RP */ case 146: /* union ::= LP union RP */
{ yymsp[-2].minor.yy153 = yymsp[-1].minor.yy153; } { yymsp[-2].minor.yy219 = yymsp[-1].minor.yy219; }
break; break;
case 147: /* union ::= union UNION ALL select */ case 147: /* union ::= union UNION ALL select */
{ yylhsminor.yy153 = appendSelectClause(yymsp[-3].minor.yy153, yymsp[0].minor.yy30); } { yylhsminor.yy219 = appendSelectClause(yymsp[-3].minor.yy219, yymsp[0].minor.yy114); }
yymsp[-3].minor.yy153 = yylhsminor.yy153; yymsp[-3].minor.yy219 = yylhsminor.yy219;
break; break;
case 148: /* union ::= union UNION ALL LP select RP */ case 148: /* union ::= union UNION ALL LP select RP */
{ yylhsminor.yy153 = appendSelectClause(yymsp[-5].minor.yy153, yymsp[-1].minor.yy30); } { yylhsminor.yy219 = appendSelectClause(yymsp[-5].minor.yy219, yymsp[-1].minor.yy114); }
yymsp[-5].minor.yy153 = yylhsminor.yy153; yymsp[-5].minor.yy219 = yylhsminor.yy219;
break; break;
case 149: /* cmd ::= union */ 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; break;
case 150: /* select ::= SELECT selcollist */ 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; break;
case 151: /* sclp ::= selcollist COMMA */ case 151: /* sclp ::= selcollist COMMA */
{yylhsminor.yy266 = yymsp[-1].minor.yy266;} {yylhsminor.yy522 = yymsp[-1].minor.yy522;}
yymsp[-1].minor.yy266 = yylhsminor.yy266; yymsp[-1].minor.yy522 = yylhsminor.yy522;
break; break;
case 152: /* sclp ::= */ case 152: /* sclp ::= */
{yymsp[1].minor.yy266 = 0;} {yymsp[1].minor.yy522 = 0;}
break; 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; break;
case 154: /* selcollist ::= sclp STAR */ case 154: /* selcollist ::= sclp STAR */
{ {
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL); 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; break;
case 155: /* as ::= AS ids */ case 155: /* as ::= AS ids */
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
...@@ -2601,317 +2605,321 @@ static void yy_reduce( ...@@ -2601,317 +2605,321 @@ static void yy_reduce(
case 157: /* as ::= */ case 157: /* as ::= */
{ yymsp[1].minor.yy0.n = 0; } { yymsp[1].minor.yy0.n = 0; }
break; break;
case 158: /* from ::= FROM tablelist */ case 158: /* distinct ::= DISTINCT */
{yymsp[-1].minor.yy135 = yymsp[0].minor.yy135;} { yylhsminor.yy0 = yymsp[0].minor.yy0; }
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
case 160: /* from ::= FROM tablelist */
{yymsp[-1].minor.yy247 = yymsp[0].minor.yy247;}
break; break;
case 159: /* tablelist ::= ids cpxName */ case 161: /* tablelist ::= ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yylhsminor.yy135 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1); yylhsminor.yy247 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[-1].minor.yy0, -1); // table alias name 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; break;
case 160: /* tablelist ::= ids cpxName ids */ case 162: /* tablelist ::= ids cpxName ids */
{ {
toTSDBType(yymsp[-2].minor.yy0.type); toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type); toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n; yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
yylhsminor.yy135 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1); yylhsminor.yy247 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[0].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; break;
case 161: /* tablelist ::= tablelist COMMA ids cpxName */ case 163: /* tablelist ::= tablelist COMMA ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yylhsminor.yy135 = tVariantListAppendToken(yymsp[-3].minor.yy135, &yymsp[-1].minor.yy0, -1); yylhsminor.yy247 = tVariantListAppendToken(yymsp[-3].minor.yy247, &yymsp[-1].minor.yy0, -1);
yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &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; 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[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type); toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n; yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
yylhsminor.yy135 = tVariantListAppendToken(yymsp[-4].minor.yy135, &yymsp[-2].minor.yy0, -1); yylhsminor.yy247 = tVariantListAppendToken(yymsp[-4].minor.yy247, &yymsp[-2].minor.yy0, -1);
yylhsminor.yy135 = tVariantListAppendToken(yylhsminor.yy135, &yymsp[0].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; break;
case 163: /* tmvar ::= VARIABLE */ case 165: /* tmvar ::= VARIABLE */
{yylhsminor.yy0 = yymsp[0].minor.yy0;} {yylhsminor.yy0 = yymsp[0].minor.yy0;}
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 164: /* interval_opt ::= INTERVAL LP tmvar RP */ case 166: /* 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;} {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; break;
case 165: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */ case 167: /* 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;} {yymsp[-5].minor.yy430.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy430.offset = yymsp[-1].minor.yy0;}
break; break;
case 166: /* interval_opt ::= */ case 168: /* interval_opt ::= */
{memset(&yymsp[1].minor.yy160, 0, sizeof(yymsp[1].minor.yy160));} {memset(&yymsp[1].minor.yy430, 0, sizeof(yymsp[1].minor.yy430));}
break; break;
case 167: /* fill_opt ::= */ case 169: /* fill_opt ::= */
{yymsp[1].minor.yy135 = 0; } {yymsp[1].minor.yy247 = 0; }
break; break;
case 168: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */ case 170: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{ {
tVariant A = {0}; tVariant A = {0};
toTSDBType(yymsp[-3].minor.yy0.type); toTSDBType(yymsp[-3].minor.yy0.type);
tVariantCreate(&A, &yymsp[-3].minor.yy0); tVariantCreate(&A, &yymsp[-3].minor.yy0);
tVariantListInsert(yymsp[-1].minor.yy135, &A, -1, 0); tVariantListInsert(yymsp[-1].minor.yy247, &A, -1, 0);
yymsp[-5].minor.yy135 = yymsp[-1].minor.yy135; yymsp[-5].minor.yy247 = yymsp[-1].minor.yy247;
} }
break; break;
case 169: /* fill_opt ::= FILL LP ID RP */ case 171: /* fill_opt ::= FILL LP ID RP */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); 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; 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; } {yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; }
break; 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; } {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; }
break; break;
case 172: /* orderby_opt ::= */ case 174: /* orderby_opt ::= */
{yymsp[1].minor.yy135 = 0;} {yymsp[1].minor.yy247 = 0;}
break; break;
case 173: /* orderby_opt ::= ORDER BY sortlist */ case 175: /* orderby_opt ::= ORDER BY sortlist */
{yymsp[-2].minor.yy135 = yymsp[0].minor.yy135;} {yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break; 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; 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; break;
case 176: /* item ::= ids cpxName */ case 178: /* item ::= ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; 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; break;
case 177: /* sortorder ::= ASC */ case 179: /* sortorder ::= ASC */
{ yymsp[0].minor.yy130 = TSDB_ORDER_ASC; } { yymsp[0].minor.yy222 = TSDB_ORDER_ASC; }
break; break;
case 178: /* sortorder ::= DESC */ case 180: /* sortorder ::= DESC */
{ yymsp[0].minor.yy130 = TSDB_ORDER_DESC;} { yymsp[0].minor.yy222 = TSDB_ORDER_DESC;}
break; break;
case 179: /* sortorder ::= */ case 181: /* sortorder ::= */
{ yymsp[1].minor.yy130 = TSDB_ORDER_ASC; } { yymsp[1].minor.yy222 = TSDB_ORDER_ASC; }
break; break;
case 180: /* groupby_opt ::= */ case 182: /* groupby_opt ::= */
{ yymsp[1].minor.yy135 = 0;} { yymsp[1].minor.yy247 = 0;}
break; break;
case 181: /* groupby_opt ::= GROUP BY grouplist */ case 183: /* groupby_opt ::= GROUP BY grouplist */
{ yymsp[-2].minor.yy135 = yymsp[0].minor.yy135;} { yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break; 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; 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; break;
case 184: /* having_opt ::= */ case 186: /* having_opt ::= */
case 194: /* where_opt ::= */ yytestcase(yyruleno==194); case 196: /* where_opt ::= */ yytestcase(yyruleno==196);
case 232: /* expritem ::= */ yytestcase(yyruleno==232); case 234: /* expritem ::= */ yytestcase(yyruleno==234);
{yymsp[1].minor.yy316 = 0;} {yymsp[1].minor.yy326 = 0;}
break; break;
case 185: /* having_opt ::= HAVING expr */ case 187: /* having_opt ::= HAVING expr */
case 195: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==195); case 197: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==197);
{yymsp[-1].minor.yy316 = yymsp[0].minor.yy316;} {yymsp[-1].minor.yy326 = yymsp[0].minor.yy326;}
break; break;
case 186: /* limit_opt ::= */ case 188: /* limit_opt ::= */
case 190: /* slimit_opt ::= */ yytestcase(yyruleno==190); case 192: /* slimit_opt ::= */ yytestcase(yyruleno==192);
{yymsp[1].minor.yy126.limit = -1; yymsp[1].minor.yy126.offset = 0;} {yymsp[1].minor.yy204.limit = -1; yymsp[1].minor.yy204.offset = 0;}
break; break;
case 187: /* limit_opt ::= LIMIT signed */ case 189: /* limit_opt ::= LIMIT signed */
case 191: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==191); case 193: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==193);
{yymsp[-1].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-1].minor.yy126.offset = 0;} {yymsp[-1].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-1].minor.yy204.offset = 0;}
break; break;
case 188: /* limit_opt ::= LIMIT signed OFFSET signed */ case 190: /* limit_opt ::= LIMIT signed OFFSET signed */
{ yymsp[-3].minor.yy126.limit = yymsp[-2].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[0].minor.yy531;} { yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break; break;
case 189: /* limit_opt ::= LIMIT signed COMMA signed */ case 191: /* limit_opt ::= LIMIT signed COMMA signed */
{ yymsp[-3].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[-2].minor.yy531;} { yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break; break;
case 192: /* slimit_opt ::= SLIMIT signed SOFFSET signed */ case 194: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
{yymsp[-3].minor.yy126.limit = yymsp[-2].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[0].minor.yy531;} {yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break; break;
case 193: /* slimit_opt ::= SLIMIT signed COMMA signed */ case 195: /* slimit_opt ::= SLIMIT signed COMMA signed */
{yymsp[-3].minor.yy126.limit = yymsp[0].minor.yy531; yymsp[-3].minor.yy126.offset = yymsp[-2].minor.yy531;} {yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break; break;
case 196: /* expr ::= LP expr RP */ case 198: /* 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);} {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.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 197: /* expr ::= ID */ case 199: /* expr ::= ID */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 198: /* expr ::= ID DOT ID */ case 200: /* 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.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 199: /* expr ::= ID DOT STAR */ case 201: /* 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.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 200: /* expr ::= INTEGER */ case 202: /* expr ::= INTEGER */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 201: /* expr ::= MINUS INTEGER */ case 203: /* expr ::= MINUS INTEGER */
case 202: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==202); 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.yy316 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);} { 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.yy316 = yylhsminor.yy316; yymsp[-1].minor.yy326 = yylhsminor.yy326;
break; break;
case 203: /* expr ::= FLOAT */ case 205: /* expr ::= FLOAT */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 204: /* expr ::= MINUS FLOAT */ case 206: /* expr ::= MINUS FLOAT */
case 205: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==205); 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.yy316 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);} { 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.yy316 = yylhsminor.yy316; yymsp[-1].minor.yy326 = yylhsminor.yy326;
break; break;
case 206: /* expr ::= STRING */ case 208: /* expr ::= STRING */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 207: /* expr ::= NOW */ case 209: /* expr ::= NOW */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); } { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 208: /* expr ::= VARIABLE */ case 210: /* expr ::= VARIABLE */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 209: /* expr ::= BOOL */ case 211: /* expr ::= BOOL */
{ yylhsminor.yy316 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 210: /* expr ::= ID LP exprlist RP */ case 212: /* 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); } { yylhsminor.yy326 = tSqlExprCreateFunction(yymsp[-1].minor.yy522, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
yymsp[-3].minor.yy316 = yylhsminor.yy316; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 211: /* expr ::= ID LP STAR RP */ case 213: /* expr ::= ID LP STAR RP */
{ yylhsminor.yy316 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); } { yylhsminor.yy326 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
yymsp[-3].minor.yy316 = yylhsminor.yy316; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 212: /* expr ::= expr IS NULL */ case 214: /* expr ::= expr IS NULL */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, NULL, TK_ISNULL);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, NULL, TK_ISNULL);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 213: /* expr ::= expr IS NOT NULL */ case 215: /* expr ::= expr IS NOT NULL */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-3].minor.yy316, NULL, TK_NOTNULL);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-3].minor.yy326, NULL, TK_NOTNULL);}
yymsp[-3].minor.yy316 = yylhsminor.yy316; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 214: /* expr ::= expr LT expr */ case 216: /* expr ::= expr LT expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LT);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LT);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 215: /* expr ::= expr GT expr */ case 217: /* expr ::= expr GT expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_GT);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GT);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 216: /* expr ::= expr LE expr */ case 218: /* expr ::= expr LE expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LE);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 217: /* expr ::= expr GE expr */ case 219: /* expr ::= expr GE expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_GE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GE);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 218: /* expr ::= expr NE expr */ case 220: /* expr ::= expr NE expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_NE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_NE);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 219: /* expr ::= expr EQ expr */ case 221: /* expr ::= expr EQ expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_EQ);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_EQ);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 220: /* expr ::= expr AND expr */ case 222: /* expr ::= expr AND expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_AND);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_AND);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 221: /* expr ::= expr OR expr */ case 223: /* expr ::= expr OR expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_OR); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_OR); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 222: /* expr ::= expr PLUS expr */ case 224: /* expr ::= expr PLUS expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_PLUS); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_PLUS); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 223: /* expr ::= expr MINUS expr */ case 225: /* expr ::= expr MINUS expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_MINUS); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_MINUS); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 224: /* expr ::= expr STAR expr */ case 226: /* expr ::= expr STAR expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_STAR); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_STAR); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 225: /* expr ::= expr SLASH expr */ case 227: /* expr ::= expr SLASH expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_DIVIDE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_DIVIDE);}
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 226: /* expr ::= expr REM expr */ case 228: /* expr ::= expr REM expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_REM); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_REM); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 227: /* expr ::= expr LIKE expr */ case 229: /* expr ::= expr LIKE expr */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-2].minor.yy316, yymsp[0].minor.yy316, TK_LIKE); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LIKE); }
yymsp[-2].minor.yy316 = yylhsminor.yy316; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 228: /* expr ::= expr IN LP exprlist RP */ case 230: /* expr ::= expr IN LP exprlist RP */
{yylhsminor.yy316 = tSqlExprCreate(yymsp[-4].minor.yy316, (tSQLExpr*)yymsp[-1].minor.yy266, TK_IN); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-4].minor.yy326, (tSQLExpr*)yymsp[-1].minor.yy522, TK_IN); }
yymsp[-4].minor.yy316 = yylhsminor.yy316; yymsp[-4].minor.yy326 = yylhsminor.yy326;
break; break;
case 229: /* exprlist ::= exprlist COMMA expritem */ case 231: /* exprlist ::= exprlist COMMA expritem */
{yylhsminor.yy266 = tSqlExprListAppend(yymsp[-2].minor.yy266,yymsp[0].minor.yy316,0);} {yylhsminor.yy522 = tSqlExprListAppend(yymsp[-2].minor.yy522,yymsp[0].minor.yy326,0, 0);}
yymsp[-2].minor.yy266 = yylhsminor.yy266; yymsp[-2].minor.yy522 = yylhsminor.yy522;
break; break;
case 230: /* exprlist ::= expritem */ case 232: /* exprlist ::= expritem */
{yylhsminor.yy266 = tSqlExprListAppend(0,yymsp[0].minor.yy316,0);} {yylhsminor.yy522 = tSqlExprListAppend(0,yymsp[0].minor.yy326,0, 0);}
yymsp[0].minor.yy266 = yylhsminor.yy266; yymsp[0].minor.yy522 = yylhsminor.yy522;
break; break;
case 231: /* expritem ::= expr */ case 233: /* expritem ::= expr */
{yylhsminor.yy316 = yymsp[0].minor.yy316;} {yylhsminor.yy326 = yymsp[0].minor.yy326;}
yymsp[0].minor.yy316 = yylhsminor.yy316; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 233: /* cmd ::= RESET QUERY CACHE */ case 235: /* cmd ::= RESET QUERY CACHE */
{ setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);} { setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
break; 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; 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); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2922,14 +2930,14 @@ static void yy_reduce( ...@@ -2922,14 +2930,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; 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); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2940,7 +2948,7 @@ static void yy_reduce( ...@@ -2940,7 +2948,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -2954,26 +2962,26 @@ static void yy_reduce( ...@@ -2954,26 +2962,26 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
toTSDBType(yymsp[-2].minor.yy0.type); toTSDBType(yymsp[-2].minor.yy0.type);
SArray* A = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1); 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); SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; 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); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2984,14 +2992,14 @@ static void yy_reduce( ...@@ -2984,14 +2992,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; 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); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -3002,7 +3010,7 @@ static void yy_reduce( ...@@ -3002,7 +3010,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; 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; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -3016,13 +3024,13 @@ static void yy_reduce( ...@@ -3016,13 +3024,13 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 245: /* cmd ::= KILL CONNECTION INTEGER */ case 247: /* cmd ::= KILL CONNECTION INTEGER */
{setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);} {setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
break; 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);} {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; 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);} {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; break;
default: default:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include "qAst.h" #include "texpr.h"
#include "taosmsg.h" #include "taosmsg.h"
#include "tsdb.h" #include "tsdb.h"
#include "tskiplist.h" #include "tskiplist.h"
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include "tsqlfunction.h" #include "qAggMain.h"
#include "tcompare.h" #include "tcompare.h"
TEST(testCase, patternMatchTest) { TEST(testCase, patternMatchTest) {
......
...@@ -19,10 +19,9 @@ ...@@ -19,10 +19,9 @@
#include "tcompare.h" #include "tcompare.h"
#include "exception.h" #include "exception.h"
#include "../../query/inc/qAst.h" // todo move to common module
#include "tlosertree.h" #include "tlosertree.h"
#include "tsdb.h"
#include "tsdbint.h" #include "tsdbint.h"
#include "texpr.h"
#define EXTRA_BYTES 2 #define EXTRA_BYTES 2
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC) #define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
...@@ -111,6 +110,7 @@ typedef struct STsdbQueryHandle { ...@@ -111,6 +110,7 @@ typedef struct STsdbQueryHandle {
int32_t activeIndex; int32_t activeIndex;
bool checkFiles; // check file stage bool checkFiles; // check file stage
bool cachelastrow; // check if last row cached bool cachelastrow; // check if last row cached
bool loadExternalRow; // load time window external data rows
void* qinfo; // query info handle, for debug purpose 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 int32_t type; // query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows
SDFileSet* pFileGroup; SDFileSet* pFileGroup;
...@@ -125,6 +125,8 @@ typedef struct STsdbQueryHandle { ...@@ -125,6 +125,8 @@ typedef struct STsdbQueryHandle {
SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */ SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */
SLoadCompBlockInfo compBlockLoadInfo; /* record current compblock information in SQuery */ 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; SIOCostSummary cost;
} STsdbQueryHandle; } STsdbQueryHandle;
...@@ -141,10 +143,10 @@ static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastK ...@@ -141,10 +143,10 @@ static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastK
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle); static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle);
static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SBlock* pBlock); static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SBlock* pBlock);
static int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order); static int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win, static int32_t tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win, STsdbQueryHandle* pQueryHandle);
STsdbQueryHandle* pQueryHandle); static int32_t tsdbCheckInfoCompar(const void* key1, const void* key2);
static int 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) { static void tsdbInitDataBlockLoadInfo(SDataBlockLoadInfo* pBlockLoadInfo) {
pBlockLoadInfo->slot = -1; pBlockLoadInfo->slot = -1;
...@@ -210,6 +212,36 @@ static void tsdbMayUnTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) { ...@@ -210,6 +212,36 @@ static void tsdbMayUnTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
pQueryHandle->pMemRef = NULL; 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) { static SArray* createCheckInfoFromTableGroup(STsdbQueryHandle* pQueryHandle, STableGroupInfo* pGroupList, STsdbMeta* pMeta) {
size_t sizeOfGroup = taosArrayGetSize(pGroupList->pGroupList); size_t sizeOfGroup = taosArrayGetSize(pGroupList->pGroupList);
assert(sizeOfGroup >= 1 && pMeta != NULL); assert(sizeOfGroup >= 1 && pMeta != NULL);
...@@ -294,6 +326,7 @@ static STsdbQueryHandle* tsdbQueryTablesImpl(STsdbRepo* tsdb, STsdbQueryCond* pC ...@@ -294,6 +326,7 @@ static STsdbQueryHandle* tsdbQueryTablesImpl(STsdbRepo* tsdb, STsdbQueryCond* pC
pQueryHandle->allocSize = 0; pQueryHandle->allocSize = 0;
pQueryHandle->locateStart = false; pQueryHandle->locateStart = false;
pQueryHandle->pMemRef = pMemRef; pQueryHandle->pMemRef = pMemRef;
pQueryHandle->loadExternalRow = pCond->loadExternalRows;
if (tsdbInitReadH(&pQueryHandle->rhelper, (STsdbRepo*)tsdb) != 0) { if (tsdbInitReadH(&pQueryHandle->rhelper, (STsdbRepo*)tsdb) != 0) {
goto out_of_memory; goto out_of_memory;
...@@ -410,10 +443,11 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle) { ...@@ -410,10 +443,11 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle) {
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond* pCond, STableGroupInfo *groupList, void* qinfo, SMemRef* pRef) { TsdbQueryHandleT tsdbQueryRowsInExternalWindow(STsdbRepo *tsdb, STsdbQueryCond* pCond, STableGroupInfo *groupList, void* qinfo, SMemRef* pRef) {
STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo, pRef); STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo, pRef);
pQueryHandle->loadExternalRow = true;
if (pQueryHandle != NULL) { if (pQueryHandle != NULL) {
pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
changeQueryHandleForInterpQuery(pQueryHandle); changeQueryHandleForInterpQuery(pQueryHandle);
} }
return pQueryHandle; return pQueryHandle;
} }
...@@ -1900,17 +1934,21 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) { ...@@ -1900,17 +1934,21 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) {
pQueryHandle->activeIndex += 1; 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. // no data in memtable or imemtable, decrease the memory reference.
tsdbMayUnTakeMemSnapshot(pQueryHandle); tsdbMayUnTakeMemSnapshot(pQueryHandle);
return false; return false;
} }
//todo not unref yet, since it is not support multi-group interpolation query
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) { static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
// filter the queried time stamp in the first place // filter the queried time stamp in the first place
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle; 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 // starts from the buffer in case of descending timestamp order check data blocks
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo); size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
...@@ -1920,8 +1958,8 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) { ...@@ -1920,8 +1958,8 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, i); STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, i);
// the first qualified table for interpolation query // the first qualified table for interpolation query
if (pQueryHandle->window.skey <= pCheckInfo->pTableObj->lastKey && if ((pQueryHandle->window.skey <= pCheckInfo->pTableObj->lastKey) &&
pCheckInfo->pTableObj->lastKey != TSKEY_INITIAL_VAL) { (pCheckInfo->pTableObj->lastKey != TSKEY_INITIAL_VAL)) {
break; break;
} }
...@@ -1938,9 +1976,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) { ...@@ -1938,9 +1976,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
info.lastKey = pQueryHandle->window.skey; info.lastKey = pQueryHandle->window.skey;
taosArrayPush(pQueryHandle->pTableCheckInfo, &info); 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, static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win,
...@@ -2020,7 +2055,6 @@ static void destroyHelper(void* param) { ...@@ -2020,7 +2055,6 @@ static void destroyHelper(void* param) {
return; return;
} }
tQueryInfo* pInfo = (tQueryInfo*)param; tQueryInfo* pInfo = (tQueryInfo*)param;
if (pInfo->optr != TSDB_RELATION_IN) { if (pInfo->optr != TSDB_RELATION_IN) {
tfree(pInfo->q); tfree(pInfo->q);
...@@ -2029,113 +2063,82 @@ static void destroyHelper(void* param) { ...@@ -2029,113 +2063,82 @@ static void destroyHelper(void* param) {
free(param); free(param);
} }
static bool getNeighborRows(STsdbQueryHandle* pQueryHandle) { // handle data in cache situation
assert (pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL); bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
SDataBlockInfo blockInfo = {{0}, 0};
pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
pQueryHandle->order = TSDB_ORDER_DESC;
if (!tsdbNextDataBlock((void*) pQueryHandle)) { int64_t stime = taosGetTimestampUs();
return false; int64_t elapsedTime = stime;
}
tsdbRetrieveDataBlockInfo((void*) pQueryHandle, &blockInfo); size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
/*SArray *pDataBlock = */tsdbRetrieveDataBlock((void*) pQueryHandle, pQueryHandle->defaultLoadColumn); assert(numOfTables > 0);
if (terrno != TSDB_CODE_SUCCESS) {
return false;
}
if (pQueryHandle->cur.win.ekey == pQueryHandle->window.skey) { if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
// data already retrieve, discard other data rows and return // 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)); int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
for (int32_t i = 0; i < numOfCols; ++i) { SQueryFilePos* cur = &pQueryHandle->cur;
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}; SDataRow pRow = NULL;
pQueryHandle->window = pQueryHandle->cur.win; TSKEY key = TSKEY_INITIAL_VAL;
pQueryHandle->cur.rows = 1; int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-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 (++pQueryHandle->activeIndex < numOfTables) {
if (cond.colList == NULL) { STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex);
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY; int32_t ret = tsdbGetCachedLastRow(pCheckInfo->pTableObj, &pRow, &key);
if (ret != TSDB_CODE_SUCCESS) {
return false; return false;
} }
for(int32_t i = 0; i < cond.numOfCols; ++i) { copyOneRowFromMem(pQueryHandle, pQueryHandle->outputCapacity, 0, pRow, numOfCols, pCheckInfo->pTableObj);
SColumnInfoData* pColInfoData = taosArrayGet(pQueryHandle->pColumns, i); tfree(pRow);
memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
}
STsdbQueryHandle* pSecQueryHandle = tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pQueryHandle->pMemRef); // update the last key value
pCheckInfo->lastKey = key + step;
tfree(cond.colList); cur->rows = 1; // only one row
cur->lastKey = key + step;
cur->mixBlock = true;
cur->win.skey = key;
cur->win.ekey = key;
pSecQueryHandle->pTableCheckInfo = createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey); return true;
if (pSecQueryHandle->pTableCheckInfo == NULL) {
tsdbCleanupQueryHandle(pSecQueryHandle);
return false;
} }
if (!tsdbNextDataBlock((void*) pSecQueryHandle)) {
tsdbCleanupQueryHandle(pSecQueryHandle);
return false; return false;
} }
tsdbRetrieveDataBlockInfo((void*) pSecQueryHandle, &blockInfo); if (pQueryHandle->checkFiles) {
tsdbRetrieveDataBlock((void*) pSecQueryHandle, pSecQueryHandle->defaultLoadColumn); // check if the query range overlaps with the file data block
bool exists = true;
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); int32_t code = getDataBlocksInFiles(pQueryHandle, &exists);
assert(pCol->info.colId == pCol1->info.colId); if (code != TSDB_CODE_SUCCESS) {
pQueryHandle->activeIndex = 0;
pQueryHandle->checkFiles = false;
memcpy((char*)pCol->pData + pCol->info.bytes, pCol1->pData, pCol1->info.bytes); return false;
} }
SColumnInfoData* pTSCol = taosArrayGet(pQueryHandle->pColumns, 0); if (exists) {
pQueryHandle->cost.checkForNextTime += (taosGetTimestampUs() - stime);
// it is ascending order return exists;
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); pQueryHandle->activeIndex = 0;
pQueryHandle->checkFiles = false;
} }
//disable it after retrieve data // TODO: opt by consider the scan order
pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL; bool ret = doHasDataInBuffer(pQueryHandle);
pQueryHandle->checkFiles = false; terrno = TSDB_CODE_SUCCESS;
return true;
elapsedTime = taosGetTimestampUs() - stime;
pQueryHandle->cost.checkForNextTime += elapsedTime;
return ret;
} }
// handle data in cache situation bool tsdbNextDataBlockWithoutMerge(TsdbQueryHandleT* pHandle) {
bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle; STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
int64_t stime = taosGetTimestampUs(); int64_t stime = taosGetTimestampUs();
...@@ -2144,16 +2147,7 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) { ...@@ -2144,16 +2147,7 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo); size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
assert(numOfTables > 0); assert(numOfTables > 0);
if (pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL) { if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
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) {
// the last row is cached in buffer, return it directly. // the last row is cached in buffer, return it directly.
// here note that the pQueryHandle->window must be the TS_INITIALIZER // here note that the pQueryHandle->window must be the TS_INITIALIZER
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle)); int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
...@@ -2209,13 +2203,118 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) { ...@@ -2209,13 +2203,118 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
pQueryHandle->checkFiles = false; pQueryHandle->checkFiles = false;
} }
// TODO: opt by consider the scan order
bool ret = doHasDataInBuffer(pQueryHandle);
terrno = TSDB_CODE_SUCCESS;
elapsedTime = taosGetTimestampUs() - stime; elapsedTime = taosGetTimestampUs() - stime;
pQueryHandle->cost.checkForNextTime += elapsedTime; pQueryHandle->cost.checkForNextTime += elapsedTime;
return ret; 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;
} }
/* /*
...@@ -2716,7 +2815,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, tExprNode* pExpr) ...@@ -2716,7 +2815,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, tExprNode* pExpr)
}; };
getTableListfromSkipList(pExpr, pSTable->pIndex, pRes, &supp); getTableListfromSkipList(pExpr, pSTable->pIndex, pRes, &supp);
tExprTreeDestroy(&pExpr, destroyHelper); tExprTreeDestroy(pExpr, destroyHelper);
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
...@@ -2773,10 +2872,10 @@ int32_t tsdbQuerySTableByTagCond(STsdbRepo* tsdb, uint64_t uid, TSKEY skey, cons ...@@ -2773,10 +2872,10 @@ int32_t tsdbQuerySTableByTagCond(STsdbRepo* tsdb, uint64_t uid, TSKEY skey, cons
if (expr == NULL) { if (expr == NULL) {
expr = exprTreeFromBinary(pTagCond, len); expr = exprTreeFromBinary(pTagCond, len);
} else { } else {
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, expr, NULL); CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, expr, NULL);
tExprNode* tagExpr = exprTreeFromBinary(pTagCond, len); tExprNode* tagExpr = exprTreeFromBinary(pTagCond, len);
if (tagExpr != NULL) { if (tagExpr != NULL) {
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, tagExpr, NULL); CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, tagExpr, NULL);
tExprNode* tbnameExpr = expr; tExprNode* tbnameExpr = expr;
expr = calloc(1, sizeof(tExprNode)); expr = calloc(1, sizeof(tExprNode));
if (expr == NULL) { if (expr == NULL) {
...@@ -2890,6 +2989,21 @@ int32_t tsdbGetTableGroupFromIdList(STsdbRepo* tsdb, SArray* pTableIdList, STabl ...@@ -2890,6 +2989,21 @@ int32_t tsdbGetTableGroupFromIdList(STsdbRepo* tsdb, SArray* pTableIdList, STabl
return TSDB_CODE_SUCCESS; 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) { void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*)queryHandle; STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*)queryHandle;
if (pQueryHandle == NULL) { if (pQueryHandle == NULL) {
...@@ -2907,14 +3021,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) { ...@@ -2907,14 +3021,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
taosArrayDestroy(pQueryHandle->pTableCheckInfo); taosArrayDestroy(pQueryHandle->pTableCheckInfo);
} }
if (pQueryHandle->pColumns != NULL) { pQueryHandle->pColumns = doFreeColumnInfoData(pQueryHandle->pColumns);
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);
}
taosArrayDestroy(pQueryHandle->defaultLoadColumn); taosArrayDestroy(pQueryHandle->defaultLoadColumn);
tfree(pQueryHandle->pDataBlockInfo); tfree(pQueryHandle->pDataBlockInfo);
...@@ -2928,6 +3035,9 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) { ...@@ -2928,6 +3035,9 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
tdFreeDataCols(pQueryHandle->pDataCols); tdFreeDataCols(pQueryHandle->pDataCols);
pQueryHandle->pDataCols = NULL; pQueryHandle->pDataCols = NULL;
pQueryHandle->prev = doFreeColumnInfoData(pQueryHandle->prev);
pQueryHandle->next = doFreeColumnInfoData(pQueryHandle->next);
SIOCostSummary* pCost = &pQueryHandle->cost; SIOCostSummary* pCost = &pQueryHandle->cost;
tsdbDebug("%p :io-cost summary: statis-info:%"PRId64" us, datablock:%" PRId64" us, check data:%"PRId64" us, %p", 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); pQueryHandle, pCost->statisInfoLoadTime, pCost->blockLoadTime, pCost->checkForNextTime, pQueryHandle->qinfo);
......
...@@ -27,6 +27,9 @@ extern "C" { ...@@ -27,6 +27,9 @@ extern "C" {
#define TSQL_TBNAME "TBNAME" #define TSQL_TBNAME "TBNAME"
#define TSQL_TBNAME_L "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 // used to denote the minimum unite in sql parsing
typedef struct SStrToken { typedef struct SStrToken {
uint32_t n; uint32_t n;
......
...@@ -274,7 +274,7 @@ void *taosIterateRef(int rsetId, int64_t rid) { ...@@ -274,7 +274,7 @@ void *taosIterateRef(int rsetId, int64_t rid) {
return NULL; return NULL;
} }
if (rid <= 0) { if (rid < 0) {
uTrace("rsetId:%d rid:%" PRId64 " failed to iterate, rid not valid", rsetId, rid); uTrace("rsetId:%d rid:%" PRId64 " failed to iterate, rid not valid", rsetId, rid);
terrno = TSDB_CODE_REF_NOT_EXIST; terrno = TSDB_CODE_REF_NOT_EXIST;
return NULL; return NULL;
......
...@@ -638,209 +638,293 @@ if $data24 != NULL then ...@@ -638,209 +638,293 @@ if $data24 != NULL then
return -1 return -1
endi endi
## interp(*) from stb + group by + fill(prev) ## interp(*) from stb + group by + fill(prev)
$t = $ts0 + 1000 $t = $ts0 + 1000
sql select interp(*) from $stb where ts = $t fill(prev) group by tbname 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:$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 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 if $rows != $tbNum then
return -1 return -1
endi endi
if $data00 != @18-09-17 09:00:01.000@ then if $data00 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data01 != 0 then if $data01 != 0 then
return -1 return -1
endi endi
if $data02 != 0 then if $data02 != 0 then
return -1 return -1
endi endi
if $data03 != 0.00000 then if $data03 != 0.00000 then
return -1 return -1
endi endi
if $data04 != 0.000000000 then if $data04 != 0.000000000 then
return -1 return -1
endi endi
if $data05 != 0 then if $data05 != 0 then
return -1 return -1
endi endi
if $data06 != 0 then if $data06 != 0 then
return -1 return -1
endi endi
if $data07 != 1 then if $data07 != 1 then
return -1 return -1
endi endi
if $data08 != binary0 then if $data08 != binary0 then
return -1 return -1
endi endi
if $data09 != nchar0 then if $data09 != nchar0 then
return -1 return -1
endi endi
if $data20 != @18-09-17 09:00:01.000@ then if $data20 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data21 != 0 then if $data21 != 0 then
return -1 return -1
endi endi
if $data22 != NULL then if $data22 != NULL then
return -1 return -1
endi endi
if $data23 != 0.00000 then if $data23 != 0.00000 then
return -1 return -1
endi endi
if $data24 != NULL then if $data24 != NULL then
return -1 return -1
endi endi
if $data25 != 0 then if $data25 != 0 then
return -1 return -1
endi endi
if $data26 != 0 then if $data26 != 0 then
return -1 return -1
endi endi
if $data27 != 1 then if $data27 != 1 then
return -1 return -1
endi endi
if $data28 != binary0 then if $data28 != binary0 then
return -1 return -1
endi endi
if $data29 != nchar0 then if $data29 != nchar0 then
return -1 return -1
endi endi
## interp(*) from stb + group by + fill(linear) ## interp(*) from stb + group by + fill(linear)
$t = $ts0 + 1000 $t = $ts0 + 1000
sql select interp(*) from $stb where ts = $t fill(linear) group by tbname 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:$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 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 if $rows != $tbNum then
return -1 return -1
endi endi
if $data00 != @18-09-17 09:00:01.000@ then if $data00 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data01 != 0 then if $data01 != 0 then
return -1 return -1
endi endi
if $data02 != 0 then if $data02 != 0 then
return -1 return -1
endi endi
if $data03 != 0.00167 then if $data03 != 0.00167 then
return -1 return -1
endi endi
if $data04 != 0.001666667 then if $data04 != 0.001666667 then
return -1 return -1
endi endi
if $data05 != 0 then if $data05 != 0 then
return -1 return -1
endi endi
if $data06 != 0 then if $data06 != 0 then
return -1 return -1
endi endi
if $data07 != NULL then if $data07 != NULL then
return -1 return -1
endi endi
if $data08 != NULL then if $data08 != NULL then
return -1 return -1
endi endi
if $data09 != NULL then if $data09 != NULL then
return -1 return -1
endi endi
if $data20 != @18-09-17 09:00:01.000@ then if $data20 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data21 != 0 then if $data21 != 0 then
return -1 return -1
endi endi
if $data22 != NULL then if $data22 != NULL then
return -1 return -1
endi endi
if $data23 != 0.00167 then if $data23 != 0.00167 then
return -1 return -1
endi endi
if $data24 != NULL then if $data24 != NULL then
return -1 return -1
endi endi
if $data25 != 0 then if $data25 != 0 then
return -1 return -1
endi endi
if $data26 != 0 then if $data26 != 0 then
return -1 return -1
endi endi
if $data27 != NULL then if $data27 != NULL then
return -1 return -1
endi endi
if $data28 != NULL then if $data28 != NULL then
return -1 return -1
endi endi
if $data29 != NULL then if $data29 != NULL then
return -1 return -1
endi endi
## interp(*) from stb + group by + fill(value) ## interp(*) from stb + group by + fill(value)
$t = $ts0 + 1000 $t = $ts0 + 1000
sql select interp(*) from $stb where ts = $t fill(value, -1, -2) group by tbname 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:$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 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 if $rows != $tbNum then
return -1 return -1
endi endi
if $data00 != @18-09-17 09:00:01.000@ then if $data00 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data01 != -2 then if $data01 != -2 then
return -1 return -1
endi endi
if $data02 != -2 then if $data02 != -2 then
return -1 return -1
endi endi
if $data03 != -2.00000 then if $data03 != -2.00000 then
return -1 return -1
endi endi
if $data04 != -2.000000000 then if $data04 != -2.000000000 then
return -1 return -1
endi endi
if $data05 != -2 then if $data05 != -2 then
return -1 return -1
endi endi
if $data06 != -2 then if $data06 != -2 then
return -1 return -1
endi endi
if $data07 != 1 then if $data07 != 1 then
return -1 return -1
endi endi
if $data08 != NULL then if $data08 != NULL then
return -1 return -1
endi endi
if $data09 != NULL then if $data09 != NULL then
return -1 return -1
endi endi
if $data20 != @18-09-17 09:00:01.000@ then if $data20 != @18-09-17 09:00:01.000@ then
return -1 return -1
endi endi
if $data21 != -2 then if $data21 != -2 then
return -1 return -1
endi endi
if $data22 != -2 then if $data22 != -2 then
return -1 return -1
endi endi
if $data23 != -2.00000 then if $data23 != -2.00000 then
return -1 return -1
endi endi
if $data24 != -2.000000000 then if $data24 != -2.000000000 then
return -1 return -1
endi endi
if $data25 != -2 then if $data25 != -2 then
return -1 return -1
endi endi
if $data26 != -2 then if $data26 != -2 then
return -1 return -1
endi endi
if $data27 != 1 then if $data27 != 1 then
return -1 return -1
endi endi
if $data28 != NULL then if $data28 != NULL then
return -1 return -1
endi endi
if $data29 != NULL then if $data29 != NULL then
return -1 return -1
endi 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
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
system sh/stop_dnodes.sh system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1 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 walLevel -v 0
system sh/exec.sh -n dnode1 -s start system sh/exec.sh -n dnode1 -s start
...@@ -78,7 +77,6 @@ if $rows != 0 then ...@@ -78,7 +77,6 @@ if $rows != 0 then
return -1 return -1
endi endi
sql DROP STABLE $stb sql DROP STABLE $stb
sql show stables sql show stables
......
...@@ -105,3 +105,5 @@ sleep 100 ...@@ -105,3 +105,5 @@ sleep 100
run general/parser/sliding.sim run general/parser/sliding.sim
sleep 100 sleep 100
run general/parser/function.sim run general/parser/function.sim
sleep 100
run general/parse/stableOp.sim
...@@ -159,6 +159,7 @@ cd ../../../debug; make ...@@ -159,6 +159,7 @@ cd ../../../debug; make
./test.sh -f general/parser/union.sim ./test.sh -f general/parser/union.sim
./test.sh -f general/parser/topbot.sim ./test.sh -f general/parser/topbot.sim
./test.sh -f general/parser/function.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/disk.sim
./test.sh -f general/stable/dnode3.sim ./test.sh -f general/stable/dnode3.sim
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册