From 9b6a1ab42f5f32ec100fe22a85f93970faad7ba3 Mon Sep 17 00:00:00 2001 From: huili Date: Tue, 23 Jul 2019 19:33:28 +0800 Subject: [PATCH] [Support using capitalized by table/db name] --- src/client/src/tscSQLParser.c | 31 +++++++++++++++++++++++++------ src/client/src/tscUtil.c | 13 ++++++++++--- src/inc/tutil.h | 1 + src/util/src/tutil.c | 20 ++++++++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 8220d483f1..243ef5bf7e 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 fb3113bcb5..4de3a23aa5 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 adeb9606f5..dab8ef2143 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 39eccf15b0..2b130236f1 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; -- GitLab