From ef24944a7fbfb68cef84663092d39282a5a59928 Mon Sep 17 00:00:00 2001 From: hjLiao Date: Thu, 14 May 2020 01:22:22 +0800 Subject: [PATCH] [TD-288] fix bug in join query. --- src/client/inc/tscUtil.h | 1 + src/client/src/tscSQLParser.c | 9 ++++----- src/client/src/tscSecondaryMerge.c | 3 ++- src/client/src/tscUtil.c | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/client/inc/tscUtil.h b/src/client/inc/tscUtil.h index 2f9a18b9fc..cc6310e9b1 100644 --- a/src/client/inc/tscUtil.h +++ b/src/client/inc/tscUtil.h @@ -134,6 +134,7 @@ void tscFieldInfoSetBinExpr(SFieldInfo* pFieldInfo, int32_t index, SSqlFunctionE void tscFieldInfoCalOffset(SQueryInfo* pQueryInfo); void tscFieldInfoCopy(SFieldInfo* src, SFieldInfo* dst, const int32_t* indexList, int32_t size); void tscFieldInfoCopyAll(SFieldInfo* dst, SFieldInfo* src); +void tscFieldInfoUpdateBySqlFunc(SQueryInfo* pQueryInfo); TAOS_FIELD* tscFieldInfoGetField(SQueryInfo* pQueryInfo, int32_t index); int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 7af6e79cd2..bfaae0595d 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1998,17 +1998,16 @@ int32_t doGetColumnIndexByName(SSQLToken* pToken, SQueryInfo* pQueryInfo, SColum } int32_t getMeterIndex(SSQLToken* pTableToken, SQueryInfo* pQueryInfo, SColumnIndex* pIndex) { + pIndex->tableIndex = COLUMN_INDEX_INITIAL_VAL; + if (pTableToken->n == 0) { // only one table and no table name prefix in column name if (pQueryInfo->numOfTables == 1) { pIndex->tableIndex = 0; } - + return TSDB_CODE_SUCCESS; } - pIndex->tableIndex = COLUMN_INDEX_INITIAL_VAL; - char tableName[TSDB_METER_ID_LEN + 1] = {0}; - for (int32_t i = 0; i < pQueryInfo->numOfTables; ++i) { SMeterMetaInfo* pMeterMetaInfo = tscGetMeterMetaInfoFromQueryInfo(pQueryInfo, i); if (strncasecmp(pMeterMetaInfo->aliasName, pTableToken->z, pTableToken->n) == 0 && @@ -5662,7 +5661,7 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) { tscAddEmptyMeterMetaInfo(pQueryInfo); } - SMeterMetaInfo* pMeterInfo1 = tscGetMeterMetaInfoFromQueryInfo(pQueryInfo, i); + SMeterMetaInfo* pMeterInfo1 = tscGetMeterMetaInfoFromQueryInfo(pQueryInfo, i/2); SSQLToken t = {.type = TSDB_DATA_TYPE_BINARY, .n = pTableItem->nLen, .z = pTableItem->pz}; if (setMeterID(pMeterInfo1, &t, pSql) != TSDB_CODE_SUCCESS) { diff --git a/src/client/src/tscSecondaryMerge.c b/src/client/src/tscSecondaryMerge.c index eac402df86..f537e7d187 100644 --- a/src/client/src/tscSecondaryMerge.c +++ b/src/client/src/tscSecondaryMerge.c @@ -259,8 +259,9 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd pReducer->rowSize = pMemBuffer[0]->nElemSize; tscRestoreSQLFunctionForMetricQuery(pQueryInfo); + tscFieldInfoUpdateBySqlFunc(pQueryInfo); tscFieldInfoCalOffset(pQueryInfo); - + if (pReducer->rowSize > pMemBuffer[0]->pageSize) { assert(false); // todo fixed row size is larger than the minimum page size; } diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index dbd3f464ea..28e063986c 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -926,6 +926,20 @@ void tscFieldInfoSetBinExpr(SFieldInfo* pFieldInfo, int32_t index, SSqlFunctionE pFieldInfo->pExpr[index] = pExpr; } +void tscFieldInfoUpdateBySqlFunc(SQueryInfo* pQueryInfo) { + for(int32_t i = 0; i < pQueryInfo->fieldsInfo.numOfOutputCols; ++i) { + TAOS_FIELD* field = tscFieldInfoGetField(pQueryInfo, i); + + SSqlExpr* pExpr = pQueryInfo->fieldsInfo.pSqlExpr[i]; + if (pExpr == NULL) { + continue; + } + + field->type = pExpr->resType; + field->bytes = pExpr->resBytes; + } +} + void tscFieldInfoCalOffset(SQueryInfo* pQueryInfo) { SSqlExprInfo* pExprInfo = &pQueryInfo->exprsInfo; pExprInfo->pExprs[0]->offset = 0; @@ -2012,6 +2026,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void // create the fields info from the sql functions SColumnList columnList = {.num = 1}; + // for avg/last/first/histo.. query, the output type is binary not numeric data type for(int32_t k = 0; k < numOfOutputCols; ++k) { SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, indexList[k]); columnList.ids[0] = (SColumnIndex){.tableIndex = tableIndex, .columnIndex = pExpr->colInfo.colIdx}; -- GitLab