fea:add select json logic
This commit is contained in:
parent
6c26b6230f
commit
d48d98f094
|
@ -295,10 +295,26 @@ void addTagPseudoColumnData(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock)
|
||||||
if (fmIsScanPseudoColumnFunc(functionId)) {
|
if (fmIsScanPseudoColumnFunc(functionId)) {
|
||||||
setTbNameColData(pTableScanInfo->readHandle.meta, pBlock, pColInfoData, functionId);
|
setTbNameColData(pTableScanInfo->readHandle.meta, pBlock, pColInfoData, functionId);
|
||||||
} else { // these are tags
|
} 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) {
|
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
||||||
colDataAppend(pColInfoData, i, p, (p == NULL));
|
colDataAppend(pColInfoData, i, p, (p == NULL));
|
||||||
}
|
}
|
||||||
|
if(pColInfoData->info.type == TSDB_DATA_TYPE_JSON){
|
||||||
|
taosMemoryFree((void*)p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -899,7 +899,7 @@ int32_t scalarCalculate(SNode *pNode, SArray *pBlockList, SScalarParam *pDst) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
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
|
// TODO: OPT performance
|
||||||
ctx.pRes = taosHashInit(SCL_DEFAULT_OP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
ctx.pRes = taosHashInit(SCL_DEFAULT_OP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
|
|
|
@ -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
|
json++; // jump type
|
||||||
int16_t cols = kvRowNCols(json);
|
int16_t cols = kvRowNCols(json);
|
||||||
for (int i = 0; i < cols; ++i) {
|
for (int i = 0; i < cols; ++i) {
|
||||||
|
|
|
@ -1035,7 +1035,7 @@ void makeJsonArrow(SSDataBlock **src, SNode **opNode, void *json, char *key){
|
||||||
|
|
||||||
SNode *pLeft = NULL, *pRight = NULL;
|
SNode *pLeft = NULL, *pRight = NULL;
|
||||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, keyVar);
|
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);
|
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 ||
|
}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){
|
opType == OP_TYPE_MOD || opType == OP_TYPE_MINUS){
|
||||||
double tmp = *((double *)colDataGetData(column, 0));
|
printf("1result:%f,except:%f\n", *((double *)colDataGetData(column, 0)), exceptValue);
|
||||||
ASSERT_TRUE(tmp == exceptValue);
|
ASSERT_TRUE(abs(*((double *)colDataGetData(column, 0)) - exceptValue) < 1e-15);
|
||||||
printf("result:%lf\n", tmp);
|
|
||||||
}else if(opType == OP_TYPE_BIT_AND || opType == OP_TYPE_BIT_OR){
|
}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);
|
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 ||
|
}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_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_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){
|
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);
|
ASSERT_EQ(*((bool *)colDataGetData(column, 0)), exceptValue);
|
||||||
printf("result:%d\n", *((bool *)colDataGetData(column, 0)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroyEx(blockList, scltFreeDataBlock);
|
taosArrayDestroyEx(blockList, scltFreeDataBlock);
|
||||||
|
@ -1114,6 +1113,13 @@ TEST(columnTest, json_column_arith_op) {
|
||||||
tdInitKVRowBuilder(&kvRowBuilder);
|
tdInitKVRowBuilder(&kvRowBuilder);
|
||||||
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
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;
|
const int32_t len = 8;
|
||||||
EOperatorType op[len] = {OP_TYPE_ADD, OP_TYPE_SUB, OP_TYPE_MULTI, OP_TYPE_DIV,
|
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++){
|
for(int i = 0; i < len; i++){
|
||||||
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]);
|
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tdDestroyKVRowBuilder(&kvRowBuilder);
|
||||||
|
taosMemoryFree(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *prepareNchar(char* rightData){
|
void *prepareNchar(char* rightData){
|
||||||
|
@ -1186,6 +1195,13 @@ TEST(columnTest, json_column_logic_op) {
|
||||||
tdInitKVRowBuilder(&kvRowBuilder);
|
tdInitKVRowBuilder(&kvRowBuilder);
|
||||||
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
parseJsontoTagData(rightv, &kvRowBuilder, NULL, 0);
|
||||||
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
|
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 len = 9;
|
||||||
const int32_t len1 = 4;
|
const int32_t len1 = 4;
|
||||||
|
@ -1223,7 +1239,7 @@ TEST(columnTest, json_column_logic_op) {
|
||||||
printf("--------------------json null---------------------\n");
|
printf("--------------------json null---------------------\n");
|
||||||
|
|
||||||
key = "k3";
|
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++){
|
for(int i = 0; i < len; i++){
|
||||||
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes2[i], op[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");
|
printf("--------------------json double---------------------\n");
|
||||||
|
|
||||||
key = "k6";
|
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++){
|
for(int i = 0; i < len; i++){
|
||||||
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes5[i], op[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");
|
printf("---------------------json not exist--------------------\n");
|
||||||
|
|
||||||
key = "k10";
|
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++){
|
for(int i = 0; i < len; i++){
|
||||||
makeCalculate(row, key, TSDB_DATA_TYPE_INT, &input[i], eRes10[i], op[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]);
|
makeCalculate(row, key, TSDB_DATA_TYPE_NCHAR, rightData, eRes10[i], op[i]);
|
||||||
taosMemoryFree(rightData);
|
taosMemoryFree(rightData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tdDestroyKVRowBuilder(&kvRowBuilder);
|
||||||
|
taosMemoryFree(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(columnTest, smallint_value_add_int_column) {
|
TEST(columnTest, smallint_value_add_int_column) {
|
||||||
|
|
Loading…
Reference in New Issue