提交 2679a075 编写于 作者: A Alex Duan

[TS-207]<fix>(query): compare nchar and binary with strcmp

上级 576a1574
......@@ -810,7 +810,7 @@ SSDataBlock* doMultiwayMergeSort(void* param, bool* newgroup) {
pOneDataSrc->rowIdx, pIndex->colIndex);
char *data = pInfo->prevRow[i];
int32_t ret = columnValueAscendingComparator(data, newRow, pColInfo->info.type, pColInfo->info.bytes);
int32_t ret = columnValueAscendingComparator(data, newRow, pColInfo->info.type, pColInfo->info.bytes, true);
if (ret == 0) {
continue;
} else {
......@@ -872,7 +872,7 @@ static bool isSameGroup(SArray* orderColumnList, SSDataBlock* pBlock, char** dat
assert(pIndex->colId == pColInfo->info.colId);
char *data = dataCols[i];
int32_t ret = columnValueAscendingComparator(data, pColInfo->pData, pColInfo->info.type, pColInfo->info.bytes);
int32_t ret = columnValueAscendingComparator(data, pColInfo->pData, pColInfo->info.type, pColInfo->info.bytes, true);
if (ret == 0) {
continue;
} else {
......@@ -1057,7 +1057,7 @@ static int32_t doSlimitImpl(SOperatorInfo* pOperator, SSLimitOperatorInfo* pInfo
SColumnInfo *pColInfo = &pColInfoData->info;
char *d = rowIndex * pColInfo->bytes + (char *)pColInfoData->pData;
int32_t ret = columnValueAscendingComparator(pInfo->prevRow[i], d, pColInfo->type, pColInfo->bytes);
int32_t ret = columnValueAscendingComparator(pInfo->prevRow[i], d, pColInfo->type, pColInfo->bytes, true);
if (ret != 0) { // it is a new group
samegroup = false;
break;
......
......@@ -1131,7 +1131,7 @@ public class JsonTagTest {
}
Assert.assertEquals(8, count);
Assert.assertEquals("\"femail\"", s);
Assert.assertEquals("\"收到货\"", s);
close(resultSet);
}
......
......@@ -93,9 +93,9 @@ int32_t twcslen(const wchar_t *wcs) {
}
int32_t tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int32_t bytes) {
for (int32_t i = 0; i < bytes; ++i) {
int32_t f1 = *(int32_t *)((char *)f1_ucs4 + i * 4);
int32_t f2 = *(int32_t *)((char *)f2_ucs4 + i * 4);
for (int32_t i = 0; i < bytes; i += 4) {
int32_t f1 = *(int32_t *)((char *)f1_ucs4 + i);
int32_t f2 = *(int32_t *)((char *)f2_ucs4 + i);
if ((f1 == 0 && f2 != 0) || (f1 != 0 && f2 == 0)) {
return f1 - f2;
......
......@@ -254,7 +254,7 @@ int32_t compare_d(tOrderDescriptor *, int32_t numOfRow1, int32_t s1, char *data1
struct SSDataBlock;
int32_t compare_aRv(struct SSDataBlock* pBlock, SArray* colIndex, int32_t numOfCols, int32_t rowIndex, char** buffer, int32_t order);
int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t bytes);
int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t bytes, bool lenFirst);
#ifdef __cplusplus
}
......
......@@ -9547,7 +9547,6 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SGroupbyExpr* pGroupbyExpr, S
pQueryAttr->needTableSeqScan = pQueryMsg->needTableSeqScan;
pQueryAttr->needReverseScan = pQueryMsg->needReverseScan;
pQueryAttr->stateWindow = pQueryMsg->stateWindow;
pQueryAttr->vgId = vgId;
pQueryAttr->pFilters = pFilters;
pQueryAttr->range = pQueryMsg->range;
......
......@@ -366,7 +366,7 @@ static int32_t tsCompareFunc(TSKEY k1, TSKEY k2, int32_t order) {
}
}
int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t bytes) {
int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t bytes, bool lenFirst) {
if (type == TSDB_DATA_TYPE_JSON){
bool canReturn = true;
int32_t result = jsonCompareUnit(f1, f2, &canReturn);
......@@ -388,30 +388,47 @@ int32_t columnValueAscendingComparator(char *f1, char *f2, int32_t type, int32_t
int32_t len1 = varDataLen(f1);
int32_t len2 = varDataLen(f2);
if (len1 != len2) {
return len1 > len2? 1:-1;
} else {
int32_t ret = strncmp(varDataVal(f1), varDataVal(f2), len1);
if (ret == 0) {
// length first compare
if(lenFirst) {
if(len1 > len2)
return 1;
else if( len1 < len2)
return -1;
}
// compare context
int32_t ret = strncmp(varDataVal(f1), varDataVal(f2), len1>len2 ? len2:len1);
if (ret == 0) {
if (len1 > len2)
return 1;
else if(len1 < len2)
return -1;
else
return 0;
}
return (ret < 0) ? -1 : 1;
}
return (ret < 0) ? -1 : 1;
};
case TSDB_DATA_TYPE_NCHAR: { // todo handle the var string compare
int32_t len1 = varDataLen(f1);
int32_t len2 = varDataLen(f2);
if (len1 != len2) {
return len1 > len2 ? 1 : -1;
} else {
int32_t ret = tasoUcs4Compare(varDataVal(f1), varDataVal(f2), len1);
if (ret == 0) {
// length first compare
if(lenFirst) {
if(len1 > len2)
return 1;
else if( len1 < len2)
return -1;
}
// compare context
int32_t ret = tasoUcs4Compare(varDataVal(f1), varDataVal(f2), len1>len2 ? len2:len1);
if (ret == 0) {
if (len1 > len2)
return 1;
else if(len1 < len2)
return -1;
else
return 0;
}
return (ret < 0) ? -1 : 1;
}
return (ret < 0) ? -1 : 1;
};
case TSDB_DATA_TYPE_UTINYINT: DEFAULT_COMP(GET_UINT8_VAL(f1), GET_UINT8_VAL(f2));
case TSDB_DATA_TYPE_USMALLINT: DEFAULT_COMP(GET_UINT16_VAL(f1), GET_UINT16_VAL(f2));
......@@ -442,7 +459,7 @@ int32_t compare_a(tOrderDescriptor *pDescriptor, int32_t numOfRows1, int32_t s1,
}
} else {
SSchemaEx *pSchema = &pDescriptor->pColumnModel->pFields[colIdx];
int32_t ret = columnValueAscendingComparator(f1, f2, pSchema->field.type, pSchema->field.bytes);
int32_t ret = columnValueAscendingComparator(f1, f2, pSchema->field.type, pSchema->field.bytes, strcmp(pSchema->field.name, TSQL_TBNAME_L) == 0);
if (ret == 0) {
continue;
} else {
......@@ -471,7 +488,7 @@ int32_t compare_aRv(SSDataBlock* pBlock, SArray* colIndex, int32_t numOfCols, in
return ret;
}
} else {
int32_t ret = columnValueAscendingComparator(data, buffer[i], pColInfo->info.type, pColInfo->info.bytes);
int32_t ret = columnValueAscendingComparator(data, buffer[i], pColInfo->info.type, pColInfo->info.bytes, false);
if (ret == 0) {
continue;
} else {
......@@ -503,7 +520,7 @@ int32_t compare_d(tOrderDescriptor *pDescriptor, int32_t numOfRows1, int32_t s1,
}
} else {
SSchemaEx *pSchema = &pDescriptor->pColumnModel->pFields[colIdx];
int32_t ret = columnValueAscendingComparator(f1, f2, pSchema->field.type, pSchema->field.bytes);
int32_t ret = columnValueAscendingComparator(f1, f2, pSchema->field.type, pSchema->field.bytes, strcmp(pSchema->field.name, TSQL_TBNAME_L) == 0);
if (ret == 0) {
continue;
} else {
......
......@@ -34,7 +34,6 @@ class TDTestCase:
def run(self):
tdSql.prepare()
print("============== STEP 1 ===== prepare data & validate json string")
tdSql.error("create table if not exists jsons1(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json, tagint int)")
tdSql.error("create table if not exists jsons1(ts timestamp, data json) tags(tagint int)")
......@@ -379,8 +378,8 @@ class TDTestCase:
tdSql.error("select count(*) from jsons1 group by jtag->'tag1' order by jtag")
tdSql.query("select count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' desc")
tdSql.checkRows(8)
tdSql.checkData(0, 0, 2)
tdSql.checkData(0, 1, '"femail"')
tdSql.checkData(1, 0, 2)
tdSql.checkData(1, 1, '"femail"')
tdSql.checkData(2, 0, 1)
tdSql.checkData(2, 1, 11)
tdSql.checkData(5, 0, 1)
......@@ -398,8 +397,8 @@ class TDTestCase:
tdSql.checkData(2, 1, "false")
tdSql.checkData(5, 0, 1)
tdSql.checkData(5, 1, 11)
tdSql.checkData(7, 0, 2)
tdSql.checkData(7, 1, '"femail"')
tdSql.checkData(6, 0, 2)
tdSql.checkData(6, 1, '"femail"')
# test stddev with group by json tag
tdSql.query("select stddev(dataint) from jsons1 group by jtag->'tag1'")
......@@ -407,8 +406,8 @@ class TDTestCase:
tdSql.checkData(0, 1, None)
tdSql.checkData(1, 0, 0)
tdSql.checkData(1, 1, "null")
tdSql.checkData(7, 0, 11)
tdSql.checkData(7, 1, '"femail"')
tdSql.checkData(6, 0, 11)
tdSql.checkData(6, 1, '"femail"')
res = tdSql.getColNameList("select stddev(dataint) from jsons1 group by jsons1.jtag->'tag1'")
cname_list = []
......@@ -422,8 +421,8 @@ class TDTestCase:
tdSql.checkData(0, 1, 4)
tdSql.checkData(1, 1, 24)
tdSql.checkData(1, 2, None)
tdSql.checkData(10, 1, 1)
tdSql.checkData(10, 2, '"femail"')
tdSql.checkData(8, 1, 1)
tdSql.checkData(8, 2, '"femail"')
# test having
tdSql.query("select stddev(dataint) from jsons1 group by jtag->'tag1' having stddev(dataint) > 0")
......@@ -437,7 +436,7 @@ class TDTestCase:
tdSql.query("select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)")
tdSql.checkRows(11)
tdSql.checkData(0, 0, '"femail"')
tdSql.checkData(1, 0, '"femail"')
tdSql.checkData(2, 0, 5)
res = tdSql.getColNameList("select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)")
......
......@@ -135,9 +135,9 @@ class TDTestCase:
tdSql.execute("insert into std3 values(now + 5s, 4);")
tdSql.execute("insert into std3 values(now + 6s, 8);")
tdSql.query("select stddev(col1) from stdtable group by loc;")
tdSql.checkData(0, 0, 2.0)
tdSql.checkData(2, 0, 2.0)
tdSql.checkData(1, 0, 0.5)
tdSql.checkData(2, 0, 0.5)
tdSql.checkData(0, 0, 0.5)
tdSql.execute("create table stdtableint(ts timestamp, col1 int) tags(num int)")
tdSql.execute("create table stdint1 using stdtableint tags(1)")
......
......@@ -18,6 +18,8 @@ from util.cases import *
from util.sql import *
import numpy as np
# constant define
WAITS = 5 # wait seconds
class TDTestCase:
def init(self, conn, logSql):
......@@ -67,9 +69,7 @@ class TDTestCase:
"%s failed: sql:%s, the order provided for col:%d is not correct" %
(callerFilename, tdSql.sql, col))
def run(self):
tdSql.prepare()
def test_base(self):
print("======= step 1: create table and insert data =========")
tdLog.debug(
''' create table st(ts timestamp, tbcol1 tinyint, tbcol2 smallint, tbcol3 int, tbcol4 bigint, tbcol5 float, tbcol6 double,
......@@ -183,6 +183,44 @@ class TDTestCase:
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
def create_insert_data(self):
sql = "create table sb(ts timestamp, i1 int) tags(t_b1 binary(32), t_n1 nchar(64));"
tdSql.execute(sql)
for i in range(20):
value = "%s%s%s" % (chr(64+i),chr(64+i),chr(65+i))
if i%10 == 5:
value += "_%s" % (chr(66+i))
if i%10 == 0:
value += "_%s" % (chr(67+i))
sql = "insert into b%d using sb tags('A%s', 'B%s') values(now, %d);"%(i, value, value, i+1000)
tdSql.execute(sql)
def test_groupby_order(self):
# create and insert data
print("======= group order step 1: create table and insert data =========")
self.create_insert_data()
# do query
print("======= group order step 2: do query =========")
# ASC
sql = "select count(*) from sb group by t_b1 order by t_b1 asc;"
tdSql.execute(sql)
tdSql.waitedQuery(sql, 20, WAITS)
tdSql.checkData(0, 1, "A@@A_C")
tdSql.checkData(5, 1, "AEEF_G")
tdSql.checkData(19, 1, "ASST")
#DESC
sql = "select count(*) from sb group by t_b1 order by t_b1 desc;"
tdSql.execute(sql)
tdSql.waitedQuery(sql, 20, WAITS)
tdSql.checkData(19, 1, "A@@A_C")
tdSql.checkData(4, 1, "AOOP_Q")
tdSql.checkData(0, 1, "ASST")
def run(self):
tdSql.prepare()
self.test_base()
self.test_groupby_order()
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册