未验证 提交 564b1849 编写于 作者: G Ganlin Zhao 提交者: GitHub

Merge pull request #13657 from taosdata/fix/TD-16372

fix(query): add to_iso8601 function timezone validation
...@@ -1045,6 +1045,22 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { ...@@ -1045,6 +1045,22 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
* *
*/ */
static bool validateHourRange(int8_t hour) {
if (hour < 0 || hour > 12) {
return false;
}
return true;
}
static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '-')) {
return true;
}
return false;
}
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;
...@@ -1053,6 +1069,8 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { ...@@ -1053,6 +1069,8 @@ static bool validateTimezoneFormat(const SValueNode* pVal) {
char* tz = varDataVal(pVal->datum.p); char* tz = varDataVal(pVal->datum.p);
int32_t len = varDataLen(pVal->datum.p); int32_t len = varDataLen(pVal->datum.p);
char buf[3] = {0};
int8_t hour = -1, minute = -1;
if (len == 0) { if (len == 0) {
return false; return false;
} else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) { } else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) {
...@@ -1065,6 +1083,20 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { ...@@ -1065,6 +1083,20 @@ static bool validateTimezoneFormat(const SValueNode* pVal) {
if (!isdigit(tz[i])) { if (!isdigit(tz[i])) {
return false; return false;
} }
if (i == 2) {
memcpy(buf, &tz[i - 1], 2);
hour = taosStr2Int8(buf, NULL, 10);
if (!validateHourRange(hour)) {
return false;
}
} else if (i == 4) {
memcpy(buf, &tz[i - 1], 2);
minute = taosStr2Int8(buf, NULL, 10);
if (!validateMinuteRange(hour, minute, tz[0])) {
return false;
}
}
} }
break; break;
} }
...@@ -1076,9 +1108,24 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { ...@@ -1076,9 +1108,24 @@ static bool validateTimezoneFormat(const SValueNode* pVal) {
} }
continue; continue;
} }
if (!isdigit(tz[i])) { if (!isdigit(tz[i])) {
return false; return false;
} }
if (i == 2) {
memcpy(buf, &tz[i - 1], 2);
hour = taosStr2Int8(buf, NULL, 10);
if (!validateHourRange(hour)) {
return false;
}
} else if (i == 5) {
memcpy(buf, &tz[i - 1], 2);
minute = taosStr2Int8(buf, NULL, 10);
if (!validateMinuteRange(hour, minute, tz[0])) {
return false;
}
}
} }
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册