diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 5ffdcd216780368e54903d413aa8c530b49136da..3835cda2a76967fafe850bd1c4943872ac4a7a89 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -26,7 +26,7 @@ #include "tschemautil.h" #include "tname.h" -static void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, size_t valueLength); +static void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, int16_t type, size_t valueLength); static int32_t getToStringLength(const char *pData, int32_t length, int32_t type) { char buf[512] = {0}; @@ -275,22 +275,37 @@ static void tscProcessCurrentUser(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, pSql->pTscObj->user, pExpr->aliasName, TSDB_USER_LEN); + pExpr->resBytes = TSDB_USER_LEN + TSDB_DATA_TYPE_BINARY; + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + char* vx = calloc(1, pExpr->resBytes); + STR_WITH_MAXSIZE_TO_VARSTR(vx, pSql->pTscObj->user, TSDB_USER_LEN); + + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + free(vx); } static void tscProcessCurrentDB(SSqlObj *pSql) { char db[TSDB_DB_NAME_LEN + 1] = {0}; extractDBName(pSql->pTscObj->db, db); - // no use db is invoked before. - if (strlen(db) == 0) { - setNull(db, TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN); - } - SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, db, pExpr->aliasName, TSDB_DB_NAME_LEN); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(db); + pExpr->resBytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE; + + char* vx = calloc(1, pExpr->resBytes); + if (t == 0) { + setVardataNull(vx, TSDB_DATA_TYPE_BINARY); + } else { + STR_WITH_SIZE_TO_VARSTR(vx, db, t); + } + + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + free(vx); } static void tscProcessServerVer(SSqlObj *pSql) { @@ -298,14 +313,32 @@ static void tscProcessServerVer(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, v, pExpr->aliasName, tListLen(pSql->pTscObj->sversion)); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(v); + pExpr->resBytes = t + VARSTR_HEADER_SIZE; + + char* vx = calloc(1, pExpr->resBytes); + STR_WITH_SIZE_TO_VARSTR(vx, v, t); + tscSetLocalQueryResult(pSql, vx, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + + tfree(vx); } static void tscProcessClientVer(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, version, pExpr->aliasName, strlen(version)); + pExpr->resType = TSDB_DATA_TYPE_BINARY; + + size_t t = strlen(version); + pExpr->resBytes = t + VARSTR_HEADER_SIZE; + + char* v = calloc(1, pExpr->resBytes); + STR_WITH_SIZE_TO_VARSTR(v, version, t); + tscSetLocalQueryResult(pSql, v, pExpr->aliasName, pExpr->resType, pExpr->resBytes); + + tfree(v); } static void tscProcessServStatus(SSqlObj *pSql) { @@ -325,10 +358,11 @@ static void tscProcessServStatus(SSqlObj *pSql) { SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, 0); - tscSetLocalQueryResult(pSql, "1", pExpr->aliasName, 2); + int32_t val = 1; + tscSetLocalQueryResult(pSql, (char*) &val, pExpr->aliasName, TSDB_DATA_TYPE_INT, sizeof(int32_t)); } -void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, size_t valueLength) { +void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnName, int16_t type, size_t valueLength) { SSqlCmd *pCmd = &pSql->cmd; SSqlRes *pRes = &pSql->res; @@ -338,8 +372,10 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa pQueryInfo->order.order = TSDB_ORDER_ASC; tscFieldInfoClear(&pQueryInfo->fieldsInfo); + pQueryInfo->fieldsInfo.pFields = taosArrayInit(1, sizeof(TAOS_FIELD)); + pQueryInfo->fieldsInfo.pSupportInfo = taosArrayInit(1, sizeof(SFieldSupInfo)); - TAOS_FIELD f = tscCreateField(TSDB_DATA_TYPE_BINARY, columnName, valueLength); + TAOS_FIELD f = tscCreateField(type, columnName, valueLength); tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); tscInitResObjForLocalQuery(pSql, 1, valueLength); @@ -348,7 +384,7 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa SFieldSupInfo* pInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, 0); pInfo->pSqlExpr = taosArrayGetP(pQueryInfo->exprList, 0); - strncpy(pRes->data, val, pField->bytes); + memcpy(pRes->data, val, pField->bytes); } int tscProcessLocalCmd(SSqlObj *pSql) { @@ -385,7 +421,7 @@ int tscProcessLocalCmd(SSqlObj *pSql) { // keep the code in local variable in order to avoid invalid read in case of async query int32_t code = pSql->res.code; if (code == TSDB_CODE_SUCCESS) { - (*pSql->fp)(pSql->param, pSql, 0); + (*pSql->fp)(pSql->param, pSql, code); } else { tscQueueAsyncRes(pSql); } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index ba012f414e4fb5916b5f04292e2ff861533cd610..32ec0a0db12522abf2f78fe371f8ac2d452c6950 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -5395,20 +5395,15 @@ int32_t doLocalQueryProcess(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) { switch (index) { case 0: - pQueryInfo->command = TSDB_SQL_CURRENT_DB; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CURRENT_DB;break; case 1: - pQueryInfo->command = TSDB_SQL_SERV_VERSION; - return TSDB_CODE_SUCCESS; - case 2: - pQueryInfo->command = TSDB_SQL_SERV_STATUS; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_SERV_VERSION;break; + case 2: + pQueryInfo->command = TSDB_SQL_SERV_STATUS;break; case 3: - pQueryInfo->command = TSDB_SQL_CLI_VERSION; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CLI_VERSION;break; case 4: - pQueryInfo->command = TSDB_SQL_CURRENT_USER; - return TSDB_CODE_SUCCESS; + pQueryInfo->command = TSDB_SQL_CURRENT_USER;break; default: { return invalidSqlErrMsg(pQueryInfo->msg, msg3); } } @@ -5418,6 +5413,8 @@ int32_t doLocalQueryProcess(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) { const char* name = (pExprList->a[0].aliasName != NULL)? pExprList->a[0].aliasName:functionsInfo[index].name; strncpy(pExpr1->aliasName, name, tListLen(pExpr1->aliasName)); + + return TSDB_CODE_SUCCESS; } // can only perform the parameters based on the macro definitation diff --git a/src/client/src/tscSchemaUtil.c b/src/client/src/tscSchemaUtil.c index ce36a73bfc0b681df3872e3b84309e05e9515b47..59415f842e8763373aa3d089130eca1d320f80c5 100644 --- a/src/client/src/tscSchemaUtil.c +++ b/src/client/src/tscSchemaUtil.c @@ -131,13 +131,6 @@ SSchema* tscGetTableColumnSchema(const STableMeta* pTableMeta, int32_t startCol) assert(pTableMeta != NULL); SSchema* pSchema = (SSchema*) pTableMeta->schema; -#if 0 - if (pTableMeta->tableType == TSDB_CHILD_TABLE) { - assert (pTableMeta->pSTable != NULL); - pSchema = pTableMeta->pSTable->schema; - } -#endif - return &pSchema[startCol]; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index d8621f526b65a32835f8e0345e955eac1cb9eb41..d2e6e0ac3fa229449bf9ed3fe564367c5f0d75c9 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1391,22 +1391,9 @@ int tscProcessDescribeTableRsp(SSqlObj *pSql) { return tscLocalResultCommonBuilder(pSql, numOfRes); } -int tscProcessTagRetrieveRsp(SSqlObj *pSql) { -// SSqlCmd *pCmd = &pSql->cmd; - -// SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex); -// STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); - - int32_t numOfRes = 0; -#if 0 - if (tscSqlExprGet(pQueryInfo, 0)->functionId == TSDB_FUNC_TAGPRJ) { - numOfRes = pTableMetaInfo->pMetricMeta->numOfTables; - } else { - numOfRes = 1; // for count function, there is only one output. - } - -#endif - +int tscProcessLocalRetrieveRsp(SSqlObj *pSql) { + int32_t numOfRes = 1; + pSql->res.completed = true; return tscLocalResultCommonBuilder(pSql, numOfRes); } @@ -2562,11 +2549,11 @@ void tscInitMsgsFp() { tscProcessMsgRsp[TSDB_SQL_RETRIEVE] = tscProcessRetrieveRspFromNode; // rsp handled by same function. tscProcessMsgRsp[TSDB_SQL_DESCRIBE_TABLE] = tscProcessDescribeTableRsp; - tscProcessMsgRsp[TSDB_SQL_CURRENT_DB] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_CURRENT_USER] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_SERV_VERSION] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_CLI_VERSION] = tscProcessTagRetrieveRsp; - tscProcessMsgRsp[TSDB_SQL_SERV_STATUS] = tscProcessTagRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CURRENT_DB] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CURRENT_USER] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_SERV_VERSION] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_CLI_VERSION] = tscProcessLocalRetrieveRsp; + tscProcessMsgRsp[TSDB_SQL_SERV_STATUS] = tscProcessLocalRetrieveRsp; tscProcessMsgRsp[TSDB_SQL_RETRIEVE_EMPTY_RESULT] = tscProcessEmptyResultRsp; diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 3f6910f0079a15b3596e07347d9d2fb2127364fa..156e727d7e7fe714cae8a46140b80da0ca6ea7e2 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -413,10 +413,6 @@ int taos_fetch_block_impl(TAOS_RES *res, TAOS_ROW *rows) { static void waitForRetrieveRsp(void *param, TAOS_RES *tres, int numOfRows) { SSqlObj* pSql = (SSqlObj*) tres; - - if (numOfRows < 0) { // set the error code - pSql->res.code = -numOfRows; - } sem_post(&pSql->rspSem); } @@ -444,7 +440,12 @@ TAOS_ROW taos_fetch_row(TAOS_RES *res) { pCmd->command == TSDB_SQL_FETCH || pCmd->command == TSDB_SQL_SHOW || pCmd->command == TSDB_SQL_SELECT || - pCmd->command == TSDB_SQL_DESCRIBE_TABLE)) { + pCmd->command == TSDB_SQL_DESCRIBE_TABLE || + pCmd->command == TSDB_SQL_SERV_STATUS || + pCmd->command == TSDB_SQL_CURRENT_DB || + pCmd->command == TSDB_SQL_SERV_VERSION || + pCmd->command == TSDB_SQL_CLI_VERSION || + pCmd->command == TSDB_SQL_CURRENT_USER )) { taos_fetch_rows_a(res, waitForRetrieveRsp, pSql->pTscObj); sem_wait(&pSql->rspSem); } diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 1b9fec7211540062f56dc29b1fcf1fdf795b89f4..811d0920f9ed280317c28aaa63e132a6dd377e34 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -965,7 +965,8 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta); pExpr->colInfo.colId = pSchema[pColIndex->columnIndex].colId; strncpy(pExpr->colInfo.name, pSchema[pColIndex->columnIndex].name, TSDB_COL_NAME_LEN); - } else { + } else if (pTableMetaInfo->pTableMeta != NULL) { + // in handling select database/version/server_status(), the pTableMeta is NULL SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pColIndex->columnIndex); pExpr->colInfo.colId = pSchema->colId; strncpy(pExpr->colInfo.name, pSchema->name, TSDB_COL_NAME_LEN); @@ -977,8 +978,12 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol pExpr->colInfo.colIndex = pColIndex->columnIndex; pExpr->resType = type; pExpr->resBytes = size; - pExpr->interBytes = interSize; - pExpr->uid = pTableMetaInfo->pTableMeta->uid; + pExpr->interBytes = interSize; + + if (pTableMetaInfo->pTableMeta) { + pExpr->uid = pTableMetaInfo->pTableMeta->uid; + } + return pExpr; }