diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index d7a6459a0ecb3a9d1238997a85fc1590b7e57435..9f03ed3656d2df739bda1aca4be86b9f359e3ae8 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -235,7 +235,182 @@ SSmlSTableMeta *smlBuildSTableMeta(bool isDataFormat) { return NULL; } +//uint16_t smlCalTypeSum(char* endptr, int32_t left){ +// uint16_t sum = 0; +// for(int i = 0; i < left; i++){ +// sum += endptr[i]; +// } +// return sum; +//} + +#define RETURN_FALSE \ +smlBuildInvalidDataMsg(msg, "invalid data", pVal); \ +return false; + +#define SET_DOUBLE kvVal->type = TSDB_DATA_TYPE_DOUBLE;\ + kvVal->d = result; + +#define SET_FLOAT \ + if (!IS_VALID_FLOAT(result)) {\ + smlBuildInvalidDataMsg(msg, "float out of range[-3.402823466e+38,3.402823466e+38]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_FLOAT;\ + kvVal->f = (float)result; + +#define SET_BIGINT \ + if (smlDoubleToInt64OverFlow(result)) {\ + errno = 0;\ + int64_t tmp = taosStr2Int64(pVal, &endptr, 10);\ + if (errno == ERANGE) {\ + smlBuildInvalidDataMsg(msg, "big int out of range[-9223372036854775808,9223372036854775807]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_BIGINT;\ + kvVal->i = tmp;\ + return true;\ + }\ + kvVal->type = TSDB_DATA_TYPE_BIGINT;\ + kvVal->i = (int64_t)result; + +#define SET_INT \ + if (!IS_VALID_INT(result)) {\ + smlBuildInvalidDataMsg(msg, "int out of range[-2147483648,2147483647]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_INT;\ + kvVal->i = result; + +#define SET_SMALL_INT \ + if (!IS_VALID_SMALLINT(result)) {\ + smlBuildInvalidDataMsg(msg, "small int our of range[-32768,32767]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_SMALLINT;\ + kvVal->i = result; + +#define SET_UBIGINT \ + if (result >= (double)UINT64_MAX || result < 0) {\ + errno = 0;\ + uint64_t tmp = taosStr2UInt64(pVal, &endptr, 10);\ + if (errno == ERANGE || result < 0) {\ + smlBuildInvalidDataMsg(msg, "unsigned big int out of range[0,18446744073709551615]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_UBIGINT;\ + kvVal->u = tmp;\ + return true;\ + }\ + kvVal->type = TSDB_DATA_TYPE_UBIGINT;\ + kvVal->u = result; + +#define SET_UINT \ + if (!IS_VALID_UINT(result)) {\ + smlBuildInvalidDataMsg(msg, "unsigned int out of range[0,4294967295]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_UINT;\ + kvVal->u = result; + +#define SET_USMALL_INT \ + if (!IS_VALID_USMALLINT(result)) {\ + smlBuildInvalidDataMsg(msg, "unsigned small int out of rang[0,65535]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_USMALLINT;\ + kvVal->u = result; + +#define SET_TINYINT \ + if (!IS_VALID_TINYINT(result)) { \ + smlBuildInvalidDataMsg(msg, "tiny int out of range[-128,127]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_TINYINT;\ + kvVal->i = result; + +#define SET_UTINYINT \ + if (!IS_VALID_UTINYINT(result)) {\ + smlBuildInvalidDataMsg(msg, "unsigned tiny int out of range[0,255]", pVal);\ + return false;\ + }\ + kvVal->type = TSDB_DATA_TYPE_UTINYINT;\ + kvVal->u = result; + bool smlParseNumber(SSmlKv *kvVal, SSmlMsgBuf *msg) { + const char *pVal = kvVal->value; + int32_t len = kvVal->length; + char * endptr = NULL; + double result = taosStr2Double(pVal, &endptr); + if (pVal == endptr) { + RETURN_FALSE + } + + int32_t left = len - (endptr - pVal); + if (left == 0) { + SET_DOUBLE + } else if (left == 3) { + if(endptr[0] == 'f' || endptr[0] == 'F'){ + if(endptr[1] == '6' && endptr[2] == '4'){ + SET_DOUBLE + }else if(endptr[1] == '3' && endptr[2] == '2'){ + SET_FLOAT + }else{ + RETURN_FALSE + } + }else if(endptr[0] == 'i' || endptr[0] == 'I'){ + if(endptr[1] == '6' && endptr[2] == '4'){ + SET_BIGINT + }else if(endptr[1] == '3' && endptr[2] == '2'){ + SET_INT + }else if(endptr[1] == '1' && endptr[2] == '6'){ + SET_SMALL_INT + }else{ + RETURN_FALSE + } + }else if(endptr[0] == 'u' || endptr[0] == 'U'){ + if(endptr[1] == '6' && endptr[2] == '4'){ + SET_UBIGINT + }else if(endptr[1] == '3' && endptr[2] == '2'){ + SET_UINT + }else if(endptr[1] == '1' && endptr[2] == '6'){ + SET_USMALL_INT + }else{ + RETURN_FALSE + } + }else{ + RETURN_FALSE + } + } else if(left == 2){ + if(endptr[0] == 'i' || endptr[0] == 'I'){ + if(endptr[1] == '8') { + SET_TINYINT + }else{ + RETURN_FALSE + } + }else if(endptr[0] == 'u' || endptr[0] == 'U') { + if (endptr[1] == '8') { + SET_UTINYINT + } else { + RETURN_FALSE + } + }else{ + RETURN_FALSE + } + } else if(left == 1){ + if(endptr[0] == 'i' || endptr[0] == 'I'){ + SET_BIGINT + }else if(endptr[0] == 'u' || endptr[0] == 'U') { + SET_UBIGINT + }else{ + RETURN_FALSE + } + } else { + RETURN_FALSE; + } + return true; +} + +bool smlParseNumberOld(SSmlKv *kvVal, SSmlMsgBuf *msg) { const char *pVal = kvVal->value; int32_t len = kvVal->length; char *endptr = NULL; diff --git a/source/client/src/clientSmlLine.c b/source/client/src/clientSmlLine.c index 4b554bd623f855ab12ae2c4330784f7859e621c6..aca0fe752b4e07e62bfed7c98e20960613b35b28 100644 --- a/source/client/src/clientSmlLine.c +++ b/source/client/src/clientSmlLine.c @@ -121,33 +121,57 @@ static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t le } static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) { - // binary - if (smlIsBinary(pVal->value, pVal->length)) { - pVal->type = TSDB_DATA_TYPE_BINARY; - pVal->length -= BINARY_ADD_LEN; - if (pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { - return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; + if (pVal->value[0] == '"'){ // binary + if (pVal->length >= 2 && pVal->value[pVal->length - 1] == '"') { + pVal->type = TSDB_DATA_TYPE_BINARY; + pVal->length -= BINARY_ADD_LEN; + if (pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { + return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; + } + pVal->value += (BINARY_ADD_LEN - 1); + return TSDB_CODE_SUCCESS; } - pVal->value += (BINARY_ADD_LEN - 1); - return TSDB_CODE_SUCCESS; + return TSDB_CODE_TSC_INVALID_VALUE; } - // nchar - if (smlIsNchar(pVal->value, pVal->length)) { - pVal->type = TSDB_DATA_TYPE_NCHAR; - pVal->length -= NCHAR_ADD_LEN; - if (pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { - return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; + + if(pVal->value[0] == 'l' || pVal->value[0] == 'L'){ // nchar + if (pVal->value[1] == '"' && pVal->value[pVal->length - 1] == '"' && pVal->length >= 3){ + pVal->type = TSDB_DATA_TYPE_NCHAR; + pVal->length -= NCHAR_ADD_LEN; + if (pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { + return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; + } + pVal->value += (NCHAR_ADD_LEN - 1); + return TSDB_CODE_SUCCESS; } - pVal->value += (NCHAR_ADD_LEN - 1); - return TSDB_CODE_SUCCESS; + return TSDB_CODE_TSC_INVALID_VALUE; } - // bool - if (smlParseBool(pVal)) { - pVal->type = TSDB_DATA_TYPE_BOOL; - pVal->length = (int16_t)tDataTypes[pVal->type].bytes; - return TSDB_CODE_SUCCESS; + if (pVal->value[0] == 't' || pVal->value[0] == 'T'){ + if(pVal->length == 1 || (pVal->length == 4 && (pVal->value[1] == 'u' || pVal->value[1] == 'U') + && (pVal->value[2] == 'r' || pVal->value[2] == 'R') + && (pVal->value[3] == 'e' || pVal->value[3] == 'E'))){ + pVal->i = TSDB_TRUE; + pVal->type = TSDB_DATA_TYPE_BOOL; + pVal->length = (int16_t)tDataTypes[pVal->type].bytes; + return TSDB_CODE_SUCCESS; + } + return TSDB_CODE_TSC_INVALID_VALUE; } + + if (pVal->value[0] == 'f' || pVal->value[0] == 'F'){ + if(pVal->length == 1 || (pVal->length == 5 && (pVal->value[1] == 'a' || pVal->value[1] == 'A') + && (pVal->value[2] == 'l' || pVal->value[2] == 'L') + && (pVal->value[3] == 's' || pVal->value[3] == 'S') + && (pVal->value[4] == 'e' || pVal->value[4] == 'E'))){ + pVal->i = TSDB_FALSE; + pVal->type = TSDB_DATA_TYPE_BOOL; + pVal->length = (int16_t)tDataTypes[pVal->type].bytes; + return TSDB_CODE_SUCCESS; + } + return TSDB_CODE_TSC_INVALID_VALUE; + } + // number if (smlParseNumber(pVal, msg)) { pVal->length = (int16_t)tDataTypes[pVal->type].bytes; diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c index 2597a26243ccabf9f33c122af67c7915420f21e5..d8d665073c19362e7cbb93d1f9c38f0e9897b38b 100644 --- a/utils/test/c/sml_test.c +++ b/utils/test/c/sml_test.c @@ -1159,7 +1159,46 @@ int sml_ttl_Test() { return code; } +//char *str[] ={ +// "", +// "f64", +// "F64", +// "f32", +// "F32", +// "i", +// "I", +// "i64", +// "I64", +// "u", +// "U", +// "u64", +// "U64", +// "i32", +// "I32", +// "u32", +// "U32", +// "i16", +// "I16", +// "u16", +// "U16", +// "i8", +// "I8", +// "u8", +// "U8", +//}; +//uint8_t smlCalTypeSum(char* endptr, int32_t left){ +// uint8_t sum = 0; +// for(int i = 0; i < left; i++){ +// sum += endptr[i]; +// } +// return sum; +//} + int main(int argc, char *argv[]) { + +// for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++){ +// printf("str:%s \t %d\n", str[i], smlCalTypeSum(str[i], strlen(str[i]))); +// } int ret = 0; ret = sml_ttl_Test(); ASSERT(!ret);