From 9556b5a76ee125b7d139ae8fe64791adbc9cefae Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 22 Jun 2022 14:53:46 +0800 Subject: [PATCH] feat: support case sensitive names of dbs, stables, tables, columns and tags --- .gitignore | 1 + src/client/src/tscLocal.c | 4 ++-- src/client/src/tscSQLParser.c | 33 +++++++++++-------------------- src/client/src/tscUtil.c | 6 ++++++ src/kit/shell/src/shellEngine.c | 2 +- src/mnode/src/mnodeTable.c | 4 ++-- src/plugins/monitor/src/monMain.c | 10 +++++----- 7 files changed, 28 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 0eba25231f..091e1d7361 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ build/ cmake-build-debug/ cmake-build-release/ cscope.out +cscope.files .DS_Store debug/ release/ diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 81d658d964..b3da64f011 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -533,8 +533,8 @@ static int32_t tscGetDBInfo(SCreateBuilder *builder, char *result) { memset(buf, 0, sizeof(buf)); int32_t* lengths = taos_fetch_lengths(pSql); int32_t ret = tscGetNthFieldResult(row, fields, lengths, 0, buf); - if (0 == ret && STR_NOCASE_EQUAL(buf, strlen(buf), builder->buf, strlen(builder->buf))) { - snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "CREATE DATABASE %s", buf); + if (0 == ret && 0 == strcmp(buf, builder->buf)) { + snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "CREATE DATABASE `%s`", buf); for (int i = 1; i < num_fields; i++) { for (int j = 0; showColumns[j][0] != NULL; j++) { if (STR_NOCASE_EQUAL(fields[i].name, strlen(fields[i].name), showColumns[j][0], strlen(showColumns[j][0]))) { diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index dc128a8aad..715262438d 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -606,8 +606,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { case TSDB_SQL_DROP_TABLE: case TSDB_SQL_DROP_USER: case TSDB_SQL_DROP_ACCT: - case TSDB_SQL_DROP_DNODE: - case TSDB_SQL_DROP_DB: { + case TSDB_SQL_DROP_DNODE: { const char* msg2 = "invalid name"; const char* msg3 = "param name too long"; @@ -626,14 +625,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { } } - if (pInfo->type == TSDB_SQL_DROP_DB) { - assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1); - code = tNameSetDbName(&pTableMetaInfo->name, getAccountId(pSql), pzName); - if (code != TSDB_CODE_SUCCESS) { - return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); - } - - } else if (pInfo->type == TSDB_SQL_DROP_TABLE) { + if (pInfo->type == TSDB_SQL_DROP_TABLE) { assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded); @@ -656,11 +648,12 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { break; } + case TSDB_SQL_DROP_DB: case TSDB_SQL_USE_DB: { const char* msg = "invalid db name"; SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); - if (tscValidateName(pToken, false, NULL) != TSDB_CODE_SUCCESS) { + if (tscValidateName(pToken, true, NULL) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg); } @@ -707,7 +700,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { char buf[TSDB_DB_NAME_LEN] = {0}; SStrToken token = taosTokenDup(&pCreateDB->dbname, buf, tListLen(buf)); - if (tscValidateName(&token, false, NULL) != TSDB_CODE_SUCCESS) { + if (tscValidateName(&token, true, NULL) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -820,7 +813,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); - if (tscValidateName(pToken, false, NULL) != TSDB_CODE_SUCCESS) { + if (tscValidateName(pToken, true, NULL) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -1747,7 +1740,7 @@ int32_t validateOneTag(SSqlCmd* pCmd, TAOS_FIELD* pTagField) { SSchema* pSchema = tscGetTableSchema(pTableMeta); for (int32_t i = 0; i < numOfTags + numOfCols; ++i) { - if (strncasecmp(pTagField->name, pSchema[i].name, sizeof(pTagField->name) - 1) == 0) { + if (strncmp(pTagField->name, pSchema[i].name, sizeof(pTagField->name) - 1) == 0) { //return tscErrorMsgWithCode(TSDB_CODE_TSC_DUP_COL_NAMES, tscGetErrorMsgPayload(pCmd), pTagField->name, NULL); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), "duplicated column names"); } @@ -2214,10 +2207,6 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS hasDistinct = (pItem->distinct == true); distIdx = hasDistinct ? i : -1; } - if(pItem->aliasName != NULL && validateColumnName(pItem->aliasName) != TSDB_CODE_SUCCESS){ - return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg11); - } - if(pItem->aliasName != NULL && strcasecmp(pItem->aliasName, DEFAULT_PRIMARY_TIMESTAMP_COL_NAME) == 0){ return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg11); } @@ -3600,7 +3589,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { if (pDbPrefixToken->n <= 0) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5); } - if (tscValidateName(pDbPrefixToken, false, NULL) != TSDB_CODE_SUCCESS) { + if (tscValidateName(pDbPrefixToken, true, NULL) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -6043,13 +6032,13 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr if (*pExpr == NULL) { return ret; } - + //multiple tables's query time range mixed together - + tExprNode* p = NULL; void *filter = NULL; - SArray* colList = taosArrayInit(10, sizeof(SColIndex)); + SArray* colList = taosArrayInit(10, sizeof(SColIndex)); ret = exprTreeFromSqlExpr(pCmd, &p, *pExpr, pQueryInfo, colList, NULL); taosArrayDestroy(&colList); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 9ed79a939f..ec09e791d1 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -3035,6 +3035,12 @@ int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded) } } + if (escapeEnabled && pToken->type == TK_ID) { + if (pToken->z[0] == TS_BACKQUOTE_CHAR) { + pToken->n = stringProcess(pToken->z, pToken->n); + firstPartQuote = true; + } + } int32_t firstPartLen = pToken->n; pToken->z = sep + 1; diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c index 21f27a9255..53e4b32e0c 100644 --- a/src/kit/shell/src/shellEngine.c +++ b/src/kit/shell/src/shellEngine.c @@ -301,7 +301,7 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { int64_t oresult = atomic_load_64(&result); - if (regex_match(command, "^\\s*use\\s+[a-zA-Z0-9_]+\\s*;\\s*$", REG_EXTENDED | REG_ICASE)) { + if (regex_match(command, "^\\s*use\\s+([a-zA-Z0-9_]+|`.+`)\\s*;\\s*$", REG_EXTENDED | REG_ICASE)) { fprintf(stdout, "Database changed.\n\n"); fflush(stdout); diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 116c1f41d7..cbf37f976e 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1225,7 +1225,7 @@ static int32_t mnodeProcessDropSuperTableMsg(SMnodeMsg *pMsg) { static int32_t mnodeFindSuperTableTagIndex(SSTableObj *pStable, const char *tagName) { SSchema *schema = (SSchema *) pStable->schema; for (int32_t tag = 0; tag < pStable->numOfTags; tag++) { - if (strcasecmp(schema[pStable->numOfColumns + tag].name, tagName) == 0) { + if (strcmp(schema[pStable->numOfColumns + tag].name, tagName) == 0) { return tag; } } @@ -1378,7 +1378,7 @@ static int32_t mnodeModifySuperTableTagName(SMnodeMsg *pMsg, char *oldTagName, c static int32_t mnodeFindSuperTableColumnIndex(SSTableObj *pStable, char *colName) { SSchema *schema = (SSchema *) pStable->schema; for (int32_t col = 0; col < pStable->numOfColumns; col++) { - if (strcasecmp(schema[col].name, colName) == 0) { + if (strcmp(schema[col].name, colName) == 0) { return col; } } diff --git a/src/plugins/monitor/src/monMain.c b/src/plugins/monitor/src/monMain.c index dac264e418..1ff2f0ef8d 100644 --- a/src/plugins/monitor/src/monMain.c +++ b/src/plugins/monitor/src/monMain.c @@ -719,13 +719,13 @@ static int32_t monBuildMnodesTotalSql(char *sql) { static int32_t monGetVgroupsTotalStats(char *dbName, int32_t *totalVgroups, int32_t *totalVgroupsAlive) { - char subsql[TSDB_DB_NAME_LEN + 14]; + char subsql[TSDB_DB_NAME_LEN + 16]; memset(subsql, 0, sizeof(subsql)); - snprintf(subsql, TSDB_DB_NAME_LEN + 13, "show %s.vgroups", dbName); + snprintf(subsql, sizeof(subsql) - 1, "show `%s`.vgroups", dbName); TAOS_RES *result = taos_query(tsMonitor.conn, subsql); int32_t code = taos_errno(result); if (code != TSDB_CODE_SUCCESS) { - monError("failed to execute cmd: show %s.vgroups, reason:%s", dbName, tstrerror(code)); + monError("failed to execute cmd: show `%s`.vgroups, reason:%s", dbName, tstrerror(code)); } TAOS_ROW row; @@ -1110,11 +1110,11 @@ static uint32_t monBuildVgroupsInfoSql(char *sql, char *dbName) { int64_t ts = taosGetTimestampUs(); memset(sql, 0, SQL_LENGTH + 1); - snprintf(sql, SQL_LENGTH, "show %s.vgroups", dbName); + snprintf(sql, SQL_LENGTH, "show `%s`.vgroups", dbName); TAOS_RES *result = taos_query(tsMonitor.conn, sql); int32_t code = taos_errno(result); if (code != TSDB_CODE_SUCCESS) { - monError("failed to execute cmd: show %s.vgroups, reason:%s", dbName, tstrerror(code)); + monError("failed to execute cmd: show `%s`.vgroups, reason:%s", dbName, tstrerror(code)); } TAOS_ROW row; -- GitLab