diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 04cfc60c8db39bff9867afe04b644c0e8001945f..4574f7db509bd74ed6ef1b610f8ba3f16786a8dd 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1910,8 +1910,16 @@ static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumn SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, pIndex->columnIndex); - char* colName = (pItem->aliasName == NULL) ? pSchema->name : pItem->aliasName; - tstrncpy(pExpr->base.aliasName, colName, sizeof(pExpr->base.aliasName)); + if (pItem->aliasName){ + tstrncpy(pExpr->base.aliasName, pItem->aliasName, sizeof(pExpr->base.aliasName)); + }else { + if (pSchema->type == TSDB_DATA_TYPE_JSON && pItem->pNode->tokenId == TK_ARROW) { + tstrncpy(pExpr->base.aliasName, pItem->pNode->exprToken.z, + (pItem->pNode->exprToken.n + 1) < sizeof(pExpr->base.aliasName) ? (pItem->pNode->exprToken.n + 1) : sizeof(pExpr->base.aliasName)); + } else { + tstrncpy(pExpr->base.aliasName, pSchema->name, sizeof(pExpr->base.aliasName)); + } + } SColumnList ids = {0}; ids.num = 1; @@ -2261,6 +2269,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t const char* msg3 = "tbname not allowed in outer query"; const char* msg4 = "-> operate can only used in json type"; const char* msg5 = "the right value of -> operation must be string"; + const char* msg6 = "select name is too long than 64, please use alias name"; int32_t startPos = (int32_t)tscNumOfExprs(pQueryInfo); int32_t tokenId = pItem->pNode->tokenId; @@ -2369,10 +2378,10 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t if (tokenId == TK_ARROW && pSchema->type != TSDB_DATA_TYPE_JSON) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); } - if(pSchema->type == TSDB_DATA_TYPE_JSON && tokenId == TK_ARROW){ - pItem->aliasName = calloc(1, pItem->pNode->exprToken.n + 1); - memcpy(pItem->aliasName, pItem->pNode->exprToken.z, pItem->pNode->exprToken.n); + if (pSchema->type == TSDB_DATA_TYPE_JSON && tokenId == TK_ARROW && pItem->pNode->exprToken.n >= TSDB_COL_NAME_LEN){ + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg6); } + addProjectQueryCol(pQueryInfo, startPos, &index, pItem, getNewResColId(pCmd)); pQueryInfo->type |= TSDB_QUERY_TYPE_PROJECTION_QUERY; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 62f754806f719fd07f2cbbe462b116da866c9b07..8f36452b7b04736d1ddd22ebe7c97c6a36dc824e 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -855,6 +855,7 @@ static int32_t serializeSqlExpr(SSqlExpr* pExpr, STableMetaInfo* pTableMetaInfo, pSqlExpr->numOfParams = htons(pExpr->numOfParams); pSqlExpr->resColId = htons(pExpr->resColId); pSqlExpr->flist.numOfFilters = htons(pExpr->flist.numOfFilters); + tstrncpy(pSqlExpr->aliasName, pExpr->aliasName, TSDB_COL_NAME_LEN); (*pMsg) += sizeof(SSqlExpr); for (int32_t j = 0; j < pExpr->numOfParams; ++j) { // todo add log diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index bf4796a87c5260d5f6c7f241bfbfdc63ff084c9f..444362b53f06a93d06984b10cecf5f52ebe69079 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -227,7 +227,7 @@ do { \ #define TSDB_MAX_JSON_TAGS_LEN (4096*TSDB_NCHAR_SIZE + 2 + 1) // 2->var_header_len 1->type #define TSDB_MAX_TAGS 128 #define TSDB_MAX_TAG_CONDITIONS 1024 -#define TSDB_MAX_JSON_KEY_LEN 256 +#define TSDB_MAX_JSON_KEY_LEN 65 #define TSDB_MAX_JSON_KEY_MD5_LEN 16 #define TSDB_AUTH_LEN 16 diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index fa57982c3b95e7a80bf5a790720d6e4ea3f93f01..69ed3582aa49bf60a7f1a952dbf6de0149487191 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -260,7 +260,7 @@ typedef struct SSchema { typedef struct TagJsonSSchema { uint8_t type; - char name[TSDB_MAX_JSON_KEY_LEN + 1]; + char name[TSDB_MAX_JSON_KEY_LEN]; } TagJsonSSchema; typedef struct { diff --git a/src/query/src/queryMain.c b/src/query/src/queryMain.c index 1ead8f60315af3e88199ddf4a49ca66824c4ac0b..dae0a237489ba3b0c5c642cfe0a796122bf5747a 100644 --- a/src/query/src/queryMain.c +++ b/src/query/src/queryMain.c @@ -84,7 +84,7 @@ static void* setJsonTagSchema(void* tsdb, int16_t numOfOutput, SExprInfo *pExprs if (sqlExpr->colType == TSDB_DATA_TYPE_JSON && sqlExpr->numOfParams > 0){ TagJsonSSchema* schema = (TagJsonSSchema*)(tmp); schema->type = TSDB_DATA_TYPE_NULL; - tstrncpy(schema->name, sqlExpr->param[0].pz, TSDB_MAX_JSON_KEY_LEN + 1); + tstrncpy(schema->name, sqlExpr->aliasName, TSDB_MAX_JSON_KEY_LEN); for (int j = 0; j < taosArrayGetSize(pTableIdList); ++j) { STableIdInfo *id = taosArrayGet(pTableIdList, j); uint8_t type = getTagJsonType(tsdb, id->uid, sqlExpr->param[0].pz, sqlExpr->param[0].nLen);