[TD-14525]<fix>: fix taosd crash if scalar function has constant param
This commit is contained in:
parent
928cbcec7d
commit
cd972fdb00
|
@ -512,6 +512,16 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result
|
||||||
setNull((char *)result, type, tDataTypes[type].bytes);
|
setNull((char *)result, type, tDataTypes[type].bytes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
||||||
|
*result = pVariant->i;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
|
*result = pVariant->u;
|
||||||
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
|
*result = (int64_t) pVariant->d;
|
||||||
|
} else {
|
||||||
|
//TODO: handling var types
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
||||||
|
@ -1014,4 +1024,4 @@ int32_t taosVariantTypeSetType(SVariant *pVariant, char type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1265,6 +1265,21 @@ static void projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSData
|
||||||
colDataAssign(pColInfoData, pCtx[k].input.pData[0], pCtx[k].input.numOfRows);
|
colDataAssign(pColInfoData, pCtx[k].input.pData[0], pCtx[k].input.numOfRows);
|
||||||
|
|
||||||
pResult->info.rows = pCtx[0].input.numOfRows;
|
pResult->info.rows = pCtx[0].input.numOfRows;
|
||||||
|
} else if (pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE) {
|
||||||
|
SVariant *pVal = pExpr->pExpr->pVal;
|
||||||
|
char *payload;
|
||||||
|
if (IS_VAR_DATA_TYPE(pVal->nType)) {
|
||||||
|
payload = taosMemoryCalloc(1, pVal->nLen + VARSTR_HEADER_SIZE);
|
||||||
|
} else {
|
||||||
|
payload = taosMemoryCalloc(1, tDataTypes[pVal->nType].bytes);
|
||||||
|
}
|
||||||
|
taosVariantDump(pVal, payload, pVal->nType, true);
|
||||||
|
SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, k);
|
||||||
|
for (int32_t i = 0; i < pSrcBlock->info.rows; ++i) {
|
||||||
|
colDataAppend(pColInfoData, i, payload, false);
|
||||||
|
}
|
||||||
|
taosMemoryFree(payload);
|
||||||
|
pResult->info.rows = pSrcBlock->info.rows;
|
||||||
} else if (pExpr[k].pExpr->nodeType == QUERY_NODE_OPERATOR) {
|
} else if (pExpr[k].pExpr->nodeType == QUERY_NODE_OPERATOR) {
|
||||||
SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
|
SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
|
||||||
taosArrayPush(pBlockList, &pSrcBlock);
|
taosArrayPush(pBlockList, &pSrcBlock);
|
||||||
|
@ -7060,6 +7075,16 @@ SExprInfo* createExprInfo(SNodeList* pNodeList, SNodeList* pGroupKeys, int32_t*
|
||||||
pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, pType->precision, pColNode->colName);
|
pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, pType->precision, pColNode->colName);
|
||||||
pExp->base.pParam[0].pCol = createColumn(pColNode->dataBlockId, pColNode->slotId, pType);
|
pExp->base.pParam[0].pCol = createColumn(pColNode->dataBlockId, pColNode->slotId, pType);
|
||||||
pExp->base.pParam[0].type = FUNC_PARAM_TYPE_COLUMN;
|
pExp->base.pParam[0].type = FUNC_PARAM_TYPE_COLUMN;
|
||||||
|
} else if (nodeType(pTargetNode->pExpr) == QUERY_NODE_VALUE) {
|
||||||
|
pExp->pExpr->nodeType = QUERY_NODE_VALUE;
|
||||||
|
SValueNode* pValueNode = (SValueNode*)pTargetNode->pExpr;
|
||||||
|
SDataType* pType = &pValueNode->node.resType;
|
||||||
|
char *pDatum = nodesGetValueFromNode(pValueNode);
|
||||||
|
if (IS_VAR_DATA_TYPE(pType->type)) {
|
||||||
|
pDatum = varDataVal(pDatum);
|
||||||
|
}
|
||||||
|
pExp->pExpr->pVal = taosMemoryCalloc(1, sizeof(SVariant));
|
||||||
|
taosVariantCreateFromBinary(pExp->pExpr->pVal, pDatum, pType->bytes, pType->type);
|
||||||
} else if (nodeType(pTargetNode->pExpr) == QUERY_NODE_FUNCTION) {
|
} else if (nodeType(pTargetNode->pExpr) == QUERY_NODE_FUNCTION) {
|
||||||
pExp->pExpr->nodeType = QUERY_NODE_FUNCTION;
|
pExp->pExpr->nodeType = QUERY_NODE_FUNCTION;
|
||||||
SFunctionNode* pFuncNode = (SFunctionNode*)pTargetNode->pExpr;
|
SFunctionNode* pFuncNode = (SFunctionNode*)pTargetNode->pExpr;
|
||||||
|
|
|
@ -777,11 +777,11 @@ void* nodesGetValueFromNode(SValueNode *pNode) {
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
return (void*)&pNode->datum.u;
|
return (void*)&pNode->datum.u;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
return (void*)&pNode->datum.d;
|
return (void*)&pNode->datum.d;
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
return (void*)pNode->datum.p;
|
return (void*)pNode->datum.p;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -797,7 +797,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) {
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buf, "%s", pNode->datum.b ? "true" : "false");
|
sprintf(buf, "%s", pNode->datum.b ? "true" : "false");
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -810,7 +810,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) {
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buf, "%" PRId64, pNode->datum.i);
|
sprintf(buf, "%" PRId64, pNode->datum.i);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -822,7 +822,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) {
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buf, "%" PRIu64, pNode->datum.u);
|
sprintf(buf, "%" PRIu64, pNode->datum.u);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -832,7 +832,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) {
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buf, "%e", pNode->datum.d);
|
sprintf(buf, "%e", pNode->datum.d);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -844,7 +844,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) {
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, bufSize, "'%s'", varDataVal(pNode->datum.p));
|
snprintf(buf, bufSize, "'%s'", varDataVal(pNode->datum.p));
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue