Merge pull request #6825 from taosdata/fix/TD-5134
[TD-5134]<fix> fix runtime error
This commit is contained in:
commit
2d6ad4d87b
|
@ -2795,8 +2795,7 @@ static bool isTablenameToken(SStrToken* token) {
|
||||||
SStrToken tableToken = {0};
|
SStrToken tableToken = {0};
|
||||||
|
|
||||||
extractTableNameFromToken(&tmpToken, &tableToken);
|
extractTableNameFromToken(&tmpToken, &tableToken);
|
||||||
|
return (tmpToken.n == strlen(TSQL_TBNAME_L) && strncasecmp(TSQL_TBNAME_L, tmpToken.z, tmpToken.n) == 0);
|
||||||
return (strncasecmp(TSQL_TBNAME_L, tmpToken.z, tmpToken.n) == 0 && tmpToken.n == strlen(TSQL_TBNAME_L));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken* pToken) {
|
static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken* pToken) {
|
||||||
|
@ -2827,8 +2826,11 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
|
||||||
|
|
||||||
if (isTablenameToken(pToken)) {
|
if (isTablenameToken(pToken)) {
|
||||||
pIndex->columnIndex = TSDB_TBNAME_COLUMN_INDEX;
|
pIndex->columnIndex = TSDB_TBNAME_COLUMN_INDEX;
|
||||||
} else if (strncasecmp(pToken->z, DEFAULT_PRIMARY_TIMESTAMP_COL_NAME, pToken->n) == 0) {
|
} else if (strlen(DEFAULT_PRIMARY_TIMESTAMP_COL_NAME) == pToken->n &&
|
||||||
pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX;
|
strncasecmp(pToken->z, DEFAULT_PRIMARY_TIMESTAMP_COL_NAME, pToken->n) == 0) {
|
||||||
|
pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX; // just make runtime happy, need fix java test case InsertSpecialCharacterJniTest
|
||||||
|
} else if (pToken->n == 0) {
|
||||||
|
pIndex->columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX; // just make runtime happy, need fix java test case InsertSpecialCharacterJniTest
|
||||||
} else {
|
} else {
|
||||||
// not specify the table name, try to locate the table index by column name
|
// not specify the table name, try to locate the table index by column name
|
||||||
if (pIndex->tableIndex == COLUMN_INDEX_INITIAL_VAL) {
|
if (pIndex->tableIndex == COLUMN_INDEX_INITIAL_VAL) {
|
||||||
|
@ -3393,7 +3395,14 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
||||||
if (IS_NUMERIC_TYPE(pRight->value.nType)) {
|
if (IS_NUMERIC_TYPE(pRight->value.nType)) {
|
||||||
bufLen = 60;
|
bufLen = 60;
|
||||||
} else {
|
} else {
|
||||||
bufLen = pRight->value.nLen + 1;
|
/*
|
||||||
|
* make memory sanitizer happy;
|
||||||
|
*/
|
||||||
|
if (pRight->value.nLen == 0) {
|
||||||
|
bufLen = pRight->value.nLen + 2;
|
||||||
|
} else {
|
||||||
|
bufLen = pRight->value.nLen + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pExpr->tokenId == TK_LE || pExpr->tokenId == TK_LT) {
|
if (pExpr->tokenId == TK_LE || pExpr->tokenId == TK_LT) {
|
||||||
|
@ -4832,7 +4841,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
|
||||||
|
|
||||||
int32_t type = 0;
|
int32_t type = 0;
|
||||||
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, &type, (*pExpr)->tokenId)) != TSDB_CODE_SUCCESS) {
|
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, &type, (*pExpr)->tokenId)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
tSqlExprCompact(pExpr);
|
tSqlExprCompact(pExpr);
|
||||||
|
@ -4842,7 +4851,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
|
||||||
|
|
||||||
// 1. check if it is a join query
|
// 1. check if it is a join query
|
||||||
if ((ret = validateJoinExpr(&pSql->cmd, pQueryInfo, &condExpr)) != TSDB_CODE_SUCCESS) {
|
if ((ret = validateJoinExpr(&pSql->cmd, pQueryInfo, &condExpr)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. get the query time range
|
// 2. get the query time range
|
||||||
|
@ -5043,7 +5052,8 @@ int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNo
|
||||||
size_t numOfFields = tscNumOfFields(pQueryInfo);
|
size_t numOfFields = tscNumOfFields(pQueryInfo);
|
||||||
|
|
||||||
if (pQueryInfo->fillVal == NULL) {
|
if (pQueryInfo->fillVal == NULL) {
|
||||||
pQueryInfo->fillVal = calloc(numOfFields, sizeof(int64_t));
|
pQueryInfo->fillVal = calloc(numOfFields, sizeof(int64_t));
|
||||||
|
pQueryInfo->numOfFillVal = (int32_t)numOfFields;
|
||||||
if (pQueryInfo->fillVal == NULL) {
|
if (pQueryInfo->fillVal == NULL) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -7725,11 +7735,18 @@ int32_t loadAllTableMeta(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
||||||
taosArrayPush(pVgroupList, &t);
|
taosArrayPush(pVgroupList, &t);
|
||||||
}
|
}
|
||||||
|
|
||||||
STableMeta* pMeta = tscTableMetaDup(pTableMeta);
|
//STableMeta* pMeta = tscTableMetaDup(pTableMeta);
|
||||||
STableMetaVgroupInfo p = { .pTableMeta = pMeta };
|
//STableMetaVgroupInfo p = { .pTableMeta = pMeta };
|
||||||
|
|
||||||
|
//const char* px = tNameGetTableName(pname);
|
||||||
|
//taosHashPut(pCmd->pTableMetaMap, px, strlen(px), &p, sizeof(STableMetaVgroupInfo));
|
||||||
|
// avoid mem leak, may should update pTableMeta
|
||||||
const char* px = tNameGetTableName(pname);
|
const char* px = tNameGetTableName(pname);
|
||||||
taosHashPut(pCmd->pTableMetaMap, px, strlen(px), &p, sizeof(STableMetaVgroupInfo));
|
if (taosHashGet(pCmd->pTableMetaMap, px, strlen(px)) == NULL) {
|
||||||
|
STableMeta* pMeta = tscTableMetaDup(pTableMeta);
|
||||||
|
STableMetaVgroupInfo p = { .pTableMeta = pMeta, .pVgroupInfo = NULL};
|
||||||
|
taosHashPut(pCmd->pTableMetaMap, px, strlen(px), &p, sizeof(STableMetaVgroupInfo));
|
||||||
|
}
|
||||||
} else { // add to the retrieve table meta array list.
|
} else { // add to the retrieve table meta array list.
|
||||||
char* t = strdup(name);
|
char* t = strdup(name);
|
||||||
taosArrayPush(plist, &t);
|
taosArrayPush(plist, &t);
|
||||||
|
@ -8185,7 +8202,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
||||||
|
|
||||||
// in case of join query, time range is required.
|
// in case of join query, time range is required.
|
||||||
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type)) {
|
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type)) {
|
||||||
int64_t timeRange = ABS(pQueryInfo->window.skey - pQueryInfo->window.ekey);
|
uint64_t timeRange = (uint64_t)pQueryInfo->window.ekey - pQueryInfo->window.skey;
|
||||||
if (timeRange == 0 && pQueryInfo->window.skey == 0) {
|
if (timeRange == 0 && pQueryInfo->window.skey == 0) {
|
||||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||||
}
|
}
|
||||||
|
@ -8227,6 +8244,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayAddBatch(pQueryInfo->exprList1, (void*) p, numOfExpr);
|
taosArrayAddBatch(pQueryInfo->exprList1, (void*) p, numOfExpr);
|
||||||
|
tfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -2076,6 +2076,7 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
|
||||||
STableMeta* pTableMeta = tscCreateTableMetaFromMsg(pMetaMsg);
|
STableMeta* pTableMeta = tscCreateTableMetaFromMsg(pMetaMsg);
|
||||||
if (!tIsValidSchema(pTableMeta->schema, pTableMeta->tableInfo.numOfColumns, pTableMeta->tableInfo.numOfTags)) {
|
if (!tIsValidSchema(pTableMeta->schema, pTableMeta->tableInfo.numOfColumns, pTableMeta->tableInfo.numOfTags)) {
|
||||||
tscError("0x%"PRIx64" invalid table meta from mnode, name:%s", pSql->self, pMetaMsg->tableFname);
|
tscError("0x%"PRIx64" invalid table meta from mnode, name:%s", pSql->self, pMetaMsg->tableFname);
|
||||||
|
tfree(pTableMeta);
|
||||||
taosHashCleanup(pSet);
|
taosHashCleanup(pSet);
|
||||||
taosReleaseRef(tscObjRef, pParentSql->self);
|
taosReleaseRef(tscObjRef, pParentSql->self);
|
||||||
|
|
||||||
|
@ -2119,6 +2120,10 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
|
||||||
assert(p != NULL);
|
assert(p != NULL);
|
||||||
|
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
if (p->pVgroupInfo!= NULL) {
|
||||||
|
tscVgroupInfoClear(p->pVgroupInfo);
|
||||||
|
//tfree(p->pTableMeta);
|
||||||
|
}
|
||||||
p->pVgroupInfo = createVgroupInfoFromMsg(pMsg, &size, pSql->self);
|
p->pVgroupInfo = createVgroupInfoFromMsg(pMsg, &size, pSql->self);
|
||||||
pMsg += size;
|
pMsg += size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,9 @@ bool subAndCheckDone(SSqlObj *pSql, SSqlObj *pParentSql, int idx) {
|
||||||
subState->states[idx] = 1;
|
subState->states[idx] = 1;
|
||||||
|
|
||||||
bool done = allSubqueryDone(pParentSql);
|
bool done = allSubqueryDone(pParentSql);
|
||||||
|
if (!done) {
|
||||||
|
tscDebug("0x%"PRIx64" sub:%p,%d completed, total:%d", pParentSql->self, pSql, idx, pParentSql->subState.numOfSub);
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&subState->mutex);
|
pthread_mutex_unlock(&subState->mutex);
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
@ -416,7 +419,9 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// tscFieldInfoClear(&pSupporter->fieldsInfo);
|
// tscFieldInfoClear(&pSupporter->fieldsInfo);
|
||||||
|
if (pSupporter->fieldsInfo.internalField != NULL) {
|
||||||
|
taosArrayDestroy(pSupporter->fieldsInfo.internalField);
|
||||||
|
}
|
||||||
if (pSupporter->pTSBuf != NULL) {
|
if (pSupporter->pTSBuf != NULL) {
|
||||||
tsBufDestroy(pSupporter->pTSBuf);
|
tsBufDestroy(pSupporter->pTSBuf);
|
||||||
pSupporter->pTSBuf = NULL;
|
pSupporter->pTSBuf = NULL;
|
||||||
|
@ -430,7 +435,8 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSupporter->pVgroupTables != NULL) {
|
if (pSupporter->pVgroupTables != NULL) {
|
||||||
taosArrayDestroy(pSupporter->pVgroupTables);
|
//taosArrayDestroy(pSupporter->pVgroupTables);
|
||||||
|
tscFreeVgroupTableInfo(pSupporter->pVgroupTables);
|
||||||
pSupporter->pVgroupTables = NULL;
|
pSupporter->pVgroupTables = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -889,7 +895,9 @@ static int32_t getIntersectionOfTableTuple(SQueryInfo* pQueryInfo, SSqlObj* pPar
|
||||||
tscDebug("Join %d - num:%d", i, p->num);
|
tscDebug("Join %d - num:%d", i, p->num);
|
||||||
|
|
||||||
// sort according to the tag valu
|
// sort according to the tag valu
|
||||||
qsort(p->pIdTagList, p->num, p->tagSize, tagValCompar);
|
if (p->pIdTagList != NULL) {
|
||||||
|
qsort(p->pIdTagList, p->num, p->tagSize, tagValCompar);
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkForDuplicateTagVal(pColSchema, p, pParentSql)) {
|
if (!checkForDuplicateTagVal(pColSchema, p, pParentSql)) {
|
||||||
for (int32_t j = 0; j <= i; j++) {
|
for (int32_t j = 0; j <= i; j++) {
|
||||||
|
@ -1173,7 +1181,7 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
|
||||||
// no data exists in next vnode, mark the <tid, tags> query completed
|
// no data exists in next vnode, mark the <tid, tags> query completed
|
||||||
// only when there is no subquery exits any more, proceeds to get the intersect of the <tid, tags> tuple sets.
|
// only when there is no subquery exits any more, proceeds to get the intersect of the <tid, tags> tuple sets.
|
||||||
if (!subAndCheckDone(pSql, pParentSql, pSupporter->subqueryIndex)) {
|
if (!subAndCheckDone(pSql, pParentSql, pSupporter->subqueryIndex)) {
|
||||||
tscDebug("0x%"PRIx64" tagRetrieve:%p,%d completed, total:%d", pParentSql->self, tres, pSupporter->subqueryIndex, pParentSql->subState.numOfSub);
|
//tscDebug("0x%"PRIx64" tagRetrieve:%p,%d completed, total:%d", pParentSql->self, tres, pSupporter->subqueryIndex, pParentSql->subState.numOfSub);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1441,7 +1449,7 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subAndCheckDone(pSql, pParentSql, pSupporter->subqueryIndex)) {
|
if (!subAndCheckDone(pSql, pParentSql, pSupporter->subqueryIndex)) {
|
||||||
tscDebug("0x%"PRIx64" sub:0x%"PRIx64",%d completed, total:%d", pParentSql->self, pSql->self, pSupporter->subqueryIndex, pState->numOfSub);
|
//tscDebug("0x%"PRIx64" sub:0x%"PRIx64",%d completed, total:%d", pParentSql->self, pSql->self, pSupporter->subqueryIndex, pState->numOfSub);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3047,9 +3055,10 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
|
||||||
pParentObj->cmd.insertParam.schemaAttached = 1;
|
pParentObj->cmd.insertParam.schemaAttached = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subAndCheckDone(tres, pParentObj, pSupporter->index)) {
|
if (!subAndCheckDone(tres, pParentObj, pSupporter->index)) {
|
||||||
tscDebug("0x%"PRIx64" insert:%p,%d completed, total:%d", pParentObj->self, tres, pSupporter->index, pParentObj->subState.numOfSub);
|
// concurrency problem, other thread already release pParentObj
|
||||||
|
//tscDebug("0x%"PRIx64" insert:%p,%d completed, total:%d", pParentObj->self, tres, suppIdx, pParentObj->subState.numOfSub);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -297,7 +297,7 @@ bool tscHasColumnFilter(SQueryInfo* pQueryInfo) {
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(pQueryInfo->colList);
|
size_t size = taosArrayGetSize(pQueryInfo->colList);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SColumn* pCol = taosArrayGet(pQueryInfo->colList, i);
|
SColumn* pCol = taosArrayGetP(pQueryInfo->colList, i);
|
||||||
if (pCol->info.flist.numOfFilters > 0) {
|
if (pCol->info.flist.numOfFilters > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2985,6 +2985,7 @@ int32_t tscQueryInfoCopy(SQueryInfo* pQueryInfo, const SQueryInfo* pSrc) {
|
||||||
pQueryInfo->tsBuf = NULL;
|
pQueryInfo->tsBuf = NULL;
|
||||||
pQueryInfo->fillType = pSrc->fillType;
|
pQueryInfo->fillType = pSrc->fillType;
|
||||||
pQueryInfo->fillVal = NULL;
|
pQueryInfo->fillVal = NULL;
|
||||||
|
pQueryInfo->numOfFillVal = 0;;
|
||||||
pQueryInfo->clauseLimit = pSrc->clauseLimit;
|
pQueryInfo->clauseLimit = pSrc->clauseLimit;
|
||||||
pQueryInfo->prjOffset = pSrc->prjOffset;
|
pQueryInfo->prjOffset = pSrc->prjOffset;
|
||||||
pQueryInfo->numOfTables = 0;
|
pQueryInfo->numOfTables = 0;
|
||||||
|
@ -3020,11 +3021,12 @@ int32_t tscQueryInfoCopy(SQueryInfo* pQueryInfo, const SQueryInfo* pSrc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSrc->fillType != TSDB_FILL_NONE) {
|
if (pSrc->fillType != TSDB_FILL_NONE) {
|
||||||
pQueryInfo->fillVal = malloc(pSrc->fieldsInfo.numOfOutput * sizeof(int64_t));
|
pQueryInfo->fillVal = calloc(1, pSrc->fieldsInfo.numOfOutput * sizeof(int64_t));
|
||||||
if (pQueryInfo->fillVal == NULL) {
|
if (pQueryInfo->fillVal == NULL) {
|
||||||
code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
pQueryInfo->numOfFillVal = pSrc->fieldsInfo.numOfOutput;
|
||||||
|
|
||||||
memcpy(pQueryInfo->fillVal, pSrc->fillVal, pSrc->fieldsInfo.numOfOutput * sizeof(int64_t));
|
memcpy(pQueryInfo->fillVal, pSrc->fillVal, pSrc->fieldsInfo.numOfOutput * sizeof(int64_t));
|
||||||
}
|
}
|
||||||
|
@ -3366,6 +3368,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
|
||||||
pNewQueryInfo->tsBuf = NULL;
|
pNewQueryInfo->tsBuf = NULL;
|
||||||
pNewQueryInfo->fillType = pQueryInfo->fillType;
|
pNewQueryInfo->fillType = pQueryInfo->fillType;
|
||||||
pNewQueryInfo->fillVal = NULL;
|
pNewQueryInfo->fillVal = NULL;
|
||||||
|
pNewQueryInfo->numOfFillVal = 0;
|
||||||
pNewQueryInfo->clauseLimit = pQueryInfo->clauseLimit;
|
pNewQueryInfo->clauseLimit = pQueryInfo->clauseLimit;
|
||||||
pNewQueryInfo->prjOffset = pQueryInfo->prjOffset;
|
pNewQueryInfo->prjOffset = pQueryInfo->prjOffset;
|
||||||
pNewQueryInfo->numOfTables = 0;
|
pNewQueryInfo->numOfTables = 0;
|
||||||
|
@ -3396,11 +3399,14 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pQueryInfo->fillType != TSDB_FILL_NONE) {
|
if (pQueryInfo->fillType != TSDB_FILL_NONE) {
|
||||||
pNewQueryInfo->fillVal = malloc(pQueryInfo->fieldsInfo.numOfOutput * sizeof(int64_t));
|
//just make memory memory sanitizer happy
|
||||||
|
//refator later
|
||||||
|
pNewQueryInfo->fillVal = calloc(1, pQueryInfo->fieldsInfo.numOfOutput * sizeof(int64_t));
|
||||||
if (pNewQueryInfo->fillVal == NULL) {
|
if (pNewQueryInfo->fillVal == NULL) {
|
||||||
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
pNewQueryInfo->numOfFillVal = pQueryInfo->fieldsInfo.numOfOutput;
|
||||||
|
|
||||||
memcpy(pNewQueryInfo->fillVal, pQueryInfo->fillVal, pQueryInfo->fieldsInfo.numOfOutput * sizeof(int64_t));
|
memcpy(pNewQueryInfo->fillVal, pQueryInfo->fillVal, pQueryInfo->fieldsInfo.numOfOutput * sizeof(int64_t));
|
||||||
}
|
}
|
||||||
|
@ -4420,7 +4426,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
|
||||||
|
|
||||||
if (pQueryAttr->fillType != TSDB_FILL_NONE) {
|
if (pQueryAttr->fillType != TSDB_FILL_NONE) {
|
||||||
pQueryAttr->fillVal = calloc(pQueryAttr->numOfOutput, sizeof(int64_t));
|
pQueryAttr->fillVal = calloc(pQueryAttr->numOfOutput, sizeof(int64_t));
|
||||||
memcpy(pQueryAttr->fillVal, pQueryInfo->fillVal, pQueryAttr->numOfOutput * sizeof(int64_t));
|
memcpy(pQueryAttr->fillVal, pQueryInfo->fillVal, pQueryInfo->numOfFillVal * sizeof(int64_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->srcRowSize = 0;
|
pQueryAttr->srcRowSize = 0;
|
||||||
|
|
|
@ -18,7 +18,58 @@
|
||||||
#include "ttype.h"
|
#include "ttype.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "tarithoperator.h"
|
#include "tarithoperator.h"
|
||||||
|
#include "tcompare.h"
|
||||||
|
|
||||||
|
//GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i]));
|
||||||
|
#define ARRAY_LIST_OP_DIV(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
|
||||||
|
{ \
|
||||||
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; \
|
||||||
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; \
|
||||||
|
\
|
||||||
|
if ((len1) == (len2)) { \
|
||||||
|
for (; i < (len2) && i >= 0; i += step, (out) += 1) { \
|
||||||
|
if (isNull((char *)&((left)[i]), _left_type) || isNull((char *)&((right)[i]), _right_type)) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
*(out) = (double)(left)[i] op(right)[i]; \
|
||||||
|
} \
|
||||||
|
} else if ((len1) == 1) { \
|
||||||
|
for (; i >= 0 && i < (len2); i += step, (out) += 1) { \
|
||||||
|
if (isNull((char *)(left), _left_type) || isNull((char *)&(right)[i], _right_type)) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
*(out) = (double)(left)[0] op(right)[i]; \
|
||||||
|
} \
|
||||||
|
} else if ((len2) == 1) { \
|
||||||
|
for (; i >= 0 && i < (len1); i += step, (out) += 1) { \
|
||||||
|
if (isNull((char *)&(left)[i], _left_type) || isNull((char *)(right), _right_type)) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[0])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
*(out) = (double)(left)[i] op(right)[0]; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
#define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
|
#define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
|
||||||
{ \
|
{ \
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; \
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; \
|
||||||
|
@ -62,6 +113,12 @@
|
||||||
SET_DOUBLE_NULL(out); \
|
SET_DOUBLE_NULL(out); \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[i])) * (right)[i]; \
|
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[i])) * (right)[i]; \
|
||||||
} \
|
} \
|
||||||
} else if (len1 == 1) { \
|
} else if (len1 == 1) { \
|
||||||
|
@ -70,6 +127,12 @@
|
||||||
SET_DOUBLE_NULL(out); \
|
SET_DOUBLE_NULL(out); \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
*(out) = (double)(left)[0] - ((int64_t)(((double)(left)[0]) / (right)[i])) * (right)[i]; \
|
*(out) = (double)(left)[0] - ((int64_t)(((double)(left)[0]) / (right)[i])) * (right)[i]; \
|
||||||
} \
|
} \
|
||||||
} else if ((len2) == 1) { \
|
} else if ((len2) == 1) { \
|
||||||
|
@ -78,6 +141,12 @@
|
||||||
SET_DOUBLE_NULL(out); \
|
SET_DOUBLE_NULL(out); \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
|
double v, z = 0.0; \
|
||||||
|
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[0])); \
|
||||||
|
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
|
||||||
|
SET_DOUBLE_NULL(out); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[0])) * (right)[0]; \
|
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[0])) * (right)[0]; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -90,7 +159,7 @@
|
||||||
#define ARRAY_LIST_MULTI(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
#define ARRAY_LIST_MULTI(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
||||||
ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, *, TSDB_DATA_TYPE_DOUBLE, _ord)
|
ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, *, TSDB_DATA_TYPE_DOUBLE, _ord)
|
||||||
#define ARRAY_LIST_DIV(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
#define ARRAY_LIST_DIV(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
||||||
ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, /, TSDB_DATA_TYPE_DOUBLE, _ord)
|
ARRAY_LIST_OP_DIV(left, right, _left_type, _right_type, len1, len2, out, /, TSDB_DATA_TYPE_DOUBLE, _ord)
|
||||||
#define ARRAY_LIST_REM(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
#define ARRAY_LIST_REM(left, right, _left_type, _right_type, len1, len2, out, _ord) \
|
||||||
ARRAY_LIST_OP_REM(left, right, _left_type, _right_type, len1, len2, out, %, TSDB_DATA_TYPE_DOUBLE, _ord)
|
ARRAY_LIST_OP_REM(left, right, _left_type, _right_type, len1, len2, out, %, TSDB_DATA_TYPE_DOUBLE, _ord)
|
||||||
|
|
||||||
|
|
|
@ -106,11 +106,14 @@ typedef struct SQueryInfo {
|
||||||
STagCond tagCond;
|
STagCond tagCond;
|
||||||
|
|
||||||
SOrderVal order;
|
SOrderVal order;
|
||||||
int16_t fillType; // final result fill type
|
|
||||||
int16_t numOfTables;
|
int16_t numOfTables;
|
||||||
STableMetaInfo **pTableMetaInfo;
|
STableMetaInfo **pTableMetaInfo;
|
||||||
struct STSBuf *tsBuf;
|
struct STSBuf *tsBuf;
|
||||||
|
|
||||||
|
int16_t fillType; // final result fill type
|
||||||
int64_t * fillVal; // default value for fill
|
int64_t * fillVal; // default value for fill
|
||||||
|
int32_t numOfFillVal; // fill value size
|
||||||
|
|
||||||
char * msg; // pointer to the pCmd->payload to keep error message temporarily
|
char * msg; // pointer to the pCmd->payload to keep error message temporarily
|
||||||
int64_t clauseLimit; // limit for current sub clause
|
int64_t clauseLimit; // limit for current sub clause
|
||||||
|
|
||||||
|
|
|
@ -951,7 +951,9 @@ static TSKEY getStartTsKey(SQueryAttr* pQueryAttr, STimeWindow* win, const TSKEY
|
||||||
static void setArithParams(SArithmeticSupport* sas, SExprInfo *pExprInfo, SSDataBlock* pSDataBlock) {
|
static void setArithParams(SArithmeticSupport* sas, SExprInfo *pExprInfo, SSDataBlock* pSDataBlock) {
|
||||||
sas->numOfCols = (int32_t) pSDataBlock->info.numOfCols;
|
sas->numOfCols = (int32_t) pSDataBlock->info.numOfCols;
|
||||||
sas->pExprInfo = pExprInfo;
|
sas->pExprInfo = pExprInfo;
|
||||||
|
if (sas->colList != NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
sas->colList = calloc(1, pSDataBlock->info.numOfCols*sizeof(SColumnInfo));
|
sas->colList = calloc(1, pSDataBlock->info.numOfCols*sizeof(SColumnInfo));
|
||||||
for(int32_t i = 0; i < sas->numOfCols; ++i) {
|
for(int32_t i = 0; i < sas->numOfCols; ++i) {
|
||||||
SColumnInfoData* pColData = taosArrayGet(pSDataBlock->pDataBlock, i);
|
SColumnInfoData* pColData = taosArrayGet(pSDataBlock->pDataBlock, i);
|
||||||
|
@ -5984,8 +5986,13 @@ SColumnInfo* extractColumnFilterInfo(SExprInfo* pExpr, int32_t numOfOutput, int3
|
||||||
pCols[i].colId = pExpr[i].base.resColId;
|
pCols[i].colId = pExpr[i].base.resColId;
|
||||||
|
|
||||||
pCols[i].flist.numOfFilters = pExpr[i].base.flist.numOfFilters;
|
pCols[i].flist.numOfFilters = pExpr[i].base.flist.numOfFilters;
|
||||||
pCols[i].flist.filterInfo = calloc(pCols[i].flist.numOfFilters, sizeof(SColumnFilterInfo));
|
if (pCols[i].flist.numOfFilters != 0) {
|
||||||
memcpy(pCols[i].flist.filterInfo, pExpr[i].base.flist.filterInfo, pCols[i].flist.numOfFilters * sizeof(SColumnFilterInfo));
|
pCols[i].flist.filterInfo = calloc(pCols[i].flist.numOfFilters, sizeof(SColumnFilterInfo));
|
||||||
|
memcpy(pCols[i].flist.filterInfo, pExpr[i].base.flist.filterInfo, pCols[i].flist.numOfFilters * sizeof(SColumnFilterInfo));
|
||||||
|
} else {
|
||||||
|
// avoid runtime error
|
||||||
|
pCols[i].flist.filterInfo = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(numOfFilter > 0);
|
assert(numOfFilter > 0);
|
||||||
|
@ -6444,10 +6451,10 @@ static SSDataBlock* hashDistinct(void* param, bool* newgroup) {
|
||||||
if (isNull(val, type)) {
|
if (isNull(val, type)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
int dummy;
|
||||||
void* res = taosHashGet(pInfo->pSet, val, bytes);
|
void* res = taosHashGet(pInfo->pSet, val, bytes);
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
taosHashPut(pInfo->pSet, val, bytes, NULL, 0);
|
taosHashPut(pInfo->pSet, val, bytes, &dummy, sizeof(dummy));
|
||||||
char* start = pResultColInfoData->pData + bytes * pInfo->pRes->info.rows;
|
char* start = pResultColInfoData->pData + bytes * pInfo->pRes->info.rows;
|
||||||
memcpy(start, val, bytes);
|
memcpy(start, val, bytes);
|
||||||
pRes->info.rows += 1;
|
pRes->info.rows += 1;
|
||||||
|
|
|
@ -193,7 +193,7 @@ if $data02 != 0.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data03 != 0.000000000 then
|
if $data03 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -444,7 +444,7 @@ if $data02 != 8.077777778 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data03 != inf then
|
if $data03 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue