feature/qnode
This commit is contained in:
parent
2d58e1fed7
commit
62e5ecd6d4
|
@ -183,7 +183,7 @@ int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t
|
|||
SCL_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||
}
|
||||
|
||||
SSDataBlock *block = taosArrayGet(ctx->pBlockList, ref->tupleId);
|
||||
SSDataBlock *block = *(SSDataBlock **)taosArrayGet(ctx->pBlockList, ref->tupleId);
|
||||
|
||||
if (NULL == block || ref->slotId >= taosArrayGetSize(block->pDataBlock)) {
|
||||
sclError("column slotId is too big, slodId:%d, dataBlockSize:%d", ref->slotId, (int32_t)taosArrayGetSize(block->pDataBlock));
|
||||
|
|
|
@ -56,6 +56,35 @@ void scltInitLogFile() {
|
|||
}
|
||||
}
|
||||
|
||||
void scltAppendReservedSlot(SArray *pBlockList, int16_t *tupleId, int16_t *slotId, bool newBlock, int32_t rows, SColumnInfo *colInfo) {
|
||||
if (newBlock) {
|
||||
SSDataBlock *res = (SSDataBlock *)calloc(1, sizeof(SSDataBlock));
|
||||
res->info.numOfCols = 1;
|
||||
res->info.rows = rows;
|
||||
res->pDataBlock = taosArrayInit(1, sizeof(SColumnInfoData));
|
||||
SColumnInfoData idata = {{0}};
|
||||
idata.info = *colInfo;
|
||||
|
||||
taosArrayPush(res->pDataBlock, &idata);
|
||||
taosArrayPush(pBlockList, &res);
|
||||
|
||||
blockDataEnsureCapacity(res, rows);
|
||||
|
||||
*tupleId = taosArrayGetSize(pBlockList) - 1;
|
||||
*slotId = 0;
|
||||
} else {
|
||||
SSDataBlock *res = *(SSDataBlock **)taosArrayGetLast(pBlockList);
|
||||
res->info.numOfCols++;
|
||||
SColumnInfoData idata = {{0}};
|
||||
idata.info = *colInfo;
|
||||
|
||||
taosArrayPush(res->pDataBlock, &idata);
|
||||
blockDataEnsureCapacity(res, rows);
|
||||
|
||||
*tupleId = taosArrayGetSize(pBlockList) - 1;
|
||||
*slotId = taosArrayGetSize(res->pDataBlock) - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void scltMakeValueNode(SNode **pNode, int32_t dataType, void *value) {
|
||||
SNode *node = nodesMakeNode(QUERY_NODE_VALUE);
|
||||
|
@ -74,7 +103,7 @@ void scltMakeValueNode(SNode **pNode, int32_t dataType, void *value) {
|
|||
*pNode = (SNode *)vnode;
|
||||
}
|
||||
|
||||
void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, int32_t dataBytes, int32_t rowNum, void *value) {
|
||||
void scltMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, int32_t dataBytes, int32_t rowNum, void *value) {
|
||||
SNode *node = nodesMakeNode(QUERY_NODE_COLUMN);
|
||||
SColumnNode *rnode = (SColumnNode *)node;
|
||||
rnode->node.resType.type = dataType;
|
||||
|
@ -90,7 +119,7 @@ void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
|
|||
SColumnInfoData idata = {{0}};
|
||||
idata.info.type = TSDB_DATA_TYPE_NULL;
|
||||
idata.info.bytes = 10;
|
||||
idata.info.colId = 0;
|
||||
idata.info.colId = i + 1;
|
||||
|
||||
int32_t size = idata.info.bytes * rowNum;
|
||||
idata.pData = (char *)calloc(1, size);
|
||||
|
@ -100,7 +129,7 @@ void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
|
|||
SColumnInfoData idata = {{0}};
|
||||
idata.info.type = dataType;
|
||||
idata.info.bytes = dataBytes;
|
||||
idata.info.colId = 55;
|
||||
idata.info.colId = 3;
|
||||
idata.pData = (char *)value;
|
||||
if (IS_VAR_DATA_TYPE(dataType)) {
|
||||
idata.varmeta.offset = (int32_t *)calloc(rowNum, sizeof(int32_t));
|
||||
|
@ -111,7 +140,7 @@ void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
|
|||
taosArrayPush(res->pDataBlock, &idata);
|
||||
|
||||
rnode->slotId = 2;
|
||||
rnode->colId = 55;
|
||||
rnode->colId = 3;
|
||||
|
||||
*block = res;
|
||||
} else {
|
||||
|
@ -121,12 +150,12 @@ void scltMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, in
|
|||
SColumnInfoData idata = {{0}};
|
||||
idata.info.type = dataType;
|
||||
idata.info.bytes = dataBytes;
|
||||
idata.info.colId = 55 + idx;
|
||||
idata.info.colId = 1 + idx;
|
||||
idata.pData = (char *)value;
|
||||
taosArrayPush(res->pDataBlock, &idata);
|
||||
|
||||
rnode->slotId = idx;
|
||||
rnode->colId = 55 + idx;
|
||||
rnode->colId = 1 + idx;
|
||||
}
|
||||
|
||||
*pNode = (SNode *)rnode;
|
||||
|
@ -171,6 +200,17 @@ void scltMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nodeLi
|
|||
*pNode = (SNode *)onode;
|
||||
}
|
||||
|
||||
void scltMakeTargetNode(SNode **pNode, int16_t tupleId, int16_t slotId, SNode *snode) {
|
||||
SNode *node = nodesMakeNode(QUERY_NODE_TARGET);
|
||||
STargetNode *onode = (STargetNode *)node;
|
||||
onode->pExpr = snode;
|
||||
onode->tupleId = tupleId;
|
||||
onode->slotId = slotId;
|
||||
|
||||
*pNode = (SNode *)onode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -802,22 +842,32 @@ TEST(columnTest, smallint_value_add_int_column) {
|
|||
int16_t rightv[5]= {0, -5, -4, 23, 100};
|
||||
double eRes[5] = {1.0, -4, -3, 24, 101};
|
||||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||
scltMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv);
|
||||
scltMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, rightv);
|
||||
scltMakeColumnNode(&pRight, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_ADD, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||
|
||||
SArray *blockList = taosArrayInit(2, POINTER_BYTES);
|
||||
taosArrayPush(blockList, &src);
|
||||
SColumnInfo colInfo = {.colId = 1, .type = TSDB_DATA_TYPE_DOUBLE, .bytes = sizeof(double)};
|
||||
int16_t tupleId = 0, slotId = 0;
|
||||
scltAppendReservedSlot(blockList, &tupleId, &slotId, true, rowNum, &colInfo);
|
||||
scltMakeTargetNode(&opNode, tupleId, slotId, opNode);
|
||||
|
||||
int32_t code = scalarCalculate(opNode, src, &res);
|
||||
int32_t code = scalarCalculate(opNode, blockList, NULL);
|
||||
ASSERT_EQ(code, 0);
|
||||
ASSERT_EQ(res.num, rowNum);
|
||||
ASSERT_EQ(res.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes);
|
||||
|
||||
SSDataBlock *res = *(SSDataBlock **)taosArrayGetLast(blockList);
|
||||
ASSERT_EQ(res->info.rows, rowNum);
|
||||
SColumnInfoData *column = (SColumnInfoData *)taosArrayGetLast(res->pDataBlock);
|
||||
ASSERT_EQ(column->info.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
ASSERT_EQ(column->info.bytes, tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes);
|
||||
for (int32_t i = 0; i < rowNum; ++i) {
|
||||
ASSERT_EQ(*((double *)res.data + i), eRes[i]);
|
||||
ASSERT_EQ(*((double *)colDataGet(column, i)), eRes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
TEST(columnTest, bigint_column_multi_binary_column) {
|
||||
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||
int64_t leftv[5]= {1, 2, 3, 4, 5};
|
||||
|
@ -831,8 +881,8 @@ TEST(columnTest, bigint_column_multi_binary_column) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t), rowNum, leftv);
|
||||
scltMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_MULTI, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||
|
||||
int32_t code = scalarCalculate(opNode, src, &res);
|
||||
|
@ -858,8 +908,8 @@ TEST(columnTest, smallint_column_and_binary_column) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_BIT_AND, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||
|
||||
int32_t code = scalarCalculate(opNode, src, &res);
|
||||
|
@ -880,8 +930,8 @@ TEST(columnTest, smallint_column_or_float_column) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_FLOAT, sizeof(float), rowNum, rightv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pRight, &src, TSDB_DATA_TYPE_FLOAT, sizeof(float), rowNum, rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_BIT_OR, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||
|
||||
int32_t code = scalarCalculate(opNode, src, &res);
|
||||
|
@ -902,7 +952,7 @@ TEST(columnTest, smallint_column_or_double_value) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_BIT_OR, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||
|
||||
|
@ -924,7 +974,7 @@ TEST(columnTest, smallint_column_greater_double_value) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv);
|
||||
scltMakeOpNode(&opNode, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_BOOL, pLeft, pRight);
|
||||
|
||||
|
@ -946,7 +996,7 @@ TEST(columnTest, int_column_in_double_list) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_INT, sizeof(int32_t), rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_INT, sizeof(int32_t), rowNum, leftv);
|
||||
SNodeList* list = nodesMakeList();
|
||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv1);
|
||||
nodesListAppend(list, pRight);
|
||||
|
@ -994,7 +1044,7 @@ TEST(columnTest, binary_column_in_binary_list) {
|
|||
}
|
||||
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
SNodeList* list = nodesMakeList();
|
||||
scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv[0]);
|
||||
nodesListAppend(list, pRight);
|
||||
|
@ -1031,7 +1081,7 @@ TEST(columnTest, binary_column_like_binary) {
|
|||
}
|
||||
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
|
||||
sprintf(&rightv[2], "%s", "__0");
|
||||
varDataSetLen(rightv, strlen(&rightv[2]));
|
||||
|
@ -1063,7 +1113,7 @@ TEST(columnTest, binary_column_is_true) {
|
|||
}
|
||||
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
|
||||
scltMakeOpNode(&opNode, OP_TYPE_IS_TRUE, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||
|
||||
|
@ -1094,7 +1144,7 @@ TEST(columnTest, binary_column_is_null) {
|
|||
setVardataNull(leftv[4], TSDB_DATA_TYPE_BINARY);
|
||||
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
|
||||
scltMakeOpNode(&opNode, OP_TYPE_IS_NULL, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||
|
||||
|
@ -1125,7 +1175,7 @@ TEST(columnTest, binary_column_is_not_null) {
|
|||
setVardataNull(leftv[4], TSDB_DATA_TYPE_BINARY);
|
||||
|
||||
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||
scltMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||
|
||||
scltMakeOpNode(&opNode, OP_TYPE_IS_NOT_NULL, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||
|
||||
|
@ -1150,11 +1200,11 @@ TEST(columnTest, greater_and_lower) {
|
|||
SSDataBlock *src = NULL;
|
||||
SScalarParam res = {0};
|
||||
int32_t rowNum = sizeof(v1)/sizeof(v1[0]);
|
||||
scltMakeColRefNode(&pcol1, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, v1);
|
||||
scltMakeColRefNode(&pcol2, &src, TSDB_DATA_TYPE_INT, sizeof(int16_t), rowNum, v2);
|
||||
scltMakeColumnNode(&pcol1, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, v1);
|
||||
scltMakeColumnNode(&pcol2, &src, TSDB_DATA_TYPE_INT, sizeof(int16_t), rowNum, v2);
|
||||
scltMakeOpNode(&opNode1, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_BOOL, pcol1, pcol2);
|
||||
scltMakeColRefNode(&pcol1, &src, TSDB_DATA_TYPE_BIGINT, sizeof(int16_t), rowNum, v3);
|
||||
scltMakeColRefNode(&pcol2, &src, TSDB_DATA_TYPE_INT, sizeof(int16_t), rowNum, v4);
|
||||
scltMakeColumnNode(&pcol1, &src, TSDB_DATA_TYPE_BIGINT, sizeof(int16_t), rowNum, v3);
|
||||
scltMakeColumnNode(&pcol2, &src, TSDB_DATA_TYPE_INT, sizeof(int16_t), rowNum, v4);
|
||||
scltMakeOpNode(&opNode2, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_BOOL, pcol1, pcol2);
|
||||
list[0] = opNode1;
|
||||
list[1] = opNode2;
|
||||
|
@ -1169,7 +1219,7 @@ TEST(columnTest, greater_and_lower) {
|
|||
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
|
Loading…
Reference in New Issue