[td-2895] refactor.
This commit is contained in:
parent
e313cf3b59
commit
5501982faa
|
@ -75,7 +75,6 @@ static int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int3
|
|||
static int32_t insertResultField(SQueryInfo* pQueryInfo, int32_t outputIndex, SColumnList* pIdList, int16_t bytes,
|
||||
int8_t type, char* fieldName, SSqlExpr* pSqlExpr);
|
||||
|
||||
static int32_t convertFunctionId(int32_t optr, int16_t* functionId);
|
||||
static uint8_t convertOptr(SStrToken *pToken);
|
||||
|
||||
static int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSelection, bool isSTable, bool joinQuery, bool intervalQuery);
|
||||
|
@ -1549,26 +1548,24 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
|
|||
hasDistinct = (pItem->distinct == true);
|
||||
}
|
||||
|
||||
int32_t optr = pItem->pNode->nSQLOptr;
|
||||
if (optr == TK_FUNCTION) {
|
||||
int32_t functId = isValidFunction(pItem->pNode->token.z, pItem->pNode->token.n);
|
||||
if (functId < 0) {
|
||||
int32_t type = pItem->pNode->type;
|
||||
if (type == SQL_NODE_SQLFUNCTION) {
|
||||
pItem->pNode->functionId = isValidFunction(pItem->pNode->operand.z, pItem->pNode->operand.n);
|
||||
if (pItem->pNode->functionId < 0) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
|
||||
}
|
||||
|
||||
pItem->pNode->nSQLOptr = functId;
|
||||
|
||||
// sql function in selection clause, append sql function info in pSqlCmd structure sequentially
|
||||
if (addExprAndResultField(pCmd, pQueryInfo, outputIndex, pItem, true) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
} else if (optr == TK_ALL || optr == TK_ID || optr == TK_STRING || optr == TK_INTEGER || optr == TK_FLOAT) {
|
||||
} else if (type == SQL_NODE_TABLE_COLUMN || type == SQL_NODE_VALUE) {
|
||||
// use the dynamic array list to decide if the function is valid or not
|
||||
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
|
||||
if (addProjectionExprAndResultField(pCmd, pQueryInfo, pItem) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
} else if (pItem->pNode->nSQLOptr >= TK_PLUS && pItem->pNode->nSQLOptr <= TK_REM) {
|
||||
} else if (type == SQL_NODE_EXPR) {
|
||||
int32_t code = handleArithmeticExpr(pCmd, clauseIndex, i, pItem);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
|
@ -1718,7 +1715,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
|||
const char* msg1 = "tag for normal table query is not allowed";
|
||||
|
||||
int32_t startPos = (int32_t)tscSqlExprNumOfExprs(pQueryInfo);
|
||||
int32_t optr = pItem->pNode->nSQLOptr;
|
||||
int32_t optr = pItem->pNode->tokenId;
|
||||
|
||||
if (optr == TK_ALL) { // project on all fields
|
||||
TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_PROJECTION_QUERY);
|
||||
|
@ -1748,13 +1745,13 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
|||
index.columnIndex = (pQueryInfo->udColumnId--);
|
||||
index.tableIndex = 0;
|
||||
|
||||
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->val, &pItem->pNode->token, pItem->aliasName);
|
||||
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->value, &pItem->pNode->token, pItem->aliasName);
|
||||
SSqlExpr* pExpr =
|
||||
tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema, TSDB_COL_UDC);
|
||||
|
||||
// NOTE: the first parameter is reserved for the tag column id during join query process.
|
||||
pExpr->numOfParams = 2;
|
||||
tVariantAssign(&pExpr->param[1], &pItem->pNode->val);
|
||||
tVariantAssign(&pExpr->param[1], &pItem->pNode->value);
|
||||
} else if (optr == TK_ID) {
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
|
@ -1865,7 +1862,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
|
|||
|
||||
int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t colIndex, tSqlExprItem* pItem, bool finalResult) {
|
||||
STableMetaInfo* pTableMetaInfo = NULL;
|
||||
int32_t optr = pItem->pNode->nSQLOptr;
|
||||
int32_t functionId = pItem->pNode->functionId;
|
||||
|
||||
const char* msg1 = "not support column types";
|
||||
const char* msg2 = "invalid parameters";
|
||||
|
@ -1875,27 +1872,21 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
const char* msg6 = "function applied to tags not allowed";
|
||||
const char* msg7 = "normal table can not apply this function";
|
||||
const char* msg8 = "multi-columns selection does not support alias column name";
|
||||
const char* msg9 = "invalid function";
|
||||
|
||||
switch (optr) {
|
||||
switch (functionId) {
|
||||
case TSDB_FUNC_COUNT: {
|
||||
/* more than one parameter for count() function */
|
||||
if (pItem->pNode->pParam != NULL && pItem->pNode->pParam->nExpr != 1) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
int16_t functionID = 0;
|
||||
if (convertFunctionId(optr, &functionID) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
SSqlExpr* pExpr = NULL;
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (pItem->pNode->pParam != NULL) {
|
||||
tSqlExprItem* pParamElem = &pItem->pNode->pParam->a[0];
|
||||
SStrToken* pToken = &pParamElem->pNode->colInfo;
|
||||
int16_t sqlOptr = pParamElem->pNode->nSQLOptr;
|
||||
int16_t sqlOptr = pParamElem->pNode->tokenId;
|
||||
if ((pToken->z == NULL || pToken->n == 0)
|
||||
&& (TK_INTEGER != sqlOptr)) /*select count(1) from table*/ {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
|
@ -1911,11 +1902,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
index = (SColumnIndex){0, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||
int32_t size = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionID, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionId, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
} else if (sqlOptr == TK_INTEGER) { // select count(1) from table1
|
||||
char buf[8] = {0};
|
||||
int64_t val = -1;
|
||||
tVariant* pVariant = &pParamElem->pNode->val;
|
||||
tVariant* pVariant = &pParamElem->pNode->value;
|
||||
if (pVariant->nType == TSDB_DATA_TYPE_BIGINT) {
|
||||
tVariantDump(pVariant, buf, TSDB_DATA_TYPE_BIGINT, true);
|
||||
val = GET_INT64_VAL(buf);
|
||||
|
@ -1923,7 +1914,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
if (val == 1) {
|
||||
index = (SColumnIndex){0, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||
int32_t size = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionID, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionId, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
} else {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
@ -1943,12 +1934,12 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
int32_t size = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionID, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, isTag);
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionId, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, isTag);
|
||||
}
|
||||
} else { // count(*) is equalled to count(primary_timestamp_key)
|
||||
index = (SColumnIndex){0, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||
int32_t size = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionID, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
pExpr = tscSqlExprAppend(pQueryInfo, functionId, &index, TSDB_DATA_TYPE_BIGINT, size, getNewResColId(pQueryInfo), size, false);
|
||||
}
|
||||
|
||||
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||
|
@ -1988,14 +1979,14 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
case TSDB_FUNC_STDDEV:
|
||||
case TSDB_FUNC_LEASTSQR: {
|
||||
// 1. valid the number of parameters
|
||||
if (pItem->pNode->pParam == NULL || (optr != TSDB_FUNC_LEASTSQR && pItem->pNode->pParam->nExpr != 1) ||
|
||||
(optr == TSDB_FUNC_LEASTSQR && pItem->pNode->pParam->nExpr != 3)) {
|
||||
if (pItem->pNode->pParam == NULL || (functionId != TSDB_FUNC_LEASTSQR && pItem->pNode->pParam->nExpr != 1) ||
|
||||
(functionId == TSDB_FUNC_LEASTSQR && pItem->pNode->pParam->nExpr != 3)) {
|
||||
/* no parameters or more than one parameter for function */
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
tSqlExprItem* pParamElem = &(pItem->pNode->pParam->a[0]);
|
||||
if (pParamElem->pNode->nSQLOptr != TK_ALL && pParamElem->pNode->nSQLOptr != TK_ID) {
|
||||
if (pParamElem->pNode->tokenId != TK_ALL && pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
|
@ -2020,18 +2011,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
int16_t resultSize = 0;
|
||||
int32_t intermediateResSize = 0;
|
||||
|
||||
int16_t functionID = 0;
|
||||
if (convertFunctionId(optr, &functionID) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (getResultDataInfo(pSchema->type, pSchema->bytes, functionID, 0, &resultType, &resultSize,
|
||||
if (getResultDataInfo(pSchema->type, pSchema->bytes, functionId, 0, &resultType, &resultSize,
|
||||
&intermediateResSize, 0, false) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
// set the first column ts for diff query
|
||||
if (optr == TSDB_FUNC_DIFF) {
|
||||
if (functionId == TSDB_FUNC_DIFF) {
|
||||
colIndex += 1;
|
||||
SColumnIndex indexTS = {.tableIndex = index.tableIndex, .columnIndex = 0};
|
||||
SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TS_DUMMY, &indexTS, TSDB_DATA_TYPE_TIMESTAMP, TSDB_KEYSIZE,
|
||||
|
@ -2046,19 +2032,19 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
|
||||
}
|
||||
|
||||
SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, functionID, &index, resultType, resultSize, getNewResColId(pQueryInfo), resultSize, false);
|
||||
SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, functionId, &index, resultType, resultSize, getNewResColId(pQueryInfo), resultSize, false);
|
||||
|
||||
if (optr == TSDB_FUNC_LEASTSQR) {
|
||||
if (functionId == TSDB_FUNC_LEASTSQR) {
|
||||
/* set the leastsquares parameters */
|
||||
char val[8] = {0};
|
||||
if (tVariantDump(&pParamElem[1].pNode->val, val, TSDB_DATA_TYPE_DOUBLE, true) < 0) {
|
||||
if (tVariantDump(&pParamElem[1].pNode->value, val, TSDB_DATA_TYPE_DOUBLE, true) < 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
addExprParams(pExpr, val, TSDB_DATA_TYPE_DOUBLE, DOUBLE_BYTES);
|
||||
|
||||
memset(val, 0, tListLen(val));
|
||||
if (tVariantDump(&pParamElem[2].pNode->val, val, TSDB_DATA_TYPE_DOUBLE, true) < 0) {
|
||||
if (tVariantDump(&pParamElem[2].pNode->value, val, TSDB_DATA_TYPE_DOUBLE, true) < 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
|
@ -2091,14 +2077,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
case TSDB_FUNC_INTERP: {
|
||||
bool requireAllFields = (pItem->pNode->pParam == NULL);
|
||||
|
||||
int16_t functionID = 0;
|
||||
if (convertFunctionId(optr, &functionID) != TSDB_CODE_SUCCESS) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg9);
|
||||
}
|
||||
|
||||
// NOTE: has time range condition or normal column filter condition, the last_row query will be transferred to last query
|
||||
SConvertFunc cvtFunc = {.originFuncId = functionID, .execFuncId = functionID};
|
||||
if (functionID == TSDB_FUNC_LAST_ROW && ((!TSWINDOW_IS_EQUAL(pQueryInfo->window, TSWINDOW_INITIALIZER)) || (hasNormalColumnFilter(pQueryInfo)))) {
|
||||
SConvertFunc cvtFunc = {.originFuncId = functionId, .execFuncId = functionId};
|
||||
if (functionId == TSDB_FUNC_LAST_ROW && ((!TSWINDOW_IS_EQUAL(pQueryInfo->window, TSWINDOW_INITIALIZER)) || (hasNormalColumnFilter(pQueryInfo)))) {
|
||||
cvtFunc.execFuncId = TSDB_FUNC_LAST;
|
||||
}
|
||||
|
||||
|
@ -2114,13 +2095,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
/* in first/last function, multiple columns can be add to resultset */
|
||||
for (int32_t i = 0; i < pItem->pNode->pParam->nExpr; ++i) {
|
||||
tSqlExprItem* pParamElem = &(pItem->pNode->pParam->a[i]);
|
||||
if (pParamElem->pNode->nSQLOptr != TK_ALL && pParamElem->pNode->nSQLOptr != TK_ID) {
|
||||
if (pParamElem->pNode->tokenId != TK_ALL && pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (pParamElem->pNode->nSQLOptr == TK_ALL) { // select table.*
|
||||
if (pParamElem->pNode->tokenId == TK_ALL) { // select table.*
|
||||
SStrToken tmpToken = pParamElem->pNode->colInfo;
|
||||
|
||||
if (getTableIndexByName(&tmpToken, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
|
@ -2164,7 +2145,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (optr == TSDB_FUNC_LAST) { // todo refactor
|
||||
if (functionId == TSDB_FUNC_LAST) { // todo refactor
|
||||
SSqlGroupbyExpr* pGroupBy = &pQueryInfo->groupbyExpr;
|
||||
if (pGroupBy->numOfGroupCols > 0) {
|
||||
for(int32_t k = 0; k < pGroupBy->numOfGroupCols; ++k) {
|
||||
|
@ -2226,7 +2207,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
tSqlExprItem* pParamElem = &(pItem->pNode->pParam->a[0]);
|
||||
if (pParamElem->pNode->nSQLOptr != TK_ID) {
|
||||
if (pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
|
@ -2254,11 +2235,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
// 3. valid the parameters
|
||||
if (pParamElem[1].pNode->nSQLOptr == TK_ID) {
|
||||
if (pParamElem[1].pNode->tokenId == TK_ID) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
tVariant* pVariant = &pParamElem[1].pNode->val;
|
||||
tVariant* pVariant = &pParamElem[1].pNode->value;
|
||||
|
||||
int8_t resultType = pSchema[index.columnIndex].type;
|
||||
int16_t resultSize = pSchema[index.columnIndex].bytes;
|
||||
|
@ -2266,7 +2247,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
char val[8] = {0};
|
||||
SSqlExpr* pExpr = NULL;
|
||||
|
||||
if (optr == TSDB_FUNC_PERCT || optr == TSDB_FUNC_APERCT) {
|
||||
if (functionId == TSDB_FUNC_PERCT || functionId == TSDB_FUNC_APERCT) {
|
||||
tVariantDump(pVariant, val, TSDB_DATA_TYPE_DOUBLE, true);
|
||||
|
||||
double dp = GET_DOUBLE_VAL(val);
|
||||
|
@ -2282,10 +2263,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
* for dp = 0, it is actually min,
|
||||
* for dp = 100, it is max,
|
||||
*/
|
||||
int16_t functionId = 0;
|
||||
if (convertFunctionId(optr, &functionId) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
tscInsertPrimaryTsSourceColumn(pQueryInfo, &index);
|
||||
colIndex += 1; // the first column is ts
|
||||
|
||||
|
@ -2299,11 +2276,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
|
||||
}
|
||||
|
||||
int16_t functionId = 0;
|
||||
if (convertFunctionId(optr, &functionId) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
// todo REFACTOR
|
||||
// set the first column ts for top/bottom query
|
||||
SColumnIndex index1 = {0, PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||
|
@ -2454,8 +2426,8 @@ void getColumnName(tSqlExprItem* pItem, char* resultFieldName, int32_t nameLengt
|
|||
if (pItem->aliasName != NULL) {
|
||||
strncpy(resultFieldName, pItem->aliasName, nameLength);
|
||||
} else {
|
||||
int32_t len = ((int32_t)pItem->pNode->operand.n < nameLength) ? (int32_t)pItem->pNode->operand.n : nameLength;
|
||||
strncpy(resultFieldName, pItem->pNode->operand.z, len);
|
||||
int32_t len = ((int32_t)pItem->pNode->token.n < nameLength) ? (int32_t)pItem->pNode->token.n : nameLength;
|
||||
strncpy(resultFieldName, pItem->pNode->token.z, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2595,87 +2567,6 @@ int32_t getColumnIndexByName(SSqlCmd* pCmd, const SStrToken* pToken, SQueryInfo*
|
|||
return doGetColumnIndexByName(pCmd, &tmpToken, pQueryInfo, pIndex);
|
||||
}
|
||||
|
||||
int32_t convertFunctionId(int32_t optr, int16_t* functionId) {
|
||||
switch (optr) {
|
||||
case TSDB_FUNC_COUNT:
|
||||
*functionId = TSDB_FUNC_COUNT;
|
||||
break;
|
||||
case TSDB_FUNC_SUM:
|
||||
*functionId = TSDB_FUNC_SUM;
|
||||
break;
|
||||
case TSDB_FUNC_AVG:
|
||||
*functionId = TSDB_FUNC_AVG;
|
||||
break;
|
||||
case TSDB_FUNC_RATE:
|
||||
*functionId = TSDB_FUNC_RATE;
|
||||
break;
|
||||
case TSDB_FUNC_IRATE:
|
||||
*functionId = TSDB_FUNC_IRATE;
|
||||
break;
|
||||
case TSDB_FUNC_SUM_RATE:
|
||||
*functionId = TSDB_FUNC_SUM_RATE;
|
||||
break;
|
||||
case TSDB_FUNC_SUM_IRATE:
|
||||
*functionId = TSDB_FUNC_SUM_IRATE;
|
||||
break;
|
||||
case TSDB_FUNC_AVG_RATE:
|
||||
*functionId = TSDB_FUNC_AVG_RATE;
|
||||
break;
|
||||
case TSDB_FUNC_AVG_IRATE:
|
||||
*functionId = TSDB_FUNC_AVG_IRATE;
|
||||
break;
|
||||
case TSDB_FUNC_MIN:
|
||||
*functionId = TSDB_FUNC_MIN;
|
||||
break;
|
||||
case TSDB_FUNC_MAX:
|
||||
*functionId = TSDB_FUNC_MAX;
|
||||
break;
|
||||
case TSDB_FUNC_STDDEV:
|
||||
*functionId = TSDB_FUNC_STDDEV;
|
||||
break;
|
||||
case TSDB_FUNC_PERCT:
|
||||
*functionId = TSDB_FUNC_PERCT;
|
||||
break;
|
||||
case TSDB_FUNC_APERCT:
|
||||
*functionId = TSDB_FUNC_APERCT;
|
||||
break;
|
||||
case TSDB_FUNC_FIRST:
|
||||
*functionId = TSDB_FUNC_FIRST;
|
||||
break;
|
||||
case TSDB_FUNC_LAST:
|
||||
*functionId = TSDB_FUNC_LAST;
|
||||
break;
|
||||
case TSDB_FUNC_LEASTSQR:
|
||||
*functionId = TSDB_FUNC_LEASTSQR;
|
||||
break;
|
||||
case TSDB_FUNC_TOP:
|
||||
*functionId = TSDB_FUNC_TOP;
|
||||
break;
|
||||
case TSDB_FUNC_BOTTOM:
|
||||
*functionId = TSDB_FUNC_BOTTOM;
|
||||
break;
|
||||
case TSDB_FUNC_DIFF:
|
||||
*functionId = TSDB_FUNC_DIFF;
|
||||
break;
|
||||
case TSDB_FUNC_SPREAD:
|
||||
*functionId = TSDB_FUNC_SPREAD;
|
||||
break;
|
||||
case TSDB_FUNC_TWA:
|
||||
*functionId = TSDB_FUNC_TWA;
|
||||
break;
|
||||
case TSDB_FUNC_INTERP:
|
||||
*functionId = TSDB_FUNC_INTERP;
|
||||
break;
|
||||
case TSDB_FUNC_LAST_ROW:
|
||||
*functionId = TSDB_FUNC_LAST_ROW;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
||||
SSqlCmd* pCmd = &pSql->cmd;
|
||||
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0);
|
||||
|
@ -3109,39 +3000,39 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
|||
colType = TSDB_DATA_TYPE_BIGINT;
|
||||
} else if (colType == TSDB_DATA_TYPE_FLOAT || colType == TSDB_DATA_TYPE_DOUBLE) {
|
||||
colType = TSDB_DATA_TYPE_DOUBLE;
|
||||
} else if ((colType == TSDB_DATA_TYPE_TIMESTAMP) && (TSDB_DATA_TYPE_BINARY == pRight->val.nType)) {
|
||||
int retVal = setColumnFilterInfoForTimestamp(pCmd, pQueryInfo, &pRight->val);
|
||||
} else if ((colType == TSDB_DATA_TYPE_TIMESTAMP) && (TSDB_DATA_TYPE_BINARY == pRight->value.nType)) {
|
||||
int retVal = setColumnFilterInfoForTimestamp(pCmd, pQueryInfo, &pRight->value);
|
||||
if (TSDB_CODE_SUCCESS != retVal) {
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t retVal = TSDB_CODE_SUCCESS;
|
||||
if (pExpr->nSQLOptr == TK_LE || pExpr->nSQLOptr == TK_LT) {
|
||||
retVal = tVariantDump(&pRight->val, (char*)&pColumnFilter->upperBndd, colType, false);
|
||||
if (pExpr->tokenId == TK_LE || pExpr->tokenId == TK_LT) {
|
||||
retVal = tVariantDump(&pRight->value, (char*)&pColumnFilter->upperBndd, colType, false);
|
||||
|
||||
// TK_GT,TK_GE,TK_EQ,TK_NE are based on the pColumn->lowerBndd
|
||||
} else if (colType == TSDB_DATA_TYPE_BINARY) {
|
||||
pColumnFilter->pz = (int64_t)calloc(1, pRight->val.nLen + TSDB_NCHAR_SIZE);
|
||||
pColumnFilter->len = pRight->val.nLen;
|
||||
retVal = tVariantDump(&pRight->val, (char*)pColumnFilter->pz, colType, false);
|
||||
pColumnFilter->pz = (int64_t)calloc(1, pRight->value.nLen + TSDB_NCHAR_SIZE);
|
||||
pColumnFilter->len = pRight->value.nLen;
|
||||
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
||||
|
||||
} else if (colType == TSDB_DATA_TYPE_NCHAR) {
|
||||
// pRight->val.nLen + 1 is larger than the actual nchar string length
|
||||
pColumnFilter->pz = (int64_t)calloc(1, (pRight->val.nLen + 1) * TSDB_NCHAR_SIZE);
|
||||
retVal = tVariantDump(&pRight->val, (char*)pColumnFilter->pz, colType, false);
|
||||
// pRight->value.nLen + 1 is larger than the actual nchar string length
|
||||
pColumnFilter->pz = (int64_t)calloc(1, (pRight->value.nLen + 1) * TSDB_NCHAR_SIZE);
|
||||
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
||||
size_t len = twcslen((wchar_t*)pColumnFilter->pz);
|
||||
pColumnFilter->len = len * TSDB_NCHAR_SIZE;
|
||||
|
||||
} else {
|
||||
retVal = tVariantDump(&pRight->val, (char*)&pColumnFilter->lowerBndd, colType, false);
|
||||
retVal = tVariantDump(&pRight->value, (char*)&pColumnFilter->lowerBndd, colType, false);
|
||||
}
|
||||
|
||||
if (retVal != TSDB_CODE_SUCCESS) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg);
|
||||
}
|
||||
|
||||
switch (pExpr->nSQLOptr) {
|
||||
switch (pExpr->tokenId) {
|
||||
case TK_LE:
|
||||
pColumnFilter->upperRelOptr = TSDB_RELATION_LESS_EQUAL;
|
||||
break;
|
||||
|
@ -3194,14 +3085,14 @@ typedef struct SCondExpr {
|
|||
static int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t timePrecision);
|
||||
|
||||
static int32_t tSQLExprNodeToString(tSQLExpr* pExpr, char** str) {
|
||||
if (pExpr->nSQLOptr == TK_ID) { // column name
|
||||
if (pExpr->tokenId == TK_ID) { // column name
|
||||
strncpy(*str, pExpr->colInfo.z, pExpr->colInfo.n);
|
||||
*str += pExpr->colInfo.n;
|
||||
|
||||
} else if (pExpr->nSQLOptr >= TK_BOOL && pExpr->nSQLOptr <= TK_STRING) { // value
|
||||
*str += tVariantToString(&pExpr->val, *str);
|
||||
} else if (pExpr->tokenId >= TK_BOOL && pExpr->tokenId <= TK_STRING) { // value
|
||||
*str += tVariantToString(&pExpr->value, *str);
|
||||
|
||||
} else if (pExpr->nSQLOptr >= TSDB_FUNC_COUNT && pExpr->nSQLOptr <= TSDB_FUNC_BLKINFO) {
|
||||
} else if (pExpr->tokenId >= TSDB_FUNC_COUNT && pExpr->tokenId <= TSDB_FUNC_BLKINFO) {
|
||||
/*
|
||||
* arithmetic expression of aggregation, such as count(ts) + count(ts) *2
|
||||
*/
|
||||
|
@ -3214,10 +3105,10 @@ static int32_t tSQLExprNodeToString(tSQLExpr* pExpr, char** str) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
// pExpr->nSQLOptr == 0 while handling "is null" query
|
||||
// pExpr->tokenId == 0 while handling "is null" query
|
||||
static bool isExprLeafNode(tSQLExpr* pExpr) {
|
||||
return (pExpr->pRight == NULL && pExpr->pLeft == NULL) &&
|
||||
(pExpr->nSQLOptr == 0 || pExpr->nSQLOptr == TK_ID || (pExpr->nSQLOptr >= TK_BOOL && pExpr->nSQLOptr <= TK_NCHAR) || pExpr->nSQLOptr == TK_SET);
|
||||
(pExpr->tokenId == 0 || pExpr->tokenId == TK_ID || (pExpr->tokenId >= TK_BOOL && pExpr->tokenId <= TK_NCHAR) || pExpr->tokenId == TK_SET);
|
||||
}
|
||||
|
||||
static bool isExprDirectParentOfLeafNode(tSQLExpr* pExpr) {
|
||||
|
@ -3259,7 +3150,7 @@ static int32_t optrToString(tSQLExpr* pExpr, char** exprString) {
|
|||
const char* ne = "<>";
|
||||
const char* likeOptr = "LIKE";
|
||||
|
||||
switch (pExpr->nSQLOptr) {
|
||||
switch (pExpr->tokenId) {
|
||||
case TK_LE: {
|
||||
*(int16_t*)(*exprString) = *(int16_t*)le;
|
||||
*exprString += 1;
|
||||
|
@ -3326,13 +3217,13 @@ static int32_t tablenameListToString(tSQLExpr* pExpr, SStringBuilder* sb) {
|
|||
|
||||
for (int32_t i = 0; i < pList->nExpr; ++i) {
|
||||
tSQLExpr* pSub = pList->a[i].pNode;
|
||||
taosStringBuilderAppendStringLen(sb, pSub->val.pz, pSub->val.nLen);
|
||||
taosStringBuilderAppendStringLen(sb, pSub->value.pz, pSub->value.nLen);
|
||||
|
||||
if (i < pList->nExpr - 1) {
|
||||
taosStringBuilderAppendString(sb, TBNAME_LIST_SEP);
|
||||
}
|
||||
|
||||
if (pSub->val.nLen <= 0 || !tscValidateTableNameLength(pSub->val.nLen)) {
|
||||
if (pSub->value.nLen <= 0 || !tscValidateTableNameLength(pSub->value.nLen)) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
}
|
||||
|
@ -3342,7 +3233,7 @@ static int32_t tablenameListToString(tSQLExpr* pExpr, SStringBuilder* sb) {
|
|||
|
||||
static int32_t tablenameCondToString(tSQLExpr* pExpr, SStringBuilder* sb) {
|
||||
taosStringBuilderAppendStringLen(sb, QUERY_COND_REL_PREFIX_LIKE, QUERY_COND_REL_PREFIX_LIKE_LEN);
|
||||
taosStringBuilderAppendString(sb, pExpr->val.pz);
|
||||
taosStringBuilderAppendString(sb, pExpr->value.pz);
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
@ -3396,21 +3287,21 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
|
|||
((pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) ? 1 : 0);
|
||||
|
||||
if (pColFilter->filterstr) {
|
||||
if (pExpr->nSQLOptr != TK_EQ
|
||||
&& pExpr->nSQLOptr != TK_NE
|
||||
&& pExpr->nSQLOptr != TK_ISNULL
|
||||
&& pExpr->nSQLOptr != TK_NOTNULL
|
||||
&& pExpr->nSQLOptr != TK_LIKE
|
||||
if (pExpr->tokenId != TK_EQ
|
||||
&& pExpr->tokenId != TK_NE
|
||||
&& pExpr->tokenId != TK_ISNULL
|
||||
&& pExpr->tokenId != TK_NOTNULL
|
||||
&& pExpr->tokenId != TK_LIKE
|
||||
) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
} else {
|
||||
if (pExpr->nSQLOptr == TK_LIKE) {
|
||||
if (pExpr->tokenId == TK_LIKE) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
if (pSchema->type == TSDB_DATA_TYPE_BOOL) {
|
||||
if (pExpr->nSQLOptr != TK_EQ && pExpr->nSQLOptr != TK_NE) {
|
||||
if (pExpr->tokenId != TK_EQ && pExpr->tokenId != TK_NE) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
}
|
||||
|
@ -3421,13 +3312,13 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
|
|||
}
|
||||
|
||||
static void relToString(tSQLExpr* pExpr, char** str) {
|
||||
assert(pExpr->nSQLOptr == TK_AND || pExpr->nSQLOptr == TK_OR);
|
||||
assert(pExpr->tokenId == TK_AND || pExpr->tokenId == TK_OR);
|
||||
|
||||
const char* or = "OR";
|
||||
const char*and = "AND";
|
||||
|
||||
// if (pQueryInfo->tagCond.relType == TSQL_STABLE_QTYPE_COND) {
|
||||
if (pExpr->nSQLOptr == TK_AND) {
|
||||
if (pExpr->tokenId == TK_AND) {
|
||||
strcpy(*str, and);
|
||||
*str += strlen(and);
|
||||
} else {
|
||||
|
@ -3481,10 +3372,10 @@ static int32_t getTablenameCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
|
|||
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
if (pTableCond->nSQLOptr == TK_IN) {
|
||||
if (pTableCond->tokenId == TK_IN) {
|
||||
ret = tablenameListToString(pRight, sb);
|
||||
} else if (pTableCond->nSQLOptr == TK_LIKE) {
|
||||
if (pRight->nSQLOptr != TK_STRING) {
|
||||
} else if (pTableCond->tokenId == TK_LIKE) {
|
||||
if (pRight->tokenId != TK_STRING) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
|
@ -3504,12 +3395,12 @@ static int32_t getColumnQueryCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQ
|
|||
}
|
||||
|
||||
if (!isExprDirectParentOfLeafNode(pExpr)) { // internal node
|
||||
int32_t ret = getColumnQueryCondInfo(pCmd, pQueryInfo, pExpr->pLeft, pExpr->nSQLOptr);
|
||||
int32_t ret = getColumnQueryCondInfo(pCmd, pQueryInfo, pExpr->pLeft, pExpr->tokenId);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return getColumnQueryCondInfo(pCmd, pQueryInfo, pExpr->pRight, pExpr->nSQLOptr);
|
||||
return getColumnQueryCondInfo(pCmd, pQueryInfo, pExpr->pRight, pExpr->tokenId);
|
||||
} else { // handle leaf node
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(pCmd, &pExpr->pLeft->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
|
@ -3579,8 +3470,8 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
|
|||
}
|
||||
|
||||
static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQueryInfo, SColumnList* pList,
|
||||
int32_t* type, uint64_t* uid) {
|
||||
if (pExpr->nSQLOptr == TK_ID) {
|
||||
int32_t* type, uint64_t* uid) {
|
||||
if (pExpr->type == SQL_NODE_TABLE_COLUMN) {
|
||||
if (*type == NON_ARITHMEIC_EXPR) {
|
||||
*type = NORMAL_ARITHMETIC;
|
||||
} else if (*type == AGG_ARIGHTMEIC) {
|
||||
|
@ -3602,9 +3493,9 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQuer
|
|||
}
|
||||
|
||||
pList->ids[pList->num++] = index;
|
||||
} else if (pExpr->nSQLOptr == TK_FLOAT && (isnan(pExpr->val.dKey) || isinf(pExpr->val.dKey))) {
|
||||
} else if (pExpr->tokenId == TK_FLOAT && (isnan(pExpr->value.dKey) || isinf(pExpr->value.dKey))) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
} else if (pExpr->nSQLOptr >= TSDB_FUNC_COUNT && pExpr->nSQLOptr <= TSDB_FUNC_AVG_IRATE) {
|
||||
} else if (pExpr->type == SQL_NODE_SQLFUNCTION) {
|
||||
if (*type == NON_ARITHMEIC_EXPR) {
|
||||
*type = AGG_ARIGHTMEIC;
|
||||
} else if (*type == NORMAL_ARITHMETIC) {
|
||||
|
@ -3617,6 +3508,11 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQuer
|
|||
|
||||
// sql function list in selection clause.
|
||||
// Append the sqlExpr into exprList of pQueryInfo structure sequentially
|
||||
pExpr->functionId = isValidFunction(pExpr->operand.z, pExpr->operand.n);
|
||||
if (pExpr->functionId < 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (addExprAndResultField(pCmd, pQueryInfo, outputIndex, &item, false) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
@ -3658,7 +3554,7 @@ static int32_t validateArithmeticSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryI
|
|||
uint64_t uidLeft = 0;
|
||||
uint64_t uidRight = 0;
|
||||
|
||||
if (pLeft->nSQLOptr >= TK_PLUS && pLeft->nSQLOptr <= TK_REM) {
|
||||
if (pLeft->type == SQL_NODE_EXPR) {
|
||||
int32_t ret = validateArithmeticSQLExpr(pCmd, pLeft, pQueryInfo, pList, type);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
|
@ -3671,7 +3567,7 @@ static int32_t validateArithmeticSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryI
|
|||
}
|
||||
|
||||
tSQLExpr* pRight = pExpr->pRight;
|
||||
if (pRight->nSQLOptr >= TK_PLUS && pRight->nSQLOptr <= TK_REM) {
|
||||
if (pRight->type == SQL_NODE_EXPR) {
|
||||
int32_t ret = validateArithmeticSQLExpr(pCmd, pRight, pQueryInfo, pList, type);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
|
@ -3704,22 +3600,15 @@ static bool isValidExpr(tSQLExpr* pLeft, tSQLExpr* pRight, int32_t optr) {
|
|||
*
|
||||
* However, columnA < 4+12 is valid
|
||||
*/
|
||||
if (pLeft->nSQLOptr >= TSDB_FUNC_COUNT && pLeft->nSQLOptr <= TSDB_FUNC_AVG_IRATE) {
|
||||
if (pLeft->type == SQL_NODE_SQLFUNCTION) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pRight == NULL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (pRight->nSQLOptr >= TSDB_FUNC_COUNT && pRight->nSQLOptr <= TSDB_FUNC_AVG_IRATE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pLeft->nSQLOptr >= TK_BOOL
|
||||
&& pLeft->nSQLOptr <= TK_BINARY
|
||||
&& pRight->nSQLOptr >= TK_BOOL
|
||||
&& pRight->nSQLOptr <= TK_BINARY) {
|
||||
if (pLeft->tokenId >= TK_BOOL && pLeft->tokenId <= TK_BINARY && pRight->tokenId >= TK_BOOL && pRight->tokenId <= TK_BINARY) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -3730,8 +3619,8 @@ static void exchangeExpr(tSQLExpr* pExpr) {
|
|||
tSQLExpr* pLeft = pExpr->pLeft;
|
||||
tSQLExpr* pRight = pExpr->pRight;
|
||||
|
||||
if (pRight->nSQLOptr == TK_ID && (pLeft->nSQLOptr == TK_INTEGER || pLeft->nSQLOptr == TK_FLOAT ||
|
||||
pLeft->nSQLOptr == TK_STRING || pLeft->nSQLOptr == TK_BOOL)) {
|
||||
if (pRight->tokenId == TK_ID && (pLeft->tokenId == TK_INTEGER || pLeft->tokenId == TK_FLOAT ||
|
||||
pLeft->tokenId == TK_STRING || pLeft->tokenId == TK_BOOL)) {
|
||||
/*
|
||||
* exchange value of the left handside and the value of the right-handside
|
||||
* to make sure that the value of filter expression always locates in
|
||||
|
@ -3739,7 +3628,7 @@ static void exchangeExpr(tSQLExpr* pExpr) {
|
|||
* the column-id is at the left handside.
|
||||
*/
|
||||
uint32_t optr = 0;
|
||||
switch (pExpr->nSQLOptr) {
|
||||
switch (pExpr->tokenId) {
|
||||
case TK_LE:
|
||||
optr = TK_GE;
|
||||
break;
|
||||
|
@ -3753,10 +3642,10 @@ static void exchangeExpr(tSQLExpr* pExpr) {
|
|||
optr = TK_LE;
|
||||
break;
|
||||
default:
|
||||
optr = pExpr->nSQLOptr;
|
||||
optr = pExpr->tokenId;
|
||||
}
|
||||
|
||||
pExpr->nSQLOptr = optr;
|
||||
pExpr->tokenId = optr;
|
||||
SWAP(pExpr->pLeft, pExpr->pRight, void*);
|
||||
}
|
||||
}
|
||||
|
@ -3770,11 +3659,11 @@ static bool validateJoinExprNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr
|
|||
|
||||
tSQLExpr* pRight = pExpr->pRight;
|
||||
|
||||
if (pRight->nSQLOptr != TK_ID) {
|
||||
if (pRight->tokenId != TK_ID) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (pExpr->nSQLOptr != TK_EQ) {
|
||||
if (pExpr->tokenId != TK_EQ) {
|
||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
return false;
|
||||
}
|
||||
|
@ -3816,7 +3705,7 @@ static bool validTableNameOptr(tSQLExpr* pExpr) {
|
|||
const char nameFilterOptr[] = {TK_IN, TK_LIKE};
|
||||
|
||||
for (int32_t i = 0; i < tListLen(nameFilterOptr); ++i) {
|
||||
if (pExpr->nSQLOptr == nameFilterOptr[i]) {
|
||||
if (pExpr->tokenId == nameFilterOptr[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -3870,7 +3759,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
|
|||
}
|
||||
|
||||
// set join query condition
|
||||
if (pRight->nSQLOptr == TK_ID) { // no need to keep the timestamp join condition
|
||||
if (pRight->tokenId == TK_ID) { // no need to keep the timestamp join condition
|
||||
TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_JOIN_QUERY);
|
||||
pCondExpr->tsJoin = true;
|
||||
|
||||
|
@ -3892,8 +3781,8 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
|
|||
}
|
||||
|
||||
// check for like expression
|
||||
if ((*pExpr)->nSQLOptr == TK_LIKE) {
|
||||
if (pRight->val.nLen > TSDB_PATTERN_STRING_MAX_LEN) {
|
||||
if ((*pExpr)->tokenId == TK_LIKE) {
|
||||
if (pRight->value.nLen > TSDB_PATTERN_STRING_MAX_LEN) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg8);
|
||||
}
|
||||
|
||||
|
@ -3926,7 +3815,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
|
|||
*type = TSQL_EXPR_TBNAME;
|
||||
*pExpr = NULL;
|
||||
} else {
|
||||
if (pRight != NULL && pRight->nSQLOptr == TK_ID) { // join on tag columns for stable query
|
||||
if (pRight != NULL && pRight->tokenId == TK_ID) { // join on tag columns for stable query
|
||||
if (!validateJoinExprNode(pCmd, pQueryInfo, *pExpr, &index)) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
@ -3950,7 +3839,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
|
|||
} else { // query on other columns
|
||||
*type = TSQL_EXPR_COLUMN;
|
||||
|
||||
if (pRight->nSQLOptr == TK_ID) { // other column cannot be served as the join column
|
||||
if (pRight->tokenId == TK_ID) { // other column cannot be served as the join column
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
|
||||
}
|
||||
|
||||
|
@ -3972,7 +3861,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
|
|||
tSQLExpr* pLeft = (*pExpr)->pLeft;
|
||||
tSQLExpr* pRight = (*pExpr)->pRight;
|
||||
|
||||
if (!isValidExpr(pLeft, pRight, (*pExpr)->nSQLOptr)) {
|
||||
if (!isValidExpr(pLeft, pRight, (*pExpr)->tokenId)) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
|
@ -3980,12 +3869,12 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
|
|||
int32_t rightType = -1;
|
||||
|
||||
if (!isExprDirectParentOfLeafNode(*pExpr)) {
|
||||
int32_t ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pLeft, pCondExpr, &leftType, (*pExpr)->nSQLOptr);
|
||||
int32_t ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pLeft, pCondExpr, &leftType, (*pExpr)->tokenId);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pRight, pCondExpr, &rightType, (*pExpr)->nSQLOptr);
|
||||
ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pRight, pCondExpr, &rightType, (*pExpr)->tokenId);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -3995,7 +3884,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
|
|||
* expression is not valid for parent node, it must be TK_AND operator.
|
||||
*/
|
||||
if (leftType != rightType) {
|
||||
if ((*pExpr)->nSQLOptr == TK_OR && (leftType + rightType != TSQL_EXPR_TBNAME + TSQL_EXPR_TAG)) {
|
||||
if ((*pExpr)->tokenId == TK_OR && (leftType + rightType != TSQL_EXPR_TBNAME + TSQL_EXPR_TAG)) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
}
|
||||
|
@ -4023,7 +3912,7 @@ static void doCompactQueryExpr(tSQLExpr** pExpr) {
|
|||
}
|
||||
|
||||
if ((*pExpr)->pLeft == NULL && (*pExpr)->pRight == NULL &&
|
||||
((*pExpr)->nSQLOptr == TK_OR || (*pExpr)->nSQLOptr == TK_AND)) {
|
||||
((*pExpr)->tokenId == TK_OR || (*pExpr)->tokenId == TK_AND)) {
|
||||
tSqlExprNodeDestroy(*pExpr);
|
||||
*pExpr = NULL;
|
||||
|
||||
|
@ -4057,7 +3946,7 @@ static void doExtractExprForSTable(SSqlCmd* pCmd, tSQLExpr** pExpr, SQueryInfo*
|
|||
(*pExpr) = NULL;
|
||||
|
||||
} else {
|
||||
*pOut = tSqlExprCreate(NULL, NULL, (*pExpr)->nSQLOptr);
|
||||
*pOut = tSqlExprCreate(NULL, NULL, (*pExpr)->tokenId);
|
||||
|
||||
doExtractExprForSTable(pCmd, &(*pExpr)->pLeft, pQueryInfo, &((*pOut)->pLeft), tableIndex);
|
||||
doExtractExprForSTable(pCmd, &(*pExpr)->pRight, pQueryInfo, &((*pOut)->pRight), tableIndex);
|
||||
|
@ -4101,9 +3990,9 @@ static int32_t setTableCondForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
|||
STagCond* pTagCond = &pQueryInfo->tagCond;
|
||||
pTagCond->tbnameCond.uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||
|
||||
assert(pExpr->nSQLOptr == TK_LIKE || pExpr->nSQLOptr == TK_IN);
|
||||
assert(pExpr->tokenId == TK_LIKE || pExpr->tokenId == TK_IN);
|
||||
|
||||
if (pExpr->nSQLOptr == TK_LIKE) {
|
||||
if (pExpr->tokenId == TK_LIKE) {
|
||||
char* str = taosStringBuilderGetResult(sb, NULL);
|
||||
pQueryInfo->tagCond.tbnameCond.cond = strdup(str);
|
||||
pQueryInfo->tagCond.tbnameCond.len = (int32_t) strlen(str);
|
||||
|
@ -4199,7 +4088,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLE
|
|||
}
|
||||
|
||||
if (!isExprDirectParentOfLeafNode(pExpr)) {
|
||||
if (pExpr->nSQLOptr == TK_OR) {
|
||||
if (pExpr->tokenId == TK_OR) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
|
@ -4218,7 +4107,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLE
|
|||
tSQLExpr* pRight = pExpr->pRight;
|
||||
|
||||
STimeWindow win = {.skey = INT64_MIN, .ekey = INT64_MAX};
|
||||
if (getTimeRange(&win, pRight, pExpr->nSQLOptr, tinfo.precision) != TSDB_CODE_SUCCESS) {
|
||||
if (getTimeRange(&win, pRight, pExpr->tokenId, tinfo.precision) != TSDB_CODE_SUCCESS) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg0);
|
||||
}
|
||||
|
||||
|
@ -4362,7 +4251,7 @@ static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
|
|||
retVal = tVariantDump(vVariant, tmp, schemaType, false);
|
||||
free(tmp);
|
||||
} else if (schemaType == TSDB_DATA_TYPE_NCHAR) {
|
||||
// pRight->val.nLen + 1 is larger than the actual nchar string length
|
||||
// pRight->value.nLen + 1 is larger than the actual nchar string length
|
||||
char *tmp = calloc(1, (vVariant->nLen + 1) * TSDB_NCHAR_SIZE);
|
||||
retVal = tVariantDump(vVariant, tmp, schemaType, false);
|
||||
free(tmp);
|
||||
|
@ -4461,7 +4350,7 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSQLExpr** pExpr, SSqlObj* pSql
|
|||
}
|
||||
|
||||
int32_t type = 0;
|
||||
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, &type, (*pExpr)->nSQLOptr)) != TSDB_CODE_SUCCESS) {
|
||||
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, &type, (*pExpr)->tokenId)) != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -4518,7 +4407,7 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSQLExpr** pExpr, SSqlObj* pSql
|
|||
|
||||
int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t timePrecision) {
|
||||
// this is join condition, do nothing
|
||||
if (pRight->nSQLOptr == TK_ID) {
|
||||
if (pRight->tokenId == TK_ID) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -4526,42 +4415,42 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
|
|||
* filter primary ts filter expression like:
|
||||
* where ts in ('2015-12-12 4:8:12')
|
||||
*/
|
||||
if (pRight->nSQLOptr == TK_SET || optr == TK_IN) {
|
||||
if (pRight->tokenId == TK_SET || optr == TK_IN) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
int64_t val = 0;
|
||||
bool parsed = false;
|
||||
if (pRight->val.nType == TSDB_DATA_TYPE_BINARY) {
|
||||
pRight->val.nLen = strdequote(pRight->val.pz);
|
||||
if (pRight->value.nType == TSDB_DATA_TYPE_BINARY) {
|
||||
pRight->value.nLen = strdequote(pRight->value.pz);
|
||||
|
||||
char* seg = strnchr(pRight->val.pz, '-', pRight->val.nLen, false);
|
||||
char* seg = strnchr(pRight->value.pz, '-', pRight->value.nLen, false);
|
||||
if (seg != NULL) {
|
||||
if (taosParseTime(pRight->val.pz, &val, pRight->val.nLen, TSDB_TIME_PRECISION_MICRO, tsDaylight) == TSDB_CODE_SUCCESS) {
|
||||
if (taosParseTime(pRight->value.pz, &val, pRight->value.nLen, TSDB_TIME_PRECISION_MICRO, tsDaylight) == TSDB_CODE_SUCCESS) {
|
||||
parsed = true;
|
||||
} else {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
} else {
|
||||
SStrToken token = {.z = pRight->val.pz, .n = pRight->val.nLen, .type = TK_ID};
|
||||
int32_t len = tSQLGetToken(pRight->val.pz, &token.type);
|
||||
SStrToken token = {.z = pRight->value.pz, .n = pRight->value.nLen, .type = TK_ID};
|
||||
int32_t len = tSQLGetToken(pRight->value.pz, &token.type);
|
||||
|
||||
if ((token.type != TK_INTEGER && token.type != TK_FLOAT) || len != pRight->val.nLen) {
|
||||
if ((token.type != TK_INTEGER && token.type != TK_FLOAT) || len != pRight->value.nLen) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
}
|
||||
} else if (pRight->nSQLOptr == TK_INTEGER && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
} else if (pRight->tokenId == TK_INTEGER && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
/*
|
||||
* if the pRight->nSQLOptr == TK_INTEGER/TK_FLOAT, the value is adaptive, we
|
||||
* if the pRight->tokenId == TK_INTEGER/TK_FLOAT, the value is adaptive, we
|
||||
* need the time precision in metermeta to transfer the value in MICROSECOND
|
||||
*
|
||||
* Additional check to avoid data overflow
|
||||
*/
|
||||
if (pRight->val.i64 <= INT64_MAX / 1000) {
|
||||
pRight->val.i64 *= 1000;
|
||||
if (pRight->value.i64 <= INT64_MAX / 1000) {
|
||||
pRight->value.i64 *= 1000;
|
||||
}
|
||||
} else if (pRight->nSQLOptr == TK_FLOAT && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
pRight->val.dKey *= 1000;
|
||||
} else if (pRight->tokenId == TK_FLOAT && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
pRight->value.dKey *= 1000;
|
||||
}
|
||||
|
||||
if (!parsed) {
|
||||
|
@ -4569,7 +4458,7 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
|
|||
* failed to parse timestamp in regular formation, try next
|
||||
* it may be a epoch time in string format
|
||||
*/
|
||||
tVariantDump(&pRight->val, (char*)&val, TSDB_DATA_TYPE_BIGINT, true);
|
||||
tVariantDump(&pRight->value, (char*)&val, TSDB_DATA_TYPE_BIGINT, true);
|
||||
|
||||
/*
|
||||
* transfer it into MICROSECOND format if it is a string, since for
|
||||
|
@ -4577,7 +4466,7 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
|
|||
*
|
||||
* additional check to avoid data overflow
|
||||
*/
|
||||
if (pRight->nSQLOptr == TK_STRING && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
if (pRight->tokenId == TK_STRING && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||
if (val <= INT64_MAX / 1000) {
|
||||
val *= 1000;
|
||||
}
|
||||
|
@ -6860,25 +6749,25 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
|
|||
}
|
||||
}
|
||||
|
||||
if (pSqlExpr->pLeft == NULL && pSqlExpr->pRight == NULL && pSqlExpr->nSQLOptr == 0) {
|
||||
if (pSqlExpr->pLeft == NULL && pSqlExpr->pRight == NULL && pSqlExpr->tokenId == 0) {
|
||||
*pExpr = calloc(1, sizeof(tExprNode));
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
if (pSqlExpr->pLeft == NULL) {
|
||||
if (pSqlExpr->nSQLOptr >= TK_BOOL && pSqlExpr->nSQLOptr <= TK_STRING) {
|
||||
if (pSqlExpr->type == SQL_NODE_VALUE) {
|
||||
*pExpr = calloc(1, sizeof(tExprNode));
|
||||
(*pExpr)->nodeType = TSQL_NODE_VALUE;
|
||||
(*pExpr)->pVal = calloc(1, sizeof(tVariant));
|
||||
|
||||
tVariantAssign((*pExpr)->pVal, &pSqlExpr->val);
|
||||
tVariantAssign((*pExpr)->pVal, &pSqlExpr->value);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
} else if (pSqlExpr->nSQLOptr >= TSDB_FUNC_COUNT && pSqlExpr->nSQLOptr <= TSDB_FUNC_BLKINFO) {
|
||||
} else if (pSqlExpr->type == SQL_NODE_SQLFUNCTION) {
|
||||
// arithmetic expression on the results of aggregation functions
|
||||
*pExpr = calloc(1, sizeof(tExprNode));
|
||||
(*pExpr)->nodeType = TSQL_NODE_COL;
|
||||
(*pExpr)->pSchema = calloc(1, sizeof(SSchema));
|
||||
strncpy((*pExpr)->pSchema->name, pSqlExpr->operand.z, pSqlExpr->operand.n);
|
||||
strncpy((*pExpr)->pSchema->name, pSqlExpr->token.z, pSqlExpr->token.n);
|
||||
|
||||
// set the input column data byte and type.
|
||||
size_t size = taosArrayGetSize(pQueryInfo->exprList);
|
||||
|
@ -6898,7 +6787,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
|
|||
break;
|
||||
}
|
||||
}
|
||||
} else if (pSqlExpr->nSQLOptr == TK_ID) { // column name, normal column arithmetic expression
|
||||
} else if (pSqlExpr->type == SQL_NODE_TABLE_COLUMN) { // column name, normal column arithmetic expression
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
int32_t ret = getColumnIndexByName(pCmd, &pSqlExpr->colInfo, pQueryInfo, &index);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
|
@ -6938,7 +6827,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
|
|||
(*pExpr)->_node.pLeft = pLeft;
|
||||
(*pExpr)->_node.pRight = pRight;
|
||||
|
||||
SStrToken t = {.type = pSqlExpr->nSQLOptr};
|
||||
SStrToken t = {.type = pSqlExpr->tokenId};
|
||||
(*pExpr)->_node.optr = convertOptr(&t);
|
||||
|
||||
assert((*pExpr)->_node.optr != 0);
|
||||
|
|
|
@ -181,19 +181,32 @@ typedef struct SSqlInfo {
|
|||
};
|
||||
} SSqlInfo;
|
||||
|
||||
#define NON_ARITHMEIC_EXPR 0
|
||||
#define NORMAL_ARITHMETIC 1
|
||||
#define AGG_ARIGHTMEIC 2
|
||||
|
||||
enum SQL_NODE_TYPE {
|
||||
SQL_NODE_TABLE_COLUMN= 1,
|
||||
SQL_NODE_SQLFUNCTION = 2,
|
||||
SQL_NODE_VALUE = 3,
|
||||
SQL_NODE_EXPR = 4,
|
||||
};
|
||||
|
||||
typedef struct tSQLExpr {
|
||||
uint32_t nSQLOptr; // TK_FUNCTION: sql function, TK_LE: less than(binary expr)
|
||||
|
||||
// the full sql string of function(col, param), which is actually the raw
|
||||
// field name, since the function name is kept in nSQLOptr already
|
||||
uint16_t type; // sql node type
|
||||
uint32_t tokenId; // TK_FUNCTION: sql function, TK_LE: less than(binary expr)
|
||||
|
||||
// the whole string of the function(col, param), while the function name is kept in token
|
||||
SStrToken operand;
|
||||
SStrToken colInfo; // field id
|
||||
tVariant val; // value only for string, float, int
|
||||
uint32_t functionId; // function id
|
||||
|
||||
SStrToken colInfo; // table column info
|
||||
tVariant value; // the use input value
|
||||
SStrToken token; // original sql expr string
|
||||
|
||||
struct tSQLExpr *pLeft; // left child
|
||||
struct tSQLExpr *pRight; // right child
|
||||
struct tSQLExprList *pParam; // function parameters
|
||||
struct tSQLExprList *pParam; // function parameters list
|
||||
} tSQLExpr;
|
||||
|
||||
// used in select clause. select <tSQLExprList> from xxx
|
||||
|
@ -287,16 +300,6 @@ void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type);
|
|||
|
||||
void *ParseAlloc(void *(*mallocProc)(size_t));
|
||||
|
||||
enum {
|
||||
TSQL_NODE_TYPE_EXPR = 0x1,
|
||||
TSQL_NODE_TYPE_ID = 0x2,
|
||||
TSQL_NODE_TYPE_VALUE = 0x4,
|
||||
};
|
||||
|
||||
#define NON_ARITHMEIC_EXPR 0
|
||||
#define NORMAL_ARITHMETIC 1
|
||||
#define AGG_ARIGHTMEIC 2
|
||||
|
||||
SSqlInfo qSQLParse(const char *str);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -137,7 +137,7 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
|
|||
}
|
||||
static void doSetTagValueToResultBuf(char* output, const char* val, int16_t type, int16_t bytes);
|
||||
|
||||
static void setResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx,
|
||||
static void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx,
|
||||
int32_t numOfCols, int32_t* rowCellInfoOffset);
|
||||
|
||||
void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowCellInfoOffset);
|
||||
|
@ -180,14 +180,14 @@ static void destroySFillOperatorInfo(void* param, int32_t numOfOutput);
|
|||
static void destroyGroupbyOperatorInfo(void* param, int32_t numOfOutput);
|
||||
static void destroyArithOperatorInfo(void* param, int32_t numOfOutput);
|
||||
|
||||
static int32_t doCopyToSData_rv(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType, SSDataBlock* pBlock);
|
||||
static int32_t doCopyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType, SSDataBlock* pBlock);
|
||||
|
||||
static int32_t getGroupbyColumnData_rv(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock* pDataBlock);
|
||||
static int32_t getGroupbyColumnIndex(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock* pDataBlock);
|
||||
|
||||
static int32_t setGroupResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo* pResultRowInfo,
|
||||
static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo* pResultRowInfo,
|
||||
SQLFunctionCtx * pCtx, int32_t numOfCols, char *pData, int16_t type, int16_t bytes, int32_t groupIndex, int32_t* offset);
|
||||
static void destroyOperatorInfo(SOperatorInfo* pOperator);
|
||||
void initCtxOutputBuf_rv(SQLFunctionCtx* pCtx, int32_t size);
|
||||
void initCtxOutputBuffer(SQLFunctionCtx* pCtx, int32_t size);
|
||||
void getAlignQueryTimeWindow(SQuery *pQuery, int64_t key, int64_t keyFirst, int64_t keyLast, STimeWindow *win);
|
||||
static bool isPointInterpoQuery(SQuery *pQuery);
|
||||
|
||||
|
@ -268,7 +268,7 @@ bool doFilterData(SQuery *pQuery, int32_t elemPos) {
|
|||
return true;
|
||||
}
|
||||
|
||||
int64_t getNumOfResult_rv(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
int64_t getNumOfResult(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
bool hasMainFunction = hasMainOutput(pQuery);
|
||||
|
||||
|
@ -816,8 +816,8 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo
|
|||
return num;
|
||||
}
|
||||
|
||||
static void doBlockwiseApplyFunctions_rv(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx* pCtx, STimeWindow *pWin,
|
||||
int32_t offset, int32_t forwardStep, TSKEY *tsCol, int32_t numOfTotal, int32_t numOfOutput) {
|
||||
static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, STimeWindow* pWin, int32_t offset,
|
||||
int32_t forwardStep, TSKEY* tsCol, int32_t numOfTotal, int32_t numOfOutput) {
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
bool hasPrev = pCtx[0].preAggVals.isSet;
|
||||
|
||||
|
@ -1307,7 +1307,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
|||
setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
|
||||
setNotInterpoWindowKey(pInfo->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
|
||||
|
||||
doBlockwiseApplyFunctions_rv(pRuntimeEnv, pInfo->pCtx, &w, startPos, 0, tsCols, pSDataBlock->info.rows,
|
||||
doApplyFunctions(pRuntimeEnv, pInfo->pCtx, &w, startPos, 0, tsCols, pSDataBlock->info.rows,
|
||||
numOfOutput);
|
||||
}
|
||||
|
||||
|
@ -1319,7 +1319,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
|||
|
||||
// window start key interpolation
|
||||
doWindowBorderInterpolation(pOperatorInfo, pSDataBlock, pInfo->pCtx, pResult, &win, startPos, forwardStep);
|
||||
doBlockwiseApplyFunctions_rv(pRuntimeEnv, pInfo->pCtx, &win, startPos, forwardStep, tsCols, pSDataBlock->info.rows,
|
||||
doApplyFunctions(pRuntimeEnv, pInfo->pCtx, &win, startPos, forwardStep, tsCols, pSDataBlock->info.rows,
|
||||
numOfOutput);
|
||||
|
||||
STimeWindow nextWin = win;
|
||||
|
@ -1343,7 +1343,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
|
|||
|
||||
// window start(end) key interpolation
|
||||
doWindowBorderInterpolation(pOperatorInfo, pSDataBlock, pInfo->pCtx, pResult, &nextWin, startPos, forwardStep);
|
||||
doBlockwiseApplyFunctions_rv(pRuntimeEnv, pInfo->pCtx, &nextWin, startPos, forwardStep, tsCols,
|
||||
doApplyFunctions(pRuntimeEnv, pInfo->pCtx, &nextWin, startPos, forwardStep, tsCols,
|
||||
pSDataBlock->info.rows, numOfOutput);
|
||||
}
|
||||
|
||||
|
@ -1365,12 +1365,12 @@ static void hashGroupbyAgg(SQueryRuntimeEnv *pRuntimeEnv, SOperatorInfo* pOperat
|
|||
|
||||
for (int32_t j = 0; j < pSDataBlock->info.rows; ++j) {
|
||||
char *val = pColInfoData->pData + bytes * j;
|
||||
if (isNull(val, type)) { // ignore the null value
|
||||
if (isNull(val, type)) { // TODO: ignore the null value
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO compare with the previous value to speedup the query processing
|
||||
int32_t ret = setGroupResultOutputBuf_rv(pRuntimeEnv, &pInfo->binfo.resultRowInfo, pInfo->binfo.pCtx, pOperator->numOfOutput, val, type, bytes, item->groupIndex, pInfo->binfo.rowCellInfoOffset);
|
||||
int32_t ret = setGroupResultOutputBuf(pRuntimeEnv, &pInfo->binfo.resultRowInfo, pInfo->binfo.pCtx, pOperator->numOfOutput, val, type, bytes, item->groupIndex, pInfo->binfo.rowCellInfoOffset);
|
||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_APP_ERROR);
|
||||
}
|
||||
|
@ -1385,7 +1385,7 @@ static void hashGroupbyAgg(SQueryRuntimeEnv *pRuntimeEnv, SOperatorInfo* pOperat
|
|||
}
|
||||
}
|
||||
|
||||
static int32_t setGroupResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo* pResultRowInfo,
|
||||
static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo* pResultRowInfo,
|
||||
SQLFunctionCtx * pCtx, int32_t numOfCols, char *pData, int16_t type, int16_t bytes, int32_t groupIndex, int32_t* rowCellInfoOffset) {
|
||||
SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
|
||||
|
||||
|
@ -1425,12 +1425,12 @@ static int32_t setGroupResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResult
|
|||
}
|
||||
}
|
||||
|
||||
setResultOutputBuf_rv(pRuntimeEnv, pResultRow, pCtx, numOfCols, rowCellInfoOffset);
|
||||
initCtxOutputBuf_rv(pCtx, numOfCols);
|
||||
setResultOutputBuf(pRuntimeEnv, pResultRow, pCtx, numOfCols, rowCellInfoOffset);
|
||||
initCtxOutputBuffer(pCtx, numOfCols);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static int32_t getGroupbyColumnData_rv(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock* pDataBlock) {
|
||||
static int32_t getGroupbyColumnIndex(SSqlGroupbyExpr *pGroupbyExpr, SSDataBlock* pDataBlock) {
|
||||
for (int32_t k = 0; k < pGroupbyExpr->numOfGroupCols; ++k) {
|
||||
SColIndex* pColIndex = taosArrayGet(pGroupbyExpr->columnInfo, k);
|
||||
if (TSDB_COL_IS_TAG(pColIndex->flag)) {
|
||||
|
@ -1496,14 +1496,12 @@ void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColInde
|
|||
|
||||
pCtx->hasNull = hasNullRv(pColIndex, pStatis);
|
||||
|
||||
#if 0
|
||||
// set the statistics data for primary time stamp column
|
||||
if (pCtx->functionId == TSDB_FUNC_SPREAD &&colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||
if (pCtx->functionId == TSDB_FUNC_SPREAD && pColIndex->colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||
pCtx->preAggVals.isSet = true;
|
||||
pCtx->preAggVals.statis.min = pBlockInfo->window.skey;
|
||||
pCtx->preAggVals.statis.max = pBlockInfo->window.ekey;
|
||||
pCtx->preAggVals.statis.min = pSDataBlock->info.window.skey;
|
||||
pCtx->preAggVals.statis.max = pSDataBlock->info.window.ekey;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// set the output buffer for the selectivity + tag query
|
||||
|
@ -2308,7 +2306,7 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, bool asc
|
|||
return TS_JOIN_TS_EQUAL;
|
||||
}
|
||||
|
||||
void filterDataBlock_rv(SQueryRuntimeEnv* pRuntimeEnv, SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols,
|
||||
void filterRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSingleColumnFilterInfo* pFilterInfo, int32_t numOfFilterCols,
|
||||
SSDataBlock* pBlock, STSBuf* pTsBuf, bool ascQuery) {
|
||||
int32_t numOfRows = pBlock->info.rows;
|
||||
|
||||
|
@ -2437,8 +2435,8 @@ static SColumnInfo* doGetTagColumnInfoById(SColumnInfo* pTagColList, int32_t num
|
|||
static void doSetTagValueInParam(void* pTable, int32_t tagColId, tVariant *tag, int16_t type, int16_t bytes);
|
||||
|
||||
//TODO refactor
|
||||
int32_t loadDataBlockOnDemand_rv(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTableScanInfo, SSDataBlock* pBlock,
|
||||
uint32_t* status) {
|
||||
int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTableScanInfo, SSDataBlock* pBlock,
|
||||
uint32_t* status) {
|
||||
*status = BLK_DATA_NO_NEEDED;
|
||||
pBlock->pDataBlock = NULL;
|
||||
pBlock->pBlockStatis = NULL;
|
||||
|
@ -2589,7 +2587,7 @@ int32_t loadDataBlockOnDemand_rv(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo*
|
|||
}
|
||||
|
||||
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL) {
|
||||
filterDataBlock_rv(pRuntimeEnv, pQuery->pFilterInfo, pQuery->numOfFilterCols, pBlock, pRuntimeEnv->pTsBuf,
|
||||
filterRowsInDataBlock(pRuntimeEnv, pQuery->pFilterInfo, pQuery->numOfFilterCols, pBlock, pRuntimeEnv->pTsBuf,
|
||||
QUERY_IS_ASC_QUERY(pQuery));
|
||||
}
|
||||
}
|
||||
|
@ -2709,8 +2707,7 @@ static SColumnInfo* doGetTagColumnInfoById(SColumnInfo* pTagColList, int32_t num
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void setTagVal_rv(SOperatorInfo* pOperatorInfo, void *pTable, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
void setTagValue(SOperatorInfo* pOperatorInfo, void *pTable, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
SQueryRuntimeEnv* pRuntimeEnv = pOperatorInfo->pRuntimeEnv;
|
||||
|
||||
SExprInfo *pExpr = pOperatorInfo->pExpr;
|
||||
|
@ -2908,7 +2905,7 @@ void UNUSED_FUNC displayInterResult(tFilePage **pdata, SQueryRuntimeEnv* pRuntim
|
|||
}
|
||||
}
|
||||
|
||||
void copyResToQueryResultBuf_rv(SQueryRuntimeEnv* pRuntimeEnv, int32_t threshold, SSDataBlock* pBlock, int32_t* offset) {
|
||||
void copyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, int32_t threshold, SSDataBlock* pBlock, int32_t* offset) {
|
||||
SGroupResInfo* pGroupResInfo = &pRuntimeEnv->groupResInfo;
|
||||
pBlock->info.rows = 0;
|
||||
|
||||
|
@ -2922,7 +2919,7 @@ void copyResToQueryResultBuf_rv(SQueryRuntimeEnv* pRuntimeEnv, int32_t threshold
|
|||
}
|
||||
}
|
||||
|
||||
doCopyToSData_rv(pRuntimeEnv, pGroupResInfo, TSDB_ORDER_ASC, pBlock);
|
||||
doCopyToSDataBlock(pRuntimeEnv, pGroupResInfo, TSDB_ORDER_ASC, pBlock);
|
||||
|
||||
// current data are all dumped to result buffer, clear it
|
||||
if (!hasRemainDataInCurrentGroup(pGroupResInfo)) {
|
||||
|
@ -2951,14 +2948,14 @@ static void updateTableQueryInfoForReverseScan(SQuery *pQuery, STableQueryInfo *
|
|||
SWITCH_ORDER(pTableQueryInfo->cur.order);
|
||||
pTableQueryInfo->cur.vgroupIndex = -1;
|
||||
|
||||
// set the index at the end of time window
|
||||
// set the index to be the end slot of result rows array
|
||||
pTableQueryInfo->resInfo.curIndex = pTableQueryInfo->resInfo.size - 1;
|
||||
}
|
||||
|
||||
static void setupQueryRangeForReverseScan(SQueryRuntimeEnv* pRuntimeEnv) {
|
||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||
int32_t numOfGroups = (int32_t)(GET_NUM_OF_TABLEGROUP(pRuntimeEnv));
|
||||
|
||||
int32_t numOfGroups = (int32_t)(GET_NUM_OF_TABLEGROUP(pRuntimeEnv));
|
||||
for(int32_t i = 0; i < numOfGroups; ++i) {
|
||||
SArray *group = GET_TABLEGROUP(pRuntimeEnv, i);
|
||||
SArray *tableKeyGroup = taosArrayGetP(pQuery->tableGroupInfo.pGroupList, i);
|
||||
|
@ -3021,7 +3018,7 @@ void setDefaultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo, i
|
|||
}
|
||||
}
|
||||
|
||||
initCtxOutputBuf_rv(pCtx, pDataBlock->info.numOfCols);
|
||||
initCtxOutputBuffer(pCtx, pDataBlock->info.numOfCols);
|
||||
}
|
||||
|
||||
void updateOutputBuf(SArithOperatorInfo* pInfo, int32_t numOfInputRows) {
|
||||
|
@ -3057,7 +3054,7 @@ void updateOutputBuf(SArithOperatorInfo* pInfo, int32_t numOfInputRows) {
|
|||
}
|
||||
}
|
||||
|
||||
void initCtxOutputBuf_rv(SQLFunctionCtx* pCtx, int32_t size) {
|
||||
void initCtxOutputBuffer(SQLFunctionCtx* pCtx, int32_t size) {
|
||||
for (int32_t j = 0; j < size; ++j) {
|
||||
SResultRowCellInfo* pResInfo = GET_RES_INFO(&pCtx[j]);
|
||||
if (pResInfo->initialized) {
|
||||
|
@ -3078,7 +3075,7 @@ void setQueryStatus(SQueryRuntimeEnv *pRuntimeEnv, int8_t status) {
|
|||
}
|
||||
}
|
||||
|
||||
static void setEnvBeforeReverseScan_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
static void setupEnvForReverseScan(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, SQLFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
if (pRuntimeEnv->pTsBuf) {
|
||||
|
@ -3089,17 +3086,17 @@ static void setEnvBeforeReverseScan_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRow
|
|||
|
||||
// reverse order time range
|
||||
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
||||
SWITCH_ORDER(pQuery->order.order);
|
||||
|
||||
SET_REVERSE_SCAN_FLAG(pRuntimeEnv);
|
||||
setQueryStatus(pRuntimeEnv, QUERY_NOT_COMPLETED);
|
||||
switchCtxOrder(pCtx, numOfOutput);
|
||||
|
||||
// disableFuncInReverseScan(pRuntimeEnv, pResultRowInfo, pCtx, numOfOutput);
|
||||
switchCtxOrder(pCtx, numOfOutput);
|
||||
SWITCH_ORDER(pQuery->order.order);
|
||||
|
||||
setupQueryRangeForReverseScan(pRuntimeEnv);
|
||||
}
|
||||
|
||||
void finalizeQueryResult_rv(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset) {
|
||||
void finalizeQueryResult(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset) {
|
||||
SQueryRuntimeEnv *pRuntimeEnv = pOperator->pRuntimeEnv;
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
|
@ -3116,7 +3113,7 @@ void finalizeQueryResult_rv(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SRes
|
|||
continue;
|
||||
}
|
||||
|
||||
setResultOutputBuf_rv(pRuntimeEnv, buf, pCtx, numOfOutput, rowCellInfoOffset);
|
||||
setResultOutputBuf(pRuntimeEnv, buf, pCtx, numOfOutput, rowCellInfoOffset);
|
||||
|
||||
for (int32_t j = 0; j < numOfOutput; ++j) {
|
||||
aAggs[pCtx[j].functionId].xFinalize(&pCtx[j]);
|
||||
|
@ -3126,7 +3123,7 @@ void finalizeQueryResult_rv(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SRes
|
|||
* set the number of output results for group by normal columns, the number of output rows usually is 1 except
|
||||
* the top and bottom query
|
||||
*/
|
||||
buf->numOfRows = (uint16_t)getNumOfResult_rv(pRuntimeEnv, pCtx, numOfOutput);
|
||||
buf->numOfRows = (uint16_t)getNumOfResult(pRuntimeEnv, pCtx, numOfOutput);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -3206,8 +3203,8 @@ void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pRe
|
|||
}
|
||||
}
|
||||
|
||||
void setExecutionContext_rv(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo, int32_t numOfOutput,
|
||||
int32_t groupIndex, TSKEY nextKey) {
|
||||
void setExecutionContext(SQueryRuntimeEnv* pRuntimeEnv, SOptrBasicInfo* pInfo, int32_t numOfOutput, int32_t groupIndex,
|
||||
TSKEY nextKey) {
|
||||
STableQueryInfo *pTableQueryInfo = pRuntimeEnv->pQuery->current;
|
||||
|
||||
// lastKey needs to be updated
|
||||
|
@ -3234,11 +3231,11 @@ void setExecutionContext_rv(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo
|
|||
|
||||
// record the current active group id
|
||||
pRuntimeEnv->prevGroupId = groupIndex;
|
||||
setResultOutputBuf_rv(pRuntimeEnv, pResultRow, pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
||||
initCtxOutputBuf_rv(pInfo->pCtx, numOfOutput);
|
||||
setResultOutputBuf(pRuntimeEnv, pResultRow, pInfo->pCtx, numOfOutput, pInfo->rowCellInfoOffset);
|
||||
initCtxOutputBuffer(pInfo->pCtx, numOfOutput);
|
||||
}
|
||||
|
||||
void setResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx,
|
||||
void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult, SQLFunctionCtx* pCtx,
|
||||
int32_t numOfCols, int32_t* rowCellInfoOffset) {
|
||||
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
||||
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResult->pageId);
|
||||
|
@ -3400,61 +3397,6 @@ bool requireTimestamp(SQuery *pQuery) {
|
|||
return false;
|
||||
}
|
||||
|
||||
//static int32_t doCopyToSData(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType) {
|
||||
// void* qinfo = pRuntimeEnv->qinfo;
|
||||
// SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
//
|
||||
// int32_t numOfRows = getNumOfTotalRes(pGroupResInfo);
|
||||
// int32_t numOfResult = pRuntimeEnv->resultInfo.rows; // there are already exists result rows
|
||||
//
|
||||
// int32_t start = 0;
|
||||
// int32_t step = -1;
|
||||
//
|
||||
// qDebug("QInfo:%p start to copy data from windowResInfo to output buf", qinfo);
|
||||
// if (orderType == TSDB_ORDER_ASC) {
|
||||
// start = pGroupResInfo->index;
|
||||
// step = 1;
|
||||
// } else { // desc order copy all data
|
||||
// start = numOfRows - pGroupResInfo->index - 1;
|
||||
// step = -1;
|
||||
// }
|
||||
//
|
||||
// for (int32_t i = start; (i < numOfRows) && (i >= 0); i += step) {
|
||||
// SResultRow* pRow = taosArrayGetP(pGroupResInfo->pRows, i);
|
||||
// if (pRow->numOfRows == 0) {
|
||||
// pGroupResInfo->index += 1;
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// int32_t numOfRowsToCopy = pRow->numOfRows;
|
||||
//
|
||||
// //current output space is not enough to accommodate all data of this page, prepare more space
|
||||
// if (numOfRowsToCopy > (pRuntimeEnv->resultInfo.capacity - numOfResult)) {
|
||||
// int32_t newSize = pRuntimeEnv->resultInfo.capacity + (numOfRowsToCopy - numOfResult);
|
||||
// expandBuffer(pRuntimeEnv, newSize, pRuntimeEnv->qinfo);
|
||||
// }
|
||||
//
|
||||
// pGroupResInfo->index += 1;
|
||||
//
|
||||
// tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pRow->pageId);
|
||||
// for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
||||
// int32_t size = pRuntimeEnv->pCtx[j].outputBytes;
|
||||
//
|
||||
// char *out = pQuery->sdata[j]->data + numOfResult * size;
|
||||
// char *in = getPosInResultPage(pRuntimeEnv, j, pRow, page);
|
||||
// memcpy(out, in, size * numOfRowsToCopy);
|
||||
// }
|
||||
//
|
||||
// numOfResult += numOfRowsToCopy;
|
||||
// if (numOfResult == pRuntimeEnv->resultInfo.capacity) { // output buffer is full
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// qDebug("QInfo:%p copy data to query buf completed", qinfo);
|
||||
// return numOfResult;
|
||||
//}
|
||||
|
||||
/**
|
||||
* copyToOutputBuf support copy data in ascending/descending order
|
||||
* For interval query of both super table and table, copy the data in ascending order, since the output results are
|
||||
|
@ -3465,7 +3407,7 @@ bool requireTimestamp(SQuery *pQuery) {
|
|||
* @param result
|
||||
*/
|
||||
|
||||
static int32_t doCopyToSData_rv(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType, SSDataBlock* pBlock) {
|
||||
static int32_t doCopyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType, SSDataBlock* pBlock) {
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
int32_t numOfRows = getNumOfTotalRes(pGroupResInfo);
|
||||
|
@ -3529,7 +3471,7 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
|
|||
|
||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||
int32_t orderType = (pQuery->pGroupbyExpr != NULL) ? pQuery->pGroupbyExpr->orderType : TSDB_ORDER_ASC;
|
||||
doCopyToSData_rv(pRuntimeEnv, pGroupResInfo, orderType, pBlock);
|
||||
doCopyToSDataBlock(pRuntimeEnv, pGroupResInfo, orderType, pBlock);
|
||||
|
||||
SColumnInfoData* pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
|
||||
|
||||
|
@ -3540,7 +3482,7 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
|
|||
}
|
||||
}
|
||||
|
||||
static void updateWindowResNumOfRes_rv(SQueryRuntimeEnv *pRuntimeEnv,
|
||||
static void updateNumOfRowsInResultRows(SQueryRuntimeEnv *pRuntimeEnv,
|
||||
SQLFunctionCtx* pCtx, int32_t numOfOutput, SResultRowInfo* pResultRowInfo, int32_t* rowCellInfoOffset) {
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
|
@ -3564,45 +3506,6 @@ static void updateWindowResNumOfRes_rv(SQueryRuntimeEnv *pRuntimeEnv,
|
|||
}
|
||||
}
|
||||
|
||||
//bool hasNotReturnedResults(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo) {
|
||||
// SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
//// SFillInfo *pFillInfo = pRuntimeEnv->pFillInfo;
|
||||
//
|
||||
// if (!Q_STATUS_EQUAL(pRuntimeEnv->status, QUERY_COMPLETED)) {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if (pQuery->limit.limit > 0 && pRuntimeEnv->resultInfo.total >= pQuery->limit.limit) {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) {
|
||||
// // There are results not returned to client yet, so filling applied to the remain result is required firstly.
|
||||
// if (taosFillHasMoreResults(pFillInfo)) {
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// /*
|
||||
// * While the code reaches here, there are no results remains now.
|
||||
// * If query is not completed yet, the gaps between two results blocks need to be handled after next data block
|
||||
// * is retrieved from TSDB.
|
||||
// *
|
||||
// * NOTE: If the result set is not the first block, the gap in front of the result set will be filled. If the result
|
||||
// * set is the FIRST result block, the gap between the start time of query time window and the timestamp of the
|
||||
// * first result row in the actual result set will fill nothing.
|
||||
// */
|
||||
// int32_t numOfTotal = (int32_t)getNumOfResultsAfterFillGap(pFillInfo, pQuery->window.ekey, (int32_t)pRuntimeEnv->resultInfo.capacity);
|
||||
// return numOfTotal > 0;
|
||||
// } else { // there are results waiting for returned to client.
|
||||
// if (Q_STATUS_EQUAL(pRuntimeEnv->status, QUERY_COMPLETED) && hasRemainDataInCurrentGroup(pGroupResInfo) &&
|
||||
// (pQuery->groupbyColumn || QUERY_IS_INTERVAL_QUERY(pQuery))) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return false;
|
||||
//}
|
||||
|
||||
static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data) {
|
||||
SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
@ -3650,7 +3553,7 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data
|
|||
}
|
||||
}
|
||||
|
||||
int32_t doFillGapsInResults_rv(SFillInfo* pFillInfo, SSDataBlock *pOutput, int32_t capacity) {
|
||||
int32_t doFillTimeIntervalGapsInResults(SFillInfo* pFillInfo, SSDataBlock *pOutput, int32_t capacity) {
|
||||
void** p = calloc(pFillInfo->numOfCols, POINTER_BYTES);
|
||||
for(int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
|
||||
SColumnInfoData* pColInfoData = taosArrayGet(pOutput->pDataBlock, i);
|
||||
|
@ -4251,7 +4154,7 @@ static SSDataBlock* doTableScanImpl(STableScanInfo *pTableScanInfo) {
|
|||
|
||||
// this function never returns error?
|
||||
uint32_t status;
|
||||
int32_t code = loadDataBlockOnDemand_rv(pTableScanInfo->pRuntimeEnv, pTableScanInfo, pBlock, &status);
|
||||
int32_t code = loadDataBlockOnDemand(pTableScanInfo->pRuntimeEnv, pTableScanInfo, pBlock, &status);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
longjmp(pTableScanInfo->pRuntimeEnv->env, code);
|
||||
}
|
||||
|
@ -4328,7 +4231,7 @@ static SSDataBlock* doTableScan(void* param) {
|
|||
}
|
||||
|
||||
if (pTableScanInfo->reverseTimes > 0) {
|
||||
setEnvBeforeReverseScan_rv(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pTableScanInfo->pCtx, pTableScanInfo->numOfOutput);
|
||||
setupEnvForReverseScan(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pTableScanInfo->pCtx, pTableScanInfo->numOfOutput);
|
||||
|
||||
STsdbQueryCond cond = createTsdbQueryCond(pQuery, &pQuery->window);
|
||||
tsdbResetQueryHandle(pTableScanInfo->pQueryHandle, &cond);
|
||||
|
@ -4583,7 +4486,7 @@ static SSDataBlock* doAggregate(void* param) {
|
|||
break;
|
||||
}
|
||||
|
||||
setTagVal_rv(pOperator, pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
setTagValue(pOperator, pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
|
||||
if (upstream->operatorType == OP_DataBlocksOptScan) {
|
||||
STableScanInfo* pScanInfo = upstream->info;
|
||||
|
@ -4598,8 +4501,8 @@ static SSDataBlock* doAggregate(void* param) {
|
|||
pOperator->status = OP_EXEC_DONE;
|
||||
setQueryStatus(pRuntimeEnv, QUERY_COMPLETED);
|
||||
|
||||
finalizeQueryResult_rv(pOperator, pInfo->pCtx, &pInfo->resultRowInfo, pInfo->rowCellInfoOffset);
|
||||
pInfo->pRes->info.rows = getNumOfResult_rv(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput);
|
||||
finalizeQueryResult(pOperator, pInfo->pCtx, &pInfo->resultRowInfo, pInfo->rowCellInfoOffset);
|
||||
pInfo->pRes->info.rows = getNumOfResult(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput);
|
||||
|
||||
return pInfo->pRes;
|
||||
}
|
||||
|
@ -4636,7 +4539,7 @@ static SSDataBlock* doSTableAggregate(void* param) {
|
|||
break;
|
||||
}
|
||||
|
||||
setTagVal_rv(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
setTagValue(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
|
||||
if (upstream->operatorType == OP_DataBlocksOptScan) {
|
||||
STableScanInfo* pScanInfo = upstream->info;
|
||||
|
@ -4647,14 +4550,14 @@ static SSDataBlock* doSTableAggregate(void* param) {
|
|||
setInputDataBlock(pOperator, pInfo->pCtx, pBlock, order);
|
||||
|
||||
TSKEY k = (pQuery->order.order == TSDB_ORDER_ASC)? pBlock->info.window.ekey + 1:pBlock->info.window.skey-1;
|
||||
setExecutionContext_rv(pRuntimeEnv, pInfo, pOperator->numOfOutput, pQuery->current->groupIndex, k);
|
||||
setExecutionContext(pRuntimeEnv, pInfo, pOperator->numOfOutput, pQuery->current->groupIndex, k);
|
||||
doAggregateImpl(pOperator, pQuery->window.skey, pInfo->pCtx, pBlock);
|
||||
}
|
||||
|
||||
pOperator->status = OP_RES_TO_RETURN;
|
||||
closeAllResultRows(&pInfo->resultRowInfo);
|
||||
|
||||
updateWindowResNumOfRes_rv(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput, &pInfo->resultRowInfo,
|
||||
updateNumOfRowsInResultRows(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput, &pInfo->resultRowInfo,
|
||||
pInfo->rowCellInfoOffset);
|
||||
|
||||
initGroupResInfo(&pRuntimeEnv->groupResInfo, &pInfo->resultRowInfo);
|
||||
|
@ -4683,14 +4586,14 @@ static SSDataBlock* doArithmeticOperation(void* param) {
|
|||
break;
|
||||
}
|
||||
|
||||
setTagVal_rv(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
setTagValue(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->pCtx, pOperator->numOfOutput);
|
||||
|
||||
// the pDataBlock are always the same one, no need to call this again
|
||||
setInputDataBlock(pOperator, pInfo->pCtx, pBlock, pRuntimeEnv->pQuery->order.order);
|
||||
updateOutputBuf(pArithInfo, pBlock->info.rows);
|
||||
arithmeticApplyFunctions(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput);
|
||||
|
||||
pInfo->pRes->info.rows = getNumOfResult_rv(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput);
|
||||
pInfo->pRes->info.rows = getNumOfResult(pRuntimeEnv, pInfo->pCtx, pOperator->numOfOutput);
|
||||
if (pInfo->pRes->info.rows >= 4096) {
|
||||
break;
|
||||
}
|
||||
|
@ -4810,7 +4713,7 @@ static SSDataBlock* doIntervalAgg(void* param) {
|
|||
pOperator->status = OP_RES_TO_RETURN;
|
||||
closeAllResultRows(&pIntervalInfo->resultRowInfo);
|
||||
setQueryStatus(pRuntimeEnv, QUERY_COMPLETED);
|
||||
finalizeQueryResult_rv(pOperator, pIntervalInfo->pCtx, &pIntervalInfo->resultRowInfo, pIntervalInfo->rowCellInfoOffset);
|
||||
finalizeQueryResult(pOperator, pIntervalInfo->pCtx, &pIntervalInfo->resultRowInfo, pIntervalInfo->rowCellInfoOffset);
|
||||
|
||||
initGroupResInfo(&pRuntimeEnv->groupResInfo, &pIntervalInfo->resultRowInfo);
|
||||
toSSDataBlock(&pRuntimeEnv->groupResInfo, pRuntimeEnv, pIntervalInfo->pRes);
|
||||
|
@ -4832,7 +4735,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
|
|||
SQueryRuntimeEnv* pRuntimeEnv = pOperator->pRuntimeEnv;
|
||||
|
||||
if (pOperator->status == OP_RES_TO_RETURN) {
|
||||
copyResToQueryResultBuf_rv(pRuntimeEnv, 3000, pIntervalInfo->pRes, pIntervalInfo->rowCellInfoOffset);
|
||||
copyToSDataBlock(pRuntimeEnv, 3000, pIntervalInfo->pRes, pIntervalInfo->rowCellInfoOffset);
|
||||
if (pIntervalInfo->pRes->info.rows == 0 || !hasRemainData(&pRuntimeEnv->groupResInfo)) {
|
||||
pOperator->status = OP_EXEC_DONE;
|
||||
}
|
||||
|
@ -4854,7 +4757,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
|
|||
// the pDataBlock are always the same one, no need to call this again
|
||||
STableQueryInfo* pTableQueryInfo = pRuntimeEnv->pQuery->current;
|
||||
|
||||
setTagVal_rv(pOperator, pTableQueryInfo->pTable, pIntervalInfo->pCtx, pOperator->numOfOutput);
|
||||
setTagValue(pOperator, pTableQueryInfo->pTable, pIntervalInfo->pCtx, pOperator->numOfOutput);
|
||||
setInputDataBlock(pOperator, pIntervalInfo->pCtx, pBlock, pQuery->order.order);
|
||||
setIntervalQueryRange(pRuntimeEnv, pBlock->info.window.skey);
|
||||
|
||||
|
@ -4866,7 +4769,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
|
|||
doCloseAllTimeWindow(pRuntimeEnv);
|
||||
setQueryStatus(pRuntimeEnv, QUERY_COMPLETED);
|
||||
|
||||
copyResToQueryResultBuf_rv(pRuntimeEnv, 3000, pIntervalInfo->pRes, pIntervalInfo->rowCellInfoOffset);
|
||||
copyToSDataBlock(pRuntimeEnv, 3000, pIntervalInfo->pRes, pIntervalInfo->rowCellInfoOffset);
|
||||
if (pIntervalInfo->pRes->info.rows == 0 || !hasRemainData(&pRuntimeEnv->groupResInfo)) {
|
||||
pOperator->status = OP_EXEC_DONE;
|
||||
}
|
||||
|
@ -4903,9 +4806,9 @@ static SSDataBlock* doHashGroupbyAgg(void* param) {
|
|||
|
||||
// the pDataBlock are always the same one, no need to call this again
|
||||
setInputDataBlock(pOperator, pInfo->binfo.pCtx, pBlock, pRuntimeEnv->pQuery->order.order);
|
||||
setTagVal_rv(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->binfo.pCtx, pOperator->numOfOutput);
|
||||
setTagValue(pOperator, pRuntimeEnv->pQuery->current->pTable, pInfo->binfo.pCtx, pOperator->numOfOutput);
|
||||
if (pInfo->colIndex == -1) {
|
||||
pInfo->colIndex = getGroupbyColumnData_rv(pRuntimeEnv->pQuery->pGroupbyExpr, pBlock);
|
||||
pInfo->colIndex = getGroupbyColumnIndex(pRuntimeEnv->pQuery->pGroupbyExpr, pBlock);
|
||||
}
|
||||
|
||||
hashGroupbyAgg(pRuntimeEnv, pOperator, pInfo, pBlock);
|
||||
|
@ -4915,12 +4818,14 @@ static SSDataBlock* doHashGroupbyAgg(void* param) {
|
|||
closeAllResultRows(&pInfo->binfo.resultRowInfo);
|
||||
setQueryStatus(pRuntimeEnv, QUERY_COMPLETED);
|
||||
|
||||
// todo need finalize the result
|
||||
if (!pRuntimeEnv->pQuery->stableQuery) {
|
||||
finalizeQueryResult_rv(pOperator, pInfo->binfo.pCtx, &pInfo->binfo.resultRowInfo, pInfo->binfo.rowCellInfoOffset);
|
||||
// finalize include the update of result rows
|
||||
finalizeQueryResult(pOperator, pInfo->binfo.pCtx, &pInfo->binfo.resultRowInfo, pInfo->binfo.rowCellInfoOffset);
|
||||
} else {
|
||||
updateNumOfRowsInResultRows(pRuntimeEnv, pInfo->binfo.pCtx, pOperator->numOfOutput, &pInfo->binfo.resultRowInfo, pInfo->binfo.rowCellInfoOffset);
|
||||
}
|
||||
|
||||
updateWindowResNumOfRes_rv(pRuntimeEnv, pInfo->binfo.pCtx, pOperator->numOfOutput, &pInfo->binfo.resultRowInfo, pInfo->binfo.rowCellInfoOffset);
|
||||
|
||||
initGroupResInfo(&pRuntimeEnv->groupResInfo, &pInfo->binfo.resultRowInfo);
|
||||
toSSDataBlock(&pRuntimeEnv->groupResInfo, pRuntimeEnv, pInfo->binfo.pRes);
|
||||
|
||||
|
@ -4941,7 +4846,7 @@ static SSDataBlock* doFill(void* param) {
|
|||
SQueryRuntimeEnv* pRuntimeEnv = pOperator->pRuntimeEnv;
|
||||
|
||||
if (taosFillHasMoreResults(pInfo->pFillInfo)) {
|
||||
doFillGapsInResults_rv(pInfo->pFillInfo, pInfo->pRes, pRuntimeEnv->resultInfo.capacity);
|
||||
doFillTimeIntervalGapsInResults(pInfo->pFillInfo, pInfo->pRes, pRuntimeEnv->resultInfo.capacity);
|
||||
return pInfo->pRes;
|
||||
}
|
||||
|
||||
|
@ -4963,7 +4868,7 @@ static SSDataBlock* doFill(void* param) {
|
|||
taosFillSetInputDataBlock(pInfo->pFillInfo, pBlock);
|
||||
}
|
||||
|
||||
doFillGapsInResults_rv(pInfo->pFillInfo, pInfo->pRes, pRuntimeEnv->resultInfo.capacity);
|
||||
doFillTimeIntervalGapsInResults(pInfo->pFillInfo, pInfo->pRes, pRuntimeEnv->resultInfo.capacity);
|
||||
return (pInfo->pRes->info.rows > 0)? pInfo->pRes:NULL;
|
||||
}
|
||||
}
|
||||
|
@ -6004,7 +5909,8 @@ int32_t createQueryFuncExprFromMsg(SQueryTableMsg* pQueryMsg, int32_t numOfOutpu
|
|||
}
|
||||
|
||||
int32_t param = (int32_t)pExprs[i].base.arg[0].argValue.i64;
|
||||
if (type != pExprs[i].base.colType || bytes != pExprs[i].base.colBytes) {
|
||||
if (pExprs[i].base.functionId != TSDB_FUNC_ARITHM &&
|
||||
(type != pExprs[i].base.colType || bytes != pExprs[i].base.colBytes)) {
|
||||
tfree(pExprs);
|
||||
return TSDB_CODE_QRY_INVALID_MSG;
|
||||
}
|
||||
|
|
|
@ -126,28 +126,33 @@ tSQLExpr *tSqlExprIdValueCreate(SStrToken *pToken, int32_t optrType) {
|
|||
if (optrType == TK_INTEGER || optrType == TK_STRING || optrType == TK_FLOAT || optrType == TK_BOOL) {
|
||||
toTSDBType(pToken->type);
|
||||
|
||||
tVariantCreate(&pSqlExpr->val, pToken);
|
||||
pSqlExpr->nSQLOptr = optrType;
|
||||
tVariantCreate(&pSqlExpr->value, pToken);
|
||||
pSqlExpr->tokenId = optrType;
|
||||
pSqlExpr->type = SQL_NODE_VALUE;
|
||||
} else if (optrType == TK_NOW) {
|
||||
// use microsecond by default
|
||||
pSqlExpr->val.i64 = taosGetTimestamp(TSDB_TIME_PRECISION_MICRO);
|
||||
pSqlExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pSqlExpr->nSQLOptr = TK_TIMESTAMP; // TK_TIMESTAMP used to denote the time value is in microsecond
|
||||
pSqlExpr->value.i64 = taosGetTimestamp(TSDB_TIME_PRECISION_MICRO);
|
||||
pSqlExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pSqlExpr->tokenId = TK_TIMESTAMP; // TK_TIMESTAMP used to denote the time value is in microsecond
|
||||
pSqlExpr->type = SQL_NODE_VALUE;
|
||||
} else if (optrType == TK_VARIABLE) {
|
||||
int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->val.i64);
|
||||
int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->value.i64);
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
terrno = TSDB_CODE_TSC_SQL_SYNTAX_ERROR;
|
||||
}
|
||||
|
||||
pSqlExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pSqlExpr->nSQLOptr = TK_TIMESTAMP;
|
||||
} else { // it must be the column name (tk_id) if it is not the number
|
||||
pSqlExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pSqlExpr->tokenId = TK_TIMESTAMP;
|
||||
pSqlExpr->type = SQL_NODE_VALUE;
|
||||
} else {
|
||||
// Here it must be the column name (tk_id) if it is not a number or string.
|
||||
assert(optrType == TK_ID || optrType == TK_ALL);
|
||||
if (pToken != NULL) {
|
||||
pSqlExpr->colInfo = *pToken;
|
||||
}
|
||||
|
||||
pSqlExpr->nSQLOptr = optrType;
|
||||
pSqlExpr->tokenId = optrType;
|
||||
pSqlExpr->type = SQL_NODE_TABLE_COLUMN;
|
||||
}
|
||||
|
||||
return pSqlExpr;
|
||||
|
@ -162,18 +167,18 @@ tSQLExpr *tSqlExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SSt
|
|||
return NULL;
|
||||
}
|
||||
|
||||
assert(optType == TK_ID);
|
||||
|
||||
tSQLExpr *pExpr = calloc(1, sizeof(tSQLExpr));
|
||||
pExpr->nSQLOptr = TK_FUNCTION;
|
||||
pExpr->pParam = pList;
|
||||
pExpr->tokenId = optType;
|
||||
pExpr->type = SQL_NODE_SQLFUNCTION;
|
||||
pExpr->pParam = pList;
|
||||
|
||||
int32_t len = (int32_t)((endToken->z + endToken->n) - pFuncToken->z);
|
||||
pExpr->operand.z = pFuncToken->z;
|
||||
pExpr->operand.n = len; // raw field name
|
||||
pExpr->operand.type = pFuncToken->type;
|
||||
pExpr->operand = (*pFuncToken);
|
||||
|
||||
pExpr->token.n = len;
|
||||
pExpr->token.z = pFuncToken->z;
|
||||
pExpr->token.type = pFuncToken->type;
|
||||
|
||||
pExpr->token = (*pFuncToken);
|
||||
return pExpr;
|
||||
}
|
||||
|
||||
|
@ -184,6 +189,7 @@ tSQLExpr *tSqlExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SSt
|
|||
tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
||||
tSQLExpr *pExpr = calloc(1, sizeof(tSQLExpr));
|
||||
|
||||
pExpr->type = SQL_NODE_EXPR;
|
||||
if (pLeft != NULL && pRight != NULL && (optrType != TK_IN)) {
|
||||
char* endPos = pRight->token.z + pRight->token.n;
|
||||
pExpr->token.z = pLeft->token.z;
|
||||
|
@ -197,32 +203,33 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
|||
* if a token is noted as the TK_TIMESTAMP, the time precision is microsecond
|
||||
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
|
||||
*/
|
||||
if ((pLeft->nSQLOptr == TK_INTEGER && pRight->nSQLOptr == TK_INTEGER) ||
|
||||
(pLeft->nSQLOptr == TK_TIMESTAMP && pRight->nSQLOptr == TK_TIMESTAMP)) {
|
||||
pExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pExpr->nSQLOptr = pLeft->nSQLOptr;
|
||||
if ((pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_INTEGER) ||
|
||||
(pLeft->tokenId == TK_TIMESTAMP && pRight->tokenId == TK_TIMESTAMP)) {
|
||||
pExpr->value.nType = TSDB_DATA_TYPE_BIGINT;
|
||||
pExpr->tokenId = pLeft->tokenId;
|
||||
pExpr->type = SQL_NODE_VALUE;
|
||||
|
||||
switch (optrType) {
|
||||
case TK_PLUS: {
|
||||
pExpr->val.i64 = pLeft->val.i64 + pRight->val.i64;
|
||||
pExpr->value.i64 = pLeft->value.i64 + pRight->value.i64;
|
||||
break;
|
||||
}
|
||||
case TK_MINUS: {
|
||||
pExpr->val.i64 = pLeft->val.i64 - pRight->val.i64;
|
||||
pExpr->value.i64 = pLeft->value.i64 - pRight->value.i64;
|
||||
break;
|
||||
}
|
||||
case TK_STAR: {
|
||||
pExpr->val.i64 = pLeft->val.i64 * pRight->val.i64;
|
||||
pExpr->value.i64 = pLeft->value.i64 * pRight->value.i64;
|
||||
break;
|
||||
}
|
||||
case TK_DIVIDE: {
|
||||
pExpr->nSQLOptr = TK_FLOAT;
|
||||
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||
pExpr->val.dKey = (double)pLeft->val.i64 / pRight->val.i64;
|
||||
pExpr->tokenId = TK_FLOAT;
|
||||
pExpr->value.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||
pExpr->value.dKey = (double)pLeft->value.i64 / pRight->value.i64;
|
||||
break;
|
||||
}
|
||||
case TK_REM: {
|
||||
pExpr->val.i64 = pLeft->val.i64 % pRight->val.i64;
|
||||
pExpr->value.i64 = pLeft->value.i64 % pRight->value.i64;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -230,33 +237,35 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
|||
tSqlExprDestroy(pLeft);
|
||||
tSqlExprDestroy(pRight);
|
||||
|
||||
} else if ((pLeft->nSQLOptr == TK_FLOAT && pRight->nSQLOptr == TK_INTEGER) || (pLeft->nSQLOptr == TK_INTEGER && pRight->nSQLOptr == TK_FLOAT) ||
|
||||
(pLeft->nSQLOptr == TK_FLOAT && pRight->nSQLOptr == TK_FLOAT)) {
|
||||
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||
pExpr->nSQLOptr = TK_FLOAT;
|
||||
} else if ((pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_INTEGER) ||
|
||||
(pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_FLOAT) ||
|
||||
(pLeft->tokenId == TK_FLOAT && pRight->tokenId == TK_FLOAT)) {
|
||||
pExpr->value.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||
pExpr->tokenId = TK_FLOAT;
|
||||
pExpr->type = SQL_NODE_VALUE;
|
||||
|
||||
double left = (pLeft->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pLeft->val.dKey : pLeft->val.i64;
|
||||
double right = (pRight->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pRight->val.dKey : pRight->val.i64;
|
||||
double left = (pLeft->value.nType == TSDB_DATA_TYPE_DOUBLE) ? pLeft->value.dKey : pLeft->value.i64;
|
||||
double right = (pRight->value.nType == TSDB_DATA_TYPE_DOUBLE) ? pRight->value.dKey : pRight->value.i64;
|
||||
|
||||
switch (optrType) {
|
||||
case TK_PLUS: {
|
||||
pExpr->val.dKey = left + right;
|
||||
pExpr->value.dKey = left + right;
|
||||
break;
|
||||
}
|
||||
case TK_MINUS: {
|
||||
pExpr->val.dKey = left - right;
|
||||
pExpr->value.dKey = left - right;
|
||||
break;
|
||||
}
|
||||
case TK_STAR: {
|
||||
pExpr->val.dKey = left * right;
|
||||
pExpr->value.dKey = left * right;
|
||||
break;
|
||||
}
|
||||
case TK_DIVIDE: {
|
||||
pExpr->val.dKey = left / right;
|
||||
pExpr->value.dKey = left / right;
|
||||
break;
|
||||
}
|
||||
case TK_REM: {
|
||||
pExpr->val.dKey = left - ((int64_t)(left / right)) * right;
|
||||
pExpr->value.dKey = left - ((int64_t)(left / right)) * right;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -265,21 +274,21 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
|||
tSqlExprDestroy(pRight);
|
||||
|
||||
} else {
|
||||
pExpr->nSQLOptr = optrType;
|
||||
pExpr->tokenId = optrType;
|
||||
pExpr->pLeft = pLeft;
|
||||
pExpr->pRight = pRight;
|
||||
}
|
||||
} else if (optrType == TK_IN) {
|
||||
pExpr->nSQLOptr = optrType;
|
||||
pExpr->tokenId = optrType;
|
||||
pExpr->pLeft = pLeft;
|
||||
|
||||
tSQLExpr *pRSub = calloc(1, sizeof(tSQLExpr));
|
||||
pRSub->nSQLOptr = TK_SET; // TODO refactor .....
|
||||
pRSub->tokenId = TK_SET; // TODO refactor .....
|
||||
pRSub->pParam = (tSQLExprList *)pRight;
|
||||
|
||||
pExpr->pRight = pRSub;
|
||||
} else {
|
||||
pExpr->nSQLOptr = optrType;
|
||||
pExpr->tokenId = optrType;
|
||||
pExpr->pLeft = pLeft;
|
||||
|
||||
if (pLeft != NULL && pRight == NULL) {
|
||||
|
@ -297,8 +306,8 @@ void tSqlExprNodeDestroy(tSQLExpr *pExpr) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (pExpr->nSQLOptr == TK_STRING) {
|
||||
tVariantDestroy(&pExpr->val);
|
||||
if (pExpr->tokenId == TK_STRING) {
|
||||
tVariantDestroy(&pExpr->value);
|
||||
}
|
||||
|
||||
tSqlExprListDestroy(pExpr->pParam);
|
||||
|
|
|
@ -268,7 +268,7 @@ int tSQLKeywordCode(const char* z, int n) {
|
|||
* Return the length of the token that begins at z[0].
|
||||
* Store the token type in *type before returning.
|
||||
*/
|
||||
uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
||||
uint32_t tSQLGetToken(char* z, uint32_t* tokenId) {
|
||||
uint32_t i;
|
||||
switch (*z) {
|
||||
case ' ':
|
||||
|
@ -278,121 +278,121 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
case '\r': {
|
||||
for (i = 1; isspace(z[i]); i++) {
|
||||
}
|
||||
*tokenType = TK_SPACE;
|
||||
*tokenId = TK_SPACE;
|
||||
return i;
|
||||
}
|
||||
case ':': {
|
||||
*tokenType = TK_COLON;
|
||||
*tokenId = TK_COLON;
|
||||
return 1;
|
||||
}
|
||||
case '-': {
|
||||
if (z[1] == '-') {
|
||||
for (i = 2; z[i] && z[i] != '\n'; i++) {
|
||||
}
|
||||
*tokenType = TK_COMMENT;
|
||||
*tokenId = TK_COMMENT;
|
||||
return i;
|
||||
}
|
||||
*tokenType = TK_MINUS;
|
||||
*tokenId = TK_MINUS;
|
||||
return 1;
|
||||
}
|
||||
case '(': {
|
||||
*tokenType = TK_LP;
|
||||
*tokenId = TK_LP;
|
||||
return 1;
|
||||
}
|
||||
case ')': {
|
||||
*tokenType = TK_RP;
|
||||
*tokenId = TK_RP;
|
||||
return 1;
|
||||
}
|
||||
case ';': {
|
||||
*tokenType = TK_SEMI;
|
||||
*tokenId = TK_SEMI;
|
||||
return 1;
|
||||
}
|
||||
case '+': {
|
||||
*tokenType = TK_PLUS;
|
||||
*tokenId = TK_PLUS;
|
||||
return 1;
|
||||
}
|
||||
case '*': {
|
||||
*tokenType = TK_STAR;
|
||||
*tokenId = TK_STAR;
|
||||
return 1;
|
||||
}
|
||||
case '/': {
|
||||
if (z[1] != '*' || z[2] == 0) {
|
||||
*tokenType = TK_SLASH;
|
||||
*tokenId = TK_SLASH;
|
||||
return 1;
|
||||
}
|
||||
for (i = 3; z[i] && (z[i] != '/' || z[i - 1] != '*'); i++) {
|
||||
}
|
||||
if (z[i]) i++;
|
||||
*tokenType = TK_COMMENT;
|
||||
*tokenId = TK_COMMENT;
|
||||
return i;
|
||||
}
|
||||
case '%': {
|
||||
*tokenType = TK_REM;
|
||||
*tokenId = TK_REM;
|
||||
return 1;
|
||||
}
|
||||
case '=': {
|
||||
*tokenType = TK_EQ;
|
||||
*tokenId = TK_EQ;
|
||||
return 1 + (z[1] == '=');
|
||||
}
|
||||
case '<': {
|
||||
if (z[1] == '=') {
|
||||
*tokenType = TK_LE;
|
||||
*tokenId = TK_LE;
|
||||
return 2;
|
||||
} else if (z[1] == '>') {
|
||||
*tokenType = TK_NE;
|
||||
*tokenId = TK_NE;
|
||||
return 2;
|
||||
} else if (z[1] == '<') {
|
||||
*tokenType = TK_LSHIFT;
|
||||
*tokenId = TK_LSHIFT;
|
||||
return 2;
|
||||
} else {
|
||||
*tokenType = TK_LT;
|
||||
*tokenId = TK_LT;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
case '>': {
|
||||
if (z[1] == '=') {
|
||||
*tokenType = TK_GE;
|
||||
*tokenId = TK_GE;
|
||||
return 2;
|
||||
} else if (z[1] == '>') {
|
||||
*tokenType = TK_RSHIFT;
|
||||
*tokenId = TK_RSHIFT;
|
||||
return 2;
|
||||
} else {
|
||||
*tokenType = TK_GT;
|
||||
*tokenId = TK_GT;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
case '!': {
|
||||
if (z[1] != '=') {
|
||||
*tokenType = TK_ILLEGAL;
|
||||
*tokenId = TK_ILLEGAL;
|
||||
return 2;
|
||||
} else {
|
||||
*tokenType = TK_NE;
|
||||
*tokenId = TK_NE;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
case '|': {
|
||||
if (z[1] != '|') {
|
||||
*tokenType = TK_BITOR;
|
||||
*tokenId = TK_BITOR;
|
||||
return 1;
|
||||
} else {
|
||||
*tokenType = TK_CONCAT;
|
||||
*tokenId = TK_CONCAT;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
case ',': {
|
||||
*tokenType = TK_COMMA;
|
||||
*tokenId = TK_COMMA;
|
||||
return 1;
|
||||
}
|
||||
case '&': {
|
||||
*tokenType = TK_BITAND;
|
||||
*tokenId = TK_BITAND;
|
||||
return 1;
|
||||
}
|
||||
case '~': {
|
||||
*tokenType = TK_BITNOT;
|
||||
*tokenId = TK_BITNOT;
|
||||
return 1;
|
||||
}
|
||||
case '?': {
|
||||
*tokenType = TK_QUESTION;
|
||||
*tokenId = TK_QUESTION;
|
||||
return 1;
|
||||
}
|
||||
case '\'':
|
||||
|
@ -418,7 +418,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
if (z[i]) i++;
|
||||
|
||||
if (strEnd) {
|
||||
*tokenType = TK_STRING;
|
||||
*tokenId = TK_STRING;
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -442,10 +442,10 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
}
|
||||
}
|
||||
|
||||
*tokenType = TK_FLOAT;
|
||||
*tokenId = TK_FLOAT;
|
||||
return i;
|
||||
} else {
|
||||
*tokenType = TK_DOT;
|
||||
*tokenId = TK_DOT;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -454,7 +454,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
char next = z[1];
|
||||
|
||||
if (next == 'b') { // bin number
|
||||
*tokenType = TK_BIN;
|
||||
*tokenId = TK_BIN;
|
||||
for (i = 2; (z[i] == '0' || z[i] == '1'); ++i) {
|
||||
}
|
||||
|
||||
|
@ -464,7 +464,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
|
||||
return i;
|
||||
} else if (next == 'x') { //hex number
|
||||
*tokenType = TK_HEX;
|
||||
*tokenId = TK_HEX;
|
||||
for (i = 2; isdigit(z[i]) || (z[i] >= 'a' && z[i] <= 'f') || (z[i] >= 'A' && z[i] <= 'F'); ++i) {
|
||||
}
|
||||
|
||||
|
@ -484,7 +484,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
case '7':
|
||||
case '8':
|
||||
case '9': {
|
||||
*tokenType = TK_INTEGER;
|
||||
*tokenId = TK_INTEGER;
|
||||
for (i = 1; isdigit(z[i]); i++) {
|
||||
}
|
||||
|
||||
|
@ -494,7 +494,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
z[i] == 'U' || z[i] == 'A' || z[i] == 'S' || z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' ||
|
||||
z[i] == 'Y' || z[i] == 'W') &&
|
||||
(isIdChar[(uint8_t)z[i + 1]] == 0)) {
|
||||
*tokenType = TK_VARIABLE;
|
||||
*tokenId = TK_VARIABLE;
|
||||
i += 1;
|
||||
return i;
|
||||
}
|
||||
|
@ -505,12 +505,12 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
while (isdigit(z[i])) {
|
||||
i++;
|
||||
}
|
||||
*tokenType = TK_FLOAT;
|
||||
*tokenId = TK_FLOAT;
|
||||
seg++;
|
||||
}
|
||||
|
||||
if (seg == 4) { // ip address
|
||||
*tokenType = TK_IPTOKEN;
|
||||
*tokenId = TK_IPTOKEN;
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -520,14 +520,14 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
while (isdigit(z[i])) {
|
||||
i++;
|
||||
}
|
||||
*tokenType = TK_FLOAT;
|
||||
*tokenId = TK_FLOAT;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
case '[': {
|
||||
for (i = 1; z[i] && z[i - 1] != ']'; i++) {
|
||||
}
|
||||
*tokenType = TK_ID;
|
||||
*tokenId = TK_ID;
|
||||
return i;
|
||||
}
|
||||
case 'T':
|
||||
|
@ -538,7 +538,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
}
|
||||
|
||||
if ((i == 4 && strncasecmp(z, "true", 4) == 0) || (i == 5 && strncasecmp(z, "false", 5) == 0)) {
|
||||
*tokenType = TK_BOOL;
|
||||
*tokenId = TK_BOOL;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
@ -548,12 +548,12 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
|||
}
|
||||
for (i = 1; ((z[i] & 0x80) == 0) && isIdChar[(uint8_t) z[i]]; i++) {
|
||||
}
|
||||
*tokenType = tSQLKeywordCode(z, i);
|
||||
*tokenId = tSQLKeywordCode(z, i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
*tokenType = TK_ILLEGAL;
|
||||
*tokenId = TK_ILLEGAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,89 +1,89 @@
|
|||
run general/parser/alter.sim
|
||||
sleep 100
|
||||
run general/parser/alter1.sim
|
||||
sleep 100
|
||||
run general/parser/alter_stable.sim
|
||||
sleep 100
|
||||
run general/parser/auto_create_tb.sim
|
||||
sleep 100
|
||||
run general/parser/auto_create_tb_drop_tb.sim
|
||||
sleep 100
|
||||
run general/parser/col_arithmetic_operation.sim
|
||||
sleep 100
|
||||
run general/parser/columnValue.sim
|
||||
sleep 100
|
||||
run general/parser/commit.sim
|
||||
sleep 100
|
||||
run general/parser/create_db.sim
|
||||
sleep 100
|
||||
run general/parser/create_mt.sim
|
||||
sleep 100
|
||||
run general/parser/create_tb.sim
|
||||
sleep 100
|
||||
run general/parser/dbtbnameValidate.sim
|
||||
sleep 100
|
||||
run general/parser/fill.sim
|
||||
sleep 100
|
||||
run general/parser/fill_stb.sim
|
||||
sleep 100
|
||||
#run general/parser/fill_us.sim #
|
||||
sleep 100
|
||||
run general/parser/first_last.sim
|
||||
sleep 100
|
||||
run general/parser/import_commit1.sim
|
||||
sleep 100
|
||||
run general/parser/import_commit2.sim
|
||||
sleep 100
|
||||
run general/parser/import_commit3.sim
|
||||
sleep 100
|
||||
#run general/parser/import_file.sim
|
||||
sleep 100
|
||||
run general/parser/insert_tb.sim
|
||||
sleep 100
|
||||
run general/parser/tags_dynamically_specifiy.sim
|
||||
sleep 100
|
||||
run general/parser/interp.sim
|
||||
sleep 100
|
||||
run general/parser/lastrow.sim
|
||||
sleep 100
|
||||
run general/parser/limit.sim
|
||||
sleep 100
|
||||
run general/parser/limit1.sim
|
||||
sleep 100
|
||||
run general/parser/limit1_tblocks100.sim
|
||||
sleep 100
|
||||
run general/parser/limit2.sim
|
||||
sleep 100
|
||||
run general/parser/mixed_blocks.sim
|
||||
sleep 100
|
||||
run general/parser/nchar.sim
|
||||
sleep 100
|
||||
run general/parser/null_char.sim
|
||||
sleep 100
|
||||
run general/parser/selectResNum.sim
|
||||
sleep 100
|
||||
run general/parser/select_across_vnodes.sim
|
||||
sleep 100
|
||||
run general/parser/select_from_cache_disk.sim
|
||||
sleep 100
|
||||
run general/parser/set_tag_vals.sim
|
||||
sleep 100
|
||||
run general/parser/single_row_in_tb.sim
|
||||
sleep 100
|
||||
run general/parser/slimit.sim
|
||||
sleep 100
|
||||
run general/parser/slimit1.sim
|
||||
sleep 100
|
||||
run general/parser/slimit_alter_tags.sim
|
||||
sleep 100
|
||||
run general/parser/tbnameIn.sim
|
||||
sleep 100
|
||||
run general/parser/slimit_alter_tags.sim # persistent failed
|
||||
sleep 100
|
||||
run general/parser/join.sim
|
||||
sleep 100
|
||||
run general/parser/join_multivnode.sim
|
||||
sleep 100
|
||||
#run general/parser/alter.sim
|
||||
#sleep 100
|
||||
#run general/parser/alter1.sim
|
||||
#sleep 100
|
||||
#run general/parser/alter_stable.sim
|
||||
#sleep 100
|
||||
#run general/parser/auto_create_tb.sim
|
||||
#sleep 100
|
||||
#run general/parser/auto_create_tb_drop_tb.sim
|
||||
#sleep 100
|
||||
#run general/parser/col_arithmetic_operation.sim
|
||||
#sleep 100
|
||||
#run general/parser/columnValue.sim
|
||||
#sleep 100
|
||||
#run general/parser/commit.sim
|
||||
#sleep 100
|
||||
#run general/parser/create_db.sim
|
||||
#sleep 100
|
||||
#run general/parser/create_mt.sim
|
||||
#sleep 100
|
||||
#run general/parser/create_tb.sim
|
||||
#sleep 100
|
||||
#run general/parser/dbtbnameValidate.sim
|
||||
#sleep 100
|
||||
#run general/parser/fill.sim
|
||||
#sleep 100
|
||||
#run general/parser/fill_stb.sim
|
||||
#sleep 100
|
||||
##run general/parser/fill_us.sim #
|
||||
#sleep 100
|
||||
#run general/parser/first_last.sim
|
||||
#sleep 100
|
||||
#run general/parser/import_commit1.sim
|
||||
#sleep 100
|
||||
#run general/parser/import_commit2.sim
|
||||
#sleep 100
|
||||
#run general/parser/import_commit3.sim
|
||||
#sleep 100
|
||||
##run general/parser/import_file.sim
|
||||
#sleep 100
|
||||
#run general/parser/insert_tb.sim
|
||||
#sleep 100
|
||||
#run general/parser/tags_dynamically_specifiy.sim
|
||||
#sleep 100
|
||||
#run general/parser/interp.sim
|
||||
#sleep 100
|
||||
#run general/parser/lastrow.sim
|
||||
#sleep 100
|
||||
#run general/parser/limit.sim
|
||||
#sleep 100
|
||||
#run general/parser/limit1.sim
|
||||
#sleep 100
|
||||
#run general/parser/limit1_tblocks100.sim
|
||||
#sleep 100
|
||||
#run general/parser/limit2.sim
|
||||
#sleep 100
|
||||
#run general/parser/mixed_blocks.sim
|
||||
#sleep 100
|
||||
#run general/parser/nchar.sim
|
||||
#sleep 100
|
||||
#run general/parser/null_char.sim
|
||||
#sleep 100
|
||||
#run general/parser/selectResNum.sim
|
||||
#sleep 100
|
||||
#run general/parser/select_across_vnodes.sim
|
||||
#sleep 100
|
||||
#run general/parser/select_from_cache_disk.sim
|
||||
#sleep 100
|
||||
#run general/parser/set_tag_vals.sim
|
||||
#sleep 100
|
||||
#run general/parser/single_row_in_tb.sim
|
||||
#sleep 100
|
||||
#run general/parser/slimit.sim
|
||||
#sleep 100
|
||||
#run general/parser/slimit1.sim
|
||||
#sleep 100
|
||||
#run general/parser/slimit_alter_tags.sim
|
||||
#sleep 100
|
||||
#run general/parser/tbnameIn.sim
|
||||
#sleep 100
|
||||
#run general/parser/slimit_alter_tags.sim # persistent failed
|
||||
#sleep 100
|
||||
#run general/parser/join.sim
|
||||
#sleep 100
|
||||
#run general/parser/join_multivnode.sim
|
||||
#sleep 100
|
||||
run general/parser/projection_limit_offset.sim
|
||||
sleep 100
|
||||
run general/parser/select_with_tags.sim
|
||||
|
|
Loading…
Reference in New Issue