From 02324202738e9df2f8c3adf96b403271e5b5d911 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 14 Jun 2023 17:32:50 +0800 Subject: [PATCH 1/4] fix:quote process error in sml --- source/client/src/clientSmlLine.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/client/src/clientSmlLine.c b/source/client/src/clientSmlLine.c index 40e014458e..39280d34dd 100644 --- a/source/client/src/clientSmlLine.c +++ b/source/client/src/clientSmlLine.c @@ -443,6 +443,7 @@ static int32_t smlParseColKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin if (unlikely(*(*sql) == QUOTE && (*(*sql - 1) != SLASH || (*sql - 1) == escapeChar))) { isInQuote = !isInQuote; (*sql)++; + if(!isInQuote) break; continue; } if (!isInQuote) { From 978f6398512c95c9fbb811e2f14ff733e8824423 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Fri, 16 Jun 2023 19:25:08 +0800 Subject: [PATCH 2/4] fix:[TD-24807] double quote & space escape error --- source/client/src/clientSmlLine.c | 13 ++++++++++--- source/client/test/smlTest.cpp | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/source/client/src/clientSmlLine.c b/source/client/src/clientSmlLine.c index 39280d34dd..8b11b2957d 100644 --- a/source/client/src/clientSmlLine.c +++ b/source/client/src/clientSmlLine.c @@ -202,7 +202,7 @@ static int32_t smlParseTagKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin bool keyEscaped = false; size_t keyLenEscaped = 0; while (*sql < sqlEnd) { - if (unlikely(IS_COMMA(*sql))) { + if (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql))) { smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql); return TSDB_CODE_SML_INVALID_DATA; } @@ -410,7 +410,7 @@ static int32_t smlParseColKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin bool keyEscaped = false; size_t keyLenEscaped = 0; while (*sql < sqlEnd) { - if (unlikely(IS_COMMA(*sql))) { + if (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql))) { smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql); return TSDB_CODE_SML_INVALID_DATA; } @@ -443,7 +443,14 @@ static int32_t smlParseColKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin if (unlikely(*(*sql) == QUOTE && (*(*sql - 1) != SLASH || (*sql - 1) == escapeChar))) { isInQuote = !isInQuote; (*sql)++; - if(!isInQuote) break; + if(!isInQuote) { + if (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql))) { + break; + }else{ + smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql); + return TSDB_CODE_SML_INVALID_DATA; + } + } continue; } if (!isInQuote) { diff --git a/source/client/test/smlTest.cpp b/source/client/test/smlTest.cpp index 1578b8b607..054698fff0 100644 --- a/source/client/test/smlTest.cpp +++ b/source/client/test/smlTest.cpp @@ -224,6 +224,8 @@ TEST(testCase, smlParseCols_Error_Test) { "st,tt=aa c 1=2 1626006833639000000,", //field value double quote,slash "st,tt=aa c=\"a\"a\" 1626006833639000000,", + "escape_test,tag1=\"tag1_value\",tag2=\"tag2_value\" co l0=\"col0_value\",col1=\"col1_value\" 1680918783010000000", + "escape_test,tag1=\"tag1_value\",tag2=\"tag2_value\" col0=\"co\"l\"0_value\",col1=\"col1_value\" 1680918783010000000" }; SSmlHandle *info = smlBuildSmlInfo(NULL); From 146aefe97e87bfe22282f773cd7accc3b23f77df Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Sun, 25 Jun 2023 18:01:49 +0800 Subject: [PATCH 3/4] fix:enable test case in sml --- utils/test/c/sml_test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c index 94619339e9..dad30db02a 100644 --- a/utils/test/c/sml_test.c +++ b/utils/test/c/sml_test.c @@ -1536,9 +1536,9 @@ int main(int argc, char *argv[]) { ASSERT(!ret); ret = sml_ts3116_Test(); ASSERT(!ret); -// ret = sml_ts2385_Test(); // this test case need config sml table name using ./sml_test config_file -// ASSERT(!ret); - ret = sml_ts3303_Test(); // this test case need config sml table name using ./sml_test config_file + ret = sml_ts2385_Test(); // this test case need config sml table name using ./sml_test config_file + ASSERT(!ret); + ret = sml_ts3303_Test(); ASSERT(!ret); // for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++){ From 4be3f51390f61d80924525f840ff2e0a8a583560 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 26 Jun 2023 10:21:54 +0800 Subject: [PATCH 4/4] fix:quote parse error in sml --- source/client/src/clientSmlLine.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/source/client/src/clientSmlLine.c b/source/client/src/clientSmlLine.c index 8b11b2957d..c5832ce1ce 100644 --- a/source/client/src/clientSmlLine.c +++ b/source/client/src/clientSmlLine.c @@ -436,27 +436,20 @@ static int32_t smlParseColKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin size_t valueLen = 0; bool valueEscaped = false; size_t valueLenEscaped = 0; - bool isInQuote = false; + int quoteNum = 0; const char *escapeChar = NULL; while (*sql < sqlEnd) { // parse value if (unlikely(*(*sql) == QUOTE && (*(*sql - 1) != SLASH || (*sql - 1) == escapeChar))) { - isInQuote = !isInQuote; + quoteNum++; (*sql)++; - if(!isInQuote) { - if (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql))) { - break; - }else{ - smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql); - return TSDB_CODE_SML_INVALID_DATA; - } + if(quoteNum > 2){ + break; } continue; } - if (!isInQuote) { - if (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql))) { - break; - } + if (quoteNum % 2 == 0 && (unlikely(IS_SPACE(*sql) || IS_COMMA(*sql)))) { + break; } if (IS_SLASH_LETTER_IN_FIELD_VALUE(*sql) && (*sql - 1) != escapeChar) { escapeChar = *sql; @@ -468,8 +461,8 @@ static int32_t smlParseColKv(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLin } valueLen = *sql - value; - if (unlikely(isInQuote)) { - smlBuildInvalidDataMsg(&info->msgBuf, "only one quote", value); + if (unlikely(quoteNum != 0 && quoteNum != 2)) { + smlBuildInvalidDataMsg(&info->msgBuf, "unbalanced quotes", value); return TSDB_CODE_SML_INVALID_DATA; } if (unlikely(valueLen == 0)) {