[td-225] fix bugs in tags retrieval
This commit is contained in:
parent
7fd0fc2bf0
commit
3d16404e19
|
@ -6417,6 +6417,22 @@ int32_t qKillQuery(qinfo_t qinfo) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void doSetTagValueToResultBuf(char* output, const char* val, int16_t type, int16_t bytes) {
|
||||||
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (val == NULL) {
|
||||||
|
setVardataNull(output, type);
|
||||||
|
} else {
|
||||||
|
memcpy(output, val, varDataTLen(val));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (val == NULL) {
|
||||||
|
setNull(output, type, bytes);
|
||||||
|
} else { // todo here stop will cause client crash
|
||||||
|
memcpy(output, val, bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void buildTagQueryResult(SQInfo* pQInfo) {
|
static void buildTagQueryResult(SQInfo* pQInfo) {
|
||||||
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||||
SQuery * pQuery = pRuntimeEnv->pQuery;
|
SQuery * pQuery = pRuntimeEnv->pQuery;
|
||||||
|
@ -6473,25 +6489,11 @@ static void buildTagQueryResult(SQInfo* pQInfo) {
|
||||||
output += sizeof(pQInfo->vgId);
|
output += sizeof(pQInfo->vgId);
|
||||||
|
|
||||||
if (pExprInfo->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
if (pExprInfo->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
||||||
char *data = tsdbGetTableName(item->pTable);
|
char* data = tsdbGetTableName(item->pTable);
|
||||||
memcpy(output, data, varDataTLen(data));
|
memcpy(output, data, varDataTLen(data));
|
||||||
} else {
|
} else {
|
||||||
char *val = tsdbGetTableTagVal(item->pTable, pExprInfo->base.colInfo.colId, type, bytes);
|
char* data = tsdbGetTableTagVal(item->pTable, pExprInfo->base.colInfo.colId, type, bytes);
|
||||||
|
doSetTagValueToResultBuf(output, data, 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 {
|
|
||||||
if (val == NULL) {
|
|
||||||
setNull(output, type, bytes);
|
|
||||||
} else { // todo here stop will cause client crash
|
|
||||||
memcpy(output, val, bytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
count += 1;
|
count += 1;
|
||||||
|
@ -6509,39 +6511,43 @@ static void buildTagQueryResult(SQInfo* pQInfo) {
|
||||||
count = 0;
|
count = 0;
|
||||||
SSchema tbnameSchema = tGetTableNameColumnSchema();
|
SSchema tbnameSchema = tGetTableNameColumnSchema();
|
||||||
|
|
||||||
int32_t maxNumOfTables = (pQuery->limit.limit < pQuery->rec.capacity)? pQuery->limit.limit:pQuery->rec.capacity;
|
int32_t maxNumOfTables = pQuery->rec.capacity;
|
||||||
|
if (pQuery->limit.limit >= 0 && pQuery->limit.limit < pQuery->rec.capacity) {
|
||||||
|
maxNumOfTables = pQuery->limit.limit;
|
||||||
|
}
|
||||||
|
|
||||||
while(pQInfo->tableIndex < num && count < maxNumOfTables) {
|
while(pQInfo->tableIndex < num && count < maxNumOfTables) {
|
||||||
int32_t i = pQInfo->tableIndex++;
|
int32_t i = pQInfo->tableIndex++;
|
||||||
|
|
||||||
|
// discard current result due to offset
|
||||||
|
if (pQuery->limit.offset > 0) {
|
||||||
|
pQuery->limit.offset -= 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SExprInfo* pExprInfo = pQuery->pSelectExpr;
|
SExprInfo* pExprInfo = pQuery->pSelectExpr;
|
||||||
STableQueryInfo* item = taosArrayGetP(pa, i);
|
STableQueryInfo* item = taosArrayGetP(pa, i);
|
||||||
|
|
||||||
|
char *data = NULL, *dst = NULL;
|
||||||
|
int16_t type = 0, bytes = 0;
|
||||||
for(int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
for(int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
||||||
if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
|
||||||
char* data = tsdbGetTableName(item->pTable);
|
|
||||||
char* dst = pQuery->sdata[j]->data + count * tbnameSchema.bytes;
|
|
||||||
memcpy(dst, data, varDataTLen(data));
|
|
||||||
} else {// todo refactor
|
|
||||||
int16_t type = pExprInfo[j].type;
|
|
||||||
int16_t bytes = pExprInfo[j].bytes;
|
|
||||||
|
|
||||||
char* data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.colInfo.colId, type, bytes);
|
|
||||||
char* dst = pQuery->sdata[j]->data + count * pExprInfo[j].bytes;
|
|
||||||
|
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
||||||
if (data == NULL) {
|
bytes = tbnameSchema.bytes;
|
||||||
setVardataNull(dst, type);
|
type = tbnameSchema.type;
|
||||||
} else {
|
|
||||||
memcpy(dst, data, varDataTLen(data));
|
data = tsdbGetTableName(item->pTable);
|
||||||
}
|
dst = pQuery->sdata[j]->data + count * tbnameSchema.bytes;
|
||||||
} else {
|
} else {
|
||||||
if (data == NULL) {
|
type = pExprInfo[j].type;
|
||||||
setNull(dst, type, bytes);
|
bytes = pExprInfo[j].bytes;
|
||||||
} else {
|
|
||||||
memcpy(dst, data, pExprInfo[j].bytes);
|
data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.colInfo.colId, type, bytes);
|
||||||
}
|
dst = pQuery->sdata[j]->data + count * pExprInfo[j].bytes;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doSetTagValueToResultBuf(dst, data, type, bytes);
|
||||||
}
|
}
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,21 @@ if $data03 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql select tag1 from st2 limit 20 offset 1
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select tag1 from st2 limit 10 offset 2
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select tag1 from st2 limit 0 offset 0
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
sql create table st3 using mt2 tags (NULL, 'ABC', 103, 'FALSE')
|
sql create table st3 using mt2 tags (NULL, 'ABC', 103, 'FALSE')
|
||||||
sql select tag1, tag2, tag3, tag5 from st3
|
sql select tag1, tag2, tag3, tag5 from st3
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
|
|
Loading…
Reference in New Issue