提交 e7614def 编写于 作者: S Shengliang Guan

Merge remote-tracking branch 'origin/develop' into feature/win

...@@ -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,13 +902,17 @@ int32_t parseSlidingClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQu ...@@ -902,13 +902,17 @@ 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 {
...@@ -2671,8 +2712,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -2671,8 +2712,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if (!validateIpAddress(pDnodeIp->z, pDnodeIp->n)) { if (!validateIpAddress(pDnodeIp->z, pDnodeIp->n)) {
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,8 +1144,10 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR ...@@ -1129,8 +1144,10 @@ 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);
return; return;
...@@ -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 {
...@@ -65,7 +65,7 @@ typedef struct tExprNode { ...@@ -65,7 +65,7 @@ typedef struct tExprNode {
uint8_t optr; // filter operator uint8_t optr; // filter operator
uint8_t hasPK; // 0: do not contain primary filter, 1: contain uint8_t hasPK; // 0: do not contain primary filter, 1: contain
void * info; // support filter operation on this expression only available for leaf node void * info; // support filter operation on this expression only available for leaf node
struct tExprNode *pLeft; // left child pointer struct tExprNode *pLeft; // left child pointer
struct tExprNode *pRight; // right child pointer struct tExprNode *pRight; // right child pointer
} _node; } _node;
...@@ -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
......
...@@ -114,6 +114,8 @@ void* tsdbGetTableTagVal(const void* pTable, int32_t colId, int16_t type, int16_ ...@@ -114,6 +114,8 @@ void* tsdbGetTableTagVal(const void* pTable, int32_t colId, int16_t type, int16_
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);
...@@ -141,7 +143,6 @@ typedef struct { ...@@ -141,7 +143,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(TSDB_REPO_T *pRepo, STableId tid);
// -- FOR INSERT DATA // -- FOR INSERT DATA
/** /**
...@@ -160,9 +161,10 @@ typedef void *TsdbQueryHandleT; // Use void to hide implementation details ...@@ -160,9 +161,10 @@ typedef void *TsdbQueryHandleT; // Use void to hide implementation details
// query condition to build vnode iterator // query condition to build vnode iterator
typedef struct STsdbQueryCond { typedef struct STsdbQueryCond {
STimeWindow twindow; STimeWindow twindow;
int32_t order; // desc|asc order to iterate the data block int32_t order; // desc|asc order to iterate the data block
int32_t numOfCols; int32_t numOfCols;
SColumnInfo *colList; SColumnInfo *colList;
bool loadExternalRows; // load external rows or not
} STsdbQueryCond; } STsdbQueryCond;
typedef struct SMemRef { typedef struct SMemRef {
...@@ -232,13 +234,32 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle); ...@@ -232,13 +234,32 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle);
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *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
* *
* @param pQueryHandle * @param pQueryHandle
* @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)
......
...@@ -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);
...@@ -164,13 +164,14 @@ typedef struct SQuery { ...@@ -164,13 +164,14 @@ typedef struct SQuery {
SColumnInfo* tagColList; SColumnInfo* tagColList;
int32_t numOfFilterCols; int32_t numOfFilterCols;
int64_t* fillVal; int64_t* fillVal;
uint32_t status; // query status uint32_t status; // query status
SResultRec rec; SResultRec rec;
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;
} SQuery; } SQuery;
...@@ -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); static void interp_function_impl(SQLFunctionCtx *pCtx) {
int32_t type = (int32_t) pCtx->param[2].i64;
if (type == TSDB_FILL_NONE) {
return;
}
if (pCtx->size == 1) { if (pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP) {
char *pData = GET_INPUT_DATA_LIST(pCtx); *(TSKEY *) pCtx->aOutputBuf = pCtx->nStartQueryTimestamp;
assignVal(pCtx->aOutputBuf, pData, pCtx->inputBytes, pCtx->inputType);
} else { } else {
/* if (pCtx->start.key == INT64_MIN) {
* use interpolation to generate the result. assert(pCtx->end.key == INT64_MIN);
* 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 (type == TSDB_FILL_NULL) {
*(TSKEY *) pCtx->aOutputBuf = pInfo->ts; setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
} else { } else if (type == TSDB_FILL_SET_VALUE) {
if (pInfo->type == TSDB_FILL_NULL) { tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true);
if (pCtx->outputType == TSDB_DATA_TYPE_BINARY || pCtx->outputType == TSDB_DATA_TYPE_NCHAR) { } else if (type == TSDB_FILL_PREV) {
setVardataNull(pCtx->aOutputBuf, pCtx->outputType); if (IS_NUMERIC_TYPE(pCtx->inputType) || pCtx->inputType == TSDB_DATA_TYPE_BOOL) {
} else { SET_TYPED_DATA(pCtx->aOutputBuf, pCtx->inputType, pCtx->start.val);
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes); } else {
} assignVal(pCtx->aOutputBuf, pCtx->start.ptr, pCtx->outputBytes, pCtx->inputType);
}
SET_VAL(pCtx, pCtx->size, 1); } else if (type == TSDB_FILL_LINEAR) {
} else if (pInfo->type == TSDB_FILL_SET_VALUE) { SPoint point1 = {.key = pCtx->start.key, .val = &pCtx->start.val};
tVariantDump(&pCtx->param[1], pCtx->aOutputBuf, pCtx->inputType, true); SPoint point2 = {.key = pCtx->end.key, .val = &pCtx->end.val};
} else if (pInfo->type == TSDB_FILL_PREV) { SPoint point = {.key = pCtx->nStartQueryTimestamp, .val = pCtx->aOutputBuf};
char *data = GET_INPUT_DATA(pCtx, 0);
assignVal(pCtx->aOutputBuf, data, pCtx->outputBytes, pCtx->outputType); int32_t srcType = pCtx->inputType;
if (IS_NUMERIC_TYPE(srcType)) { // TODO should find the not null data?
SET_VAL(pCtx, pCtx->size, 1); if (isNull((char *)&pCtx->start.val, srcType) || isNull((char *)&pCtx->end.val, srcType)) {
} else if (pInfo->type == TSDB_FILL_LINEAR) { setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
char *data1 = GET_INPUT_DATA(pCtx, 0);
char *data2 = GET_INPUT_DATA(pCtx, 1);
TSKEY key1 = pCtx->ptsList[0];
TSKEY key2 = pCtx->ptsList[1];
SPoint point1 = {.key = key1, .val = data1};
SPoint point2 = {.key = key2, .val = data2};
SPoint point = {.key = pInfo->ts, .val = pCtx->aOutputBuf};
int32_t srcType = pCtx->inputType;
if ((srcType >= TSDB_DATA_TYPE_TINYINT && srcType <= TSDB_DATA_TYPE_BIGINT) ||
srcType == TSDB_DATA_TYPE_TIMESTAMP || srcType == TSDB_DATA_TYPE_DOUBLE) {
point1.val = data1;
point2.val = data2;
if (isNull(data1, srcType) || isNull(data2, srcType)) {
setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} else {
taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point);
}
} else if (srcType == TSDB_DATA_TYPE_FLOAT) {
point1.val = data1;
point2.val = data2;
if (isNull(data1, srcType) || isNull(data2, srcType)) {
setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} else {
taosGetLinearInterpolationVal(pCtx->outputType, &point1, &point2, &point);
}
} else { } else {
if (srcType == TSDB_DATA_TYPE_BINARY || srcType == TSDB_DATA_TYPE_NCHAR) { taosGetLinearInterpolationVal(&point, pCtx->outputType, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
setVardataNull(pCtx->aOutputBuf, pCtx->inputType);
} else {
setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
}
} }
} else {
setNull(pCtx->aOutputBuf, srcType, pCtx->inputBytes);
} }
} }
} }
SET_VAL(pCtx, pCtx->size, 1); SET_VAL(pCtx, 1, 1);
}
static void interp_function(SQLFunctionCtx *pCtx) {
// at this point, the value is existed, return directly
if (pCtx->size > 0) {
// impose the timestamp check
TSKEY key = GET_TS_DATA(pCtx, 0);
if (key == pCtx->nStartQueryTimestamp) {
char *pData = GET_INPUT_DATA(pCtx, 0);
assignVal(pCtx->aOutputBuf, pData, pCtx->inputBytes, pCtx->inputType);
SET_VAL(pCtx, 1, 1);
} else {
interp_function_impl(pCtx);
}
} else { //no qualified data rows and interpolation is required
interp_function_impl(pCtx);
}
} }
static bool ts_comp_function_setup(SQLFunctionCtx *pCtx) { 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,14 +1470,25 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa ...@@ -1450,14 +1470,25 @@ 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 (type == RESULT_ROW_START_INTERP) { if (functionId == TSDB_FUNC_TWA) {
pRuntimeEnv->pCtx[k].start.key = point.key; taosGetLinearInterpolationVal(&point, TSDB_DATA_TYPE_DOUBLE, &point1, &point2, TSDB_DATA_TYPE_DOUBLE);
pRuntimeEnv->pCtx[k].start.val = v;
if (type == RESULT_ROW_START_INTERP) {
pRuntimeEnv->pCtx[k].start.key = point.key;
pRuntimeEnv->pCtx[k].start.val = v;
} else {
pRuntimeEnv->pCtx[k].end.key = point.key;
pRuntimeEnv->pCtx[k].end.val = v;
}
} else { } else {
pRuntimeEnv->pCtx[k].end.key = point.key; if (type == RESULT_ROW_START_INTERP) {
pRuntimeEnv->pCtx[k].end.val = v; 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,24 +3830,19 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) { ...@@ -3737,24 +3830,19 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
qDebug("QInfo:%p start to repeat scan data blocks due to query func required, qrange:%"PRId64"-%"PRId64, pQInfo, 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)) { if (needReverseScan(pQuery)) {
return; setEnvBeforeReverseScan(pRuntimeEnv, &qstatus);
}
setEnvBeforeReverseScan(pRuntimeEnv, &qstatus); // reverse scan from current position
qDebug("QInfo:%p start to reverse scan", pQInfo);
doScanAllDataBlocks(pRuntimeEnv);
// reverse scan from current position clearEnvAfterReverseScan(pRuntimeEnv, &qstatus);
qDebug("QInfo:%p start to reverse scan", pQInfo); }
doScanAllDataBlocks(pRuntimeEnv);
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,7 +6049,10 @@ static int32_t getColumnIndexInSource(SQueryTableMsg *pQueryMsg, SSqlFuncMsg *pE ...@@ -5857,7 +6049,10 @@ 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) {
...@@ -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,10 @@ ...@@ -19,10 +19,10 @@
#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 "tsdb.h"
#include "tsdbMain.h" #include "tsdbMain.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 +111,7 @@ typedef struct STsdbQueryHandle { ...@@ -111,6 +111,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
SFileGroup* pFileGroup; SFileGroup* pFileGroup;
...@@ -125,6 +126,8 @@ typedef struct STsdbQueryHandle { ...@@ -125,6 +126,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 +144,10 @@ static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastK ...@@ -141,10 +144,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, SCompBlock* pBlock); static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SCompBlock* 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 +213,36 @@ static void tsdbMayUnTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) { ...@@ -210,6 +213,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 +327,7 @@ static STsdbQueryHandle* tsdbQueryTablesImpl(TSDB_REPO_T* tsdb, STsdbQueryCond* ...@@ -294,6 +327,7 @@ static STsdbQueryHandle* tsdbQueryTablesImpl(TSDB_REPO_T* tsdb, STsdbQueryCond*
pQueryHandle->allocSize = 0; pQueryHandle->allocSize = 0;
pQueryHandle->locateStart = false; pQueryHandle->locateStart = false;
pQueryHandle->pMemRef = pMemRef; pQueryHandle->pMemRef = pMemRef;
pQueryHandle->loadExternalRow = pCond->loadExternalRows;
if (tsdbInitReadHelper(&pQueryHandle->rhelper, (STsdbRepo*) tsdb) != 0) { if (tsdbInitReadHelper(&pQueryHandle->rhelper, (STsdbRepo*) tsdb) != 0) {
goto out_of_memory; goto out_of_memory;
...@@ -410,10 +444,11 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle) { ...@@ -410,10 +444,11 @@ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle) {
TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *tsdb, STsdbQueryCond* pCond, STableGroupInfo *groupList, void* qinfo, SMemRef* pRef) { TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *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 +1935,21 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) { ...@@ -1900,17 +1935,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 +1959,8 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) { ...@@ -1920,8 +1959,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 +1977,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) { ...@@ -1938,9 +1977,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 +2056,6 @@ static void destroyHelper(void* param) { ...@@ -2020,7 +2056,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 +2064,82 @@ static void destroyHelper(void* param) { ...@@ -2029,113 +2064,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.
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle)); // here note that the pQueryHandle->window must be the TS_INITIALIZER
for (int32_t i = 0; i < numOfCols; ++i) { int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i); SQueryFilePos* cur = &pQueryHandle->cur;
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 (cond.colList == NULL) {
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
return false;
}
for(int32_t i = 0; i < cond.numOfCols; ++i) { if (++pQueryHandle->activeIndex < numOfTables) {
SColumnInfoData* pColInfoData = taosArrayGet(pQueryHandle->pColumns, i); STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex);
memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo)); int32_t ret = tsdbGetCachedLastRow(pCheckInfo->pTableObj, &pRow, &key);
} if (ret != TSDB_CODE_SUCCESS) {
return false;
}
STsdbQueryHandle* pSecQueryHandle = tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pQueryHandle->pMemRef); copyOneRowFromMem(pQueryHandle, pQueryHandle->outputCapacity, 0, pRow, numOfCols, pCheckInfo->pTableObj);
tfree(pRow);
tfree(cond.colList); // update the last key value
pCheckInfo->lastKey = key + step;
pSecQueryHandle->pTableCheckInfo = createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey); cur->rows = 1; // only one row
if (pSecQueryHandle->pTableCheckInfo == NULL) { cur->lastKey = key + step;
tsdbCleanupQueryHandle(pSecQueryHandle); cur->mixBlock = true;
return false; cur->win.skey = key;
} cur->win.ekey = key;
if (!tsdbNextDataBlock((void*) pSecQueryHandle)) { return true;
tsdbCleanupQueryHandle(pSecQueryHandle);
return false;
} }
tsdbRetrieveDataBlockInfo((void*) pSecQueryHandle, &blockInfo); return false;
tsdbRetrieveDataBlock((void*) pSecQueryHandle, pSecQueryHandle->defaultLoadColumn); }
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pSecQueryHandle));
size_t si = taosArrayGetSize(pSecQueryHandle->pTableCheckInfo);
for (int32_t i = 0; i < numOfCols; ++i) { if (pQueryHandle->checkFiles) {
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i); // check if the query range overlaps with the file data block
memcpy((char*)pCol->pData, (char*)pCol->pData + pCol->info.bytes * (pQueryHandle->cur.rows - 1), pCol->info.bytes); bool exists = true;
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();
...@@ -2209,13 +2213,118 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) { ...@@ -2209,13 +2213,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 +2825,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, tExprNode* pExpr) ...@@ -2716,7 +2825,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 +2882,10 @@ int32_t tsdbQuerySTableByTagCond(TSDB_REPO_T* tsdb, uint64_t uid, TSKEY skey, co ...@@ -2773,10 +2882,10 @@ int32_t tsdbQuerySTableByTagCond(TSDB_REPO_T* tsdb, uint64_t uid, TSKEY skey, co
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 +2999,21 @@ int32_t tsdbGetTableGroupFromIdList(TSDB_REPO_T* tsdb, SArray* pTableIdList, STa ...@@ -2890,6 +2999,21 @@ int32_t tsdbGetTableGroupFromIdList(TSDB_REPO_T* tsdb, SArray* pTableIdList, STa
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 +3031,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) { ...@@ -2907,14 +3031,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 +3045,9 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) { ...@@ -2928,6 +3045,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
...@@ -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.
先完成此消息的编辑!
想要评论请 注册