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

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

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