Merge pull request #16223 from taosdata/fix/3.0_bugfix_wxy
fix: escape character problem in auto create table insert
This commit is contained in:
commit
af22a928c6
|
@ -105,7 +105,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_COLUMN_REF,
|
QUERY_NODE_COLUMN_REF,
|
||||||
|
|
||||||
// Statement nodes are used in parser and planner module.
|
// Statement nodes are used in parser and planner module.
|
||||||
QUERY_NODE_SET_OPERATOR,
|
QUERY_NODE_SET_OPERATOR = 100,
|
||||||
QUERY_NODE_SELECT_STMT,
|
QUERY_NODE_SELECT_STMT,
|
||||||
QUERY_NODE_VNODE_MODIF_STMT,
|
QUERY_NODE_VNODE_MODIF_STMT,
|
||||||
QUERY_NODE_CREATE_DATABASE_STMT,
|
QUERY_NODE_CREATE_DATABASE_STMT,
|
||||||
|
@ -198,7 +198,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_QUERY,
|
QUERY_NODE_QUERY,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN,
|
QUERY_NODE_LOGIC_PLAN_SCAN = 1000,
|
||||||
QUERY_NODE_LOGIC_PLAN_JOIN,
|
QUERY_NODE_LOGIC_PLAN_JOIN,
|
||||||
QUERY_NODE_LOGIC_PLAN_AGG,
|
QUERY_NODE_LOGIC_PLAN_AGG,
|
||||||
QUERY_NODE_LOGIC_PLAN_PROJECT,
|
QUERY_NODE_LOGIC_PLAN_PROJECT,
|
||||||
|
@ -215,7 +215,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_LOGIC_PLAN,
|
QUERY_NODE_LOGIC_PLAN,
|
||||||
|
|
||||||
// physical plan node
|
// physical plan node
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN = 1100,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN,
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN,
|
||||||
|
|
|
@ -428,6 +428,9 @@ void nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal);
|
||||||
char* nodesGetFillModeString(EFillMode mode);
|
char* nodesGetFillModeString(EFillMode mode);
|
||||||
int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc);
|
int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc);
|
||||||
|
|
||||||
|
const char* operatorTypeStr(EOperatorType type);
|
||||||
|
const char* logicConditionTypeStr(ELogicConditionType type);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -132,15 +132,14 @@ typedef enum EOperatorType {
|
||||||
OP_TYPE_DIV,
|
OP_TYPE_DIV,
|
||||||
OP_TYPE_REM,
|
OP_TYPE_REM,
|
||||||
// unary arithmetic operator
|
// unary arithmetic operator
|
||||||
OP_TYPE_MINUS,
|
OP_TYPE_MINUS = 20,
|
||||||
OP_TYPE_ASSIGN,
|
|
||||||
|
|
||||||
// bitwise operator
|
// bitwise operator
|
||||||
OP_TYPE_BIT_AND,
|
OP_TYPE_BIT_AND = 30,
|
||||||
OP_TYPE_BIT_OR,
|
OP_TYPE_BIT_OR,
|
||||||
|
|
||||||
// binary comparison operator
|
// binary comparison operator
|
||||||
OP_TYPE_GREATER_THAN,
|
OP_TYPE_GREATER_THAN = 40,
|
||||||
OP_TYPE_GREATER_EQUAL,
|
OP_TYPE_GREATER_EQUAL,
|
||||||
OP_TYPE_LOWER_THAN,
|
OP_TYPE_LOWER_THAN,
|
||||||
OP_TYPE_LOWER_EQUAL,
|
OP_TYPE_LOWER_EQUAL,
|
||||||
|
@ -153,7 +152,7 @@ typedef enum EOperatorType {
|
||||||
OP_TYPE_MATCH,
|
OP_TYPE_MATCH,
|
||||||
OP_TYPE_NMATCH,
|
OP_TYPE_NMATCH,
|
||||||
// unary comparison operator
|
// unary comparison operator
|
||||||
OP_TYPE_IS_NULL,
|
OP_TYPE_IS_NULL = 100,
|
||||||
OP_TYPE_IS_NOT_NULL,
|
OP_TYPE_IS_NOT_NULL,
|
||||||
OP_TYPE_IS_TRUE,
|
OP_TYPE_IS_TRUE,
|
||||||
OP_TYPE_IS_FALSE,
|
OP_TYPE_IS_FALSE,
|
||||||
|
@ -163,8 +162,11 @@ typedef enum EOperatorType {
|
||||||
OP_TYPE_IS_NOT_UNKNOWN,
|
OP_TYPE_IS_NOT_UNKNOWN,
|
||||||
|
|
||||||
// json operator
|
// json operator
|
||||||
OP_TYPE_JSON_GET_VALUE,
|
OP_TYPE_JSON_GET_VALUE = 150,
|
||||||
OP_TYPE_JSON_CONTAINS
|
OP_TYPE_JSON_CONTAINS,
|
||||||
|
|
||||||
|
// internal operator
|
||||||
|
OP_TYPE_ASSIGN = 200
|
||||||
} EOperatorType;
|
} EOperatorType;
|
||||||
|
|
||||||
#define OP_TYPE_CALC_MAX OP_TYPE_BIT_OR
|
#define OP_TYPE_CALC_MAX OP_TYPE_BIT_OR
|
||||||
|
|
|
@ -88,7 +88,7 @@ static const SSysDbTableSchema userDBSchema[] = {
|
||||||
{.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
{.name = "comp", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT},
|
||||||
{.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "precision", .bytes = 2 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "retention", .bytes = 60 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "retentions", .bytes = 60 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "single_stable", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL},
|
{.name = "single_stable", .bytes = 1, .type = TSDB_DATA_TYPE_BOOL},
|
||||||
{.name = "cachemodel", .bytes = TSDB_CACHE_MODEL_STR_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "cachemodel", .bytes = TSDB_CACHE_MODEL_STR_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "cachesize", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "cachesize", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
|
|
@ -205,7 +205,7 @@ typedef struct SExprSupp {
|
||||||
} SExprSupp;
|
} SExprSupp;
|
||||||
|
|
||||||
typedef struct SOperatorInfo {
|
typedef struct SOperatorInfo {
|
||||||
uint8_t operatorType;
|
uint16_t operatorType;
|
||||||
bool blocking; // block operator or not
|
bool blocking; // block operator or not
|
||||||
uint8_t status; // denote if current operator is completed
|
uint8_t status; // denote if current operator is completed
|
||||||
char* name; // name, for debug purpose
|
char* name; // name, for debug purpose
|
||||||
|
@ -434,7 +434,7 @@ typedef struct SStreamAggSupporter {
|
||||||
typedef struct SessionWindowSupporter {
|
typedef struct SessionWindowSupporter {
|
||||||
SStreamAggSupporter* pStreamAggSup;
|
SStreamAggSupporter* pStreamAggSup;
|
||||||
int64_t gap;
|
int64_t gap;
|
||||||
uint8_t parentType;
|
uint16_t parentType;
|
||||||
SAggSupporter* pIntervalAggSup;
|
SAggSupporter* pIntervalAggSup;
|
||||||
} SessionWindowSupporter;
|
} SessionWindowSupporter;
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,7 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
|
||||||
taosThreadOnce(&initPoolOnce, initRefPool);
|
taosThreadOnce(&initPoolOnce, initRefPool);
|
||||||
atexit(cleanupRefPool);
|
atexit(cleanupRefPool);
|
||||||
|
|
||||||
qDebug("start to create subplan task, TID:0x%"PRIx64 " QID:0x%"PRIx64, taskId, pSubplan->id.queryId);
|
qDebug("start to create subplan task, TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, pSubplan->id.queryId);
|
||||||
|
|
||||||
int32_t code = createExecTaskInfoImpl(pSubplan, pTask, readHandle, taskId, sql, model);
|
int32_t code = createExecTaskInfoImpl(pSubplan, pTask, readHandle, taskId, sql, model);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -374,7 +374,7 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("subplan task create completed, TID:0x%"PRIx64 " QID:0x%"PRIx64, taskId, pSubplan->id.queryId);
|
qDebug("subplan task create completed, TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, pSubplan->id.queryId);
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
// if failed to add ref for all tables in this query, abort current query
|
// if failed to add ref for all tables in this query, abort current query
|
||||||
|
@ -427,7 +427,7 @@ int waitMoment(SQInfo* pQInfo) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void freeBlock(void* param) {
|
static void freeBlock(void* param) {
|
||||||
SSDataBlock* pBlock = *(SSDataBlock**) param;
|
SSDataBlock* pBlock = *(SSDataBlock**)param;
|
||||||
blockDataDestroy(pBlock);
|
blockDataDestroy(pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,12 +467,12 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds) {
|
||||||
|
|
||||||
qDebug("%s execTask is launched", GET_TASKID(pTaskInfo));
|
qDebug("%s execTask is launched", GET_TASKID(pTaskInfo));
|
||||||
|
|
||||||
int32_t current = 0;
|
int32_t current = 0;
|
||||||
SSDataBlock* pRes = NULL;
|
SSDataBlock* pRes = NULL;
|
||||||
|
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
while((pRes = pTaskInfo->pRoot->fpSet.getNextFn(pTaskInfo->pRoot)) != NULL) {
|
while ((pRes = pTaskInfo->pRoot->fpSet.getNextFn(pTaskInfo->pRoot)) != NULL) {
|
||||||
SSDataBlock* p = createOneDataBlock(pRes, true);
|
SSDataBlock* p = createOneDataBlock(pRes, true);
|
||||||
current += p->info.rows;
|
current += p->info.rows;
|
||||||
ASSERT(p->info.rows > 0);
|
ASSERT(p->info.rows > 0);
|
||||||
|
@ -494,7 +494,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds) {
|
||||||
uint64_t total = pTaskInfo->pRoot->resultInfo.totalRows;
|
uint64_t total = pTaskInfo->pRoot->resultInfo.totalRows;
|
||||||
|
|
||||||
qDebug("%s task suspended, %d rows in %d blocks returned, total:%" PRId64 " rows, in sinkNode:%d, elapsed:%.2f ms",
|
qDebug("%s task suspended, %d rows in %d blocks returned, total:%" PRId64 " rows, in sinkNode:%d, elapsed:%.2f ms",
|
||||||
GET_TASKID(pTaskInfo), current, (int32_t) taosArrayGetSize(pResList), total, 0, el / 1000.0);
|
GET_TASKID(pTaskInfo), current, (int32_t)taosArrayGetSize(pResList), total, 0, el / 1000.0);
|
||||||
|
|
||||||
atomic_store_64(&pTaskInfo->owner, 0);
|
atomic_store_64(&pTaskInfo->owner, 0);
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
|
@ -632,7 +632,7 @@ int32_t qExtractStreamScanner(qTaskInfo_t tinfo, void** scanner) {
|
||||||
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
uint8_t type = pOperator->operatorType;
|
uint16_t type = pOperator->operatorType;
|
||||||
if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
*scanner = pOperator->info;
|
*scanner = pOperator->info;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -691,7 +691,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset) {
|
||||||
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
||||||
if (!tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus)) {
|
if (!tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus)) {
|
||||||
while (1) {
|
while (1) {
|
||||||
uint8_t type = pOperator->operatorType;
|
uint16_t type = pOperator->operatorType;
|
||||||
pOperator->status = OP_OPENED;
|
pOperator->status = OP_OPENED;
|
||||||
// TODO add more check
|
// TODO add more check
|
||||||
if (type != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (type != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
|
|
|
@ -1785,7 +1785,7 @@ void increaseTs(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initIntervalDownStream(SOperatorInfo* downstream, uint8_t type, SAggSupporter* pSup) {
|
void initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SAggSupporter* pSup) {
|
||||||
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
// Todo(liuyao) support partition by column
|
// Todo(liuyao) support partition by column
|
||||||
return;
|
return;
|
||||||
|
@ -3546,7 +3546,7 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num
|
||||||
}
|
}
|
||||||
|
|
||||||
void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t gap, int64_t waterMark,
|
void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t gap, int64_t waterMark,
|
||||||
uint8_t type) {
|
uint16_t type) {
|
||||||
ASSERT(downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN);
|
ASSERT(downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN);
|
||||||
SStreamScanInfo* pScanInfo = downstream->info;
|
SStreamScanInfo* pScanInfo = downstream->info;
|
||||||
pScanInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = pAggSup, .gap = gap, .parentType = type};
|
pScanInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = pAggSup, .gap = gap, .parentType = type};
|
||||||
|
|
|
@ -4673,7 +4673,6 @@ static int32_t jsonToNode(const SJson* pJson, void* pObj) {
|
||||||
|
|
||||||
int32_t code;
|
int32_t code;
|
||||||
tjsonGetNumberValue(pJson, jkNodeType, pNode->type, code);
|
tjsonGetNumberValue(pJson, jkNodeType, pNode->type, code);
|
||||||
;
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonToObject(pJson, nodesNodeName(pNode->type), jsonToSpecificNode, pNode);
|
code = tjsonToObject(pJson, nodesNodeName(pNode->type), jsonToSpecificNode, pNode);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
|
|
@ -21,36 +21,89 @@
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
|
|
||||||
char *gOperatorStr[] = {NULL,
|
const char *operatorTypeStr(EOperatorType type) {
|
||||||
"+",
|
switch (type) {
|
||||||
"-",
|
case OP_TYPE_ADD:
|
||||||
"*",
|
return "+";
|
||||||
"/",
|
case OP_TYPE_SUB:
|
||||||
"%",
|
return "-";
|
||||||
"-",
|
case OP_TYPE_MULTI:
|
||||||
"&",
|
return "*";
|
||||||
"|",
|
case OP_TYPE_DIV:
|
||||||
">",
|
return "/";
|
||||||
">=",
|
case OP_TYPE_REM:
|
||||||
"<",
|
return "%";
|
||||||
"<=",
|
case OP_TYPE_MINUS:
|
||||||
"=",
|
return "-";
|
||||||
"<>",
|
case OP_TYPE_BIT_AND:
|
||||||
"IN",
|
return "&";
|
||||||
"NOT IN",
|
case OP_TYPE_BIT_OR:
|
||||||
"LIKE",
|
return "|";
|
||||||
"NOT LIKE",
|
case OP_TYPE_GREATER_THAN:
|
||||||
"MATCH",
|
return ">";
|
||||||
"NMATCH",
|
case OP_TYPE_GREATER_EQUAL:
|
||||||
"IS NULL",
|
return ">=";
|
||||||
"IS NOT NULL",
|
case OP_TYPE_LOWER_THAN:
|
||||||
"IS TRUE",
|
return "<";
|
||||||
"IS FALSE",
|
case OP_TYPE_LOWER_EQUAL:
|
||||||
"IS UNKNOWN",
|
return "<=";
|
||||||
"IS NOT TRUE",
|
case OP_TYPE_EQUAL:
|
||||||
"IS NOT FALSE",
|
return "=";
|
||||||
"IS NOT UNKNOWN"};
|
case OP_TYPE_NOT_EQUAL:
|
||||||
char *gLogicConditionStr[] = {"AND", "OR", "NOT"};
|
return "<>";
|
||||||
|
case OP_TYPE_IN:
|
||||||
|
return "IN";
|
||||||
|
case OP_TYPE_NOT_IN:
|
||||||
|
return "NOT IN";
|
||||||
|
case OP_TYPE_LIKE:
|
||||||
|
return "LIKE";
|
||||||
|
case OP_TYPE_NOT_LIKE:
|
||||||
|
return "NOT LIKE";
|
||||||
|
case OP_TYPE_MATCH:
|
||||||
|
return "MATCH";
|
||||||
|
case OP_TYPE_NMATCH:
|
||||||
|
return "NMATCH";
|
||||||
|
case OP_TYPE_IS_NULL:
|
||||||
|
return "IS NULL";
|
||||||
|
case OP_TYPE_IS_NOT_NULL:
|
||||||
|
return "IS NOT NULL";
|
||||||
|
case OP_TYPE_IS_TRUE:
|
||||||
|
return "IS TRUE";
|
||||||
|
case OP_TYPE_IS_FALSE:
|
||||||
|
return "IS FALSE";
|
||||||
|
case OP_TYPE_IS_UNKNOWN:
|
||||||
|
return "IS UNKNOWN";
|
||||||
|
case OP_TYPE_IS_NOT_TRUE:
|
||||||
|
return "IS NOT TRUE";
|
||||||
|
case OP_TYPE_IS_NOT_FALSE:
|
||||||
|
return "IS NOT FALSE";
|
||||||
|
case OP_TYPE_IS_NOT_UNKNOWN:
|
||||||
|
return "IS NOT UNKNOWN";
|
||||||
|
case OP_TYPE_JSON_GET_VALUE:
|
||||||
|
return "=>";
|
||||||
|
case OP_TYPE_JSON_CONTAINS:
|
||||||
|
return "CONTAINS";
|
||||||
|
case OP_TYPE_ASSIGN:
|
||||||
|
return "=";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *logicConditionTypeStr(ELogicConditionType type) {
|
||||||
|
switch (type) {
|
||||||
|
case LOGIC_COND_TYPE_AND:
|
||||||
|
return "AND";
|
||||||
|
case LOGIC_COND_TYPE_OR:
|
||||||
|
return "OR";
|
||||||
|
case LOGIC_COND_TYPE_NOT:
|
||||||
|
return "NOT";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
|
int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
|
||||||
switch (pNode->type) {
|
switch (pNode->type) {
|
||||||
|
@ -94,12 +147,7 @@ int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
|
||||||
NODES_ERR_RET(nodesNodeToSQL(pOpNode->pLeft, buf, bufSize, len));
|
NODES_ERR_RET(nodesNodeToSQL(pOpNode->pLeft, buf, bufSize, len));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pOpNode->opType >= (sizeof(gOperatorStr) / sizeof(gOperatorStr[0]))) {
|
*len += snprintf(buf + *len, bufSize - *len, " %s ", operatorTypeStr(pOpNode->opType));
|
||||||
nodesError("unknown operation type:%d", pOpNode->opType);
|
|
||||||
NODES_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
*len += snprintf(buf + *len, bufSize - *len, " %s ", gOperatorStr[pOpNode->opType]);
|
|
||||||
|
|
||||||
if (pOpNode->pRight) {
|
if (pOpNode->pRight) {
|
||||||
NODES_ERR_RET(nodesNodeToSQL(pOpNode->pRight, buf, bufSize, len));
|
NODES_ERR_RET(nodesNodeToSQL(pOpNode->pRight, buf, bufSize, len));
|
||||||
|
@ -118,7 +166,7 @@ int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
|
||||||
|
|
||||||
FOREACH(node, pLogicNode->pParameterList) {
|
FOREACH(node, pLogicNode->pParameterList) {
|
||||||
if (!first) {
|
if (!first) {
|
||||||
*len += snprintf(buf + *len, bufSize - *len, " %s ", gLogicConditionStr[pLogicNode->condType]);
|
*len += snprintf(buf + *len, bufSize - *len, " %s ", logicConditionTypeStr(pLogicNode->condType));
|
||||||
}
|
}
|
||||||
NODES_ERR_RET(nodesNodeToSQL(node, buf, bufSize, len));
|
NODES_ERR_RET(nodesNodeToSQL(node, buf, bufSize, len));
|
||||||
first = false;
|
first = false;
|
||||||
|
|
|
@ -143,9 +143,9 @@ static int32_t createSName(SName* pName, SToken* pTableName, int32_t acctId, con
|
||||||
}
|
}
|
||||||
char name[TSDB_DB_FNAME_LEN] = {0};
|
char name[TSDB_DB_FNAME_LEN] = {0};
|
||||||
strncpy(name, pTableName->z, dbLen);
|
strncpy(name, pTableName->z, dbLen);
|
||||||
dbLen = strdequote(name);
|
int32_t actualDbLen = strdequote(name);
|
||||||
|
|
||||||
code = tNameSetDbName(pName, acctId, name, dbLen);
|
code = tNameSetDbName(pName, acctId, name, actualDbLen);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return buildInvalidOperationMsg(pMsgBuf, msg1);
|
return buildInvalidOperationMsg(pMsgBuf, msg1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,7 +350,6 @@ struct SFilterInfo {
|
||||||
|
|
||||||
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
||||||
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
||||||
extern OptrStr gOptrStr[];
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,46 +24,6 @@
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
|
|
||||||
OptrStr gOptrStr[] = {
|
|
||||||
{0, "invalid"},
|
|
||||||
{OP_TYPE_ADD, "+"},
|
|
||||||
{OP_TYPE_SUB, "-"},
|
|
||||||
{OP_TYPE_MULTI, "*"},
|
|
||||||
{OP_TYPE_DIV, "/"},
|
|
||||||
{OP_TYPE_REM, "%"},
|
|
||||||
{OP_TYPE_MINUS, "minus"},
|
|
||||||
{OP_TYPE_ASSIGN, "assign"},
|
|
||||||
// bit operator
|
|
||||||
{OP_TYPE_BIT_AND, "&"},
|
|
||||||
{OP_TYPE_BIT_OR, "|"},
|
|
||||||
|
|
||||||
// comparison operator
|
|
||||||
{OP_TYPE_GREATER_THAN, ">"},
|
|
||||||
{OP_TYPE_GREATER_EQUAL, ">="},
|
|
||||||
{OP_TYPE_LOWER_THAN, "<"},
|
|
||||||
{OP_TYPE_LOWER_EQUAL, "<="},
|
|
||||||
{OP_TYPE_EQUAL, "=="},
|
|
||||||
{OP_TYPE_NOT_EQUAL, "!="},
|
|
||||||
{OP_TYPE_IN, "in"},
|
|
||||||
{OP_TYPE_NOT_IN, "not in"},
|
|
||||||
{OP_TYPE_LIKE, "like"},
|
|
||||||
{OP_TYPE_NOT_LIKE, "not like"},
|
|
||||||
{OP_TYPE_MATCH, "match"},
|
|
||||||
{OP_TYPE_NMATCH, "nmatch"},
|
|
||||||
{OP_TYPE_IS_NULL, "is null"},
|
|
||||||
{OP_TYPE_IS_NOT_NULL, "not null"},
|
|
||||||
{OP_TYPE_IS_TRUE, "is true"},
|
|
||||||
{OP_TYPE_IS_FALSE, "is false"},
|
|
||||||
{OP_TYPE_IS_UNKNOWN, "is unknown"},
|
|
||||||
{OP_TYPE_IS_NOT_TRUE, "not true"},
|
|
||||||
{OP_TYPE_IS_NOT_FALSE, "not false"},
|
|
||||||
{OP_TYPE_IS_NOT_UNKNOWN, "not unknown"},
|
|
||||||
|
|
||||||
// json operator
|
|
||||||
{OP_TYPE_JSON_GET_VALUE, "->"},
|
|
||||||
{OP_TYPE_JSON_CONTAINS, "json contains"}
|
|
||||||
};
|
|
||||||
|
|
||||||
bool filterRangeCompGi (const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
|
bool filterRangeCompGi (const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
|
||||||
int32_t result = cfunc(maxv, minr);
|
int32_t result = cfunc(maxv, minr);
|
||||||
return result >= 0;
|
return result >= 0;
|
||||||
|
@ -986,7 +946,7 @@ int32_t filterAddUnit(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFi
|
||||||
} else {
|
} else {
|
||||||
int32_t paramNum = scalarGetOperatorParamNum(optr);
|
int32_t paramNum = scalarGetOperatorParamNum(optr);
|
||||||
if (1 != paramNum) {
|
if (1 != paramNum) {
|
||||||
fltError("invalid right field in unit, operator:%s, rightType:%d", gOptrStr[optr].str, u->right.type);
|
fltError("invalid right field in unit, operator:%s, rightType:%d", operatorTypeStr(optr), u->right.type);
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1517,7 +1477,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
|
||||||
SFilterField *left = FILTER_UNIT_LEFT_FIELD(info, unit);
|
SFilterField *left = FILTER_UNIT_LEFT_FIELD(info, unit);
|
||||||
SColumnNode *refNode = (SColumnNode *)left->desc;
|
SColumnNode *refNode = (SColumnNode *)left->desc;
|
||||||
if (unit->compare.optr >= 0 && unit->compare.optr <= OP_TYPE_JSON_CONTAINS){
|
if (unit->compare.optr >= 0 && unit->compare.optr <= OP_TYPE_JSON_CONTAINS){
|
||||||
len = sprintf(str, "UNIT[%d] => [%d][%d] %s [", i, refNode->dataBlockId, refNode->slotId, gOptrStr[unit->compare.optr].str);
|
len = sprintf(str, "UNIT[%d] => [%d][%d] %s [", i, refNode->dataBlockId, refNode->slotId, operatorTypeStr(unit->compare.optr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unit->right.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
|
if (unit->right.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
|
||||||
|
@ -1536,7 +1496,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
|
||||||
if (unit->compare.optr2) {
|
if (unit->compare.optr2) {
|
||||||
strcat(str, " && ");
|
strcat(str, " && ");
|
||||||
if (unit->compare.optr2 >= 0 && unit->compare.optr2 <= OP_TYPE_JSON_CONTAINS){
|
if (unit->compare.optr2 >= 0 && unit->compare.optr2 <= OP_TYPE_JSON_CONTAINS){
|
||||||
sprintf(str + strlen(str), "[%d][%d] %s [", refNode->dataBlockId, refNode->slotId, gOptrStr[unit->compare.optr2].str);
|
sprintf(str + strlen(str), "[%d][%d] %s [", refNode->dataBlockId, refNode->slotId, operatorTypeStr(unit->compare.optr2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unit->right2.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
|
if (unit->right2.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
|
||||||
|
|
|
@ -1089,16 +1089,16 @@ 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_REM || opType == OP_TYPE_MINUS){
|
opType == OP_TYPE_REM || opType == OP_TYPE_MINUS){
|
||||||
printf("op:%s,1result:%f,except:%f\n", gOptrStr[opType].str, *((double *)colDataGetData(column, 0)), exceptValue);
|
printf("op:%s,1result:%f,except:%f\n", operatorTypeStr(opType), *((double *)colDataGetData(column, 0)), exceptValue);
|
||||||
ASSERT_TRUE(fabs(*((double *)colDataGetData(column, 0)) - exceptValue) < 0.0001);
|
ASSERT_TRUE(fabs(*((double *)colDataGetData(column, 0)) - exceptValue) < 0.0001);
|
||||||
}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("op:%s,2result:%" PRId64 ",except:%f\n", gOptrStr[opType].str, *((int64_t *)colDataGetData(column, 0)), exceptValue);
|
printf("op:%s,2result:%" PRId64 ",except:%f\n", operatorTypeStr(opType), *((int64_t *)colDataGetData(column, 0)), exceptValue);
|
||||||
ASSERT_EQ(*((int64_t *)colDataGetData(column, 0)), exceptValue);
|
ASSERT_EQ(*((int64_t *)colDataGetData(column, 0)), exceptValue);
|
||||||
}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("op:%s,3result:%d,except:%f\n", gOptrStr[opType].str, *((bool *)colDataGetData(column, 0)), exceptValue);
|
printf("op:%s,3result:%d,except:%f\n", operatorTypeStr(opType), *((bool *)colDataGetData(column, 0)), exceptValue);
|
||||||
ASSERT_EQ(*((bool *)colDataGetData(column, 0)), exceptValue);
|
ASSERT_EQ(*((bool *)colDataGetData(column, 0)), exceptValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,7 +293,7 @@ class TDTestCase:
|
||||||
dbname = tdSql.getData(0,0)
|
dbname = tdSql.getData(0,0)
|
||||||
tdSql.query("select * from information_schema.ins_databases")
|
tdSql.query("select * from information_schema.ins_databases")
|
||||||
for index , value in enumerate(tdSql.cursor.description):
|
for index , value in enumerate(tdSql.cursor.description):
|
||||||
if value[0] == "retention":
|
if value[0] == "retentions":
|
||||||
r_index = index
|
r_index = index
|
||||||
break
|
break
|
||||||
for row in tdSql.queryResult:
|
for row in tdSql.queryResult:
|
||||||
|
|
Loading…
Reference in New Issue