Merge pull request #14176 from taosdata/fix/TD-15211
fix(query): fix to_ISO8601 function crash when processing constant
This commit is contained in:
commit
19dc2e4eb2
|
@ -1267,6 +1267,29 @@ static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool validateTimestampDigits(const SValueNode* pVal) {
|
||||||
|
if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t tsVal = pVal->datum.i;
|
||||||
|
char fraction[20] = {0};
|
||||||
|
NUM_TO_STRING(pVal->node.resType.type, &tsVal, sizeof(fraction), fraction);
|
||||||
|
int32_t tsDigits = (int32_t)strlen(fraction);
|
||||||
|
|
||||||
|
if (tsDigits > TSDB_TIME_PRECISION_SEC_DIGITS) {
|
||||||
|
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS ||
|
||||||
|
tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS ||
|
||||||
|
tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool validateTimezoneFormat(const SValueNode* pVal) {
|
static bool validateTimezoneFormat(const SValueNode* pVal) {
|
||||||
if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
|
if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1379,6 +1402,15 @@ static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t l
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (QUERY_NODE_VALUE == nodeType(nodesListGetNode(pFunc->pParameterList, 0))) {
|
||||||
|
SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
|
||||||
|
if (!validateTimestampDigits(pValue)) {
|
||||||
|
pFunc->node.resType = (SDataType){.bytes = 0, .type = TSDB_DATA_TYPE_BINARY};
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// param1
|
// param1
|
||||||
if (numOfParams == 2) {
|
if (numOfParams == 2) {
|
||||||
SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
|
|
|
@ -856,10 +856,13 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
int32_t type = GET_PARAM_TYPE(pInput);
|
int32_t type = GET_PARAM_TYPE(pInput);
|
||||||
|
|
||||||
|
bool tzPresent = (inputNum == 2) ? true : false;
|
||||||
char* tz;
|
char* tz;
|
||||||
int32_t tzLen;
|
int32_t tzLen;
|
||||||
|
if (tzPresent) {
|
||||||
tz = varDataVal(pInput[1].columnData->pData);
|
tz = varDataVal(pInput[1].columnData->pData);
|
||||||
tzLen = varDataLen(pInput[1].columnData->pData);
|
tzLen = varDataLen(pInput[1].columnData->pData);
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pInput[0].numOfRows; ++i) {
|
for (int32_t i = 0; i < pInput[0].numOfRows; ++i) {
|
||||||
if (colDataIsNull_s(pInput[0].columnData, i)) {
|
if (colDataIsNull_s(pInput[0].columnData, i)) {
|
||||||
|
|
Loading…
Reference in New Issue