diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 4de3a23aa5242e83b28541178453b04fcdbdede7..acfbce3acf4dd82f31e8a67f7a27e6a4774e4be6 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -795,22 +795,19 @@ void tscColumnInfoReserve(SSqlCmd* pCmd, int32_t size) { _cf_ensureSpace(&pCmd-> */ static int32_t validateQuoteToken(SSQLToken* pToken) { - strdequote(pToken->z); + pToken->n = strdequote(pToken->z); strtrim(pToken->z); pToken->n = (uint32_t)strlen(pToken->z); int32_t k = tSQLGetToken(pToken->z, &pToken->type); - if (k != pToken->n) { - if (pToken->type == TK_STRING) { - return tscValidateName(pToken); - } - } else { - if (pToken->type != TK_ID) { - return TSDB_CODE_INVALID_SQL; - } - } + if (pToken->type == TK_STRING) { + return tscValidateName(pToken); + } + if (k != pToken->n || pToken->type != TK_ID) { + return TSDB_CODE_INVALID_SQL; + } return TSDB_CODE_SUCCESS; } @@ -822,7 +819,20 @@ int32_t tscValidateName(SSQLToken* pToken) { char* sep = strnchrNoquote(pToken->z, TS_PATH_DELIMITER[0], pToken->n); if (sep == NULL) { // single part if (pToken->type == TK_STRING) { - return validateQuoteToken(pToken); + pToken->n = strdequote(pToken->z); + strtrim(pToken->z); + pToken->n = (uint32_t)strlen(pToken->z); + int len = tSQLGetToken(pToken->z, &pToken->type); + if (len == pToken->n){ + return validateQuoteToken(pToken); + } + else { + sep = strnchrNoquote(pToken->z, TS_PATH_DELIMITER[0], pToken->n); + if (sep == NULL) { + return TSDB_CODE_INVALID_SQL; + } + return tscValidateName(pToken); + } } else { if (isNumber(pToken)) { return TSDB_CODE_INVALID_SQL; @@ -832,6 +842,11 @@ int32_t tscValidateName(SSQLToken* pToken) { int32_t oldLen = pToken->n; char* pStr = pToken->z; + if (pToken->type == TK_SPACE) { + strtrim(pToken->z); + pToken->n = (uint32_t)strlen(pToken->z); + } + pToken->n = tSQLGetToken(pToken->z, &pToken->type); if (pToken->z[pToken->n] != TS_PATH_DELIMITER[0]) { return TSDB_CODE_INVALID_SQL; diff --git a/src/util/src/ttokenizer.c b/src/util/src/ttokenizer.c index ad8dae36a45ab24d9905bd7408931afd503d3093..dd1f908478124c765df9ae84781a9bd28d1d0041 100644 --- a/src/util/src/ttokenizer.c +++ b/src/util/src/ttokenizer.c @@ -272,6 +272,10 @@ int tSQLKeywordCode(const char* z, int n) { } } +/* +** Return the length of the token that begins at z[0]. +** Store the token type in *type before returning. +*/ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) { int i; switch (*z) { @@ -398,18 +402,25 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) { case '\'': case '"': { int delim = z[0]; + bool strEnd = false; for (i = 1; z[i]; i++) { if (z[i] == delim) { if (z[i + 1] == delim) { i++; } else { + strEnd = true; break; } } } if (z[i]) i++; - *tokenType = TK_STRING; - return i; + + if (strEnd){ + *tokenType = TK_STRING; + return i; + } + + break; } case '.': { *tokenType = TK_DOT;