未验证 提交 c4b1e264 编写于 作者: M Minglei Jin 提交者: GitHub

Merge pull request #10863 from taosdata/fix/TS-1318-D

[TS-1318]<fix>: fixed unmatched tag columns in join queries
......@@ -662,6 +662,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
} else {
filterVgroupTables(pQueryInfo, pTableMetaInfo->pVgroupTables);
}
pQueryInfo->stableQuery = true;
}
subquerySetState(pNew, &pSql->subState, i, 0);
......@@ -935,6 +936,96 @@ static void setTidTagType(SJoinSupporter* p, uint8_t type) {
}
}
static int32_t tidTagsMerge(SArray *arr, int32_t start, int32_t mid, int32_t end, const int32_t tagSize)
{
char *pTmp, *pRes = NULL;
char *result = NULL;
STidTags *pi, *pj, *p;
int32_t k = 0;
int32_t i = start;
int32_t j = mid + 1;
if (end - start > 0) {
result = calloc(1, (end - start + 1) * tagSize);
if (result == NULL) {
tscError("failed to allocate memory for tidTagsMerge");
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
}
pRes = result;
while (i <= mid && j <= end) {
pi = taosArrayGet(arr, i);
pj = taosArrayGet(arr, j);
if (pi->vgId <= pj->vgId) {
p = taosArrayGet(arr, i++);
memcpy(pRes, p, tagSize);
} else {
p = taosArrayGet(arr, j++);
memcpy(pRes, p, tagSize);
}
k++;
pRes += tagSize;
}
if (i == mid + 1) {
while(j <= end) {
p = taosArrayGet(arr, j++);
memcpy(pRes, p, tagSize);
k++;
pRes += tagSize;
}
}
if (j == end + 1) {
while (i <= mid) {
p = taosArrayGet(arr, i++);
memcpy(pRes, p, tagSize);
k++;
pRes += tagSize;
}
}
for (i = start, j = 0, pTmp = result; j < k; i++, j++, pTmp += tagSize) {
p = (STidTags *) taosArrayGet(arr, i);
memcpy(p, pTmp, tagSize);
}
if (result) {
tfree(result);
}
return TSDB_CODE_SUCCESS;
}
static int32_t tidTagsMergeSort(SArray *arr, int32_t start, int32_t end, const int32_t tagSize)
{
int32_t ret;
int32_t mid;
if (start >= end) {
return TSDB_CODE_SUCCESS;
}
mid = (start + end) / 2;
ret = tidTagsMergeSort(arr, start, mid, tagSize);
if (ret != TSDB_CODE_SUCCESS) {
return ret;
}
ret = tidTagsMergeSort(arr, mid + 1, end, tagSize);
if (ret != TSDB_CODE_SUCCESS) {
return ret;
}
return tidTagsMerge(arr, start, mid, end, tagSize);
}
static int32_t getIntersectionOfTableTuple(SQueryInfo* pQueryInfo, SSqlObj* pParentSql, SArray* resList) {
int16_t joinNum = pParentSql->subState.numOfSub;
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
......@@ -1124,7 +1215,10 @@ static int32_t getIntersectionOfTableTuple(SQueryInfo* pQueryInfo, SSqlObj* pPar
// sort according to the tag value
size_t num = taosArrayGetSize(ctxlist[i].res);
qsort((ctxlist[i].res)->pData, num, size, tidTagsCompar);
int32_t ret = tidTagsMergeSort(ctxlist[i].res, 0, num - 1, size);
if (ret != TSDB_CODE_SUCCESS) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
taosArrayPush(resList, &ctxlist[i].res);
......
......@@ -394,7 +394,7 @@ bool tscIsPointInterpQuery(SQueryInfo* pQueryInfo) {
}
bool tscNeedTableSeqScan(SQueryInfo* pQueryInfo) {
return pQueryInfo->stableQuery && (tscQueryContainsFunction(pQueryInfo, TSDB_FUNC_TWA) || tscQueryContainsFunction(pQueryInfo, TSDB_FUNC_ELAPSED));
return pQueryInfo->stableQuery && (tscQueryContainsFunction(pQueryInfo, TSDB_FUNC_TWA) || tscQueryContainsFunction(pQueryInfo, TSDB_FUNC_ELAPSED) || (pQueryInfo->tsBuf != NULL));
}
bool tscGetPointInterpQuery(SQueryInfo* pQueryInfo) {
......
......@@ -4874,7 +4874,7 @@ static int32_t setupQueryHandle(void* tsdb, SQueryRuntimeEnv* pRuntimeEnv, int64
}
STsdbQueryCond cond = createTsdbQueryCond(pQueryAttr, &pQueryAttr->window);
if (pQueryAttr->tsCompQuery || pQueryAttr->pointInterpQuery) {
if (pQueryAttr->tsCompQuery || pQueryAttr->pointInterpQuery || pQueryAttr->needTableSeqScan) {
cond.type = BLOCK_LOAD_TABLE_SEQ_ORDER;
}
......
......@@ -183,7 +183,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle);
static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SBlock* pBlock);
static int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
static int32_t tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win, STsdbQueryHandle* pQueryHandle);
static int32_t tsdbCheckInfoCompar(const void* key1, const void* key2);
static int32_t doGetExternalRow(STsdbQueryHandle* pQueryHandle, int16_t type, SMemRef* pMemRef);
static void* doFreeColumnInfoData(SArray* pColumnInfoData);
static void* destroyTableCheckInfo(SArray* pTableCheckInfo);
......@@ -333,8 +332,6 @@ static SArray* createCheckInfoFromTableGroup(STsdbQueryHandle* pQueryHandle, STa
}
}
taosArraySort(pTableCheckInfo, tsdbCheckInfoCompar);
size_t gsize = taosArrayGetSize(pTableCheckInfo);
for (int32_t i = 0; i < gsize; ++i) {
......@@ -3911,17 +3908,6 @@ static int32_t tableGroupComparFn(const void *p1, const void *p2, const void *pa
return 0;
}
static int tsdbCheckInfoCompar(const void* key1, const void* key2) {
if (((STableCheckInfo*)key1)->tableId.tid < ((STableCheckInfo*)key2)->tableId.tid) {
return -1;
} else if (((STableCheckInfo*)key1)->tableId.tid > ((STableCheckInfo*)key2)->tableId.tid) {
return 1;
} else {
ASSERT(false);
return 0;
}
}
void createTableGroupImpl(SArray* pGroups, SArray* pTableList, size_t numOfTables, TSKEY skey,
STableGroupSupporter* pSupp, __ext_compar_fn_t compareFn) {
STable* pTable = taosArrayGetP(pTableList, 0);
......
......@@ -172,28 +172,28 @@ int tsdbSetReadTable(SReadH *pReadh, STable *pTable) {
size_t size = taosArrayGetSize(pReadh->aBlkIdx);
if (size > 0) {
while (true) {
if (pReadh->cidx >= size) {
pReadh->pBlkIdx = NULL;
break;
}
SBlockIdx *pBlkIdx = taosArrayGet(pReadh->aBlkIdx, pReadh->cidx);
int64_t left = 0, right = size - 1;
while (left <= right) {
int64_t mid = (left + right) / 2;
SBlockIdx *pBlkIdx = taosArrayGet(pReadh->aBlkIdx, (size_t)mid);
if (pBlkIdx->tid == TABLE_TID(pTable)) {
if (pBlkIdx->uid == TABLE_UID(pTable)) {
pReadh->pBlkIdx = pBlkIdx;
} else {
pReadh->pBlkIdx = NULL;
}
pReadh->cidx++;
break;
} else if (pBlkIdx->tid > TABLE_TID(pTable)) {
pReadh->pBlkIdx = NULL;
break;
} else if (pBlkIdx->tid < TABLE_TID(pTable)) {
left = mid + 1;
} else {
pReadh->cidx++;
right = mid - 1;
}
}
if (left > right) {
pReadh->pBlkIdx = NULL;
}
} else {
pReadh->pBlkIdx = NULL;
}
......
......@@ -83,8 +83,8 @@ class TDTestCase:
tdSql.checkData(3, 0, "2021-12-24 01:31:31")
tdSql.checkData(0, 1, 1)
tdSql.checkData(1, 1, 2)
tdSql.checkData(2, 1, 19)
tdSql.checkData(3, 1, 9)
tdSql.checkData(2, 1, 9)
tdSql.checkData(3, 1, 19)
tdSql.query('select ts,unique(voltage),ts,groupid,location,tbname from unique')
tdSql.checkRows(4)
......@@ -106,19 +106,19 @@ class TDTestCase:
tdSql.checkData(2, 0, "2021-12-24 01:31:31")
tdSql.checkData(2, 1, "2021-12-24 01:31:31")
tdSql.checkData(2, 2, 19)
tdSql.checkData(2, 2, 9)
tdSql.checkData(2, 3, "2021-12-24 01:31:31")
tdSql.checkData(2, 4, 2)
tdSql.checkData(2, 5, "Beijing.haidian")
tdSql.checkData(2, 6, "d002")
tdSql.checkData(2, 4, 3)
tdSql.checkData(2, 5, "Beijing.Tongzhou")
tdSql.checkData(2, 6, "d003")
tdSql.checkData(3, 0, "2021-12-24 01:31:31")
tdSql.checkData(3, 1, "2021-12-24 01:31:31")
tdSql.checkData(3, 2, 9)
tdSql.checkData(3, 2, 19)
tdSql.checkData(3, 3, "2021-12-24 01:31:31")
tdSql.checkData(3, 4, 3)
tdSql.checkData(3, 5, "Beijing.Tongzhou")
tdSql.checkData(3, 6, "d003")
tdSql.checkData(3, 4, 2)
tdSql.checkData(3, 5, "Beijing.haidian")
tdSql.checkData(3, 6, "d002")
tdSql.execute('insert into D004 values("2021-10-15 00:00:01", 10, 2) ("2021-12-24 00:21:31", 5, 2) ("2021-12-25 01:31:31", 9, 4)')
......@@ -151,9 +151,9 @@ class TDTestCase:
tdSql.query('select ts,unique(voltage) from unique group by ts')
tdSql.checkRows(9)
tdSql.checkData(1, 2, 1)
tdSql.checkData(4, 2, 1)
tdSql.checkData(4, 2, 2)
tdSql.checkData(8, 2, 1)
tdSql.checkData(6, 2, 9)
tdSql.checkData(6, 2, 19)
tdSql.checkData(7, 2, 9)
#group by tag,column
tdSql.query('select ts,unique(voltage) from unique group by location,num')
......@@ -165,13 +165,13 @@ class TDTestCase:
tdSql.query('select unique(voltage) from unique order by ts desc')
tdSql.checkRows(6)
tdSql.checkData(0, 0, "2021-12-24 01:31:31")
tdSql.checkData(0, 1, 9)
tdSql.checkData(0, 1, 19)
tdSql.checkData(5, 0, "2021-10-15 00:00:01")
tdSql.checkData(5, 1, 10)
tdSql.query('select unique(voltage) from unique order by ts')
tdSql.checkRows(6)
tdSql.checkData(5, 0, "2021-12-24 01:31:31")
tdSql.checkData(5, 1, 9)
tdSql.checkData(5, 1, 19)
tdSql.checkData(0, 0, "2021-10-15 00:00:01")
tdSql.checkData(0, 1, 10)
#order by column [desc]
......@@ -216,7 +216,7 @@ class TDTestCase:
tdSql.checkData(6, 0, "2021-12-25 01:31:31")
tdSql.checkData(6, 1, 9)
tdSql.checkData(0, 0, "2021-12-24 01:31:31")
tdSql.checkData(0, 1, 9)
tdSql.checkData(0, 1, 19)
# error
tdSql.error("select unique(ts) from unique")
......@@ -246,7 +246,7 @@ class TDTestCase:
tdSql.query('select unique(voltage) from unique where voltage > 2 limit 2 offset 1')
tdSql.checkRows(2)
tdSql.checkData(0, 1, 5)
tdSql.checkData(1, 1, 19)
tdSql.checkData(1, 1, 9)
#having
tdSql.query('select unique(voltage) from unique group by num having unique(voltage)>5')
......
......@@ -168,9 +168,9 @@ sql select * from $stb limit 2 offset $offset
if $rows != 2 then
return -1
endi
if $data00 != @18-09-17 10:30:00.002@ then
return -1
endi
#if $data00 != @18-09-17 10:30:00.002@ then
# return -1
#endi
if $data01 != 9 then
return -1
endi
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册