From d48d98f094fd42b4d44db48e4caa3db6b62aff3d Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 19 May 2022 22:10:20 +0800 Subject: [PATCH] fea:add select json logic --- source/libs/executor/src/scanoperator.c | 18 ++++++++- source/libs/scalar/src/scalar.c | 2 +- source/libs/scalar/src/sclvector.c | 2 +- .../libs/scalar/test/scalar/scalarTests.cpp | 37 ++++++++++++++----- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index d88b0dc57e..5f5352b95d 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -295,10 +295,26 @@ void addTagPseudoColumnData(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock) if (fmIsScanPseudoColumnFunc(functionId)) { setTbNameColData(pTableScanInfo->readHandle.meta, pBlock, pColInfoData, functionId); } else { // these are tags - const char* p = metaGetTableTagVal(&mr.me, pExpr->base.pParam[0].pCol->colId); + const char* p = NULL; + if(pColInfoData->info.type == TSDB_DATA_TYPE_JSON){ + const uint8_t *tmp = mr.me.ctbEntry.pTags; + char *data = taosMemoryCalloc(kvRowLen(tmp) + 1, 1); + if(data == NULL){ + qError("doTagScan calloc error:%d", kvRowLen(tmp) + 1); + return; + } + *data = TSDB_DATA_TYPE_JSON; + memcpy(data+1, tmp, kvRowLen(tmp)); + p = data; + }else{ + p = metaGetTableTagVal(&mr.me, pExpr->base.pParam[0].pCol->colId); + } for (int32_t i = 0; i < pBlock->info.rows; ++i) { colDataAppend(pColInfoData, i, p, (p == NULL)); } + if(pColInfoData->info.type == TSDB_DATA_TYPE_JSON){ + taosMemoryFree((void*)p); + } } } diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 7e3dbaf7d0..49ed3ab48b 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -899,7 +899,7 @@ int32_t scalarCalculate(SNode *pNode, SArray *pBlockList, SScalarParam *pDst) { } int32_t code = 0; - SScalarCtx ctx = {.code = 0, .pBlockList = pBlockList, .param = pDst->param}; + SScalarCtx ctx = {.code = 0, .pBlockList = pBlockList, .param = pDst ? pDst->param : NULL}; // TODO: OPT performance ctx.pRes = taosHashInit(SCL_DEFAULT_OP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index c357b438c2..b6a741b74b 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -922,7 +922,7 @@ static void doReleaseVec(SColumnInfoData* pCol, int32_t type) { } } -char *getJsonValue(char *json, char *key){ +char *getJsonValue(char *json, char *key){ //todo json++; // jump type int16_t cols = kvRowNCols(json); for (int i = 0; i < cols; ++i) { diff --git a/source/libs/scalar/test/scalar/scalarTests.cpp b/source/libs/scalar/test/scalar/scalarTests.cpp index 49a5f5b9a4..627c3c438c 100644 --- a/source/libs/scalar/test/scalar/scalarTests.cpp +++ b/source/libs/scalar/test/scalar/scalarTests.cpp @@ -1035,7 +1035,7 @@ void makeJsonArrow(SSDataBlock **src, SNode **opNode, void *json, char *key){ SNode *pLeft = NULL, *pRight = NULL; scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, keyVar); - scltMakeColumnNode(&pLeft, src, TSDB_DATA_TYPE_JSON, varDataLen(json), 1, json); + scltMakeColumnNode(&pLeft, src, TSDB_DATA_TYPE_JSON, kvRowLen(json), 1, json); scltMakeOpNode(opNode, OP_TYPE_JSON_GET_VALUE, TSDB_DATA_TYPE_JSON, pLeft, pRight); } @@ -1088,18 +1088,17 @@ void makeCalculate(void *json, void *key, int32_t rightType, void *rightData, do }else if(opType == OP_TYPE_ADD || opType == OP_TYPE_SUB || opType == OP_TYPE_MULTI || opType == OP_TYPE_DIV || opType == OP_TYPE_MOD || opType == OP_TYPE_MINUS){ - double tmp = *((double *)colDataGetData(column, 0)); - ASSERT_TRUE(tmp == exceptValue); - printf("result:%lf\n", tmp); + printf("1result:%f,except:%f\n", *((double *)colDataGetData(column, 0)), exceptValue); + ASSERT_TRUE(abs(*((double *)colDataGetData(column, 0)) - exceptValue) < 1e-15); }else if(opType == OP_TYPE_BIT_AND || opType == OP_TYPE_BIT_OR){ + printf("2result:%ld,except:%f\n", *((int64_t *)colDataGetData(column, 0)), exceptValue); ASSERT_EQ(*((int64_t *)colDataGetData(column, 0)), exceptValue); - printf("result:%ld\n", *((int64_t *)colDataGetData(column, 0))); }else if(opType == OP_TYPE_GREATER_THAN || opType == OP_TYPE_GREATER_EQUAL || opType == OP_TYPE_LOWER_THAN || opType == OP_TYPE_LOWER_EQUAL || opType == OP_TYPE_EQUAL || opType == OP_TYPE_NOT_EQUAL || opType == OP_TYPE_IS_NULL || opType == OP_TYPE_IS_NOT_NULL || opType == OP_TYPE_IS_TRUE || opType == OP_TYPE_LIKE || opType == OP_TYPE_NOT_LIKE || opType == OP_TYPE_MATCH || opType == OP_TYPE_NMATCH){ + printf("3result:%d,except:%f\n", *((bool *)colDataGetData(column, 0)), exceptValue); ASSERT_EQ(*((bool *)colDataGetData(column, 0)), exceptValue); - printf("result:%d\n", *((bool *)colDataGetData(column, 0))); } taosArrayDestroyEx(blockList, scltFreeDataBlock); @@ -1114,6 +1113,13 @@ TEST(columnTest, json_column_arith_op) { tdInitKVRowBuilder(&kvRowBuilder); parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0); SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder); + char *tmp = (char *)taosMemoryRealloc(row, kvRowLen(row)+1); + if(tmp == NULL){ + ASSERT_TRUE(0); + } + memmove(tmp+1, tmp, kvRowLen(tmp)); + *tmp = TSDB_DATA_TYPE_JSON; + row = tmp; const int32_t len = 8; EOperatorType op[len] = {OP_TYPE_ADD, OP_TYPE_SUB, OP_TYPE_MULTI, OP_TYPE_DIV, @@ -1166,6 +1172,9 @@ TEST(columnTest, json_column_arith_op) { for(int i = 0; i < len; i++){ makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]); } + + tdDestroyKVRowBuilder(&kvRowBuilder); + taosMemoryFree(row); } void *prepareNchar(char* rightData){ @@ -1186,6 +1195,13 @@ TEST(columnTest, json_column_logic_op) { tdInitKVRowBuilder(&kvRowBuilder); parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0); SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder); + char *tmp = (char *)taosMemoryRealloc(row, kvRowLen(row)+1); + if(tmp == NULL){ + ASSERT_TRUE(0); + } + memmove(tmp+1, tmp, kvRowLen(tmp)); + *tmp = TSDB_DATA_TYPE_JSON; + row = tmp; const int32_t len = 9; const int32_t len1 = 4; @@ -1223,7 +1239,7 @@ TEST(columnTest, json_column_logic_op) { printf("--------------------json null---------------------\n"); key = "k3"; - double eRes2[len+len1] = {DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, true, false, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX}; + bool eRes2[len+len1] = {false, false, false, false, false, false, true, false, false, false, false, false, false}; for(int i = 0; i < len; i++){ makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes2[i], op[i]); } @@ -1262,7 +1278,7 @@ TEST(columnTest, json_column_logic_op) { printf("--------------------json double---------------------\n"); key = "k6"; - bool eRes5[len+len1] = {true, false, false, false, false, true, false, true, true, false, false, false, true}; + bool eRes5[len+len1] = {true, false, false, false, false, true, false, true, true, false, true, false, true}; for(int i = 0; i < len; i++){ makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]); } @@ -1275,7 +1291,7 @@ TEST(columnTest, json_column_logic_op) { printf("---------------------json not exist--------------------\n"); key = "k10"; - double eRes10[len+len1] = {DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, true, false, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX}; + double eRes10[len+len1] = {false, false, false, false, false, false, true, false, false, false, false, false, false}; for(int i = 0; i < len; i++){ makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes10[i], op[i]); } @@ -1284,6 +1300,9 @@ TEST(columnTest, json_column_logic_op) { makeCalculate(row, key, TSDB_DATA_TYPE_NCHAR, rightData, eRes10[i], op[i]); taosMemoryFree(rightData); } + + tdDestroyKVRowBuilder(&kvRowBuilder); + taosMemoryFree(row); } TEST(columnTest, smallint_value_add_int_column) { -- GitLab