Merge pull request #13785 from taosdata/feature/TD-14761
fix: error in schemaless with same timestamp
This commit is contained in:
commit
a5bbc0a6ac
|
@ -1327,8 +1327,8 @@ static int32_t smlKvTimeArrayCompare(const void *key1, const void *key2) {
|
||||||
static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) {
|
static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) {
|
||||||
SHashObj *s1 = *(SHashObj **)key1;
|
SHashObj *s1 = *(SHashObj **)key1;
|
||||||
SHashObj *s2 = *(SHashObj **)key2;
|
SHashObj *s2 = *(SHashObj **)key2;
|
||||||
SSmlKv *kv1 = (SSmlKv *)taosHashGet(s1, TS, TS_LEN);
|
SSmlKv *kv1 = *(SSmlKv **)taosHashGet(s1, TS, TS_LEN);
|
||||||
SSmlKv *kv2 = (SSmlKv *)taosHashGet(s2, TS, TS_LEN);
|
SSmlKv *kv2 = *(SSmlKv **)taosHashGet(s2, TS, TS_LEN);
|
||||||
ASSERT(kv1->type == TSDB_DATA_TYPE_TIMESTAMP);
|
ASSERT(kv1->type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
ASSERT(kv2->type == TSDB_DATA_TYPE_TIMESTAMP);
|
ASSERT(kv2->type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
if (kv1->i < kv2->i) {
|
if (kv1->i < kv2->i) {
|
||||||
|
@ -1340,29 +1340,13 @@ static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlDealCols(SSmlTableInfo *oneTable, bool dataFormat, SArray *cols) {
|
static int32_t smlDealCols(SSmlTableInfo* oneTable, bool dataFormat, SArray *cols){
|
||||||
if (dataFormat) {
|
if(dataFormat){
|
||||||
void *p = taosArraySearch(oneTable->cols, &cols, smlKvTimeArrayCompare, TD_GE);
|
void *p = taosArraySearch(oneTable->cols, &cols, smlKvTimeArrayCompare, TD_GT);
|
||||||
if (p == NULL) {
|
if(p == NULL){
|
||||||
taosArrayPush(oneTable->cols, &cols);
|
taosArrayPush(oneTable->cols, &cols);
|
||||||
} else { // to make the sort stable for update data
|
}else{
|
||||||
SArray *sa = (SArray *)p;
|
taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &cols);
|
||||||
SSmlKv *cur = (SSmlKv *)taosArrayGet(sa, 0);
|
|
||||||
SSmlKv *dCur = (SSmlKv *)taosArrayGet(cols, 0);
|
|
||||||
if (cur->i > dCur->i) {
|
|
||||||
taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &cols);
|
|
||||||
} else {
|
|
||||||
ASSERT(cur->i == dCur->i);
|
|
||||||
int32_t index = TARRAY_ELEM_IDX(oneTable->cols, p) + 1;
|
|
||||||
for (; index < taosArrayGetSize(oneTable->cols); index++) {
|
|
||||||
SArray *tmp = (SArray *)taosArrayGet(oneTable->cols, index);
|
|
||||||
SSmlKv *curTs = (SSmlKv *)taosArrayGet(tmp, 0);
|
|
||||||
if (curTs->i > dCur->i) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
taosArrayInsert(oneTable->cols, index, &cols);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1377,27 +1361,11 @@ static int32_t smlDealCols(SSmlTableInfo *oneTable, bool dataFormat, SArray *col
|
||||||
taosHashPut(kvHash, kv->key, kv->keyLen, &kv, POINTER_BYTES);
|
taosHashPut(kvHash, kv->key, kv->keyLen, &kv, POINTER_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *p = taosArraySearch(oneTable->cols, &kvHash, smlKvTimeHashCompare, TD_GE);
|
void *p = taosArraySearch(oneTable->cols, &kvHash, smlKvTimeHashCompare, TD_GT);
|
||||||
if (p == NULL) {
|
if(p == NULL){
|
||||||
taosArrayPush(oneTable->cols, &kvHash);
|
taosArrayPush(oneTable->cols, &kvHash);
|
||||||
} else { // to make the sort stable for update data
|
}else{
|
||||||
SHashObj *sa = (SHashObj *)p;
|
taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &kvHash);
|
||||||
SSmlKv *cur = (SSmlKv *)taosHashGet(sa, TS, TS_LEN);
|
|
||||||
SSmlKv *dCur = (SSmlKv *)taosArrayGet(cols, 0);
|
|
||||||
if (cur->i > dCur->i) {
|
|
||||||
taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &cols);
|
|
||||||
} else {
|
|
||||||
ASSERT(cur->i == dCur->i);
|
|
||||||
int32_t index = TARRAY_ELEM_IDX(oneTable->cols, p) + 1;
|
|
||||||
for (; index < taosArrayGetSize(oneTable->cols); index++) {
|
|
||||||
SHashObj *tmp = (SHashObj *)taosArrayGet(oneTable->cols, index);
|
|
||||||
SSmlKv *curTs = (SSmlKv *)taosHashGet(tmp, TS, TS_LEN);
|
|
||||||
if (curTs->i > dCur->i) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
taosArrayInsert(oneTable->cols, index, &cols);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1260,4 +1260,28 @@ TEST(testCase, sml_16368_Test) {
|
||||||
pRes = taos_schemaless_insert(taos, (char**)sql, sizeof(sql)/sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL, TSDB_SML_TIMESTAMP_MICRO_SECONDS);
|
pRes = taos_schemaless_insert(taos, (char**)sql, sizeof(sql)/sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL, TSDB_SML_TIMESTAMP_MICRO_SECONDS);
|
||||||
ASSERT_EQ(taos_errno(pRes), 0);
|
ASSERT_EQ(taos_errno(pRes), 0);
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
TEST(testCase, sml_dup_time_Test) {
|
||||||
|
TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
ASSERT_NE(taos, nullptr);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(taos, "create database if not exists dup_time schemaless 1");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
const char *sql[] = {
|
||||||
|
//"test_ms,t0=t c0=f 1626006833641",
|
||||||
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=false,c1=1i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"xcxvwjvf\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
||||||
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=T,c1=2i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"fixrzcuq\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
||||||
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=3i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"iupzdqub\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
||||||
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=4i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"yvvtzzof\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
||||||
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=5i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"vbxpilkj\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000"
|
||||||
|
};
|
||||||
|
pRes = taos_query(taos, "use dup_time");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_schemaless_insert(taos, (char**)sql, sizeof(sql)/sizeof(sql[0]), TSDB_SML_LINE_PROTOCOL, 0);
|
||||||
|
ASSERT_EQ(taos_errno(pRes), 0);
|
||||||
|
taos_free_result(pRes);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
|
@ -283,6 +283,8 @@ void sortRemoveDataBlockDupRowsRaw(STableDataBlocks* dataBuf) {
|
||||||
|
|
||||||
if (!dataBuf->ordered) {
|
if (!dataBuf->ordered) {
|
||||||
char* pBlockData = pBlocks->data;
|
char* pBlockData = pBlocks->data;
|
||||||
|
|
||||||
|
// todo. qsort is unstable, if timestamp is same, should get the last one
|
||||||
qsort(pBlockData, pBlocks->numOfRows, dataBuf->rowSize, rowDataCompar);
|
qsort(pBlockData, pBlocks->numOfRows, dataBuf->rowSize, rowDataCompar);
|
||||||
|
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -350,6 +352,8 @@ int sortRemoveDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo* pBlkKey
|
||||||
|
|
||||||
if (!dataBuf->ordered) {
|
if (!dataBuf->ordered) {
|
||||||
pBlkKeyTuple = pBlkKeyInfo->pKeyTuple;
|
pBlkKeyTuple = pBlkKeyInfo->pKeyTuple;
|
||||||
|
|
||||||
|
// todo. qsort is unstable, if timestamp is same, should get the last one
|
||||||
qsort(pBlkKeyTuple, nRows, sizeof(SBlockKeyTuple), rowDataCompar);
|
qsort(pBlkKeyTuple, nRows, sizeof(SBlockKeyTuple), rowDataCompar);
|
||||||
|
|
||||||
pBlkKeyTuple = pBlkKeyInfo->pKeyTuple;
|
pBlkKeyTuple = pBlkKeyInfo->pKeyTuple;
|
||||||
|
|
|
@ -175,7 +175,13 @@ void *taosbsearch(const void *key, const void *base, int32_t nmemb, int32_t size
|
||||||
|
|
||||||
c = compar(key, p);
|
c = compar(key, p);
|
||||||
if (c == 0) {
|
if (c == 0) {
|
||||||
break;
|
if (flags == TD_GT){
|
||||||
|
lidx = midx + 1;
|
||||||
|
} else if(flags == TD_LT){
|
||||||
|
ridx = midx - 1;
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else if (c < 0) {
|
} else if (c < 0) {
|
||||||
ridx = midx - 1;
|
ridx = midx - 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -189,6 +195,10 @@ void *taosbsearch(const void *key, const void *base, int32_t nmemb, int32_t size
|
||||||
return (c <= 0) ? p : (midx + 1 < nmemb ? p + size : NULL);
|
return (c <= 0) ? p : (midx + 1 < nmemb ? p + size : NULL);
|
||||||
} else if (flags == TD_LE) {
|
} else if (flags == TD_LE) {
|
||||||
return (c >= 0) ? p : (midx > 0 ? p - size : NULL);
|
return (c >= 0) ? p : (midx > 0 ? p - size : NULL);
|
||||||
|
} else if (flags == TD_GT) {
|
||||||
|
return (c < 0) ? p : (midx + 1 < nmemb ? p + size : NULL);
|
||||||
|
} else if (flags == TD_LT) {
|
||||||
|
return (c > 0) ? p : (midx > 0 ? p - size : NULL);
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,6 +248,170 @@ TEST(testCase, taosbsearch_greater_or_equal) {
|
||||||
ASSERT_EQ(pRet, nullptr);
|
ASSERT_EQ(pRet, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(testCase, taosbsearch_greater) {
|
||||||
|
// For equal test
|
||||||
|
int key = 3;
|
||||||
|
void *pRet = NULL;
|
||||||
|
|
||||||
|
pRet = taosbsearch((void *)&key, NULL, 0, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 1 element
|
||||||
|
int array1[1] = {5};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 5);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 5;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 2 element
|
||||||
|
int array2[2] = {3, 6};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 3 element
|
||||||
|
int array3[3] = {3, 6, 8};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 4 element
|
||||||
|
int array4[4] = {3, 6, 8, 11};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 11;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 13;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 5 element
|
||||||
|
int array5[5] = {3, 6, 8, 11, 15};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 11;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 15);
|
||||||
|
|
||||||
|
key = 13;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 15);
|
||||||
|
|
||||||
|
key = 15;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 17;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_GT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(testCase, taosbsearch_less_or_equal) {
|
TEST(testCase, taosbsearch_less_or_equal) {
|
||||||
// For equal test
|
// For equal test
|
||||||
int key = 3;
|
int key = 3;
|
||||||
|
@ -411,4 +575,168 @@ TEST(testCase, taosbsearch_less_or_equal) {
|
||||||
key = 17;
|
key = 17;
|
||||||
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LE);
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LE);
|
||||||
ASSERT_EQ(*(int *)pRet, 15);
|
ASSERT_EQ(*(int *)pRet, 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, taosbsearch_less) {
|
||||||
|
// For equal test
|
||||||
|
int key = 3;
|
||||||
|
void *pRet = NULL;
|
||||||
|
|
||||||
|
pRet = taosbsearch((void *)&key, NULL, 0, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 1 element
|
||||||
|
int array1[1] = {5};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 5);
|
||||||
|
|
||||||
|
key = 5;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array1, 1, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
// 2 element
|
||||||
|
int array2[2] = {3, 6};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array2, 2, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
// 3 element
|
||||||
|
int array3[3] = {3, 6, 8};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array3, 3, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
// 4 element
|
||||||
|
int array4[4] = {3, 6, 8, 11};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 11;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 13;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array4, 4, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
// 5 element
|
||||||
|
int array5[5] = {3, 6, 8, 11, 15};
|
||||||
|
|
||||||
|
key = 1;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 3;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(pRet, nullptr);
|
||||||
|
|
||||||
|
key = 4;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 6;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 3);
|
||||||
|
|
||||||
|
key = 7;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 8;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 6);
|
||||||
|
|
||||||
|
key = 9;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 11;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 8);
|
||||||
|
|
||||||
|
key = 13;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 15;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 11);
|
||||||
|
|
||||||
|
key = 17;
|
||||||
|
pRet = taosbsearch((void *)&key, (void *)array5, 5, sizeof(int), compareFunc, TD_LT);
|
||||||
|
ASSERT_EQ(*(int *)pRet, 15);
|
||||||
}
|
}
|
Loading…
Reference in New Issue