提交 efee9afa 编写于 作者: wmmhello's avatar wmmhello

opti:parse value in schemaless

上级 408ae6aa
......@@ -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;
......
......@@ -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;
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册