From e5b484f75334fcdebabebd1dff1355e2ceb8684e Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 5 Jun 2020 18:47:51 +0800 Subject: [PATCH] [td-225] support tbid(tbname) query --- src/client/src/tscSQLParser.c | 28 +++++++++++++---- src/query/src/qExecutor.c | 58 ++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index bfa8a93791..ba012f414e 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1881,22 +1881,38 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIndex, tSQLExpr // functions can not be applied to normal columns int32_t numOfCols = tscGetNumOfColumns(pTableMetaInfo->pTableMeta); - if (index.columnIndex < numOfCols) { + if (index.columnIndex < numOfCols && index.columnIndex != TSDB_TBNAME_COLUMN_INDEX) { return invalidSqlErrMsg(pQueryInfo->msg, msg6); } - index.columnIndex -= numOfCols; + if (index.columnIndex > 0) { + index.columnIndex -= numOfCols; + } // 2. valid the column type - int16_t colType = pSchema[index.columnIndex].type; - if (colType == TSDB_DATA_TYPE_BOOL || colType >= TSDB_DATA_TYPE_BINARY) { + int16_t colType = 0; + if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { + colType = TSDB_DATA_TYPE_BINARY; + } else { + colType = pSchema[index.columnIndex].type; + } + + if (colType == TSDB_DATA_TYPE_BOOL) { return invalidSqlErrMsg(pQueryInfo->msg, msg1); } tscColumnListInsert(pTableMetaInfo->tagColList, &index); SSchema* pTagSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta); - SSchema s = pTagSchema[index.columnIndex]; - + + SSchema s = {0}; + if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { + s.bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + s.type = TSDB_DATA_TYPE_BINARY; + s.colId = TSDB_TBNAME_COLUMN_INDEX; + } else { + s = pTagSchema[index.columnIndex]; + } + int16_t bytes = 0; int16_t type = 0; int32_t inter = 0; diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 6c498d7b46..fd718f4ac0 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -4942,9 +4942,12 @@ static bool validateQuerySourceCols(SQueryTableMsg *pQueryMsg, SSqlFuncMsg** pEx return false; } else if (numOfTotal == 0) { for(int32_t i = 0; i < pQueryMsg->numOfOutput; ++i) { - if (pExprMsg[i]->functionId != TSDB_FUNC_TAGPRJ) { - return false; + if ((pExprMsg[i]->functionId == TSDB_FUNC_TAGPRJ) || + (pExprMsg[i]->functionId == TSDB_FUNC_TID_TAG && pExprMsg[i]->colInfo.colId == TSDB_TBNAME_COLUMN_INDEX)) { + continue; } + + return false; } } @@ -6035,53 +6038,58 @@ static void buildTagQueryResult(SQInfo* pQInfo) { num = taosArrayGetSize(pa); assert(num == pQInfo->groupInfo.numOfTables); -// int16_t type, bytes; - int32_t functionId = pQuery->pSelectExpr[0].base.functionId; if (functionId == TSDB_FUNC_TID_TAG) { // return the tags & table Id assert(pQuery->numOfOutput == 1); + SExprInfo* pExprInfo = &pQuery->pSelectExpr[0]; - int32_t rsize = pExprInfo->bytes; for(int32_t i = 0; i < num; ++i) { - SGroupItem* item = taosArrayGet(pa, i); + SGroupItem *item = taosArrayGet(pa, i); - char* output = pQuery->sdata[0]->data + i * rsize; + char *output = pQuery->sdata[0]->data + i * rsize; varDataSetLen(output, rsize - VARSTR_HEADER_SIZE); - + output = varDataVal(output); - *(int64_t*) output = item->id.uid; // memory align problem, todo serialize + *(int64_t *)output = item->id.uid; // memory align problem, todo serialize output += sizeof(item->id.uid); - *(int32_t*) output = item->id.tid; + *(int32_t *)output = item->id.tid; output += sizeof(item->id.tid); - *(int32_t*) output = pQInfo->vgId; + *(int32_t *)output = pQInfo->vgId; output += sizeof(pQInfo->vgId); int16_t bytes = pExprInfo->bytes; int16_t type = pExprInfo->type; - - char* val = tsdbGetTableTagVal(pQInfo->tsdb, &item->id, pExprInfo->base.colInfo.colId, type, bytes); - - // todo refactor - if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { - if (val == NULL) { - setVardataNull(output, type); - } else { - memcpy(output, val, varDataTLen(val)); - } + + if (pExprInfo->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { + char *data = tsdbGetTableName(pQInfo->tsdb, &item->id); + memcpy(output, data, varDataTLen(data)); } else { - if (val == NULL) { - setNull(output, type, bytes); + char *val = tsdbGetTableTagVal(pQInfo->tsdb, &item->id, pExprInfo->base.colInfo.colId, type, bytes); + + // todo refactor + if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { + if (val == NULL) { + setVardataNull(output, type); + } else { + memcpy(output, val, varDataTLen(val)); + } } else { - memcpy(output, val, bytes); + if (val == NULL) { + setNull(output, type, bytes); + } else { + memcpy(output, val, bytes); + } } } } - + + pQInfo->tableIndex = pQInfo->groupInfo.numOfTables; qTrace("QInfo:%p create (tableId, tag) info completed, rows:%d", pQInfo, num); + } else { // return only the tags|table name etc. for(int32_t i = 0; i < num; ++i) { SExprInfo* pExprInfo = pQuery->pSelectExpr; -- GitLab