[TD-225]refactor.
This commit is contained in:
parent
9dc0bf6c86
commit
7ee01d6d5e
|
@ -22,15 +22,15 @@ extern "C" {
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "qAggMain.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tglobal.h"
|
|
||||||
#include "tsqlfunction.h"
|
|
||||||
#include "tutil.h"
|
|
||||||
#include "tcache.h"
|
#include "tcache.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#include "qExecutor.h"
|
#include "qExecutor.h"
|
||||||
#include "qSqlparser.h"
|
#include "qSqlparser.h"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "tscLocalMerge.h"
|
#include "tscLocalMerge.h"
|
||||||
#include "tscSubquery.h"
|
#include "tscSubquery.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
#include "tscLog.h"
|
#include "tscLog.h"
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "ttype.h"
|
#include "ttype.h"
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -1354,7 +1354,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
|
||||||
int32_t ret = exprTreeFromSqlExpr(pCmd, &pNode, pItem->pNode, pQueryInfo, colList, NULL);
|
int32_t ret = exprTreeFromSqlExpr(pCmd, &pNode, pItem->pNode, pQueryInfo, colList, NULL);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
taosArrayDestroy(colList);
|
taosArrayDestroy(colList);
|
||||||
tExprTreeDestroy(&pNode, NULL);
|
tExprTreeDestroy(pNode, NULL);
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1363,9 +1363,9 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
|
||||||
for(int32_t k = 0; k < numOfNode; ++k) {
|
for(int32_t k = 0; k < numOfNode; ++k) {
|
||||||
SColIndex* pIndex = taosArrayGet(colList, k);
|
SColIndex* pIndex = taosArrayGet(colList, k);
|
||||||
if (TSDB_COL_IS_TAG(pIndex->flag)) {
|
if (TSDB_COL_IS_TAG(pIndex->flag)) {
|
||||||
tExprTreeDestroy(&pNode, NULL);
|
tExprTreeDestroy(pNode, NULL);
|
||||||
taosArrayDestroy(colList);
|
taosArrayDestroy(colList);
|
||||||
tExprTreeDestroy(&pNode, NULL);
|
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1392,7 +1392,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
|
||||||
|
|
||||||
tbufCloseWriter(&bw);
|
tbufCloseWriter(&bw);
|
||||||
taosArrayDestroy(colList);
|
taosArrayDestroy(colList);
|
||||||
tExprTreeDestroy(&pNode, NULL);
|
tExprTreeDestroy(pNode, NULL);
|
||||||
} else {
|
} else {
|
||||||
columnList.num = 0;
|
columnList.num = 0;
|
||||||
columnList.ids[0] = (SColumnIndex) {0, 0};
|
columnList.ids[0] = (SColumnIndex) {0, 0};
|
||||||
|
@ -1424,7 +1424,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
|
||||||
|
|
||||||
int32_t ret = exprTreeFromSqlExpr(pCmd, &pArithExprInfo->pExpr, pItem->pNode, pQueryInfo, NULL, &pArithExprInfo->uid);
|
int32_t ret = exprTreeFromSqlExpr(pCmd, &pArithExprInfo->pExpr, pItem->pNode, pQueryInfo, NULL, &pArithExprInfo->uid);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
tExprTreeDestroy(&pArithExprInfo->pExpr, NULL);
|
tExprTreeDestroy(pArithExprInfo->pExpr, NULL);
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "invalid expression in select clause");
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "invalid expression in select clause");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4304,7 +4304,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
|
||||||
doCompactQueryExpr(pExpr);
|
doCompactQueryExpr(pExpr);
|
||||||
|
|
||||||
tSqlExprDestroy(p1);
|
tSqlExprDestroy(p1);
|
||||||
tExprTreeDestroy(&p, NULL);
|
tExprTreeDestroy(p, NULL);
|
||||||
|
|
||||||
taosArrayDestroy(colList);
|
taosArrayDestroy(colList);
|
||||||
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "tkey.h"
|
#include "tkey.h"
|
||||||
#include "tcache.h"
|
#include "tcache.h"
|
||||||
#include "tnote.h"
|
#include "tnote.h"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "qTsbuf.h"
|
#include "qTsbuf.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tscLog.h"
|
#include "tscLog.h"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tkey.h"
|
#include "tkey.h"
|
||||||
#include "tmd5.h"
|
#include "tmd5.h"
|
||||||
|
@ -1054,7 +1054,7 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
|
||||||
SInternalField* pInfo = taosArrayGet(pFieldInfo->internalField, i);
|
SInternalField* pInfo = taosArrayGet(pFieldInfo->internalField, i);
|
||||||
|
|
||||||
if (pInfo->pArithExprInfo != NULL) {
|
if (pInfo->pArithExprInfo != NULL) {
|
||||||
tExprTreeDestroy(&pInfo->pArithExprInfo->pExpr, NULL);
|
tExprTreeDestroy(pInfo->pArithExprInfo->pExpr, NULL);
|
||||||
|
|
||||||
SSqlFuncMsg* pFuncMsg = &pInfo->pArithExprInfo->base;
|
SSqlFuncMsg* pFuncMsg = &pInfo->pArithExprInfo->base;
|
||||||
for(int32_t j = 0; j < pFuncMsg->numOfParams; ++j) {
|
for(int32_t j = 0; j < pFuncMsg->numOfParams; ++j) {
|
||||||
|
|
|
@ -31,6 +31,15 @@ extern "C" {
|
||||||
struct tExprNode;
|
struct tExprNode;
|
||||||
struct SSchema;
|
struct SSchema;
|
||||||
|
|
||||||
|
#define QUERY_COND_REL_PREFIX_IN "IN|"
|
||||||
|
#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
|
||||||
|
|
||||||
|
#define QUERY_COND_REL_PREFIX_IN_LEN 3
|
||||||
|
#define QUERY_COND_REL_PREFIX_LIKE_LEN 5
|
||||||
|
|
||||||
|
typedef bool (*__result_filter_fn_t)(const void *, void *);
|
||||||
|
typedef void (*__do_filter_suppl_fn_t)(void *, void *);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TSQL_NODE_DUMMY = 0x0,
|
TSQL_NODE_DUMMY = 0x0,
|
||||||
TSQL_NODE_EXPR = 0x1,
|
TSQL_NODE_EXPR = 0x1,
|
||||||
|
@ -38,9 +47,6 @@ enum {
|
||||||
TSQL_NODE_VALUE = 0x4,
|
TSQL_NODE_VALUE = 0x4,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef bool (*__result_filter_fn_t)(const void *, void *);
|
|
||||||
typedef void (*__do_filter_suppl_fn_t)(void *, void *);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this structure is used to filter data in tags, so the offset of filtered tag column in tagdata string is required
|
* this structure is used to filter data in tags, so the offset of filtered tag column in tagdata string is required
|
||||||
*/
|
*/
|
||||||
|
@ -52,12 +58,6 @@ typedef struct tQueryInfo {
|
||||||
bool indexed; // indexed columns
|
bool indexed; // indexed columns
|
||||||
} tQueryInfo;
|
} tQueryInfo;
|
||||||
|
|
||||||
typedef struct SExprTraverseSupp {
|
|
||||||
__result_filter_fn_t nodeFilterFn;
|
|
||||||
__do_filter_suppl_fn_t setupInfoFn;
|
|
||||||
void * pExtInfo;
|
|
||||||
} SExprTraverseSupp;
|
|
||||||
|
|
||||||
typedef struct tExprNode {
|
typedef struct tExprNode {
|
||||||
uint8_t nodeType;
|
uint8_t nodeType;
|
||||||
union {
|
union {
|
||||||
|
@ -65,7 +65,7 @@ typedef struct tExprNode {
|
||||||
uint8_t optr; // filter operator
|
uint8_t optr; // filter operator
|
||||||
uint8_t hasPK; // 0: do not contain primary filter, 1: contain
|
uint8_t hasPK; // 0: do not contain primary filter, 1: contain
|
||||||
void * info; // support filter operation on this expression only available for leaf node
|
void * info; // support filter operation on this expression only available for leaf node
|
||||||
|
|
||||||
struct tExprNode *pLeft; // left child pointer
|
struct tExprNode *pLeft; // left child pointer
|
||||||
struct tExprNode *pRight; // right child pointer
|
struct tExprNode *pRight; // right child pointer
|
||||||
} _node;
|
} _node;
|
||||||
|
@ -74,19 +74,27 @@ typedef struct tExprNode {
|
||||||
};
|
};
|
||||||
} tExprNode;
|
} tExprNode;
|
||||||
|
|
||||||
void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, void *param, int32_t order,
|
typedef struct SExprTraverseSupp {
|
||||||
char *(*cb)(void *, const char*, int32_t));
|
__result_filter_fn_t nodeFilterFn;
|
||||||
|
__do_filter_suppl_fn_t setupInfoFn;
|
||||||
|
void * pExtInfo;
|
||||||
|
} SExprTraverseSupp;
|
||||||
|
|
||||||
|
void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *));
|
||||||
|
|
||||||
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
tExprNode* exprTreeFromBinary(const void* data, size_t size);
|
||||||
tExprNode* exprTreeFromTableName(const char* tbnameCond);
|
tExprNode* exprTreeFromTableName(const char* tbnameCond);
|
||||||
|
|
||||||
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree);
|
void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree);
|
||||||
|
|
||||||
void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *));
|
|
||||||
void tExprTreeDestroy(tExprNode **pExprs, void (*fp)(void*));
|
|
||||||
|
|
||||||
bool exprTreeApplayFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
|
bool exprTreeApplayFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param);
|
||||||
|
|
||||||
|
typedef void (*_arithmetic_operator_fn_t)(void *left, int32_t numLeft, int32_t leftType, void *right, int32_t numRight,
|
||||||
|
int32_t rightType, void *output, int32_t order);
|
||||||
|
|
||||||
|
void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput, void *param, int32_t order,
|
||||||
|
char *(*cb)(void *, const char*, int32_t));
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -1,3 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef TDENGINE_NAME_H
|
#ifndef TDENGINE_NAME_H
|
||||||
#define TDENGINE_NAME_H
|
#define TDENGINE_NAME_H
|
||||||
|
|
||||||
|
|
|
@ -16,18 +16,15 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "qArithmeticOperator.h"
|
|
||||||
#include "qAst.h"
|
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tbuffer.h"
|
#include "tbuffer.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tname.h"
|
|
||||||
#include "tschemautil.h"
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tskiplist.h"
|
#include "tskiplist.h"
|
||||||
#include "tsqlfunction.h"
|
#include "texpr.h"
|
||||||
|
|
||||||
|
|
||||||
static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
|
static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
|
||||||
if (pLeft->nodeType == TSQL_NODE_COL) {
|
if (pLeft->nodeType == TSQL_NODE_COL) {
|
||||||
|
@ -102,13 +99,15 @@ static void reverseCopy(char* dest, const char* src, int16_t type, int32_t numOf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
|
static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *));
|
||||||
|
|
||||||
|
void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *)) {
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pNode->nodeType == TSQL_NODE_EXPR) {
|
if (pNode->nodeType == TSQL_NODE_EXPR) {
|
||||||
tExprTreeDestroy(&pNode, fp);
|
doExprTreeDestroy(&pNode, fp);
|
||||||
} else if (pNode->nodeType == TSQL_NODE_VALUE) {
|
} else if (pNode->nodeType == TSQL_NODE_VALUE) {
|
||||||
tVariantDestroy(pNode->pVal);
|
tVariantDestroy(pNode->pVal);
|
||||||
} else if (pNode->nodeType == TSQL_NODE_COL) {
|
} else if (pNode->nodeType == TSQL_NODE_COL) {
|
||||||
|
@ -118,14 +117,14 @@ void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
|
||||||
free(pNode);
|
free(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
|
static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
|
||||||
if (*pExpr == NULL) {
|
if (*pExpr == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*pExpr)->nodeType == TSQL_NODE_EXPR) {
|
if ((*pExpr)->nodeType == TSQL_NODE_EXPR) {
|
||||||
tExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
|
doExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
|
||||||
tExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
|
doExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
|
||||||
|
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
fp((*pExpr)->_node.info);
|
fp((*pExpr)->_node.info);
|
||||||
|
@ -342,7 +341,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tExprNode* pExpr = exception_calloc(1, sizeof(tExprNode));
|
tExprNode* pExpr = exception_calloc(1, sizeof(tExprNode));
|
||||||
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, pExpr, NULL);
|
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, pExpr, NULL);
|
||||||
pExpr->nodeType = tbufReadUint8(br);
|
pExpr->nodeType = tbufReadUint8(br);
|
||||||
|
|
||||||
if (pExpr->nodeType == TSQL_NODE_VALUE) {
|
if (pExpr->nodeType == TSQL_NODE_VALUE) {
|
||||||
|
@ -396,7 +395,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
|
||||||
int32_t anchor = CLEANUP_GET_ANCHOR();
|
int32_t anchor = CLEANUP_GET_ANCHOR();
|
||||||
|
|
||||||
tExprNode* expr = exception_calloc(1, sizeof(tExprNode));
|
tExprNode* expr = exception_calloc(1, sizeof(tExprNode));
|
||||||
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, expr, NULL);
|
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, expr, NULL);
|
||||||
|
|
||||||
expr->nodeType = TSQL_NODE_EXPR;
|
expr->nodeType = TSQL_NODE_EXPR;
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TDENGINE_TSQLFUNCTION_H
|
#ifndef TDENGINE_QAGGMAIN_H
|
||||||
#define TDENGINE_TSQLFUNCTION_H
|
#define TDENGINE_QAGGMAIN_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -97,11 +97,7 @@ extern "C" {
|
||||||
#define DATA_SET_FLAG ',' // to denote the output area has data, not null value
|
#define DATA_SET_FLAG ',' // to denote the output area has data, not null value
|
||||||
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)
|
#define DATA_SET_FLAG_SIZE sizeof(DATA_SET_FLAG)
|
||||||
|
|
||||||
#define QUERY_COND_REL_PREFIX_IN "IN|"
|
|
||||||
#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
|
|
||||||
|
|
||||||
#define QUERY_COND_REL_PREFIX_IN_LEN 3
|
|
||||||
#define QUERY_COND_REL_PREFIX_LIKE_LEN 5
|
|
||||||
|
|
||||||
#define QUERY_ASC_FORWARD_STEP 1
|
#define QUERY_ASC_FORWARD_STEP 1
|
||||||
#define QUERY_DESC_FORWARD_STEP -1
|
#define QUERY_DESC_FORWARD_STEP -1
|
||||||
|
@ -279,4 +275,4 @@ static FORCE_INLINE void initResultInfo(SResultRowCellInfo *pResInfo, uint32_t b
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_TSQLFUNCTION_H
|
#endif // TDENGINE_QAGGMAIN_H
|
|
@ -18,6 +18,7 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
|
#include "qAggMain.h"
|
||||||
#include "qFill.h"
|
#include "qFill.h"
|
||||||
#include "qResultbuf.h"
|
#include "qResultbuf.h"
|
||||||
#include "qSqlparser.h"
|
#include "qSqlparser.h"
|
||||||
|
@ -27,7 +28,6 @@
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsqlfunction.h"
|
|
||||||
|
|
||||||
struct SColumnFilterElem;
|
struct SColumnFilterElem;
|
||||||
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
|
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
|
||||||
|
|
|
@ -14,17 +14,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qAst.h"
|
#include "taosdef.h"
|
||||||
|
#include "taosmsg.h"
|
||||||
|
#include "texpr.h"
|
||||||
|
#include "ttype.h"
|
||||||
|
|
||||||
|
#include "qAggMain.h"
|
||||||
#include "qFill.h"
|
#include "qFill.h"
|
||||||
#include "qHistogram.h"
|
#include "qHistogram.h"
|
||||||
#include "qPercentile.h"
|
#include "qPercentile.h"
|
||||||
#include "qTsbuf.h"
|
#include "qTsbuf.h"
|
||||||
#include "taosdef.h"
|
|
||||||
#include "taosmsg.h"
|
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "tscSubquery.h"
|
|
||||||
#include "tsqlfunction.h"
|
|
||||||
#include "ttype.h"
|
|
||||||
|
|
||||||
#define GET_INPUT_DATA_LIST(x) (((char *)((x)->aInputElemBuf)) + ((x)->startOffset) * ((x)->inputBytes))
|
#define GET_INPUT_DATA_LIST(x) (((char *)((x)->aInputElemBuf)) + ((x)->startOffset) * ((x)->inputBytes))
|
||||||
#define GET_INPUT_DATA(x, y) (GET_INPUT_DATA_LIST(x) + (y) * (x)->inputBytes)
|
#define GET_INPUT_DATA(x, y) (GET_INPUT_DATA_LIST(x) + (y) * (x)->inputBytes)
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "qExecutor.h"
|
#include "qExecutor.h"
|
||||||
#include "qResultbuf.h"
|
#include "qResultbuf.h"
|
||||||
#include "qUtil.h"
|
#include "qUtil.h"
|
||||||
|
@ -6798,7 +6798,8 @@ _cleanup_query:
|
||||||
for (int32_t i = 0; i < numOfOutput; ++i) {
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
SExprInfo* pExprInfo = &pExprs[i];
|
SExprInfo* pExprInfo = &pExprs[i];
|
||||||
if (pExprInfo->pExpr != NULL) {
|
if (pExprInfo->pExpr != NULL) {
|
||||||
tExprTreeDestroy(&pExprInfo->pExpr, NULL);
|
tExprTreeDestroy(pExprInfo->pExpr, NULL);
|
||||||
|
pExprInfo->pExpr = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6914,7 +6915,7 @@ static void* destroyQueryFuncExpr(SExprInfo* pExprInfo, int32_t numOfExpr) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfExpr; ++i) {
|
for (int32_t i = 0; i < numOfExpr; ++i) {
|
||||||
if (pExprInfo[i].pExpr != NULL) {
|
if (pExprInfo[i].pExpr != NULL) {
|
||||||
tExprNodeDestroy(pExprInfo[i].pExpr, NULL);
|
tExprTreeDestroy(pExprInfo[i].pExpr, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,13 +12,13 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "os.h"
|
|
||||||
#include "qExtbuffer.h"
|
#include "qExtbuffer.h"
|
||||||
|
#include "os.h"
|
||||||
|
#include "qAggMain.h"
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tsqlfunction.h"
|
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
|
|
||||||
#define COLMODEL_GET_VAL(data, schema, allrow, rowId, colId) \
|
#define COLMODEL_GET_VAL(data, schema, allrow, rowId, colId) \
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "qAggMain.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tsqlfunction.h"
|
|
||||||
#include "ttype.h"
|
#include "ttype.h"
|
||||||
|
|
||||||
#include "qFill.h"
|
#include "qFill.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "qAst.h"
|
#include "texpr.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tskiplist.h"
|
#include "tskiplist.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "tsqlfunction.h"
|
#include "qAggMain.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
|
||||||
TEST(testCase, patternMatchTest) {
|
TEST(testCase, patternMatchTest) {
|
||||||
|
|
|
@ -19,10 +19,10 @@
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
|
||||||
#include "../../query/inc/qAst.h" // todo move to common module
|
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
|
#include "texpr.h"
|
||||||
|
|
||||||
#define EXTRA_BYTES 2
|
#define EXTRA_BYTES 2
|
||||||
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
||||||
|
@ -1920,7 +1920,6 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) {
|
||||||
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
|
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
|
||||||
// filter the queried time stamp in the first place
|
// filter the queried time stamp in the first place
|
||||||
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
|
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
|
||||||
// pQueryHandle->order = TSDB_ORDER_DESC;
|
|
||||||
|
|
||||||
// starts from the buffer in case of descending timestamp order check data blocks
|
// starts from the buffer in case of descending timestamp order check data blocks
|
||||||
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
||||||
|
@ -1948,9 +1947,6 @@ static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle) {
|
||||||
|
|
||||||
info.lastKey = pQueryHandle->window.skey;
|
info.lastKey = pQueryHandle->window.skey;
|
||||||
taosArrayPush(pQueryHandle->pTableCheckInfo, &info);
|
taosArrayPush(pQueryHandle->pTableCheckInfo, &info);
|
||||||
|
|
||||||
// update the query time window according to the chosen last timestamp
|
|
||||||
// pQueryHandle->window = (STimeWindow) {info.lastKey, TSKEY_INITIAL_VAL};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win,
|
static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int maxRowsToRead, STimeWindow* win,
|
||||||
|
@ -2030,7 +2026,6 @@ static void destroyHelper(void* param) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tQueryInfo* pInfo = (tQueryInfo*)param;
|
tQueryInfo* pInfo = (tQueryInfo*)param;
|
||||||
if (pInfo->optr != TSDB_RELATION_IN) {
|
if (pInfo->optr != TSDB_RELATION_IN) {
|
||||||
tfree(pInfo->q);
|
tfree(pInfo->q);
|
||||||
|
@ -2039,148 +2034,6 @@ static void destroyHelper(void* param) {
|
||||||
free(param);
|
free(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
//static bool getNeighborRows(STsdbQueryHandle* pQueryHandle) {
|
|
||||||
// assert(pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL);
|
|
||||||
//
|
|
||||||
// SDataBlockInfo blockInfo = {{0}, 0};
|
|
||||||
//
|
|
||||||
// pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
|
|
||||||
// pQueryHandle->order = TSDB_ORDER_DESC;
|
|
||||||
//
|
|
||||||
// if (!tsdbNextDataBlock((void*)pQueryHandle)) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// tsdbRetrieveDataBlockInfo((void*)pQueryHandle, &blockInfo);
|
|
||||||
// /*SArray *pDataBlock = */ tsdbRetrieveDataBlock((void*)pQueryHandle, pQueryHandle->defaultLoadColumn);
|
|
||||||
// if (terrno != TSDB_CODE_SUCCESS) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// STimeWindow* win = &pQueryHandle->window;
|
|
||||||
//
|
|
||||||
// // the skey == ekey means only one data row is required.
|
|
||||||
// // the data row of this timestamp is already retrieved, discard other data rows and return.
|
|
||||||
// if (win->skey == win->ekey) {
|
|
||||||
// if (pQueryHandle->cur.win.ekey == win->skey) {
|
|
||||||
// int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
|
|
||||||
// for (int32_t i = 0; i < numOfCols; ++i) {
|
|
||||||
// SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
|
||||||
// memcpy((char*)pCol->pData, (char*)pCol->pData + pCol->info.bytes * (pQueryHandle->cur.rows - 1),
|
|
||||||
// pCol->info.bytes);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pQueryHandle->cur.win = (STimeWindow){win->skey, win->skey};
|
|
||||||
// pQueryHandle->window = pQueryHandle->cur.win;
|
|
||||||
// pQueryHandle->cur.rows = 1;
|
|
||||||
// pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
|
|
||||||
// return true;
|
|
||||||
// } else {
|
|
||||||
// STimeWindow win1 = (STimeWindow){pQueryHandle->window.skey, INT64_MAX};
|
|
||||||
// STsdbQueryCond cond = {.order = TSDB_ORDER_ASC, .numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle))};
|
|
||||||
//
|
|
||||||
// cond.twindow = win1;
|
|
||||||
//
|
|
||||||
// cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
|
|
||||||
// if (cond.colList == NULL) {
|
|
||||||
// terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int32_t i = 0; i < cond.numOfCols; ++i) {
|
|
||||||
// SColumnInfoData* pColInfoData = taosArrayGet(pQueryHandle->pColumns, i);
|
|
||||||
// memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// STsdbQueryHandle* pSecQueryHandle =
|
|
||||||
// tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pQueryHandle->pMemRef);
|
|
||||||
//
|
|
||||||
// tfree(cond.colList);
|
|
||||||
//
|
|
||||||
// pSecQueryHandle->pTableCheckInfo =
|
|
||||||
// createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey);
|
|
||||||
// if (pSecQueryHandle->pTableCheckInfo == NULL) {
|
|
||||||
// tsdbCleanupQueryHandle(pSecQueryHandle);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!tsdbNextDataBlock((void*)pSecQueryHandle)) {
|
|
||||||
// tsdbCleanupQueryHandle(pSecQueryHandle);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// tsdbRetrieveDataBlockInfo((void*)pSecQueryHandle, &blockInfo);
|
|
||||||
// tsdbRetrieveDataBlock((void*)pSecQueryHandle, pSecQueryHandle->defaultLoadColumn);
|
|
||||||
//
|
|
||||||
// int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pSecQueryHandle));
|
|
||||||
// size_t si = taosArrayGetSize(pSecQueryHandle->pTableCheckInfo);
|
|
||||||
//
|
|
||||||
// for (int32_t i = 0; i < numOfCols; ++i) {
|
|
||||||
// SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
|
||||||
// memcpy((char*)pCol->pData, (char*)pCol->pData + pCol->info.bytes * (pQueryHandle->cur.rows - 1),
|
|
||||||
// pCol->info.bytes);
|
|
||||||
//
|
|
||||||
// SColumnInfoData* pCol1 = taosArrayGet(pSecQueryHandle->pColumns, i);
|
|
||||||
// assert(pCol->info.colId == pCol1->info.colId);
|
|
||||||
//
|
|
||||||
// memcpy((char*)pCol->pData + pCol->info.bytes, pCol1->pData, pCol1->info.bytes);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// SColumnInfoData* pTSCol = taosArrayGet(pQueryHandle->pColumns, 0);
|
|
||||||
//
|
|
||||||
// // it is ascending order
|
|
||||||
// pQueryHandle->order = TSDB_ORDER_DESC;
|
|
||||||
// pQueryHandle->window = pQueryHandle->cur.win;
|
|
||||||
// pQueryHandle->cur.win = (STimeWindow){((TSKEY*)pTSCol->pData)[0], ((TSKEY*)pTSCol->pData)[1]};
|
|
||||||
// pQueryHandle->cur.rows = 2;
|
|
||||||
// pQueryHandle->cur.mixBlock = true;
|
|
||||||
//
|
|
||||||
// int32_t step = -1; // one step for ascending order traverse
|
|
||||||
// for (int32_t j = 0; j < si; ++j) {
|
|
||||||
// STableCheckInfo* pCheckInfo = (STableCheckInfo*)taosArrayGet(pQueryHandle->pTableCheckInfo, j);
|
|
||||||
// pCheckInfo->lastKey = pQueryHandle->cur.win.ekey + step;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// tsdbCleanupQueryHandle(pSecQueryHandle);
|
|
||||||
// }
|
|
||||||
// } else { // go back to normal query
|
|
||||||
// if (pQueryHandle->cur.win.ekey == win->skey) {
|
|
||||||
// pQueryHandle->type = TSDB_QUERY_TYPE_ALL;
|
|
||||||
//
|
|
||||||
// STsdbQueryCond cond = {.order = TSDB_ORDER_ASC, .numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle))};
|
|
||||||
//
|
|
||||||
// cond.twindow = pQueryHandle->oriWindow;;
|
|
||||||
//
|
|
||||||
// cond.colList = calloc(cond.numOfCols, sizeof(SColumnInfo));
|
|
||||||
// if (cond.colList == NULL) {
|
|
||||||
// terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// STsdbQueryHandle* pSecQueryHandle =
|
|
||||||
// tsdbQueryTablesImpl(pQueryHandle->pTsdb, &cond, pQueryHandle->qinfo, pQueryHandle->pMemRef);
|
|
||||||
//
|
|
||||||
// tfree(cond.colList);
|
|
||||||
//
|
|
||||||
// pSecQueryHandle->pTableCheckInfo =
|
|
||||||
// createCheckInfoFromCheckInfo(pQueryHandle->pTableCheckInfo, pSecQueryHandle->window.skey);
|
|
||||||
// if (pSecQueryHandle->pTableCheckInfo == NULL) {
|
|
||||||
// tsdbCleanupQueryHandle(pSecQueryHandle);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return true;
|
|
||||||
// } else {
|
|
||||||
// // save the pre rows for interpolation query.
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // disable it after retrieve data
|
|
||||||
// pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
|
|
||||||
// pQueryHandle->checkFiles = false;
|
|
||||||
// return true;
|
|
||||||
//}
|
|
||||||
|
|
||||||
// handle data in cache situation
|
// handle data in cache situation
|
||||||
bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
||||||
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
|
STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*) pHandle;
|
||||||
|
@ -2191,16 +2044,7 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
||||||
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
size_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
||||||
assert(numOfTables > 0);
|
assert(numOfTables > 0);
|
||||||
|
|
||||||
// if (pQueryHandle->type == TSDB_QUERY_TYPE_EXTERNAL) {
|
if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
|
||||||
// SMemRef* pMemRef = pQueryHandle->pMemRef;
|
|
||||||
// tsdbMayTakeMemSnapshot(pQueryHandle);
|
|
||||||
// bool ret = getNeighborRows(pQueryHandle);
|
|
||||||
// tsdbMayUnTakeMemSnapshot(pQueryHandle);
|
|
||||||
//
|
|
||||||
// // restore the pMemRef
|
|
||||||
// pQueryHandle->pMemRef = pMemRef;
|
|
||||||
// return ret;
|
|
||||||
/*} else*/ if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
|
|
||||||
// the last row is cached in buffer, return it directly.
|
// the last row is cached in buffer, return it directly.
|
||||||
// here note that the pQueryHandle->window must be the TS_INITIALIZER
|
// here note that the pQueryHandle->window must be the TS_INITIALIZER
|
||||||
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
|
int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
|
||||||
|
@ -2872,7 +2716,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, tExprNode* pExpr)
|
||||||
};
|
};
|
||||||
|
|
||||||
getTableListfromSkipList(pExpr, pSTable->pIndex, pRes, &supp);
|
getTableListfromSkipList(pExpr, pSTable->pIndex, pRes, &supp);
|
||||||
tExprTreeDestroy(&pExpr, destroyHelper);
|
tExprTreeDestroy(pExpr, destroyHelper);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2929,10 +2773,10 @@ int32_t tsdbQuerySTableByTagCond(TSDB_REPO_T* tsdb, uint64_t uid, TSKEY skey, co
|
||||||
if (expr == NULL) {
|
if (expr == NULL) {
|
||||||
expr = exprTreeFromBinary(pTagCond, len);
|
expr = exprTreeFromBinary(pTagCond, len);
|
||||||
} else {
|
} else {
|
||||||
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, expr, NULL);
|
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, expr, NULL);
|
||||||
tExprNode* tagExpr = exprTreeFromBinary(pTagCond, len);
|
tExprNode* tagExpr = exprTreeFromBinary(pTagCond, len);
|
||||||
if (tagExpr != NULL) {
|
if (tagExpr != NULL) {
|
||||||
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprNodeDestroy, tagExpr, NULL);
|
CLEANUP_PUSH_VOID_PTR_PTR(true, tExprTreeDestroy, tagExpr, NULL);
|
||||||
tExprNode* tbnameExpr = expr;
|
tExprNode* tbnameExpr = expr;
|
||||||
expr = calloc(1, sizeof(tExprNode));
|
expr = calloc(1, sizeof(tExprNode));
|
||||||
if (expr == NULL) {
|
if (expr == NULL) {
|
||||||
|
|
Loading…
Reference in New Issue