diff --git a/source/common/src/tvariant.c b/source/common/src/tvariant.c index 3995db89b6..ba8caa6857 100644 --- a/source/common/src/tvariant.c +++ b/source/common/src/tvariant.c @@ -512,6 +512,16 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result setNull((char *)result, type, tDataTypes[type].bytes); 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 errno = 0; 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; -} \ No newline at end of file +} diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 3e47356223..1d1aaa508b 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1265,6 +1265,21 @@ static void projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSData colDataAssign(pColInfoData, pCtx[k].input.pData[0], pCtx[k].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) { SArray* pBlockList = taosArrayInit(4, POINTER_BYTES); 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.pParam[0].pCol = createColumn(pColNode->dataBlockId, pColNode->slotId, pType); 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) { pExp->pExpr->nodeType = QUERY_NODE_FUNCTION; SFunctionNode* pFuncNode = (SFunctionNode*)pTargetNode->pExpr; diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 90f06c6c9c..de36fddf4b 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -777,11 +777,11 @@ void* nodesGetValueFromNode(SValueNode *pNode) { case TSDB_DATA_TYPE_UBIGINT: return (void*)&pNode->datum.u; case TSDB_DATA_TYPE_FLOAT: - case TSDB_DATA_TYPE_DOUBLE: + case TSDB_DATA_TYPE_DOUBLE: return (void*)&pNode->datum.d; case TSDB_DATA_TYPE_NCHAR: case TSDB_DATA_TYPE_VARCHAR: - case TSDB_DATA_TYPE_VARBINARY: + case TSDB_DATA_TYPE_VARBINARY: return (void*)pNode->datum.p; default: break; @@ -797,7 +797,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) { if (NULL == buf) { return NULL; } - + sprintf(buf, "%s", pNode->datum.b ? "true" : "false"); return buf; } @@ -810,7 +810,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) { if (NULL == buf) { return NULL; } - + sprintf(buf, "%" PRId64, pNode->datum.i); return buf; } @@ -822,7 +822,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) { if (NULL == buf) { return NULL; } - + sprintf(buf, "%" PRIu64, pNode->datum.u); return buf; } @@ -832,7 +832,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) { if (NULL == buf) { return NULL; } - + sprintf(buf, "%e", pNode->datum.d); return buf; } @@ -844,7 +844,7 @@ char* nodesGetStrValueFromNode(SValueNode *pNode) { if (NULL == buf) { return NULL; } - + snprintf(buf, bufSize, "'%s'", varDataVal(pNode->datum.p)); return buf; }