From 7654cb6dd4caf704eb0fcc4f4f7104b1ede799ae Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 17 Jun 2021 05:00:22 +0800 Subject: [PATCH] [TD-3086]tag support timestamp and in_operator support timestamp --- src/client/src/tscSQLParser.c | 39 +++++++++++++++++++++++++---------- src/common/src/texpr.c | 5 ++++- src/query/src/qFilterfunc.c | 2 +- src/tsdb/src/tsdbRead.c | 2 +- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index fcb549a66a..e9bf4cdb0d 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -63,7 +63,8 @@ static SExprInfo* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t colIndex, int3 static int32_t setShowInfo(SSqlObj* pSql, SSqlInfo* pInfo); static char* getAccountId(SSqlObj* pSql); -static bool serializeExprListToVariant(SArray* pList, tVariant **dest, int16_t colType); +static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision); +static bool serializeExprListToVariant(SArray* pList, tVariant **dest, int16_t colType, uint8_t precision); static int32_t validateParamOfRelationIn(tVariant *pVar, int32_t colType); static bool has(SArray* pFieldList, int32_t startIdx, const char* name); @@ -149,7 +150,7 @@ int16_t getNewResColId(SSqlCmd* pCmd) { // serialize expr in exprlist to binary // formate "type | size | value" -bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType) { +bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, uint8_t precision) { bool ret = false; if (!pList || pList->size <= 0 || colType < 0) { return ret; @@ -161,9 +162,11 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType) //nchar to binary and toTSDBType(type); - if (type != colType && (type != TSDB_DATA_TYPE_BINARY || colType != TSDB_DATA_TYPE_NCHAR)) { - return false; - } + if (colType != TSDB_DATA_TYPE_TIMESTAMP) { + if (type != colType && (type != TSDB_DATA_TYPE_BINARY || colType != TSDB_DATA_TYPE_NCHAR)) { + return false; + } + } type = colType; SBufferWriter bw = tbufInitWriter( NULL, false ); @@ -185,8 +188,7 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType) tVariant var; tVariantCreate(&var, &pSub->token); - if (type == TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_TINYINT || type == TSDB_DATA_TYPE_SMALLINT - || type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_INT) { + if (type == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(type) || IS_UNSIGNED_NUMERIC_TYPE(type)) { tbufWriteInt64(&bw, var.i64); } else if (type == TSDB_DATA_TYPE_DOUBLE || type == TSDB_DATA_TYPE_FLOAT) { tbufWriteDouble(&bw, var.dKey); @@ -201,6 +203,16 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType) } tbufWriteBinary(&bw, buf, twcslen((wchar_t *)buf) * TSDB_NCHAR_SIZE); free(buf); + } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { + if (var.nType == TSDB_DATA_TYPE_BINARY) { + if (convertTimestampStrToInt64(&var, precision) < 0) { + tVariantDestroy(&var); + break; + } + tbufWriteInt64(&bw, var.i64); + } else if (var.nType == TSDB_DATA_TYPE_BIGINT) { + tbufWriteInt64(&bw, var.i64); + } } tVariantDestroy(&var); @@ -3340,7 +3352,8 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, // TK_GT,TK_GE,TK_EQ,TK_NE are based on the pColumn->lowerBndd } else if (pExpr->tokenId == TK_IN) { tVariant *pVal; - if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->pParam, &pVal, colType) || colType == TSDB_DATA_TYPE_TIMESTAMP) { + + if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->pParam, &pVal, colType, timePrecision)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg); } if (validateParamOfRelationIn(pVal, colType) != TSDB_CODE_SUCCESS) { @@ -3352,7 +3365,6 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, pColumnFilter->len = pVal->nLen; pColumnFilter->filterstr = 1; memcpy((char *)(pColumnFilter->pz), (char *)(pVal->pz), pVal->nLen); - //retVal = tVariantDump(pVal, (char *)(pColumnFilter->pz), TSDB_DATA_TYPE_BINARY, false); tVariantDestroy(pVal); free(pVal); @@ -3485,6 +3497,7 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC const char* msg1 = "non binary column not support like operator"; const char* msg2 = "binary column not support this operator"; const char* msg3 = "bool column not support this operator"; + const char* msg4 = "primary key not support this operator"; SColumn* pColumn = tscColumnListInsert(pQueryInfo->colList, pIndex->columnIndex, pTableMeta->id.uid, pSchema); SColumnFilterInfo* pColFilter = NULL; @@ -3541,6 +3554,9 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC pColumn->columnIndex = pIndex->columnIndex; pColumn->tableUid = pTableMeta->id.uid; + if (pColumn->columnIndex == PRIMARYKEY_TIMESTAMP_COL_INDEX && pExpr->tokenId == TK_IN) { + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); + } STableComInfo tinfo = tscGetTableInfo(pTableMeta); return doExtractColumnFilterInfo(pCmd, pQueryInfo, tinfo.precision, pColFilter, pSchema->type, pExpr); @@ -8116,14 +8132,15 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS colType = pSchema->type; } } - tVariant *pVal; if (colType >= TSDB_DATA_TYPE_TINYINT && colType <= TSDB_DATA_TYPE_BIGINT) { colType = TSDB_DATA_TYPE_BIGINT; } else if (colType == TSDB_DATA_TYPE_FLOAT || colType == TSDB_DATA_TYPE_DOUBLE) { colType = TSDB_DATA_TYPE_DOUBLE; } - if (serializeExprListToVariant(pSqlExpr->pParam, &pVal, colType) == false) { + STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); + STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta); + if (serializeExprListToVariant(pSqlExpr->pParam, &pVal, colType, tinfo.precision) == false) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), "not support filter expression"); } *pExpr = calloc(1, sizeof(tExprNode)); diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index 0e9ec053cc..0fbbfcd16f 100644 --- a/src/common/src/texpr.c +++ b/src/common/src/texpr.c @@ -476,7 +476,10 @@ void buildFilterSetFromBinary(void **q, const char *buf, int32_t len) { int dummy = -1; int32_t sz = tbufReadInt32(&br); for (int32_t i = 0; i < sz; i++) { - if (type == TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_TINYINT || type == TSDB_DATA_TYPE_SMALLINT || type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_INT) { + if (type == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(type) || IS_UNSIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_TIMESTAMP) { + int64_t val = tbufReadInt64(&br); + taosHashPut(pObj, (char *)&val, sizeof(val), &dummy, sizeof(dummy)); + } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t val = tbufReadInt64(&br); taosHashPut(pObj, (char *)&val, sizeof(val), &dummy, sizeof(dummy)); } else if (type == TSDB_DATA_TYPE_DOUBLE || type == TSDB_DATA_TYPE_FLOAT) { diff --git a/src/query/src/qFilterfunc.c b/src/query/src/qFilterfunc.c index 7e8dd66ed1..cfc3bfa125 100644 --- a/src/query/src/qFilterfunc.c +++ b/src/query/src/qFilterfunc.c @@ -254,7 +254,7 @@ bool notNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* return true; } bool inOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) { - if (type == TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_TINYINT || type == TSDB_DATA_TYPE_SMALLINT || type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_INT) { + if (type == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(type) || IS_UNSIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t minv = -1, maxv = -1; GET_TYPED_DATA(minv, int64_t, type, minval); GET_TYPED_DATA(maxv, int64_t, type, maxval); diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index 972c3c4e10..a582e920f2 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -3355,7 +3355,7 @@ static bool tableFilterFp(const void* pNode, void* param) { } } else if (pInfo->optr == TSDB_RELATION_IN) { int type = pInfo->sch.type; - if (type == TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_TINYINT || type == TSDB_DATA_TYPE_SMALLINT || type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_INT) { + if (type == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(type) || IS_UNSIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_TIMESTAMP) { int64_t v; GET_TYPED_DATA(v, int64_t, pInfo->sch.type, val); return NULL != taosHashGet((SHashObj *)pInfo->q, (char *)&v, sizeof(v)); -- GitLab