diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 8220d483f11f1b76fa367fffecce4ae1b2707f68..243ef5bf7e06bb6e641120175adca8477cd2ca21 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -207,7 +207,11 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { SSQLToken* pToken = &pInfo->pDCLInfo->a[0]; - tscValidateName(pToken); + if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) { + char msg1[] = "invalid db name"; + setErrMsg(pCmd, msg1, tListLen(msg1)); + return TSDB_CODE_INVALID_SQL; + } if (pToken->n > TSDB_DB_NAME_LEN) { setErrMsg(pCmd, msg, tListLen(msg)); @@ -393,7 +397,11 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { SSQLToken* pToken = &pInfo->pDCLInfo->a[0]; char msg[] = "table name is too long"; - tscValidateName(pToken); + if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) { + char msg1[] = "invalid table name"; + setErrMsg(pCmd, msg1, tListLen(msg1)); + return TSDB_CODE_INVALID_SQL; + } if (pToken->n > TSDB_METER_NAME_LEN) { setErrMsg(pCmd, msg, tListLen(msg)); @@ -571,7 +579,10 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { // metric name, create table by using dst SSQLToken* pToken = &(pInfo->pCreateTableInfo->usingInfo.metricName); - tscValidateName(pToken); + if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) { + setErrMsg(pCmd, msg, tListLen(msg)); + return TSDB_CODE_INVALID_SQL; + } int32_t ret = setMeterID(pSql, pToken); if (ret != TSDB_CODE_SUCCESS) { @@ -738,8 +749,12 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { setErrMsg(pCmd, msg, tListLen(msg)); return TSDB_CODE_INVALID_SQL; } - - tscValidateName(&(pQuerySql->from)); + + if (tscValidateName(&(pQuerySql->from)) != TSDB_CODE_SUCCESS) { + char msg[] = "invalid table name"; + setErrMsg(pCmd, msg, tListLen(msg)); + return TSDB_CODE_INVALID_SQL; + } if (setMeterID(pSql, &pQuerySql->from) != TSDB_CODE_SUCCESS) { char msg[] = "table name too long"; @@ -3477,7 +3492,11 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { SAlterTableSQL* pAlterSQL = pInfo->pAlterInfo; pCmd->command = TSDB_SQL_ALTER_TABLE; - tscValidateName(&(pAlterSQL->name)); + if (tscValidateName(&(pAlterSQL->name)) != TSDB_CODE_SUCCESS) { + char msg[] = "invalid table name"; + setErrMsg(pCmd, msg, tListLen(msg)); + return TSDB_CODE_INVALID_SQL; + } if (setMeterID(pSql, &(pAlterSQL->name)) != TSDB_CODE_SUCCESS) { char msg[] = "table name too long"; diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index fb3113bcb5bb859f2d6a9a7110c199d345f3c10e..4de3a23aa5242e83b28541178453b04fcdbdede7 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -800,8 +800,15 @@ static int32_t validateQuoteToken(SSQLToken* pToken) { pToken->n = (uint32_t)strlen(pToken->z); int32_t k = tSQLGetToken(pToken->z, &pToken->type); - if (k != pToken->n || pToken->type != TK_ID) { - return TSDB_CODE_INVALID_SQL; + + if (k != pToken->n) { + if (pToken->type == TK_STRING) { + return tscValidateName(pToken); + } + } else { + if (pToken->type != TK_ID) { + return TSDB_CODE_INVALID_SQL; + } } return TSDB_CODE_SUCCESS; @@ -812,7 +819,7 @@ int32_t tscValidateName(SSQLToken* pToken) { return TSDB_CODE_INVALID_SQL; } - char* sep = strnchr(pToken->z, TS_PATH_DELIMITER[0], pToken->n); + char* sep = strnchrNoquote(pToken->z, TS_PATH_DELIMITER[0], pToken->n); if (sep == NULL) { // single part if (pToken->type == TK_STRING) { return validateQuoteToken(pToken); diff --git a/src/inc/tutil.h b/src/inc/tutil.h index adeb9606f506307aa6208ec2745c229091589153..dab8ef214372540870627bbece4bef97258a3732 100644 --- a/src/inc/tutil.h +++ b/src/inc/tutil.h @@ -155,6 +155,7 @@ int32_t strdequote(char *src); void strtrim(char *src); char *strnchr(char *haystack, char needle, int32_t len); +char *strnchrNoquote(char *haystack, char needle, int32_t len); char **strsplit(char *src, const char *delim, int32_t *num); diff --git a/src/util/src/tutil.c b/src/util/src/tutil.c index 39eccf15b009817bb317d54600efbc42837c9306..2b130236f1a2164ebc28de4eca3afb8f5109e18c 100644 --- a/src/util/src/tutil.c +++ b/src/util/src/tutil.c @@ -131,6 +131,26 @@ char *strnchr(char *haystack, char needle, int32_t len) { return NULL; } +char *strnchrNoquote(char *haystack, char needle, int32_t len) { + for (int32_t i = 0; i < len; ++i) { + if (haystack[i] == '\'' || haystack[i] == '"') { + char quote = haystack[i++]; + while(i < len && haystack[i] != quote){++i;} + + if (++i >= len) { + return NULL; + } + } + + if (haystack[i] == needle) { + return &haystack[i]; + } + } + + return NULL; +} + + void strtolower(char *z, char *dst) { int quote = 0; char *str = z;