Merge remote-tracking branch 'origin/develop' into feature/sync
This commit is contained in:
commit
7465d0c7f1
|
@ -348,7 +348,7 @@ function set_ipAsFqdn() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function local_fqdn_check() {
|
function local_fqdn_check() {
|
||||||
#serverFqdn=$(hostname -f)
|
#serverFqdn=$(hostname)
|
||||||
echo
|
echo
|
||||||
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
||||||
echo
|
echo
|
||||||
|
@ -911,7 +911,7 @@ function install_TDengine() {
|
||||||
|
|
||||||
|
|
||||||
## ==============================Main program starts from here============================
|
## ==============================Main program starts from here============================
|
||||||
serverFqdn=$(hostname -f)
|
serverFqdn=$(hostname)
|
||||||
if [ "$verType" == "server" ]; then
|
if [ "$verType" == "server" ]; then
|
||||||
# Install server and client
|
# Install server and client
|
||||||
if [ -x ${bin_dir}/taosd ]; then
|
if [ -x ${bin_dir}/taosd ]; then
|
||||||
|
|
|
@ -345,7 +345,7 @@ function set_ipAsFqdn() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function local_fqdn_check() {
|
function local_fqdn_check() {
|
||||||
#serverFqdn=$(hostname -f)
|
#serverFqdn=$(hostname)
|
||||||
echo
|
echo
|
||||||
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
||||||
echo
|
echo
|
||||||
|
@ -881,7 +881,7 @@ function install_PowerDB() {
|
||||||
|
|
||||||
|
|
||||||
## ==============================Main program starts from here============================
|
## ==============================Main program starts from here============================
|
||||||
serverFqdn=$(hostname -f)
|
serverFqdn=$(hostname)
|
||||||
if [ "$verType" == "server" ]; then
|
if [ "$verType" == "server" ]; then
|
||||||
# Install server and client
|
# Install server and client
|
||||||
if [ -x ${bin_dir}/powerd ]; then
|
if [ -x ${bin_dir}/powerd ]; then
|
||||||
|
|
|
@ -228,7 +228,7 @@ function set_ipAsFqdn() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function local_fqdn_check() {
|
function local_fqdn_check() {
|
||||||
#serverFqdn=$(hostname -f)
|
#serverFqdn=$(hostname)
|
||||||
echo
|
echo
|
||||||
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
||||||
echo
|
echo
|
||||||
|
@ -492,5 +492,5 @@ function install_TDengine() {
|
||||||
|
|
||||||
|
|
||||||
## ==============================Main program starts from here============================
|
## ==============================Main program starts from here============================
|
||||||
serverFqdn=$(hostname -f)
|
serverFqdn=$(hostname)
|
||||||
install_TDengine
|
install_TDengine
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
|
|
||||||
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
||||||
|
|
||||||
//struct SSchema;
|
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the number of tags of this table
|
* get the number of tags of this table
|
||||||
|
@ -91,7 +91,7 @@ SSchema* tscGetColumnSchemaById(STableMeta* pTableMeta, int16_t colId);
|
||||||
* @param numOfCols
|
* @param numOfCols
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool isValidSchema(struct SSchema *pSchema, int32_t numOfCols);
|
bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the schema for the "tbname" column. it is a built column
|
* get the schema for the "tbname" column. it is a built column
|
||||||
|
|
|
@ -460,7 +460,7 @@ static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pField
|
||||||
} else {
|
} else {
|
||||||
assert(bytes == tDataTypeDesc[type].nSize);
|
assert(bytes == tDataTypeDesc[type].nSize);
|
||||||
|
|
||||||
pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : (unsigned char*)&pInfo->pSqlExpr->param[1].i64Key;
|
pRes->tsrow[columnIndex] = isNull(pData, type) ? NULL : (unsigned char*)&pInfo->pSqlExpr->param[1].i64;
|
||||||
pRes->length[columnIndex] = bytes;
|
pRes->length[columnIndex] = bytes;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -388,7 +388,7 @@ void tscAsyncResultOnError(SSqlObj *pSql) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pSql->res.code != TSDB_CODE_SUCCESS);
|
assert(pSql->res.code != TSDB_CODE_SUCCESS);
|
||||||
tscError("%p add into queued async res, code:%s", pSql, tstrerror(pSql->res.code));
|
tscError("%p invoke user specified function due to error occured, code:%s", pSql, tstrerror(pSql->res.code));
|
||||||
|
|
||||||
SSqlRes *pRes = &pSql->res;
|
SSqlRes *pRes = &pSql->res;
|
||||||
if (pSql->fp == NULL || pSql->fetchFp == NULL){
|
if (pSql->fp == NULL || pSql->fetchFp == NULL){
|
||||||
|
@ -521,7 +521,6 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pSql->fp)(pSql->param, pSql, code);
|
(*pSql->fp)(pSql->param, pSql, code);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@ static int32_t tscProcessDescribeTable(SSqlObj *pSql) {
|
||||||
assert(tscGetMetaInfo(pQueryInfo, 0)->pTableMeta != NULL);
|
assert(tscGetMetaInfo(pQueryInfo, 0)->pTableMeta != NULL);
|
||||||
|
|
||||||
const int32_t NUM_OF_DESC_TABLE_COLUMNS = 4;
|
const int32_t NUM_OF_DESC_TABLE_COLUMNS = 4;
|
||||||
const int32_t TYPE_COLUMN_LENGTH = 16;
|
const int32_t TYPE_COLUMN_LENGTH = 20;
|
||||||
const int32_t NOTE_COLUMN_MIN_LENGTH = 8;
|
const int32_t NOTE_COLUMN_MIN_LENGTH = 8;
|
||||||
|
|
||||||
int32_t noteFieldLen = NOTE_COLUMN_MIN_LENGTH;
|
int32_t noteFieldLen = NOTE_COLUMN_MIN_LENGTH;
|
||||||
|
|
|
@ -95,11 +95,11 @@ static void tscInitSqlContext(SSqlCmd *pCmd, SLocalReducer *pReducer, tOrderDesc
|
||||||
int32_t functionId = pExpr->functionId;
|
int32_t functionId = pExpr->functionId;
|
||||||
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
||||||
pCtx->ptsOutputBuf = pReducer->pCtx[0].aOutputBuf;
|
pCtx->ptsOutputBuf = pReducer->pCtx[0].aOutputBuf;
|
||||||
pCtx->param[2].i64Key = pQueryInfo->order.order;
|
pCtx->param[2].i64 = pQueryInfo->order.order;
|
||||||
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
pCtx->param[1].i64Key = pQueryInfo->order.orderColId;
|
pCtx->param[1].i64 = pQueryInfo->order.orderColId;
|
||||||
} else if (functionId == TSDB_FUNC_APERCT) {
|
} else if (functionId == TSDB_FUNC_APERCT) {
|
||||||
pCtx->param[0].i64Key = pExpr->param[0].i64Key;
|
pCtx->param[0].i64 = pExpr->param[0].i64;
|
||||||
pCtx->param[0].nType = pExpr->param[0].nType;
|
pCtx->param[0].nType = pExpr->param[0].nType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,7 +1064,7 @@ static void doExecuteSecondaryMerge(SSqlCmd *pCmd, SLocalReducer *pLocalReducer,
|
||||||
}
|
}
|
||||||
} else if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM) {
|
} else if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM) {
|
||||||
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, j);
|
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, j);
|
||||||
pCtx->param[0].i64Key = pExpr->param[0].i64Key;
|
pCtx->param[0].i64 = pExpr->param[0].i64;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->currentStage = MERGE_STAGE;
|
pCtx->currentStage = MERGE_STAGE;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "ttype.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
#include "tschemautil.h"
|
#include "tschemautil.h"
|
||||||
|
@ -40,46 +41,9 @@ enum {
|
||||||
|
|
||||||
static int32_t tscAllocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int32_t * numOfRows);
|
static int32_t tscAllocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int32_t * numOfRows);
|
||||||
|
|
||||||
static int32_t tscToInteger(SStrToken *pToken, int64_t *value, char **endPtr) {
|
|
||||||
if (pToken->n == 0) {
|
|
||||||
return TK_ILLEGAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int32_t radix = 10;
|
|
||||||
if (pToken->type == TK_HEX) {
|
|
||||||
radix = 16;
|
|
||||||
} else if (pToken->type == TK_BIN) {
|
|
||||||
radix = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
*value = strtoll(pToken->z, endPtr, radix);
|
|
||||||
if (**endPtr == 'e' || **endPtr == 'E' || **endPtr == '.') {
|
|
||||||
errno = 0;
|
|
||||||
double v = round(strtod(pToken->z, endPtr));
|
|
||||||
if (v > INT64_MAX || v <= INT64_MIN) {
|
|
||||||
errno = ERANGE;
|
|
||||||
} else {
|
|
||||||
*value = (int64_t)v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// not a valid integer number, return error
|
|
||||||
if (*endPtr - pToken->z != pToken->n) {
|
|
||||||
return TK_ILLEGAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pToken->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tscToDouble(SStrToken *pToken, double *value, char **endPtr) {
|
static int32_t tscToDouble(SStrToken *pToken, double *value, char **endPtr) {
|
||||||
if (pToken->n == 0) {
|
|
||||||
return TK_ILLEGAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
*value = strtod(pToken->z, endPtr);
|
*value = strtold(pToken->z, endPtr);
|
||||||
|
|
||||||
// not a valid integer number, return error
|
// not a valid integer number, return error
|
||||||
if ((*endPtr - pToken->z) != pToken->n) {
|
if ((*endPtr - pToken->z) != pToken->n) {
|
||||||
|
@ -163,86 +127,119 @@ int tsParseTime(SStrToken *pToken, int64_t *time, char **next, char *error, int1
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo extract the null value check
|
||||||
|
static bool isNullStr(SStrToken* pToken) {
|
||||||
|
return (pToken->type == TK_NULL) || ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
||||||
|
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0));
|
||||||
|
}
|
||||||
int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload, char *msg, char **str, bool primaryKey,
|
int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload, char *msg, char **str, bool primaryKey,
|
||||||
int16_t timePrec) {
|
int16_t timePrec) {
|
||||||
int64_t iv;
|
int64_t iv;
|
||||||
int32_t numType;
|
int32_t ret;
|
||||||
char * endptr = NULL;
|
char *endptr = NULL;
|
||||||
errno = 0; // clear the previous existed error information
|
|
||||||
|
if (IS_NUMERIC_TYPE(pSchema->type) && pToken->n == 0) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid numeric data", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
switch (pSchema->type) {
|
switch (pSchema->type) {
|
||||||
case TSDB_DATA_TYPE_BOOL: { // bool
|
case TSDB_DATA_TYPE_BOOL: { // bool
|
||||||
if ((pToken->type == TK_BOOL || pToken->type == TK_STRING) && (pToken->n != 0)) {
|
if (isNullStr(pToken)) {
|
||||||
if (strncmp(pToken->z, "true", pToken->n) == 0) {
|
*((uint8_t *)payload) = TSDB_DATA_BOOL_NULL;
|
||||||
*(uint8_t *)payload = TSDB_TRUE;
|
|
||||||
} else if (strncmp(pToken->z, "false", pToken->n) == 0) {
|
|
||||||
*(uint8_t *)payload = TSDB_FALSE;
|
|
||||||
} else if (strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0) {
|
|
||||||
*(uint8_t *)payload = TSDB_DATA_BOOL_NULL;
|
|
||||||
} else {
|
|
||||||
return tscSQLSyntaxErrMsg(msg, "invalid bool data", pToken->z);
|
|
||||||
}
|
|
||||||
} else if (pToken->type == TK_INTEGER) {
|
|
||||||
iv = strtoll(pToken->z, NULL, 10);
|
|
||||||
*(uint8_t *)payload = (int8_t)((iv == 0) ? TSDB_FALSE : TSDB_TRUE);
|
|
||||||
} else if (pToken->type == TK_FLOAT) {
|
|
||||||
double dv = strtod(pToken->z, NULL);
|
|
||||||
*(uint8_t *)payload = (int8_t)((dv == 0) ? TSDB_FALSE : TSDB_TRUE);
|
|
||||||
} else if (pToken->type == TK_NULL) {
|
|
||||||
*(uint8_t *)payload = TSDB_DATA_BOOL_NULL;
|
|
||||||
} else {
|
} else {
|
||||||
return tscInvalidSQLErrMsg(msg, "invalid bool data", pToken->z);
|
if ((pToken->type == TK_BOOL || pToken->type == TK_STRING) && (pToken->n != 0)) {
|
||||||
|
if (strncmp(pToken->z, "true", pToken->n) == 0) {
|
||||||
|
*(uint8_t *)payload = TSDB_TRUE;
|
||||||
|
} else if (strncmp(pToken->z, "false", pToken->n) == 0) {
|
||||||
|
*(uint8_t *)payload = TSDB_FALSE;
|
||||||
|
} else {
|
||||||
|
return tscSQLSyntaxErrMsg(msg, "invalid bool data", pToken->z);
|
||||||
|
}
|
||||||
|
} else if (pToken->type == TK_INTEGER) {
|
||||||
|
iv = strtoll(pToken->z, NULL, 10);
|
||||||
|
*(uint8_t *)payload = (int8_t)((iv == 0) ? TSDB_FALSE : TSDB_TRUE);
|
||||||
|
} else if (pToken->type == TK_FLOAT) {
|
||||||
|
double dv = strtod(pToken->z, NULL);
|
||||||
|
*(uint8_t *)payload = (int8_t)((dv == 0) ? TSDB_FALSE : TSDB_TRUE);
|
||||||
|
} else {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid bool data", pToken->z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int8_t *)payload) = TSDB_DATA_TINYINT_NULL;
|
*((uint8_t *)payload) = TSDB_DATA_TINYINT_NULL;
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int8_t *)payload) = TSDB_DATA_TINYINT_NULL;
|
|
||||||
} else {
|
} else {
|
||||||
numType = tscToInteger(pToken, &iv, &endptr);
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, true);
|
||||||
if (TK_ILLEGAL == numType) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return tscInvalidSQLErrMsg(msg, "invalid tinyint data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "invalid tinyint data", pToken->z);
|
||||||
} else if (errno == ERANGE || iv > INT8_MAX || iv <= INT8_MIN) {
|
} else if (!IS_VALID_TINYINT(iv)) {
|
||||||
return tscInvalidSQLErrMsg(msg, "tinyint data overflow", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
*((int8_t *)payload) = (int8_t)iv;
|
*((uint8_t *)payload) = (uint8_t)iv;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
if (isNullStr(pToken)) {
|
||||||
|
*((uint8_t *)payload) = TSDB_DATA_UTINYINT_NULL;
|
||||||
|
} else {
|
||||||
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, false);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid unsigned tinyint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UTINYINT(iv)) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "unsigned tinyint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*((uint8_t *)payload) = (uint8_t)iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int16_t *)payload) = TSDB_DATA_SMALLINT_NULL;
|
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int16_t *)payload) = TSDB_DATA_SMALLINT_NULL;
|
*((int16_t *)payload) = TSDB_DATA_SMALLINT_NULL;
|
||||||
} else {
|
} else {
|
||||||
numType = tscToInteger(pToken, &iv, &endptr);
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, true);
|
||||||
if (TK_ILLEGAL == numType) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return tscInvalidSQLErrMsg(msg, "invalid smallint data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "invalid smallint data", pToken->z);
|
||||||
} else if (errno == ERANGE || iv > INT16_MAX || iv <= INT16_MIN) {
|
} else if (!IS_VALID_SMALLINT(iv)) {
|
||||||
return tscInvalidSQLErrMsg(msg, "smallint data overflow", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "smallint data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
*((int16_t *)payload) = (int16_t)iv;
|
*((int16_t *)payload) = (int16_t)iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
if (isNullStr(pToken)) {
|
||||||
|
*((uint16_t *)payload) = TSDB_DATA_USMALLINT_NULL;
|
||||||
|
} else {
|
||||||
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, false);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid unsigned smallint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_USMALLINT(iv)) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "unsigned smallint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*((uint16_t *)payload) = (uint16_t)iv;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int32_t *)payload) = TSDB_DATA_INT_NULL;
|
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int32_t *)payload) = TSDB_DATA_INT_NULL;
|
*((int32_t *)payload) = TSDB_DATA_INT_NULL;
|
||||||
} else {
|
} else {
|
||||||
numType = tscToInteger(pToken, &iv, &endptr);
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, true);
|
||||||
if (TK_ILLEGAL == numType) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return tscInvalidSQLErrMsg(msg, "invalid int data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "invalid int data", pToken->z);
|
||||||
} else if (errno == ERANGE || iv > INT32_MAX || iv <= INT32_MIN) {
|
} else if (!IS_VALID_INT(iv)) {
|
||||||
return tscInvalidSQLErrMsg(msg, "int data overflow", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "int data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,17 +248,30 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
if (isNullStr(pToken)) {
|
||||||
|
*((uint32_t *)payload) = TSDB_DATA_UINT_NULL;
|
||||||
|
} else {
|
||||||
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, false);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid unsigned int data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UINT(iv)) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "unsigned int data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*((uint32_t *)payload) = (uint32_t)iv;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int64_t *)payload) = TSDB_DATA_BIGINT_NULL;
|
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int64_t *)payload) = TSDB_DATA_BIGINT_NULL;
|
*((int64_t *)payload) = TSDB_DATA_BIGINT_NULL;
|
||||||
} else {
|
} else {
|
||||||
numType = tscToInteger(pToken, &iv, &endptr);
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, true);
|
||||||
if (TK_ILLEGAL == numType) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return tscInvalidSQLErrMsg(msg, "invalid bigint data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "invalid bigint data", pToken->z);
|
||||||
} else if (errno == ERANGE || iv == INT64_MIN) {
|
} else if (!IS_VALID_BIGINT(iv)) {
|
||||||
return tscInvalidSQLErrMsg(msg, "bigint data overflow", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "bigint data overflow", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,11 +279,23 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
if (isNullStr(pToken)) {
|
||||||
|
*((uint64_t *)payload) = TSDB_DATA_UBIGINT_NULL;
|
||||||
|
} else {
|
||||||
|
ret = tStrToInteger(pToken->z, pToken->type, pToken->n, &iv, false);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "invalid unsigned bigint data", pToken->z);
|
||||||
|
} else if (!IS_VALID_UBIGINT((uint64_t)iv)) {
|
||||||
|
return tscInvalidSQLErrMsg(msg, "unsigned bigint data overflow", pToken->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
*((uint64_t *)payload) = iv;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
*((int32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
||||||
} else {
|
} else {
|
||||||
double dv;
|
double dv;
|
||||||
|
@ -281,24 +303,16 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
|
||||||
return tscInvalidSQLErrMsg(msg, "illegal float data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "illegal float data", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
float fv = (float)dv;
|
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || dv > FLT_MAX || dv < -FLT_MAX || isinf(dv) || isnan(dv)) {
|
||||||
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || (fv > FLT_MAX || fv < -FLT_MAX)) {
|
|
||||||
return tscInvalidSQLErrMsg(msg, "illegal float data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "illegal float data", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isinf(fv) || isnan(fv)) {
|
*((float *)payload) = (float)dv;
|
||||||
*((int32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*((float *)payload) = fv;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
if (pToken->type == TK_NULL) {
|
if (isNullStr(pToken)) {
|
||||||
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
|
||||||
} else if ((pToken->type == TK_STRING) && (pToken->n != 0) &&
|
|
||||||
(strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0)) {
|
|
||||||
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
||||||
} else {
|
} else {
|
||||||
double dv;
|
double dv;
|
||||||
|
@ -306,15 +320,11 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
|
||||||
return tscInvalidSQLErrMsg(msg, "illegal double data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "illegal double data", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || (dv > DBL_MAX || dv < -DBL_MAX)) {
|
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || isinf(dv) || isnan(dv)) {
|
||||||
return tscInvalidSQLErrMsg(msg, "illegal double data", pToken->z);
|
return tscInvalidSQLErrMsg(msg, "illegal double data", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isinf(dv) || isnan(dv)) {
|
*((double *)payload) = dv;
|
||||||
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
|
||||||
} else {
|
|
||||||
*((double *)payload) = dv;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -337,7 +347,7 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
|
||||||
setVardataNull(payload, TSDB_DATA_TYPE_NCHAR);
|
setVardataNull(payload, TSDB_DATA_TYPE_NCHAR);
|
||||||
} else {
|
} else {
|
||||||
// if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long'
|
// if the converted output len is over than pColumnModel->bytes, return error: 'Argument list too long'
|
||||||
size_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(pToken->z, pToken->n, varDataVal(payload), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(pToken->z, pToken->n, varDataVal(payload), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
snprintf(buf, tListLen(buf), "%s", strerror(errno));
|
snprintf(buf, tListLen(buf), "%s", strerror(errno));
|
||||||
|
|
|
@ -84,35 +84,35 @@ static int normalStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) {
|
||||||
var->nLen = 0;
|
var->nLen = 0;
|
||||||
if (tb->is_null != NULL && *(tb->is_null)) {
|
if (tb->is_null != NULL && *(tb->is_null)) {
|
||||||
var->nType = TSDB_DATA_TYPE_NULL;
|
var->nType = TSDB_DATA_TYPE_NULL;
|
||||||
var->i64Key = 0;
|
var->i64 = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var->nType = tb->buffer_type;
|
var->nType = tb->buffer_type;
|
||||||
switch (tb->buffer_type) {
|
switch (tb->buffer_type) {
|
||||||
case TSDB_DATA_TYPE_NULL:
|
case TSDB_DATA_TYPE_NULL:
|
||||||
var->i64Key = 0;
|
var->i64 = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
var->i64Key = (*(int8_t*)tb->buffer) ? 1 : 0;
|
var->i64 = (*(int8_t*)tb->buffer) ? 1 : 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
var->i64Key = *(int8_t*)tb->buffer;
|
var->i64 = *(int8_t*)tb->buffer;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
var->i64Key = *(int16_t*)tb->buffer;
|
var->i64 = *(int16_t*)tb->buffer;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
var->i64Key = *(int32_t*)tb->buffer;
|
var->i64 = *(int32_t*)tb->buffer;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
var->i64Key = *(int64_t*)tb->buffer;
|
var->i64 = *(int64_t*)tb->buffer;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
@ -219,7 +219,7 @@ static char* normalStmtBuildSql(STscStmt* stmt) {
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
taosStringBuilderAppendInteger(&sb, var->i64Key);
|
taosStringBuilderAppendInteger(&sb, var->i64);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
@ -616,7 +616,7 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
switch (bind->buffer_type) {
|
switch (bind->buffer_type) {
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
size_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(bind->buffer, *bind->length, varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(bind->buffer, *bind->length, varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -678,7 +678,7 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
size_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(bind->buffer, *bind->length, varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(bind->buffer, *bind->length, varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "ttype.h"
|
||||||
#include "qAst.h"
|
#include "qAst.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
|
@ -484,10 +485,10 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
||||||
|
|
||||||
case TSDB_SQL_CREATE_USER:
|
case TSDB_SQL_CREATE_USER:
|
||||||
case TSDB_SQL_ALTER_USER: {
|
case TSDB_SQL_ALTER_USER: {
|
||||||
const char* msg5 = "invalid user rights";
|
|
||||||
const char* msg7 = "not support options";
|
|
||||||
const char* msg2 = "invalid user/account name";
|
const char* msg2 = "invalid user/account name";
|
||||||
const char* msg3 = "name too long";
|
const char* msg3 = "name too long";
|
||||||
|
const char* msg5 = "invalid user rights";
|
||||||
|
const char* msg7 = "not support options";
|
||||||
|
|
||||||
pCmd->command = pInfo->type;
|
pCmd->command = pInfo->type;
|
||||||
|
|
||||||
|
@ -950,7 +951,7 @@ static bool validateTableColumnInfo(SArray* pFieldList, SSqlCmd* pCmd) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pField->type < TSDB_DATA_TYPE_BOOL || pField->type > TSDB_DATA_TYPE_NCHAR) {
|
if (!isValidDataType(pField->type)) {
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1011,7 +1012,7 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->type < TSDB_DATA_TYPE_BOOL || p->type > TSDB_DATA_TYPE_NCHAR) {
|
if (!isValidDataType(p->type)) {
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1754,7 +1755,7 @@ static int32_t setExprInfoForFunctions(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SS
|
||||||
// set reverse order scan data blocks for last query
|
// set reverse order scan data blocks for last query
|
||||||
if (functionID == TSDB_FUNC_LAST) {
|
if (functionID == TSDB_FUNC_LAST) {
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
pExpr->param[0].i64Key = TSDB_ORDER_DESC;
|
pExpr->param[0].i64 = TSDB_ORDER_DESC;
|
||||||
pExpr->param[0].nType = TSDB_DATA_TYPE_INT;
|
pExpr->param[0].nType = TSDB_DATA_TYPE_INT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1945,7 +1946,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
||||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
||||||
int16_t colType = pSchema->type;
|
int16_t colType = pSchema->type;
|
||||||
|
|
||||||
if (colType <= TSDB_DATA_TYPE_BOOL || colType >= TSDB_DATA_TYPE_BINARY) {
|
if (!IS_NUMERIC_TYPE(colType)) {
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2105,7 +2106,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
||||||
if (!TSDB_COL_IS_TAG(pIndex->flag) && pIndex->colIndex < tscGetNumOfColumns(pTableMetaInfo->pTableMeta)) { // group by normal columns
|
if (!TSDB_COL_IS_TAG(pIndex->flag) && pIndex->colIndex < tscGetNumOfColumns(pTableMetaInfo->pTableMeta)) { // group by normal columns
|
||||||
SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, colIndex + i);
|
SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, colIndex + i);
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
pExpr->param->i64Key = TSDB_ORDER_ASC;
|
pExpr->param->i64 = TSDB_ORDER_ASC;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2182,7 +2183,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
||||||
|
|
||||||
// 2. valid the column type
|
// 2. valid the column type
|
||||||
int16_t colType = pSchema[index.columnIndex].type;
|
int16_t colType = pSchema[index.columnIndex].type;
|
||||||
if (colType == TSDB_DATA_TYPE_BOOL || colType >= TSDB_DATA_TYPE_BINARY) {
|
if (!IS_NUMERIC_TYPE(colType)) {
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2727,7 +2728,7 @@ int32_t tscTansformSQLFuncForSTableQuery(SQueryInfo* pQueryInfo) {
|
||||||
if ((functionId >= TSDB_FUNC_SUM && functionId <= TSDB_FUNC_TWA) ||
|
if ((functionId >= TSDB_FUNC_SUM && functionId <= TSDB_FUNC_TWA) ||
|
||||||
(functionId >= TSDB_FUNC_FIRST_DST && functionId <= TSDB_FUNC_LAST_DST) ||
|
(functionId >= TSDB_FUNC_FIRST_DST && functionId <= TSDB_FUNC_LAST_DST) ||
|
||||||
(functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE)) {
|
(functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE)) {
|
||||||
if (getResultDataInfo(pSrcSchema->type, pSrcSchema->bytes, functionId, (int32_t)pExpr->param[0].i64Key, &type, &bytes,
|
if (getResultDataInfo(pSrcSchema->type, pSrcSchema->bytes, functionId, (int32_t)pExpr->param[0].i64, &type, &bytes,
|
||||||
&interBytes, 0, true) != TSDB_CODE_SUCCESS) {
|
&interBytes, 0, true) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
}
|
}
|
||||||
|
@ -2827,7 +2828,7 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
|
||||||
int32_t factor = functionCompatList[tscSqlExprGet(pQueryInfo, startIdx)->functionId];
|
int32_t factor = functionCompatList[tscSqlExprGet(pQueryInfo, startIdx)->functionId];
|
||||||
|
|
||||||
if (tscSqlExprGet(pQueryInfo, 0)->functionId == TSDB_FUNC_LAST_ROW && (joinQuery || intervalQuery)) {
|
if (tscSqlExprGet(pQueryInfo, 0)->functionId == TSDB_FUNC_LAST_ROW && (joinQuery || intervalQuery)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// diff function cannot be executed with other function
|
// diff function cannot be executed with other function
|
||||||
|
@ -4396,8 +4397,8 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
|
||||||
*
|
*
|
||||||
* Additional check to avoid data overflow
|
* Additional check to avoid data overflow
|
||||||
*/
|
*/
|
||||||
if (pRight->val.i64Key <= INT64_MAX / 1000) {
|
if (pRight->val.i64 <= INT64_MAX / 1000) {
|
||||||
pRight->val.i64Key *= 1000;
|
pRight->val.i64 *= 1000;
|
||||||
}
|
}
|
||||||
} else if (pRight->nSQLOptr == TK_FLOAT && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
} else if (pRight->nSQLOptr == TK_FLOAT && timePrecision == TSDB_TIME_PRECISION_MILLI) {
|
||||||
pRight->val.dKey *= 1000;
|
pRight->val.dKey *= 1000;
|
||||||
|
@ -5380,22 +5381,22 @@ static int32_t setKeepOption(SSqlCmd* pCmd, SCreateDbMsg* pMsg, SCreateDBInfo* p
|
||||||
tVariantListItem* p0 = taosArrayGet(pKeep, 0);
|
tVariantListItem* p0 = taosArrayGet(pKeep, 0);
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case 1: {
|
case 1: {
|
||||||
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64Key);
|
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: {
|
case 2: {
|
||||||
tVariantListItem* p1 = taosArrayGet(pKeep, 1);
|
tVariantListItem* p1 = taosArrayGet(pKeep, 1);
|
||||||
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64Key);
|
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64);
|
||||||
pMsg->daysToKeep1 = htonl((int32_t)p1->pVar.i64Key);
|
pMsg->daysToKeep1 = htonl((int32_t)p1->pVar.i64);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3: {
|
case 3: {
|
||||||
tVariantListItem* p1 = taosArrayGet(pKeep, 1);
|
tVariantListItem* p1 = taosArrayGet(pKeep, 1);
|
||||||
tVariantListItem* p2 = taosArrayGet(pKeep, 2);
|
tVariantListItem* p2 = taosArrayGet(pKeep, 2);
|
||||||
|
|
||||||
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64Key);
|
pMsg->daysToKeep = htonl((int32_t)p0->pVar.i64);
|
||||||
pMsg->daysToKeep1 = htonl((int32_t)p1->pVar.i64Key);
|
pMsg->daysToKeep1 = htonl((int32_t)p1->pVar.i64);
|
||||||
pMsg->daysToKeep2 = htonl((int32_t)p2->pVar.i64Key);
|
pMsg->daysToKeep2 = htonl((int32_t)p2->pVar.i64);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg); }
|
default: { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg); }
|
||||||
|
@ -5561,7 +5562,7 @@ static void doUpdateSqlFunctionForTagPrj(SQueryInfo* pQueryInfo) {
|
||||||
if ((pExpr->functionId != TSDB_FUNC_TAG_DUMMY && pExpr->functionId != TSDB_FUNC_TS_DUMMY) &&
|
if ((pExpr->functionId != TSDB_FUNC_TAG_DUMMY && pExpr->functionId != TSDB_FUNC_TS_DUMMY) &&
|
||||||
!(pExpr->functionId == TSDB_FUNC_PRJ && TSDB_COL_IS_UD_COL(pExpr->colInfo.flag))) {
|
!(pExpr->functionId == TSDB_FUNC_PRJ && TSDB_COL_IS_UD_COL(pExpr->colInfo.flag))) {
|
||||||
SSchema* pColSchema = &pSchema[pExpr->colInfo.colIndex];
|
SSchema* pColSchema = &pSchema[pExpr->colInfo.colIndex];
|
||||||
getResultDataInfo(pColSchema->type, pColSchema->bytes, pExpr->functionId, (int32_t)pExpr->param[0].i64Key, &pExpr->resType,
|
getResultDataInfo(pColSchema->type, pColSchema->bytes, pExpr->functionId, (int32_t)pExpr->param[0].i64, &pExpr->resType,
|
||||||
&pExpr->resBytes, &pExpr->interBytes, tagLength, isSTable);
|
&pExpr->resBytes, &pExpr->interBytes, tagLength, isSTable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6760,7 +6761,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
|
||||||
// check for dividing by 0
|
// check for dividing by 0
|
||||||
if ((*pExpr)->_node.optr == TSDB_BINARY_OP_DIVIDE) {
|
if ((*pExpr)->_node.optr == TSDB_BINARY_OP_DIVIDE) {
|
||||||
if (pRight->nodeType == TSQL_NODE_VALUE) {
|
if (pRight->nodeType == TSQL_NODE_VALUE) {
|
||||||
if (pRight->pVal->nType == TSDB_DATA_TYPE_INT && pRight->pVal->i64Key == 0) {
|
if (pRight->pVal->nType == TSDB_DATA_TYPE_INT && pRight->pVal->i64 == 0) {
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
} else if (pRight->pVal->nType == TSDB_DATA_TYPE_FLOAT && pRight->pVal->dKey == 0) {
|
} else if (pRight->pVal->nType == TSDB_DATA_TYPE_FLOAT && pRight->pVal->dKey == 0) {
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
|
|
@ -66,30 +66,24 @@ STableComInfo tscGetTableInfo(const STableMeta* pTableMeta) {
|
||||||
return pTableMeta->tableInfo;
|
return pTableMeta->tableInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols) {
|
static bool doValidateSchema(SSchema* pSchema, int32_t numOfCols, int32_t maxLen) {
|
||||||
if (!VALIDNUMOFCOLS(numOfCols)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first column must be the timestamp, which is a primary key */
|
|
||||||
if (pSchema[0].type != TSDB_DATA_TYPE_TIMESTAMP) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* type is valid, length is valid */
|
|
||||||
int32_t rowLen = 0;
|
int32_t rowLen = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
// 1. valid types
|
// 1. valid types
|
||||||
if (pSchema[i].type > TSDB_DATA_TYPE_TIMESTAMP || pSchema[i].type < TSDB_DATA_TYPE_BOOL) {
|
if (!isValidDataType(pSchema[i].type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. valid length for each type
|
// 2. valid length for each type
|
||||||
if (pSchema[i].type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (pSchema[i].type == TSDB_DATA_TYPE_BINARY) {
|
||||||
if (pSchema[i].bytes > TSDB_MAX_BINARY_LEN) {
|
if (pSchema[i].bytes > TSDB_MAX_BINARY_LEN) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (pSchema[i].type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (pSchema[i].bytes > TSDB_MAX_NCHAR_LEN) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pSchema[i].bytes != tDataTypeDesc[pSchema[i].type].nSize) {
|
if (pSchema[i].bytes != tDataTypeDesc[pSchema[i].type].nSize) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -106,8 +100,32 @@ bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols) {
|
||||||
rowLen += pSchema[i].bytes;
|
rowLen += pSchema[i].bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
// valid total length
|
return rowLen <= maxLen;
|
||||||
return (rowLen <= TSDB_MAX_BYTES_PER_ROW);
|
}
|
||||||
|
|
||||||
|
bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTags) {
|
||||||
|
if (!VALIDNUMOFCOLS(numOfCols)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!VALIDNUMOFTAGS(numOfTags)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first column must be the timestamp, which is a primary key */
|
||||||
|
if (pSchema[0].type != TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doValidateSchema(pSchema, numOfCols, TSDB_MAX_BYTES_PER_ROW)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doValidateSchema(&pSchema[numOfCols], numOfTags, TSDB_MAX_TAGS_LEN)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* tscGetTableColumnSchema(const STableMeta* pTableMeta, int32_t colIndex) {
|
SSchema* tscGetTableColumnSchema(const STableMeta* pTableMeta, int32_t colIndex) {
|
||||||
|
|
|
@ -755,12 +755,10 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
SColumn *pCol = taosArrayGetP(pQueryInfo->colList, i);
|
SColumn *pCol = taosArrayGetP(pQueryInfo->colList, i);
|
||||||
SSchema *pColSchema = &pSchema[pCol->colIndex.columnIndex];
|
SSchema *pColSchema = &pSchema[pCol->colIndex.columnIndex];
|
||||||
|
|
||||||
if (pCol->colIndex.columnIndex >= tscGetNumOfColumns(pTableMeta) || pColSchema->type < TSDB_DATA_TYPE_BOOL ||
|
if (pCol->colIndex.columnIndex >= tscGetNumOfColumns(pTableMeta) || !isValidDataType(pColSchema->type)) {
|
||||||
pColSchema->type > TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
tscError("%p tid:%d uid:%" PRIu64" id:%s, column index out of range, numOfColumns:%d, index:%d, column name:%s",
|
tscError("%p tid:%d uid:%" PRIu64" id:%s, column index out of range, numOfColumns:%d, index:%d, column name:%s",
|
||||||
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, tscGetNumOfColumns(pTableMeta), pCol->colIndex.columnIndex,
|
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, tscGetNumOfColumns(pTableMeta), pCol->colIndex.columnIndex,
|
||||||
pColSchema->name);
|
pColSchema->name);
|
||||||
|
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -826,7 +824,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
memcpy(pMsg, pExpr->param[j].pz, pExpr->param[j].nLen);
|
memcpy(pMsg, pExpr->param[j].pz, pExpr->param[j].nLen);
|
||||||
pMsg += pExpr->param[j].nLen;
|
pMsg += pExpr->param[j].nLen;
|
||||||
} else {
|
} else {
|
||||||
pSqlFuncExpr->arg[j].argValue.i64 = htobe64(pExpr->param[j].i64Key);
|
pSqlFuncExpr->arg[j].argValue.i64 = htobe64(pExpr->param[j].i64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -866,7 +864,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
memcpy(pMsg, pExpr->param[j].pz, pExpr->param[j].nLen);
|
memcpy(pMsg, pExpr->param[j].pz, pExpr->param[j].nLen);
|
||||||
pMsg += pExpr->param[j].nLen;
|
pMsg += pExpr->param[j].nLen;
|
||||||
} else {
|
} else {
|
||||||
pSqlFuncExpr1->arg[j].argValue.i64 = htobe64(pExpr->param[j].i64Key);
|
pSqlFuncExpr1->arg[j].argValue.i64 = htobe64(pExpr->param[j].i64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -944,7 +942,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
SSchema *pColSchema = &pSchema[pCol->colIndex.columnIndex];
|
SSchema *pColSchema = &pSchema[pCol->colIndex.columnIndex];
|
||||||
|
|
||||||
if ((pCol->colIndex.columnIndex >= numOfTagColumns || pCol->colIndex.columnIndex < -1) ||
|
if ((pCol->colIndex.columnIndex >= numOfTagColumns || pCol->colIndex.columnIndex < -1) ||
|
||||||
(pColSchema->type < TSDB_DATA_TYPE_BOOL || pColSchema->type > TSDB_DATA_TYPE_NCHAR)) {
|
(!isValidDataType(pColSchema->type))) {
|
||||||
tscError("%p tid:%d uid:%" PRIu64 " id:%s, tag index out of range, totalCols:%d, numOfTags:%d, index:%d, column name:%s",
|
tscError("%p tid:%d uid:%" PRIu64 " id:%s, tag index out of range, totalCols:%d, numOfTags:%d, index:%d, column name:%s",
|
||||||
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, total, numOfTagColumns,
|
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, total, numOfTagColumns,
|
||||||
pCol->colIndex.columnIndex, pColSchema->name);
|
pCol->colIndex.columnIndex, pColSchema->name);
|
||||||
|
@ -1830,7 +1828,7 @@ int tscProcessTableMetaRsp(SSqlObj *pSql) {
|
||||||
assert(i == 0);
|
assert(i == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pSchema->type >= TSDB_DATA_TYPE_BOOL && pSchema->type <= TSDB_DATA_TYPE_NCHAR);
|
assert(isValidDataType(pSchema->type));
|
||||||
pSchema++;
|
pSchema++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -788,18 +788,34 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields)
|
||||||
len += sprintf(str + len, "%d", *((int8_t *)row[i]));
|
len += sprintf(str + len, "%d", *((int8_t *)row[i]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
len += sprintf(str + len, "%u", *((uint8_t *)row[i]));
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
len += sprintf(str + len, "%d", *((int16_t *)row[i]));
|
len += sprintf(str + len, "%d", *((int16_t *)row[i]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
len += sprintf(str + len, "%u", *((uint16_t *)row[i]));
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
len += sprintf(str + len, "%d", *((int32_t *)row[i]));
|
len += sprintf(str + len, "%d", *((int32_t *)row[i]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
len += sprintf(str + len, "%u", *((uint32_t *)row[i]));
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
|
len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i]));
|
||||||
|
break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float fv = 0;
|
float fv = 0;
|
||||||
fv = GET_FLOAT_VAL(row[i]);
|
fv = GET_FLOAT_VAL(row[i]);
|
||||||
|
|
|
@ -65,15 +65,30 @@ static int64_t tscGetRetryDelayTime(SSqlStream* pStream, int64_t slidingTime, in
|
||||||
return retryDelta;
|
return retryDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setRetryInfo(SSqlStream* pStream, int32_t code) {
|
||||||
|
SSqlObj* pSql = pStream->pSql;
|
||||||
|
|
||||||
|
pSql->res.code = code;
|
||||||
|
int64_t retryDelayTime = tscGetRetryDelayTime(pStream, pStream->interval.sliding, pStream->precision);
|
||||||
|
tscDebug("%p stream:%p, get table Meta failed, retry in %" PRId64 "ms", pSql, pStream, retryDelayTime);
|
||||||
|
tscSetRetryTimer(pStream, pSql, retryDelayTime);
|
||||||
|
}
|
||||||
|
|
||||||
static void doLaunchQuery(void* param, TAOS_RES* tres, int32_t code) {
|
static void doLaunchQuery(void* param, TAOS_RES* tres, int32_t code) {
|
||||||
SSqlStream *pStream = (SSqlStream *)param;
|
SSqlStream *pStream = (SSqlStream *)param;
|
||||||
assert(pStream->pSql == tres && code == TSDB_CODE_SUCCESS);
|
assert(pStream->pSql == tres);
|
||||||
|
|
||||||
SSqlObj* pSql = (SSqlObj*) tres;
|
SSqlObj* pSql = (SSqlObj*) tres;
|
||||||
pSql->fp = doLaunchQuery;
|
|
||||||
|
pSql->fp = doLaunchQuery;
|
||||||
pSql->fetchFp = doLaunchQuery;
|
pSql->fetchFp = doLaunchQuery;
|
||||||
pSql->res.completed = false;
|
pSql->res.completed = false;
|
||||||
|
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
setRetryInfo(pStream, code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0);
|
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0);
|
||||||
STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
|
|
||||||
|
@ -82,6 +97,10 @@ static void doLaunchQuery(void* param, TAOS_RES* tres, int32_t code) {
|
||||||
code = tscGetSTableVgroupInfo(pSql, 0);
|
code = tscGetSTableVgroupInfo(pSql, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// failed to get table Meta or vgroup list, retry in 10sec.
|
// failed to get table Meta or vgroup list, retry in 10sec.
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
tscTansformSQLFuncForSTableQuery(pQueryInfo);
|
tscTansformSQLFuncForSTableQuery(pQueryInfo);
|
||||||
|
@ -91,11 +110,8 @@ static void doLaunchQuery(void* param, TAOS_RES* tres, int32_t code) {
|
||||||
pSql->fetchFp = tscProcessStreamQueryCallback;
|
pSql->fetchFp = tscProcessStreamQueryCallback;
|
||||||
tscDoQuery(pSql);
|
tscDoQuery(pSql);
|
||||||
tscIncStreamExecutionCount(pStream);
|
tscIncStreamExecutionCount(pStream);
|
||||||
} else if (code != TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
} else {
|
||||||
pSql->res.code = code;
|
setRetryInfo(pStream, code);
|
||||||
int64_t retryDelayTime = tscGetRetryDelayTime(pStream, pStream->interval.sliding, pStream->precision);
|
|
||||||
tscDebug("%p stream:%p, get table Meta failed, retry in %" PRId64 "ms", pSql, pStream, retryDelayTime);
|
|
||||||
tscSetRetryTimer(pStream, pSql, retryDelayTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -465,7 +465,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
|
||||||
int16_t colId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
int16_t colId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
|
|
||||||
// set the tag column id for executor to extract correct tag value
|
// set the tag column id for executor to extract correct tag value
|
||||||
pExpr->param[0] = (tVariant) {.i64Key = colId, .nType = TSDB_DATA_TYPE_BIGINT, .nLen = sizeof(int64_t)};
|
pExpr->param[0] = (tVariant) {.i64 = colId, .nType = TSDB_DATA_TYPE_BIGINT, .nLen = sizeof(int64_t)};
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -650,7 +650,7 @@ static void issueTSCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, 0);
|
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, 0);
|
||||||
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
pExpr->param->i64Key = tagColId;
|
pExpr->param->i64 = tagColId;
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1547,7 +1547,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
|
||||||
|
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
pExpr->param->i64Key = tagColId;
|
pExpr->param->i64 = tagColId;
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2120,6 +2120,7 @@ static SSqlObj *tscCreateSTableSubquery(SSqlObj *pSql, SRetrieveSupport *trsuppo
|
||||||
return pNew;
|
return pNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo there is are race condition in this function, while cancel is called by user.
|
||||||
void tscRetrieveDataRes(void *param, TAOS_RES *tres, int code) {
|
void tscRetrieveDataRes(void *param, TAOS_RES *tres, int code) {
|
||||||
// the param may be null, since it may be done by other query threads. and the asyncOnError may enter in this
|
// the param may be null, since it may be done by other query threads. and the asyncOnError may enter in this
|
||||||
// function while kill query by a user.
|
// function while kill query by a user.
|
||||||
|
|
|
@ -71,6 +71,7 @@ void tsSetSTableQueryCond(STagCond* pTagCond, uint64_t uid, SBufferWriter* bw) {
|
||||||
|
|
||||||
bool tscQueryTags(SQueryInfo* pQueryInfo) {
|
bool tscQueryTags(SQueryInfo* pQueryInfo) {
|
||||||
int32_t numOfCols = (int32_t) tscSqlExprNumOfExprs(pQueryInfo);
|
int32_t numOfCols = (int32_t) tscSqlExprNumOfExprs(pQueryInfo);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, i);
|
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, i);
|
||||||
int32_t functId = pExpr->functionId;
|
int32_t functId = pExpr->functionId;
|
||||||
|
@ -314,7 +315,7 @@ void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo) {
|
||||||
} else {
|
} else {
|
||||||
for (int32_t k = 0; k < pRes->numOfRows; ++k) {
|
for (int32_t k = 0; k < pRes->numOfRows; ++k) {
|
||||||
char* p = ((char**)pRes->urow)[i] + k * pInfo->field.bytes;
|
char* p = ((char**)pRes->urow)[i] + k * pInfo->field.bytes;
|
||||||
memcpy(p, &pInfo->pSqlExpr->param[1].i64Key, pInfo->field.bytes);
|
memcpy(p, &pInfo->pSqlExpr->param[1].i64, pInfo->field.bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,7 +191,7 @@ extern int32_t monDebugFlag;
|
||||||
extern int32_t uDebugFlag;
|
extern int32_t uDebugFlag;
|
||||||
extern int32_t rpcDebugFlag;
|
extern int32_t rpcDebugFlag;
|
||||||
extern int32_t odbcDebugFlag;
|
extern int32_t odbcDebugFlag;
|
||||||
extern int32_t qDebugFlag;
|
extern uint32_t qDebugFlag;
|
||||||
extern int32_t wDebugFlag;
|
extern int32_t wDebugFlag;
|
||||||
extern int32_t cqDebugFlag;
|
extern int32_t cqDebugFlag;
|
||||||
extern int32_t debugFlag;
|
extern int32_t debugFlag;
|
||||||
|
|
|
@ -28,7 +28,8 @@ typedef struct tVariant {
|
||||||
uint32_t nType;
|
uint32_t nType;
|
||||||
int32_t nLen; // only used for string, for number, it is useless
|
int32_t nLen; // only used for string, for number, it is useless
|
||||||
union {
|
union {
|
||||||
int64_t i64Key;
|
int64_t i64;
|
||||||
|
uint64_t u64;
|
||||||
double dKey;
|
double dKey;
|
||||||
char * pz;
|
char * pz;
|
||||||
wchar_t *wpz;
|
wchar_t *wpz;
|
||||||
|
@ -36,9 +37,9 @@ typedef struct tVariant {
|
||||||
};
|
};
|
||||||
} tVariant;
|
} tVariant;
|
||||||
|
|
||||||
void tVariantCreate(tVariant *pVar, SStrToken *token);
|
bool tVariantIsValid(tVariant *pVar);
|
||||||
|
|
||||||
void tVariantCreateFromString(tVariant *pVar, char *pz, uint32_t len, uint32_t type);
|
void tVariantCreate(tVariant *pVar, SStrToken *token);
|
||||||
|
|
||||||
void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32_t type);
|
void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32_t type);
|
||||||
|
|
||||||
|
|
|
@ -219,7 +219,7 @@ int32_t odbcDebugFlag = 131;
|
||||||
int32_t httpDebugFlag = 131;
|
int32_t httpDebugFlag = 131;
|
||||||
int32_t mqttDebugFlag = 131;
|
int32_t mqttDebugFlag = 131;
|
||||||
int32_t monDebugFlag = 131;
|
int32_t monDebugFlag = 131;
|
||||||
int32_t qDebugFlag = 131;
|
uint32_t qDebugFlag = 131;
|
||||||
int32_t rpcDebugFlag = 131;
|
int32_t rpcDebugFlag = 131;
|
||||||
int32_t uDebugFlag = 131;
|
int32_t uDebugFlag = 131;
|
||||||
int32_t debugFlag = 0;
|
int32_t debugFlag = 0;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
#include "tscompression.h"
|
#include "tscompression.h"
|
||||||
|
|
||||||
const int32_t TYPE_BYTES[11] = {
|
const int32_t TYPE_BYTES[15] = {
|
||||||
-1, // TSDB_DATA_TYPE_NULL
|
-1, // TSDB_DATA_TYPE_NULL
|
||||||
sizeof(int8_t), // TSDB_DATA_TYPE_BOOL
|
sizeof(int8_t), // TSDB_DATA_TYPE_BOOL
|
||||||
sizeof(int8_t), // TSDB_DATA_TYPE_TINYINT
|
sizeof(int8_t), // TSDB_DATA_TYPE_TINYINT
|
||||||
|
@ -29,10 +29,28 @@ const int32_t TYPE_BYTES[11] = {
|
||||||
sizeof(double), // TSDB_DATA_TYPE_DOUBLE
|
sizeof(double), // TSDB_DATA_TYPE_DOUBLE
|
||||||
sizeof(VarDataOffsetT), // TSDB_DATA_TYPE_BINARY
|
sizeof(VarDataOffsetT), // TSDB_DATA_TYPE_BINARY
|
||||||
sizeof(TSKEY), // TSDB_DATA_TYPE_TIMESTAMP
|
sizeof(TSKEY), // TSDB_DATA_TYPE_TIMESTAMP
|
||||||
sizeof(VarDataOffsetT) // TSDB_DATA_TYPE_NCHAR
|
sizeof(VarDataOffsetT), // TSDB_DATA_TYPE_NCHAR
|
||||||
|
sizeof(uint8_t), // TSDB_DATA_TYPE_UTINYINT
|
||||||
|
sizeof(uint16_t), // TSDB_DATA_TYPE_USMALLINT
|
||||||
|
sizeof(uint32_t), // TSDB_DATA_TYPE_UINT
|
||||||
|
sizeof(uint64_t), // TSDB_DATA_TYPE_UBIGINT
|
||||||
};
|
};
|
||||||
|
|
||||||
static void getStatics_bool(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
#define DO_STATICS(__sum, __min, __max, __minIndex, __maxIndex, _list, _index) \
|
||||||
|
do { \
|
||||||
|
(__sum) += (_list)[(_index)]; \
|
||||||
|
if ((__min) > (_list)[(_index)]) { \
|
||||||
|
(__min) = (_list)[(_index)]; \
|
||||||
|
(__minIndex) = (_index); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
if ((__max) < (_list)[(_index)]) { \
|
||||||
|
(__max) = (_list)[(_index)]; \
|
||||||
|
(__maxIndex) = (_index); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static void getStatics_bool(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
int8_t *data = (int8_t *)pData;
|
int8_t *data = (int8_t *)pData;
|
||||||
*min = INT64_MAX;
|
*min = INT64_MAX;
|
||||||
|
@ -43,26 +61,17 @@ static void getStatics_bool(const TSKEY *primaryKey, const void *pData, int32_t
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((char *)&data[i], TSDB_DATA_TYPE_BOOL)) {
|
if (data[i] == TSDB_DATA_BOOL_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sum += data[i];
|
DO_STATICS(*sum, *min, *max, *minIndex, *maxIndex, data, i);
|
||||||
if (*min > data[i]) {
|
|
||||||
*min = data[i];
|
|
||||||
*minIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*max < data[i]) {
|
|
||||||
*max = data[i];
|
|
||||||
*maxIndex = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_i8(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_i8(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
int8_t *data = (int8_t *)pData;
|
int8_t *data = (int8_t *)pData;
|
||||||
*min = INT64_MAX;
|
*min = INT64_MAX;
|
||||||
*max = INT64_MIN;
|
*max = INT64_MIN;
|
||||||
|
@ -72,26 +81,43 @@ static void getStatics_i8(const TSKEY *primaryKey, const void *pData, int32_t nu
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((char *)&data[i], TSDB_DATA_TYPE_TINYINT)) {
|
if (((uint8_t)data[i]) == TSDB_DATA_TINYINT_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sum += data[i];
|
DO_STATICS(*sum, *min, *max, *minIndex, *maxIndex, data, i);
|
||||||
if (*min > data[i]) {
|
|
||||||
*min = data[i];
|
|
||||||
*minIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*max < data[i]) {
|
|
||||||
*max = data[i];
|
|
||||||
*maxIndex = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_i16(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_u8(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
|
uint8_t *data = (uint8_t *)pData;
|
||||||
|
uint64_t _min = UINT64_MAX;
|
||||||
|
uint64_t _max = 0;
|
||||||
|
uint64_t _sum = 0;
|
||||||
|
|
||||||
|
*minIndex = 0;
|
||||||
|
*maxIndex = 0;
|
||||||
|
|
||||||
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
|
if (((uint8_t)data[i]) == TSDB_DATA_UTINYINT_NULL) {
|
||||||
|
(*numOfNull) += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DO_STATICS(_sum, _min, _max, *minIndex, *maxIndex, data, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
*min = _min;
|
||||||
|
*max = _max;
|
||||||
|
*sum = _sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getStatics_i16(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
|
int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
int16_t *data = (int16_t *)pData;
|
int16_t *data = (int16_t *)pData;
|
||||||
*min = INT64_MAX;
|
*min = INT64_MAX;
|
||||||
*max = INT64_MIN;
|
*max = INT64_MIN;
|
||||||
|
@ -100,39 +126,45 @@ static void getStatics_i16(const TSKEY *primaryKey, const void *pData, int32_t n
|
||||||
|
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
// int64_t lastKey = 0;
|
|
||||||
// int16_t lastVal = TSDB_DATA_SMALLINT_NULL;
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((const char*) &data[i], TSDB_DATA_TYPE_SMALLINT)) {
|
if (((uint16_t)data[i]) == TSDB_DATA_SMALLINT_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sum += data[i];
|
DO_STATICS(*sum, *min, *max, *minIndex, *maxIndex, data, i);
|
||||||
if (*min > data[i]) {
|
|
||||||
*min = data[i];
|
|
||||||
*minIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*max < data[i]) {
|
|
||||||
*max = data[i];
|
|
||||||
*maxIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (isNull(&lastVal, TSDB_DATA_TYPE_SMALLINT)) {
|
|
||||||
// lastKey = primaryKey[i];
|
|
||||||
// lastVal = data[i];
|
|
||||||
// } else {
|
|
||||||
// *wsum = lastVal * (primaryKey[i] - lastKey);
|
|
||||||
// lastKey = primaryKey[i];
|
|
||||||
// lastVal = data[i];
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_i32(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_u16(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
|
uint16_t *data = (uint16_t *)pData;
|
||||||
|
uint64_t _min = UINT64_MAX;
|
||||||
|
uint64_t _max = 0;
|
||||||
|
uint64_t _sum = 0;
|
||||||
|
|
||||||
|
*minIndex = 0;
|
||||||
|
*maxIndex = 0;
|
||||||
|
|
||||||
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
|
if (((uint16_t)data[i]) == TSDB_DATA_USMALLINT_NULL) {
|
||||||
|
(*numOfNull) += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DO_STATICS(_sum, _min, _max, *minIndex, *maxIndex, data, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
*min = _min;
|
||||||
|
*max = _max;
|
||||||
|
*sum = _sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getStatics_i32(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
|
int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
int32_t *data = (int32_t *)pData;
|
int32_t *data = (int32_t *)pData;
|
||||||
*min = INT64_MAX;
|
*min = INT64_MAX;
|
||||||
*max = INT64_MIN;
|
*max = INT64_MIN;
|
||||||
|
@ -141,29 +173,43 @@ static void getStatics_i32(const TSKEY *primaryKey, const void *pData, int32_t n
|
||||||
|
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
// int64_t lastKey = 0;
|
|
||||||
// int32_t lastVal = TSDB_DATA_INT_NULL;
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((const char*) &data[i], TSDB_DATA_TYPE_INT)) {
|
if (((uint32_t)data[i]) == TSDB_DATA_INT_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sum += data[i];
|
DO_STATICS(*sum, *min, *max, *minIndex, *maxIndex, data, i);
|
||||||
if (*min > data[i]) {
|
|
||||||
*min = data[i];
|
|
||||||
*minIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*max < data[i]) {
|
|
||||||
*max = data[i];
|
|
||||||
*maxIndex = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_i64(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_u32(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
|
uint32_t *data = (uint32_t *)pData;
|
||||||
|
uint64_t _min = UINT64_MAX;
|
||||||
|
uint64_t _max = 0;
|
||||||
|
uint64_t _sum = 0;
|
||||||
|
|
||||||
|
*minIndex = 0;
|
||||||
|
*maxIndex = 0;
|
||||||
|
|
||||||
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
|
if (((uint32_t)data[i]) == TSDB_DATA_UINT_NULL) {
|
||||||
|
(*numOfNull) += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DO_STATICS(_sum, _min, _max, *minIndex, *maxIndex, data, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
*min = _min;
|
||||||
|
*max = _max;
|
||||||
|
*sum = _sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getStatics_i64(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
int64_t *data = (int64_t *)pData;
|
int64_t *data = (int64_t *)pData;
|
||||||
*min = INT64_MAX;
|
*min = INT64_MAX;
|
||||||
|
@ -174,52 +220,60 @@ static void getStatics_i64(const TSKEY *primaryKey, const void *pData, int32_t n
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((const char*) &data[i], TSDB_DATA_TYPE_BIGINT)) {
|
if (((uint64_t)data[i]) == TSDB_DATA_BIGINT_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sum += data[i];
|
DO_STATICS(*sum, *min, *max, *minIndex, *maxIndex, data, i);
|
||||||
if (*min > data[i]) {
|
|
||||||
*min = data[i];
|
|
||||||
*minIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*max < data[i]) {
|
|
||||||
*max = data[i];
|
|
||||||
*maxIndex = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (isNull(&lastVal, TSDB_DATA_TYPE_BIGINT)) {
|
|
||||||
// lastKey = primaryKey[i];
|
|
||||||
// lastVal = data[i];
|
|
||||||
// } else {
|
|
||||||
// *wsum = lastVal * (primaryKey[i] - lastKey);
|
|
||||||
// lastKey = primaryKey[i];
|
|
||||||
// lastVal = data[i];
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_f(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_u64(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
|
uint64_t *data = (uint64_t *)pData;
|
||||||
|
uint64_t _min = UINT64_MAX;
|
||||||
|
uint64_t _max = 0;
|
||||||
|
uint64_t _sum = 0;
|
||||||
|
|
||||||
|
*minIndex = 0;
|
||||||
|
*maxIndex = 0;
|
||||||
|
|
||||||
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
|
if (((uint64_t)data[i]) == TSDB_DATA_UBIGINT_NULL) {
|
||||||
|
(*numOfNull) += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DO_STATICS(_sum, _min, _max, *minIndex, *maxIndex, data, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
*min = _min;
|
||||||
|
*max = _max;
|
||||||
|
*sum = _sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getStatics_f(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
float *data = (float *)pData;
|
float *data = (float *)pData;
|
||||||
float fmin = FLT_MAX;
|
float fmin = FLT_MAX;
|
||||||
float fmax = -FLT_MAX;
|
float fmax = -FLT_MAX;
|
||||||
double dsum = 0;
|
double dsum = 0;
|
||||||
*minIndex = 0;
|
*minIndex = 0;
|
||||||
*maxIndex = 0;
|
*maxIndex = 0;
|
||||||
|
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((const char*) &data[i], TSDB_DATA_TYPE_FLOAT)) {
|
if ((*(uint32_t*)&(data[i])) == TSDB_DATA_FLOAT_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
float fv = 0;
|
float fv = GET_FLOAT_VAL((const char*)&(data[i]));
|
||||||
fv = GET_FLOAT_VAL((const char*)&(data[i]));
|
|
||||||
dsum += fv;
|
dsum += fv;
|
||||||
if (fmin > fv) {
|
if (fmin > fv) {
|
||||||
fmin = fv;
|
fmin = fv;
|
||||||
|
@ -232,28 +286,24 @@ static void getStatics_f(const TSKEY *primaryKey, const void *pData, int32_t num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double csum = 0;
|
SET_DOUBLE_VAL(sum, dsum);
|
||||||
csum = GET_DOUBLE_VAL((const char *)sum);
|
|
||||||
csum += dsum;
|
|
||||||
|
|
||||||
SET_DOUBLE_VAL(sum, csum);
|
|
||||||
SET_DOUBLE_VAL(max, fmax);
|
SET_DOUBLE_VAL(max, fmax);
|
||||||
SET_DOUBLE_VAL(min, fmin);
|
SET_DOUBLE_VAL(min, fmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_d(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_d(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
double *data = (double *)pData;
|
double *data = (double *)pData;
|
||||||
double dmin = DBL_MAX;
|
double dmin = DBL_MAX;
|
||||||
double dmax = -DBL_MAX;
|
double dmax = -DBL_MAX;
|
||||||
double dsum = 0;
|
double dsum = 0;
|
||||||
*minIndex = 0;
|
*minIndex = 0;
|
||||||
*maxIndex = 0;
|
*maxIndex = 0;
|
||||||
|
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfRow; ++i) {
|
for (int32_t i = 0; i < numOfRow; ++i) {
|
||||||
if (isNull((const char*) &data[i], TSDB_DATA_TYPE_DOUBLE)) {
|
if ((*(uint64_t*)&(data[i])) == TSDB_DATA_DOUBLE_NULL) {
|
||||||
(*numOfNull) += 1;
|
(*numOfNull) += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -272,16 +322,12 @@ static void getStatics_d(const TSKEY *primaryKey, const void *pData, int32_t num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double csum = 0;
|
SET_DOUBLE_PTR(sum, &dsum);
|
||||||
csum = GET_DOUBLE_VAL((const char *)sum);
|
|
||||||
csum += dsum;
|
|
||||||
|
|
||||||
SET_DOUBLE_PTR(sum, &csum);
|
|
||||||
SET_DOUBLE_PTR(max, &dmax);
|
SET_DOUBLE_PTR(max, &dmax);
|
||||||
SET_DOUBLE_PTR(min, &dmin);
|
SET_DOUBLE_PTR(min, &dmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_bin(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_bin(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
const char* data = pData;
|
const char* data = pData;
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
@ -301,7 +347,7 @@ static void getStatics_bin(const TSKEY *primaryKey, const void *pData, int32_t n
|
||||||
*maxIndex = 0;
|
*maxIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStatics_nchr(const TSKEY *primaryKey, const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
static void getStatics_nchr(const void *pData, int32_t numOfRow, int64_t *min, int64_t *max,
|
||||||
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
int64_t *sum, int16_t *minIndex, int16_t *maxIndex, int16_t *numOfNull) {
|
||||||
const char* data = pData;
|
const char* data = pData;
|
||||||
ASSERT(numOfRow <= INT16_MAX);
|
ASSERT(numOfRow <= INT16_MAX);
|
||||||
|
@ -321,18 +367,22 @@ static void getStatics_nchr(const TSKEY *primaryKey, const void *pData, int32_t
|
||||||
*maxIndex = 0;
|
*maxIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDataTypeDescriptor tDataTypeDesc[11] = {
|
tDataTypeDescriptor tDataTypeDesc[15] = {
|
||||||
{TSDB_DATA_TYPE_NULL, 6, 1, "NOTYPE", NULL, NULL, NULL},
|
{TSDB_DATA_TYPE_NULL, 6,1, "NOTYPE", NULL, NULL, NULL},
|
||||||
{TSDB_DATA_TYPE_BOOL, 4, CHAR_BYTES, "BOOL", tsCompressBool, tsDecompressBool, getStatics_bool},
|
{TSDB_DATA_TYPE_BOOL, 4, CHAR_BYTES, "BOOL", tsCompressBool, tsDecompressBool, getStatics_bool},
|
||||||
{TSDB_DATA_TYPE_TINYINT, 7, CHAR_BYTES, "TINYINT", tsCompressTinyint, tsDecompressTinyint, getStatics_i8},
|
{TSDB_DATA_TYPE_TINYINT, 7, CHAR_BYTES, "TINYINT", tsCompressTinyint, tsDecompressTinyint, getStatics_i8},
|
||||||
{TSDB_DATA_TYPE_SMALLINT, 8, SHORT_BYTES, "SMALLINT", tsCompressSmallint, tsDecompressSmallint, getStatics_i16},
|
{TSDB_DATA_TYPE_SMALLINT, 8, SHORT_BYTES, "SMALLINT", tsCompressSmallint, tsDecompressSmallint, getStatics_i16},
|
||||||
{TSDB_DATA_TYPE_INT, 3, INT_BYTES, "INT", tsCompressInt, tsDecompressInt, getStatics_i32},
|
{TSDB_DATA_TYPE_INT, 3, INT_BYTES, "INT", tsCompressInt, tsDecompressInt, getStatics_i32},
|
||||||
{TSDB_DATA_TYPE_BIGINT, 6, LONG_BYTES, "BIGINT", tsCompressBigint, tsDecompressBigint, getStatics_i64},
|
{TSDB_DATA_TYPE_BIGINT, 6, LONG_BYTES, "BIGINT", tsCompressBigint, tsDecompressBigint, getStatics_i64},
|
||||||
{TSDB_DATA_TYPE_FLOAT, 5, FLOAT_BYTES, "FLOAT", tsCompressFloat, tsDecompressFloat, getStatics_f},
|
{TSDB_DATA_TYPE_FLOAT, 5, FLOAT_BYTES, "FLOAT", tsCompressFloat, tsDecompressFloat, getStatics_f},
|
||||||
{TSDB_DATA_TYPE_DOUBLE, 6, DOUBLE_BYTES, "DOUBLE", tsCompressDouble, tsDecompressDouble, getStatics_d},
|
{TSDB_DATA_TYPE_DOUBLE, 6, DOUBLE_BYTES, "DOUBLE", tsCompressDouble, tsDecompressDouble, getStatics_d},
|
||||||
{TSDB_DATA_TYPE_BINARY, 6, 0, "BINARY", tsCompressString, tsDecompressString, getStatics_bin},
|
{TSDB_DATA_TYPE_BINARY, 6, 0, "BINARY", tsCompressString, tsDecompressString, getStatics_bin},
|
||||||
{TSDB_DATA_TYPE_TIMESTAMP, 9, LONG_BYTES, "TIMESTAMP", tsCompressTimestamp, tsDecompressTimestamp, getStatics_i64},
|
{TSDB_DATA_TYPE_TIMESTAMP, 9, LONG_BYTES, "TIMESTAMP", tsCompressTimestamp, tsDecompressTimestamp, getStatics_i64},
|
||||||
{TSDB_DATA_TYPE_NCHAR, 5, 8, "NCHAR", tsCompressString, tsDecompressString, getStatics_nchr},
|
{TSDB_DATA_TYPE_NCHAR, 5, 8, "NCHAR", tsCompressString, tsDecompressString, getStatics_nchr},
|
||||||
|
{TSDB_DATA_TYPE_UTINYINT, 16, CHAR_BYTES, "TINYINT UNSIGNED", tsCompressTinyint, tsDecompressTinyint, getStatics_u8},
|
||||||
|
{TSDB_DATA_TYPE_USMALLINT, 17, SHORT_BYTES, "SMALLINT UNSIGNED", tsCompressSmallint, tsDecompressSmallint, getStatics_u16},
|
||||||
|
{TSDB_DATA_TYPE_UINT, 12, INT_BYTES, "INT UNSIGNED", tsCompressInt, tsDecompressInt, getStatics_u32},
|
||||||
|
{TSDB_DATA_TYPE_UBIGINT, 15, LONG_BYTES, "BIGINT UNSIGNED", tsCompressBigint, tsDecompressBigint, getStatics_u64},
|
||||||
};
|
};
|
||||||
|
|
||||||
char tTokenTypeSwitcher[13] = {
|
char tTokenTypeSwitcher[13] = {
|
||||||
|
@ -352,7 +402,7 @@ char tTokenTypeSwitcher[13] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
bool isValidDataType(int32_t type) {
|
bool isValidDataType(int32_t type) {
|
||||||
return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_NCHAR;
|
return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_UBIGINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setVardataNull(char* val, int32_t type) {
|
void setVardataNull(char* val, int32_t type) {
|
||||||
|
@ -397,6 +447,26 @@ void setNullN(char *val, int32_t type, int32_t bytes, int32_t numOfElems) {
|
||||||
*(uint64_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_BIGINT_NULL;
|
*(uint64_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_BIGINT_NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
for (int32_t i = 0; i < numOfElems; ++i) {
|
||||||
|
*(uint8_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_UTINYINT_NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
for (int32_t i = 0; i < numOfElems; ++i) {
|
||||||
|
*(uint16_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_USMALLINT_NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
for (int32_t i = 0; i < numOfElems; ++i) {
|
||||||
|
*(uint32_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_UINT_NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
for (int32_t i = 0; i < numOfElems; ++i) {
|
||||||
|
*(uint64_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_UBIGINT_NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
for (int32_t i = 0; i < numOfElems; ++i) {
|
for (int32_t i = 0; i < numOfElems; ++i) {
|
||||||
*(uint32_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_FLOAT_NULL;
|
*(uint32_t *)(val + i * tDataTypeDesc[type].nSize) = TSDB_DATA_FLOAT_NULL;
|
||||||
|
@ -422,13 +492,17 @@ void setNullN(char *val, int32_t type, int32_t bytes, int32_t numOfElems) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t nullBool = TSDB_DATA_BOOL_NULL;
|
static uint8_t nullBool = TSDB_DATA_BOOL_NULL;
|
||||||
static uint8_t nullTinyInt = TSDB_DATA_TINYINT_NULL;
|
static uint8_t nullTinyInt = TSDB_DATA_TINYINT_NULL;
|
||||||
static uint16_t nullSmallInt = TSDB_DATA_SMALLINT_NULL;
|
static uint16_t nullSmallInt = TSDB_DATA_SMALLINT_NULL;
|
||||||
static uint32_t nullInt = TSDB_DATA_INT_NULL;
|
static uint32_t nullInt = TSDB_DATA_INT_NULL;
|
||||||
static uint64_t nullBigInt = TSDB_DATA_BIGINT_NULL;
|
static uint64_t nullBigInt = TSDB_DATA_BIGINT_NULL;
|
||||||
static uint32_t nullFloat = TSDB_DATA_FLOAT_NULL;
|
static uint32_t nullFloat = TSDB_DATA_FLOAT_NULL;
|
||||||
static uint64_t nullDouble = TSDB_DATA_DOUBLE_NULL;
|
static uint64_t nullDouble = TSDB_DATA_DOUBLE_NULL;
|
||||||
|
static uint8_t nullTinyIntu = TSDB_DATA_UTINYINT_NULL;
|
||||||
|
static uint16_t nullSmallIntu = TSDB_DATA_USMALLINT_NULL;
|
||||||
|
static uint32_t nullIntu = TSDB_DATA_UINT_NULL;
|
||||||
|
static uint64_t nullBigIntu = TSDB_DATA_UBIGINT_NULL;
|
||||||
|
|
||||||
static union {
|
static union {
|
||||||
tstr str;
|
tstr str;
|
||||||
|
@ -436,17 +510,25 @@ static union {
|
||||||
} nullBinary = {.str = {.len = 1}}, nullNchar = {.str = {.len = 4}};
|
} nullBinary = {.str = {.len = 1}}, nullNchar = {.str = {.len = 4}};
|
||||||
|
|
||||||
static void *nullValues[] = {
|
static void *nullValues[] = {
|
||||||
&nullBool, &nullTinyInt, &nullSmallInt, &nullInt, &nullBigInt,
|
&nullBool, &nullTinyInt, &nullSmallInt, &nullInt, &nullBigInt,
|
||||||
&nullFloat, &nullDouble, &nullBinary, &nullBigInt, &nullNchar,
|
&nullFloat, &nullDouble, &nullBinary, &nullBigInt, &nullNchar,
|
||||||
|
&nullTinyIntu, &nullSmallIntu, &nullIntu, &nullBigIntu,
|
||||||
};
|
};
|
||||||
|
|
||||||
void *getNullValue(int32_t type) {
|
void *getNullValue(int32_t type) {
|
||||||
assert(type >= TSDB_DATA_TYPE_BOOL && type <= TSDB_DATA_TYPE_NCHAR);
|
assert(type >= TSDB_DATA_TYPE_BOOL && type <= TSDB_DATA_TYPE_UBIGINT);
|
||||||
return nullValues[type - 1];
|
return nullValues[type - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
void assignVal(char *val, const char *src, int32_t len, int32_t type) {
|
void assignVal(char *val, const char *src, int32_t len, int32_t type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
*((int8_t *)val) = GET_INT8_VAL(src);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
*((int16_t *)val) = GET_INT16_VAL(src);
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
*((int32_t *)val) = GET_INT32_VAL(src);
|
*((int32_t *)val) = GET_INT32_VAL(src);
|
||||||
break;
|
break;
|
||||||
|
@ -457,17 +539,10 @@ void assignVal(char *val, const char *src, int32_t len, int32_t type) {
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
SET_DOUBLE_VAL(val, GET_DOUBLE_VAL(src));
|
SET_DOUBLE_VAL(val, GET_DOUBLE_VAL(src));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
*((int64_t *)val) = GET_INT64_VAL(src);
|
*((int64_t *)val) = GET_INT64_VAL(src);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
*((int16_t *)val) = GET_INT16_VAL(src);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
*((int8_t *)val) = GET_INT8_VAL(src);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
varDataCopy(val, src);
|
varDataCopy(val, src);
|
||||||
break;
|
break;
|
||||||
|
@ -483,12 +558,14 @@ void assignVal(char *val, const char *src, int32_t len, int32_t type) {
|
||||||
|
|
||||||
void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf) {
|
void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
SWAP(*(int32_t *)(pLeft), *(int32_t *)(pRight), int32_t);
|
SWAP(*(int32_t *)(pLeft), *(int32_t *)(pRight), int32_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
SWAP(*(int64_t *)(pLeft), *(int64_t *)(pRight), int64_t);
|
SWAP(*(int64_t *)(pLeft), *(int64_t *)(pRight), int64_t);
|
||||||
break;
|
break;
|
||||||
|
@ -497,7 +574,8 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
|
||||||
SWAP(*(double *)(pLeft), *(double *)(pRight), double);
|
SWAP(*(double *)(pLeft), *(double *)(pRight), double);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
SWAP(*(int16_t *)(pLeft), *(int16_t *)(pRight), int16_t);
|
SWAP(*(int16_t *)(pLeft), *(int16_t *)(pRight), int16_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -508,7 +586,8 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
SWAP(*(int8_t *)(pLeft), *(int8_t *)(pRight), int8_t);
|
SWAP(*(int8_t *)(pLeft), *(int8_t *)(pRight), int8_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -521,3 +600,41 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tStrToInteger(const char* z, int16_t type, int32_t n, int64_t* value, bool issigned) {
|
||||||
|
errno = 0;
|
||||||
|
int32_t ret = 0;
|
||||||
|
|
||||||
|
char* endPtr = NULL;
|
||||||
|
if (type == TK_FLOAT) {
|
||||||
|
double v = strtod(z, &endPtr);
|
||||||
|
if ((errno == ERANGE && v == HUGE_VALF) || isinf(v) || isnan(v)) {
|
||||||
|
ret = -1;
|
||||||
|
} else if ((issigned && (v < INT64_MIN || v > INT64_MAX)) || ((!issigned) && (v < 0 || v > UINT64_MAX))) {
|
||||||
|
ret = -1;
|
||||||
|
} else {
|
||||||
|
*value = (int64_t) round(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t radix = 10;
|
||||||
|
if (type == TK_HEX) {
|
||||||
|
radix = 16;
|
||||||
|
} else if (type == TK_BIN) {
|
||||||
|
radix = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the string may be overflow according to errno
|
||||||
|
*value = issigned? strtoll(z, &endPtr, radix):strtoul(z, &endPtr, radix);
|
||||||
|
|
||||||
|
// not a valid integer number, return error
|
||||||
|
if (endPtr - z != n || errno == ERANGE) {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -21,36 +21,48 @@
|
||||||
#include "tstoken.h"
|
#include "tstoken.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
#include "ttype.h"
|
||||||
|
|
||||||
// todo support scientific expression number and oct number
|
void tVariantCreate(tVariant *pVar, SStrToken *token) {
|
||||||
void tVariantCreate(tVariant *pVar, SStrToken *token) { tVariantCreateFromString(pVar, token->z, token->n, token->type); }
|
int32_t ret = 0;
|
||||||
|
int32_t type = token->type;
|
||||||
|
|
||||||
void tVariantCreateFromString(tVariant *pVar, char *pz, uint32_t len, uint32_t type) {
|
|
||||||
memset(pVar, 0, sizeof(tVariant));
|
memset(pVar, 0, sizeof(tVariant));
|
||||||
|
|
||||||
switch (type) {
|
switch (token->type) {
|
||||||
case TSDB_DATA_TYPE_BOOL: {
|
case TSDB_DATA_TYPE_BOOL: {
|
||||||
int32_t k = strncasecmp(pz, "true", 4);
|
int32_t k = strncasecmp(token->z, "true", 4);
|
||||||
if (k == 0) {
|
if (k == 0) {
|
||||||
pVar->i64Key = TSDB_TRUE;
|
pVar->i64 = TSDB_TRUE;
|
||||||
} else {
|
} else {
|
||||||
assert(strncasecmp(pz, "false", 5) == 0);
|
assert(strncasecmp(token->z, "false", 5) == 0);
|
||||||
pVar->i64Key = TSDB_FALSE;
|
pVar->i64 = TSDB_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:{
|
||||||
pVar->i64Key = strtoll(pz, NULL, 10);
|
ret = tStrToInteger(token->z, token->type, token->n, &pVar->i64, true);
|
||||||
|
if (ret != 0) {
|
||||||
|
pVar->nType = -1; // -1 means error type
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
pVar->dKey = strtod(pz, NULL);
|
pVar->dKey = strtod(token->z, NULL);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
pVar->pz = strndup(pz, len);
|
pVar->pz = strndup(token->z, token->n);
|
||||||
pVar->nLen = strdequote(pVar->pz);
|
pVar->nLen = strdequote(pVar->pz);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -74,20 +86,36 @@ void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
pVar->i64Key = GET_INT8_VAL(pz);
|
pVar->i64 = GET_INT8_VAL(pz);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
pVar->u64 = GET_UINT8_VAL(pz);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
pVar->i64Key = GET_INT16_VAL(pz);
|
pVar->i64 = GET_INT16_VAL(pz);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
pVar->u64 = GET_UINT16_VAL(pz);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
pVar->i64Key = GET_INT32_VAL(pz);
|
pVar->i64 = GET_INT32_VAL(pz);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
pVar->u64 = GET_UINT32_VAL(pz);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
pVar->i64Key = GET_INT64_VAL(pz);
|
pVar->i64 = GET_INT64_VAL(pz);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
pVar->u64 = GET_UINT64_VAL(pz);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
@ -115,7 +143,7 @@ void tVariantCreateFromBinary(tVariant *pVar, const char *pz, size_t len, uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pVar->i64Key = GET_INT32_VAL(pVar);
|
pVar->i64 = GET_INT32_VAL(pz);
|
||||||
}
|
}
|
||||||
|
|
||||||
pVar->nType = type;
|
pVar->nType = type;
|
||||||
|
@ -141,6 +169,11 @@ void tVariantDestroy(tVariant *pVar) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tVariantIsValid(tVariant *pVar) {
|
||||||
|
assert(pVar != NULL);
|
||||||
|
return isValidDataType(pVar->nType);
|
||||||
|
}
|
||||||
|
|
||||||
void tVariantAssign(tVariant *pDst, const tVariant *pSrc) {
|
void tVariantAssign(tVariant *pDst, const tVariant *pSrc) {
|
||||||
if (pSrc == NULL || pDst == NULL) return;
|
if (pSrc == NULL || pDst == NULL) return;
|
||||||
|
|
||||||
|
@ -159,8 +192,8 @@ void tVariantAssign(tVariant *pDst, const tVariant *pSrc) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSrc->nType >= TSDB_DATA_TYPE_BOOL && pSrc->nType <= TSDB_DATA_TYPE_DOUBLE) {
|
if (IS_NUMERIC_TYPE(pSrc->nType) || (pSrc->nType == TSDB_DATA_TYPE_BOOL)) {
|
||||||
pDst->i64Key = pSrc->i64Key;
|
pDst->i64 = pSrc->i64;
|
||||||
} else if (pSrc->nType == TSDB_DATA_TYPE_ARRAY) { // this is only for string array
|
} else if (pSrc->nType == TSDB_DATA_TYPE_ARRAY) { // this is only for string array
|
||||||
size_t num = taosArrayGetSize(pSrc->arr);
|
size_t num = taosArrayGetSize(pSrc->arr);
|
||||||
pDst->arr = taosArrayInit(num, sizeof(char*));
|
pDst->arr = taosArrayInit(num, sizeof(char*));
|
||||||
|
@ -189,30 +222,30 @@ int32_t tVariantCompare(const tVariant* p1, const tVariant* p2) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (p1->nType) {
|
if (p1->nType == TSDB_DATA_TYPE_BINARY || p1->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
if (p1->nLen == p2->nLen) {
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
return memcmp(p1->pz, p2->pz, p1->nLen);
|
||||||
if (p1->nLen == p2->nLen) {
|
} else {
|
||||||
return memcmp(p1->pz, p2->pz, p1->nLen);
|
return p1->nLen > p2->nLen? 1:-1;
|
||||||
} else {
|
}
|
||||||
return p1->nLen > p2->nLen? 1:-1;
|
} else if (p1->nType == TSDB_DATA_TYPE_FLOAT || p1->nType == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
}
|
if (p1->dKey == p2->dKey) {
|
||||||
};
|
return 0;
|
||||||
|
} else {
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
return p1->dKey > p2->dKey? 1:-1;
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
}
|
||||||
if (p1->dKey == p2->dKey) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(p1->nType)) {
|
||||||
return 0;
|
if (p1->u64 == p2->u64) {
|
||||||
} else {
|
return 0;
|
||||||
return p1->dKey > p2->dKey? 1:-1;
|
} else {
|
||||||
}
|
return p1->u64 > p2->u64? 1:-1;
|
||||||
|
}
|
||||||
default:
|
} else {
|
||||||
if (p1->i64Key == p2->i64Key) {
|
if (p1->i64 == p2->i64) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return p1->i64Key > p2->i64Key? 1:-1;
|
return p1->i64 > p2->i64? 1:-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,11 +272,15 @@ int32_t tVariantToString(tVariant *pVar, char *dst) {
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
return sprintf(dst, "%d", (int32_t)pVar->i64Key);
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return sprintf(dst, "%d", (int32_t)pVar->i64);
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
return sprintf(dst, "%" PRId64, pVar->i64Key);
|
return sprintf(dst, "%" PRId64, pVar->i64);
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
return sprintf(dst, "%" PRIu64, pVar->u64);
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
return sprintf(dst, "%.9lf", pVar->dKey);
|
return sprintf(dst, "%.9lf", pVar->dKey);
|
||||||
|
@ -253,121 +290,6 @@ int32_t tVariantToString(tVariant *pVar, char *dst) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t doConvertToInteger(tVariant *pVariant, char *pDest, int32_t type, bool releaseVariantPtr) {
|
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
|
||||||
setNull(pDest, type, tDataTypeDesc[type].nSize);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
|
||||||
*((int64_t *)pDest) = pVariant->i64Key;
|
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
|
||||||
if ((pVariant->dKey < INT64_MIN) || (pVariant->dKey > INT64_MAX)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*((int64_t *)pDest) = (int64_t)pVariant->dKey;
|
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
|
||||||
errno = 0;
|
|
||||||
char *endPtr = NULL;
|
|
||||||
|
|
||||||
SStrToken token = {0};
|
|
||||||
token.n = tSQLGetToken(pVariant->pz, &token.type);
|
|
||||||
|
|
||||||
if (token.type == TK_MINUS || token.type == TK_PLUS) {
|
|
||||||
token.n = tSQLGetToken(pVariant->pz + token.n, &token.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token.type == TK_FLOAT) {
|
|
||||||
double v = strtod(pVariant->pz, &endPtr);
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((errno == ERANGE && v == -1) || (isinf(v) || isnan(v))) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((v < INT64_MIN) || (v > INT64_MAX)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*((int64_t *)pDest) = (int64_t)v;
|
|
||||||
} else if (token.type == TK_INTEGER) {
|
|
||||||
int64_t val = strtoll(pVariant->pz, &endPtr, 10);
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errno == ERANGE) {
|
|
||||||
return -1; // data overflow
|
|
||||||
}
|
|
||||||
|
|
||||||
*((int64_t *)pDest) = val;
|
|
||||||
} else if (token.type == TK_NULL) {
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
setNull(pDest, type, tDataTypeDesc[type].nSize);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
errno = 0;
|
|
||||||
wchar_t *endPtr = NULL;
|
|
||||||
|
|
||||||
SStrToken token = {0};
|
|
||||||
token.n = tSQLGetToken(pVariant->pz, &token.type);
|
|
||||||
|
|
||||||
if (token.type == TK_MINUS || token.type == TK_PLUS) {
|
|
||||||
token.n = tSQLGetToken(pVariant->pz + token.n, &token.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token.type == TK_FLOAT) {
|
|
||||||
double v = wcstod(pVariant->wpz, &endPtr);
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((errno == ERANGE && v == -1) || (isinf(v) || isnan(v))) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((v < INT64_MIN) || (v > INT64_MAX)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*((int64_t *)pDest) = (int64_t)v;
|
|
||||||
} else if (token.type == TK_NULL) {
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
setNull(pDest, type, tDataTypeDesc[type].nSize);
|
|
||||||
} else {
|
|
||||||
int64_t val = wcstoll(pVariant->wpz, &endPtr, 10);
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errno == ERANGE) {
|
|
||||||
return -1; // data overflow
|
|
||||||
}
|
|
||||||
|
|
||||||
*((int64_t *)pDest) = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
static FORCE_INLINE int32_t convertToBoolImpl(char *pStr, int32_t len) {
|
static FORCE_INLINE int32_t convertToBoolImpl(char *pStr, int32_t len) {
|
||||||
if ((strncasecmp(pStr, "true", len) == 0) && (len == 4)) {
|
if ((strncasecmp(pStr, "true", len) == 0) && (len == 4)) {
|
||||||
return TSDB_TRUE;
|
return TSDB_TRUE;
|
||||||
|
@ -385,15 +307,18 @@ static FORCE_INLINE int32_t wcsconvertToBoolImpl(wchar_t *pstr, int32_t len) {
|
||||||
return TSDB_TRUE;
|
return TSDB_TRUE;
|
||||||
} else if (wcsncasecmp(pstr, L"false", len) == 0 && (len == 5)) {
|
} else if (wcsncasecmp(pstr, L"false", len) == 0 && (len == 5)) {
|
||||||
return TSDB_FALSE;
|
return TSDB_FALSE;
|
||||||
|
} else if (memcmp(pstr, L"null", wcslen(L"null")) == 0) {
|
||||||
|
return TSDB_DATA_BOOL_NULL;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t toBinary(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
static int32_t toBinary(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
const int32_t INITIAL_ALLOC_SIZE = 20;
|
const int32_t INITIAL_ALLOC_SIZE = 40;
|
||||||
char * pBuf = NULL;
|
char * pBuf = NULL;
|
||||||
|
|
||||||
|
// it is a in-place convert type for tVariant, local buffer is needed
|
||||||
if (*pDest == pVariant->pz) {
|
if (*pDest == pVariant->pz) {
|
||||||
pBuf = calloc(1, INITIAL_ALLOC_SIZE);
|
pBuf = calloc(1, INITIAL_ALLOC_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -413,12 +338,12 @@ static int32_t toBinary(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (pVariant->nType >= TSDB_DATA_TYPE_TINYINT && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
sprintf(pBuf == NULL ? *pDest : pBuf, "%" PRId64, pVariant->i64Key);
|
sprintf(pBuf == NULL ? *pDest : pBuf, "%" PRId64, pVariant->i64);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
||||||
sprintf(pBuf == NULL ? *pDest : pBuf, "%lf", pVariant->dKey);
|
sprintf(pBuf == NULL ? *pDest : pBuf, "%lf", pVariant->dKey);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
||||||
sprintf(pBuf == NULL ? *pDest : pBuf, "%s", (pVariant->i64Key == TSDB_TRUE) ? "TRUE" : "FALSE");
|
sprintf(pBuf == NULL ? *pDest : pBuf, "%s", (pVariant->i64 == TSDB_TRUE) ? "TRUE" : "FALSE");
|
||||||
} else if (pVariant->nType == 0) { // null data
|
} else if (pVariant->nType == 0) { // null data
|
||||||
setNull(pBuf == NULL ? *pDest : pBuf, TSDB_DATA_TYPE_BINARY, 0);
|
setNull(pBuf == NULL ? *pDest : pBuf, TSDB_DATA_TYPE_BINARY, 0);
|
||||||
}
|
}
|
||||||
|
@ -432,28 +357,33 @@ static int32_t toBinary(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo handle the error
|
|
||||||
static int32_t toNchar(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
static int32_t toNchar(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
char tmpBuf[40] = {0};
|
char tmpBuf[40] = {0};
|
||||||
|
|
||||||
char * pDst = tmpBuf;
|
char * pDst = tmpBuf;
|
||||||
int32_t nLen = 0;
|
int32_t nLen = 0;
|
||||||
|
|
||||||
if (pVariant->nType >= TSDB_DATA_TYPE_TINYINT && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
// convert the number to string, than convert it to wchar string.
|
||||||
nLen = sprintf(pDst, "%" PRId64, pVariant->i64Key);
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
|
nLen = sprintf(pDst, "%" PRId64, pVariant->i64);
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
|
nLen = sprintf(pDst, "%"PRIu64, pVariant->u64);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
||||||
nLen = sprintf(pDst, "%lf", pVariant->dKey);
|
nLen = sprintf(pDst, "%lf", pVariant->dKey);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
pDst = pVariant->pz;
|
pDst = pVariant->pz;
|
||||||
nLen = pVariant->nLen;
|
nLen = pVariant->nLen;
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
||||||
nLen = sprintf(pDst, "%s", (pVariant->i64Key == TSDB_TRUE) ? "TRUE" : "FALSE");
|
nLen = sprintf(pDst, "%s", (pVariant->i64 == TSDB_TRUE) ? "TRUE" : "FALSE");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*pDest == pVariant->pz) {
|
if (*pDest == pVariant->pz) {
|
||||||
wchar_t *pWStr = calloc(1, (nLen + 1) * TSDB_NCHAR_SIZE);
|
wchar_t *pWStr = calloc(1, (nLen + 1) * TSDB_NCHAR_SIZE);
|
||||||
taosMbsToUcs4(pDst, nLen, (char *)pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL);
|
bool ret = taosMbsToUcs4(pDst, nLen, (char *)pWStr, (nLen + 1) * TSDB_NCHAR_SIZE, NULL);
|
||||||
|
if (!ret) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// free the binary buffer in the first place
|
// free the binary buffer in the first place
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
free(pVariant->wpz);
|
free(pVariant->wpz);
|
||||||
|
@ -468,11 +398,14 @@ static int32_t toNchar(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
|
|
||||||
pVariant->wpz = (wchar_t *)tmp;
|
pVariant->wpz = (wchar_t *)tmp;
|
||||||
} else {
|
} else {
|
||||||
size_t output = -1;
|
int32_t output = 0;
|
||||||
taosMbsToUcs4(pDst, nLen, *pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output);
|
bool ret = taosMbsToUcs4(pDst, nLen, *pDest, (nLen + 1) * TSDB_NCHAR_SIZE, &output);
|
||||||
|
if (!ret) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (pDestSize != NULL) {
|
if (pDestSize != NULL) {
|
||||||
*pDestSize = (int32_t)output;
|
*pDestSize = output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,38 +414,31 @@ static int32_t toNchar(tVariant *pVariant, char **pDest, int32_t *pDestSize) {
|
||||||
|
|
||||||
static FORCE_INLINE int32_t convertToDouble(char *pStr, int32_t len, double *value) {
|
static FORCE_INLINE int32_t convertToDouble(char *pStr, int32_t len, double *value) {
|
||||||
SStrToken stoken = {.z = pStr, .n = len};
|
SStrToken stoken = {.z = pStr, .n = len};
|
||||||
|
if (TK_ILLEGAL == tGetNumericStringType(&stoken)) {
|
||||||
if (TK_ILLEGAL == isValidNumber(&stoken)) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*value = strtod(pStr, NULL);
|
*value = strtod(pStr, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result, int32_t type, int64_t lowBnd,
|
static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result, int32_t type, bool issigned, bool releaseVariantPtr) {
|
||||||
int64_t upperBnd, bool releaseVariantPtr) {
|
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
||||||
setNull((char *)result, type, tDataTypeDesc[type].nSize);
|
setNull((char *)result, type, tDataTypeDesc[type].nSize);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
errno = 0;
|
||||||
*result = pVariant->i64Key;
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
*result = pVariant->i64;
|
||||||
*result = (int64_t)pVariant->dKey;
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
|
*result = pVariant->u64;
|
||||||
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
|
*result = (int64_t) pVariant->dKey;
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
errno = 0;
|
SStrToken token = {.z = pVariant->pz, .n = pVariant->nLen};
|
||||||
char *endPtr = NULL;
|
/*int32_t n = */tSQLGetToken(pVariant->pz, &token.type);
|
||||||
|
|
||||||
SStrToken token = {0};
|
|
||||||
token.n = tSQLGetToken(pVariant->pz, &token.type);
|
|
||||||
|
|
||||||
if (token.type == TK_MINUS || token.type == TK_PLUS) {
|
|
||||||
token.n = tSQLGetToken(pVariant->pz + token.n, &token.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token.type == TK_NULL) {
|
if (token.type == TK_NULL) {
|
||||||
if (releaseVariantPtr) {
|
if (releaseVariantPtr) {
|
||||||
free(pVariant->pz);
|
free(pVariant->pz);
|
||||||
|
@ -522,39 +448,25 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
|
||||||
setNull((char *)result, type, tDataTypeDesc[type].nSize);
|
setNull((char *)result, type, tDataTypeDesc[type].nSize);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStrToken sToken = {.z = pVariant->pz, .n = pVariant->nLen};
|
// decide if it is a valid number
|
||||||
if (TK_ILLEGAL == isValidNumber(&sToken)) {
|
token.type = tGetNumericStringType(&token);
|
||||||
|
if (token.type == TK_ILLEGAL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token.type == TK_FLOAT) {
|
int64_t res = 0;
|
||||||
double v = strtod(pVariant->pz, &endPtr);
|
int32_t t = tStrToInteger(token.z, token.type, token.n, &res, issigned);
|
||||||
if (releaseVariantPtr) {
|
if (t != 0) {
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((errno == ERANGE && v == -1) || (isinf(v) || isnan(v))) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = (int64_t)v;
|
|
||||||
} else if (token.type == TK_INTEGER) {
|
|
||||||
int64_t val = strtoll(pVariant->pz, &endPtr, 10);
|
|
||||||
if (releaseVariantPtr) {
|
|
||||||
free(pVariant->pz);
|
|
||||||
pVariant->nLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errno == ERANGE) {
|
|
||||||
return -1; // data overflow
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = val;
|
|
||||||
} else {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (releaseVariantPtr) {
|
||||||
|
free(pVariant->pz);
|
||||||
|
pVariant->nLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*result = res;
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
wchar_t *endPtr = NULL;
|
wchar_t *endPtr = NULL;
|
||||||
|
@ -599,19 +511,35 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
|
||||||
*result = val;
|
*result = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*result <= lowBnd) || (*result > upperBnd)) {
|
bool code = false;
|
||||||
return -1;
|
switch(type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
code = IS_VALID_TINYINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
code = IS_VALID_SMALLINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
code = IS_VALID_INT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
code = IS_VALID_BIGINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
code = IS_VALID_UTINYINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
code = IS_VALID_USMALLINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
code = IS_VALID_UINT(*result); break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
code = IS_VALID_UBIGINT(*result); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return code? 0:-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t convertToBool(tVariant *pVariant, int64_t *pDest) {
|
static int32_t convertToBool(tVariant *pVariant, int64_t *pDest) {
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
if (pVariant->nType == TSDB_DATA_TYPE_BOOL) {
|
||||||
*pDest = pVariant->i64Key; // in order to be compatible to null of bool
|
*pDest = pVariant->i64; // in order to be compatible to null of bool
|
||||||
} else if (pVariant->nType >= TSDB_DATA_TYPE_TINYINT && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
} else if (IS_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
*pDest = ((pVariant->i64Key != 0) ? TSDB_TRUE : TSDB_FALSE);
|
*pDest = ((pVariant->i64 != 0) ? TSDB_TRUE : TSDB_FALSE);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_FLOAT || pVariant->nType == TSDB_DATA_TYPE_DOUBLE) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_FLOAT || pVariant->nType == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
*pDest = ((pVariant->dKey != 0) ? TSDB_TRUE : TSDB_FALSE);
|
*pDest = ((pVariant->dKey != 0) ? TSDB_TRUE : TSDB_FALSE);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
@ -638,8 +566,6 @@ static int32_t convertToBool(tVariant *pVariant, int64_t *pDest) {
|
||||||
/*
|
/*
|
||||||
* transfer data from variant serve as the implicit data conversion: from input sql string pVariant->nType
|
* transfer data from variant serve as the implicit data conversion: from input sql string pVariant->nType
|
||||||
* to column type defined in schema
|
* to column type defined in schema
|
||||||
*
|
|
||||||
* todo handle the return value
|
|
||||||
*/
|
*/
|
||||||
int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool includeLengthPrefix) {
|
int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool includeLengthPrefix) {
|
||||||
if (pVariant == NULL || (pVariant->nType != 0 && !isValidDataType(pVariant->nType))) {
|
if (pVariant == NULL || (pVariant->nType != 0 && !isValidDataType(pVariant->nType))) {
|
||||||
|
@ -647,57 +573,82 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0; // reset global error code
|
errno = 0; // reset global error code
|
||||||
|
int64_t result;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL: {
|
case TSDB_DATA_TYPE_BOOL: {
|
||||||
int64_t dst = 0;
|
if (convertToBool(pVariant, &result) < 0) {
|
||||||
if (convertToBool(pVariant, &dst) < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*(int8_t *)payload = (int8_t)dst;
|
|
||||||
|
*(int8_t *)payload = (int8_t)result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int64_t result = 0;
|
if (convertToInteger(pVariant, &result, type, true, false) < 0) {
|
||||||
if (convertToInteger(pVariant, &result, type, INT8_MIN, INT8_MAX, false) < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
*((int8_t *)payload) = (int8_t) result;
|
||||||
*((int8_t *)payload) = (int8_t)result;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
if (convertToInteger(pVariant, &result, type, false, false) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*((uint8_t *)payload) = (uint8_t) result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int64_t result = 0;
|
if (convertToInteger(pVariant, &result, type, true, false) < 0) {
|
||||||
if (convertToInteger(pVariant, &result, type, INT16_MIN, INT16_MAX, false) < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*((int16_t *)payload) = (int16_t)result;
|
*((int16_t *)payload) = (int16_t)result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
if (convertToInteger(pVariant, &result, type, false, false) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*((uint16_t *)payload) = (uint16_t)result;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int64_t result = 0;
|
if (convertToInteger(pVariant, &result, type, true, false) < 0) {
|
||||||
if (convertToInteger(pVariant, &result, type, INT32_MIN, INT32_MAX, false) < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*((int32_t *)payload) = (int32_t)result;
|
*((int32_t *)payload) = (int32_t)result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
if (convertToInteger(pVariant, &result, type, false, false) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*((uint32_t *)payload) = (uint32_t)result;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t result = 0;
|
if (convertToInteger(pVariant, &result, type, true, false) < 0) {
|
||||||
if (convertToInteger(pVariant, &result, type, INT64_MIN, INT64_MAX, false) < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*((int64_t *)payload) = (int64_t)result;
|
*((int64_t *)payload) = (int64_t)result;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
if (convertToInteger(pVariant, &result, type, false, false) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*((uint64_t *)payload) = (uint64_t)result;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||||
if (strncasecmp(TSDB_DATA_NULL_STR_L, pVariant->pz, pVariant->nLen) == 0 &&
|
if (strncasecmp(TSDB_DATA_NULL_STR_L, pVariant->pz, pVariant->nLen) == 0 &&
|
||||||
|
@ -706,20 +657,19 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
double value = -1;
|
double value = -1;
|
||||||
int32_t ret;
|
int32_t ret = convertToDouble(pVariant->pz, pVariant->nLen, &value);
|
||||||
ret = convertToDouble(pVariant->pz, pVariant->nLen, &value);
|
|
||||||
if ((errno == ERANGE && (float)value == -1) || (ret != 0)) {
|
if ((errno == ERANGE && (float)value == -1) || (ret != 0)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_FLOAT_VAL(payload, value);
|
SET_FLOAT_VAL(payload, value);
|
||||||
}
|
}
|
||||||
} else if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
SET_FLOAT_VAL(payload, pVariant->i64Key);
|
SET_FLOAT_VAL(payload, pVariant->i64);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
SET_FLOAT_VAL(payload, pVariant->dKey);
|
SET_FLOAT_VAL(payload, pVariant->dKey);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
||||||
*((int32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
*((uint32_t *)payload) = TSDB_DATA_FLOAT_NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -745,9 +695,9 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
|
|
||||||
SET_DOUBLE_VAL(payload, value);
|
SET_DOUBLE_VAL(payload, value);
|
||||||
}
|
}
|
||||||
} else if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_BOOL || IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
SET_DOUBLE_VAL(payload, pVariant->i64Key);
|
SET_DOUBLE_VAL(payload, pVariant->i64);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_DOUBLE || pVariant->nType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
SET_DOUBLE_VAL(payload, pVariant->dKey);
|
SET_DOUBLE_VAL(payload, pVariant->dKey);
|
||||||
} else if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
} else if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
||||||
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
*((int64_t *)payload) = TSDB_DATA_DOUBLE_NULL;
|
||||||
|
@ -755,9 +705,10 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
}
|
}
|
||||||
|
|
||||||
double dv = GET_DOUBLE_VAL(payload);
|
double dv = GET_DOUBLE_VAL(payload);
|
||||||
if (isinf(dv) || isnan(dv) || dv > DBL_MAX || dv < -DBL_MAX) {
|
if (errno == ERANGE || isinf(dv) || isnan(dv)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -794,7 +745,7 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
if (pVariant->nType == TSDB_DATA_TYPE_NULL) {
|
||||||
*((int64_t *)payload) = TSDB_DATA_BIGINT_NULL;
|
*((int64_t *)payload) = TSDB_DATA_BIGINT_NULL;
|
||||||
} else {
|
} else {
|
||||||
*((int64_t *)payload) = pVariant->i64Key;
|
*((int64_t *)payload) = pVariant->i64;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -805,7 +756,9 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
*(uint32_t *)payload = TSDB_DATA_NCHAR_NULL;
|
*(uint32_t *)payload = TSDB_DATA_NCHAR_NULL;
|
||||||
} else {
|
} else {
|
||||||
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
||||||
toNchar(pVariant, &payload, &newlen);
|
if (toNchar(pVariant, &payload, &newlen) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
wcsncpy((wchar_t *)payload, pVariant->wpz, pVariant->nLen);
|
wcsncpy((wchar_t *)payload, pVariant->wpz, pVariant->nLen);
|
||||||
}
|
}
|
||||||
|
@ -817,7 +770,9 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
|
||||||
char *p = varDataVal(payload);
|
char *p = varDataVal(payload);
|
||||||
|
|
||||||
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
||||||
toNchar(pVariant, &p, &newlen);
|
if (toNchar(pVariant, &p, &newlen) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
wcsncpy((wchar_t *)p, pVariant->wpz, pVariant->nLen);
|
wcsncpy((wchar_t *)p, pVariant->wpz, pVariant->nLen);
|
||||||
newlen = pVariant->nLen;
|
newlen = pVariant->nLen;
|
||||||
|
@ -848,7 +803,7 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL: { // bool
|
case TSDB_DATA_TYPE_BOOL: { // bool
|
||||||
if (convertToBool(pVariant, &pVariant->i64Key) < 0) {
|
if (convertToBool(pVariant, &pVariant->i64) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -859,7 +814,7 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
convertToInteger(pVariant, &(pVariant->i64Key), type, INT64_MIN, INT64_MAX, true);
|
convertToInteger(pVariant, &(pVariant->i64), type, true, true);
|
||||||
pVariant->nType = TSDB_DATA_TYPE_BIGINT;
|
pVariant->nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -886,7 +841,7 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
|
||||||
free(pVariant->pz);
|
free(pVariant->pz);
|
||||||
pVariant->dKey = v;
|
pVariant->dKey = v;
|
||||||
} else if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
} else if (pVariant->nType >= TSDB_DATA_TYPE_BOOL && pVariant->nType <= TSDB_DATA_TYPE_BIGINT) {
|
||||||
pVariant->dKey = (double)(pVariant->i64Key);
|
pVariant->dKey = (double)(pVariant->i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
pVariant->nType = TSDB_DATA_TYPE_DOUBLE;
|
pVariant->nType = TSDB_DATA_TYPE_DOUBLE;
|
||||||
|
@ -901,7 +856,9 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
if (pVariant->nType != TSDB_DATA_TYPE_NCHAR) {
|
||||||
toNchar(pVariant, &pVariant->pz, &pVariant->nLen);
|
if (toNchar(pVariant, &pVariant->pz, &pVariant->nLen) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pVariant->nType = type;
|
pVariant->nType = type;
|
||||||
break;
|
break;
|
||||||
|
@ -909,6 +866,4 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,8 @@ static void cqCreateStream(SCqContext *pContext, SCqObj *pObj) {
|
||||||
|
|
||||||
if (pObj->pStream == NULL) {
|
if (pObj->pStream == NULL) {
|
||||||
pObj->pStream = taos_open_stream(pContext->dbConn, pObj->sqlStr, cqProcessStreamRes, 0, pObj, NULL);
|
pObj->pStream = taos_open_stream(pContext->dbConn, pObj->sqlStr, cqProcessStreamRes, 0, pObj, NULL);
|
||||||
|
|
||||||
|
// TODO the pObj->pStream may be released if error happens
|
||||||
if (pObj->pStream) {
|
if (pObj->pStream) {
|
||||||
tscSetStreamDestTable(pObj->pStream, pObj->dstTable);
|
tscSetStreamDestTable(pObj->pStream, pObj->dstTable);
|
||||||
pContext->num++;
|
pContext->num++;
|
||||||
|
@ -306,11 +308,14 @@ static void cqCreateStream(SCqContext *pContext, SCqObj *pObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cqProcessStreamRes(void *param, TAOS_RES *tres, TAOS_ROW row) {
|
static void cqProcessStreamRes(void *param, TAOS_RES *tres, TAOS_ROW row) {
|
||||||
SCqObj *pObj = (SCqObj *)param;
|
SCqObj *pObj = (SCqObj *)param;
|
||||||
if (tres == NULL && row == NULL) {
|
if (tres == NULL && row == NULL) {
|
||||||
|
taos_close_stream(pObj->pStream);
|
||||||
|
|
||||||
pObj->pStream = NULL;
|
pObj->pStream = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCqContext *pContext = pObj->pContext;
|
SCqContext *pContext = pObj->pContext;
|
||||||
STSchema *pSchema = pObj->pSchema;
|
STSchema *pSchema = pObj->pSchema;
|
||||||
if (pObj->pStream == NULL) return;
|
if (pObj->pStream == NULL) return;
|
||||||
|
@ -336,7 +341,7 @@ static void cqProcessStreamRes(void *param, TAOS_RES *tres, TAOS_ROW row) {
|
||||||
val = ((char*)val) - sizeof(VarDataLenT);
|
val = ((char*)val) - sizeof(VarDataLenT);
|
||||||
} else if (c->type == TSDB_DATA_TYPE_NCHAR) {
|
} else if (c->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
char buf[TSDB_MAX_NCHAR_LEN];
|
char buf[TSDB_MAX_NCHAR_LEN];
|
||||||
size_t len = taos_fetch_lengths(tres)[i];
|
int32_t len = taos_fetch_lengths(tres)[i];
|
||||||
taosMbsToUcs4(val, len, buf, sizeof(buf), &len);
|
taosMbsToUcs4(val, len, buf, sizeof(buf), &len);
|
||||||
memcpy(val + sizeof(VarDataLenT), buf, len);
|
memcpy(val + sizeof(VarDataLenT), buf, len);
|
||||||
varDataLen(val) = len;
|
varDataLen(val) = len;
|
||||||
|
|
|
@ -160,7 +160,7 @@ static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context) {
|
||||||
syslog(LOG_INFO, "Shut down signal is %d", signum);
|
syslog(LOG_INFO, "Shut down signal is %d", signum);
|
||||||
syslog(LOG_INFO, "Shutting down TDengine service...");
|
syslog(LOG_INFO, "Shutting down TDengine service...");
|
||||||
// clean the system.
|
// clean the system.
|
||||||
dInfo("shut down signal is %d, sender PID:%d", signum, sigInfo->si_pid);
|
dInfo("shut down signal is %d, sender PID:%d cmdline:%s", signum, sigInfo->si_pid, taosGetCmdlineByPID(sigInfo->si_pid));
|
||||||
|
|
||||||
// protect the application from receive another signal
|
// protect the application from receive another signal
|
||||||
struct sigaction act = {{0}};
|
struct sigaction act = {{0}};
|
||||||
|
|
|
@ -42,6 +42,10 @@ typedef void **TAOS_ROW;
|
||||||
#define TSDB_DATA_TYPE_BINARY 8 // string
|
#define TSDB_DATA_TYPE_BINARY 8 // string
|
||||||
#define TSDB_DATA_TYPE_TIMESTAMP 9 // 8 bytes
|
#define TSDB_DATA_TYPE_TIMESTAMP 9 // 8 bytes
|
||||||
#define TSDB_DATA_TYPE_NCHAR 10 // unicode string
|
#define TSDB_DATA_TYPE_NCHAR 10 // unicode string
|
||||||
|
#define TSDB_DATA_TYPE_UTINYINT 11 // 1 byte
|
||||||
|
#define TSDB_DATA_TYPE_USMALLINT 12 // 2 bytes
|
||||||
|
#define TSDB_DATA_TYPE_UINT 13 // 4 bytes
|
||||||
|
#define TSDB_DATA_TYPE_UBIGINT 14 // 8 bytes
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TSDB_OPTION_LOCALE,
|
TSDB_OPTION_LOCALE,
|
||||||
|
|
|
@ -60,7 +60,7 @@ typedef struct tstr {
|
||||||
|
|
||||||
|
|
||||||
// Bytes for each type.
|
// Bytes for each type.
|
||||||
extern const int32_t TYPE_BYTES[11];
|
extern const int32_t TYPE_BYTES[15];
|
||||||
|
|
||||||
// TODO: replace and remove code below
|
// TODO: replace and remove code below
|
||||||
#define CHAR_BYTES sizeof(char)
|
#define CHAR_BYTES sizeof(char)
|
||||||
|
@ -92,6 +92,11 @@ extern const int32_t TYPE_BYTES[11];
|
||||||
#define TSDB_DATA_NCHAR_NULL 0xFFFFFFFF
|
#define TSDB_DATA_NCHAR_NULL 0xFFFFFFFF
|
||||||
#define TSDB_DATA_BINARY_NULL 0xFF
|
#define TSDB_DATA_BINARY_NULL 0xFF
|
||||||
|
|
||||||
|
#define TSDB_DATA_UTINYINT_NULL 0xFF
|
||||||
|
#define TSDB_DATA_USMALLINT_NULL 0xFFFF
|
||||||
|
#define TSDB_DATA_UINT_NULL 0xFFFFFFFF
|
||||||
|
#define TSDB_DATA_UBIGINT_NULL 0xFFFFFFFFFFFFFFFFL
|
||||||
|
|
||||||
#define TSDB_DATA_NULL_STR "NULL"
|
#define TSDB_DATA_NULL_STR "NULL"
|
||||||
#define TSDB_DATA_NULL_STR_L "null"
|
#define TSDB_DATA_NULL_STR_L "null"
|
||||||
|
|
||||||
|
@ -131,19 +136,16 @@ do { \
|
||||||
(src) = (void *)((char *)src + sizeof(type));\
|
(src) = (void *)((char *)src + sizeof(type));\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define GET_INT8_VAL(x) (*(int8_t *)(x))
|
#define GET_INT8_VAL(x) (*(int8_t *)(x))
|
||||||
#define GET_INT16_VAL(x) (*(int16_t *)(x))
|
#define GET_INT16_VAL(x) (*(int16_t *)(x))
|
||||||
#define GET_INT32_VAL(x) (*(int32_t *)(x))
|
#define GET_INT32_VAL(x) (*(int32_t *)(x))
|
||||||
#define GET_INT64_VAL(x) (*(int64_t *)(x))
|
#define GET_INT64_VAL(x) (*(int64_t *)(x))
|
||||||
|
#define GET_UINT8_VAL(x) (*(uint8_t*) (x))
|
||||||
|
#define GET_UINT16_VAL(x) (*(uint16_t *)(x))
|
||||||
|
#define GET_UINT32_VAL(x) (*(uint32_t *)(x))
|
||||||
|
#define GET_UINT64_VAL(x) (*(uint64_t *)(x))
|
||||||
|
|
||||||
#ifdef _TD_ARM_32
|
#ifdef _TD_ARM_32
|
||||||
|
|
||||||
//#define __float_align_declear() float __underlyFloat = 0.0;
|
|
||||||
//#define __float_align_declear()
|
|
||||||
//#define GET_FLOAT_VAL_ALIGN(x) (*(int32_t*)&(__underlyFloat) = *(int32_t*)(x); __underlyFloat);
|
|
||||||
// notes: src must be float or double type variable !!!
|
|
||||||
//#define SET_FLOAT_VAL_ALIGN(dst, src) (*(int32_t*) dst = *(int32_t*)src);
|
|
||||||
//#define SET_DOUBLE_VAL_ALIGN(dst, src) (*(int64_t*) dst = *(int64_t*)src);
|
|
||||||
|
|
||||||
float taos_align_get_float(const char* pBuf);
|
float taos_align_get_float(const char* pBuf);
|
||||||
double taos_align_get_double(const char* pBuf);
|
double taos_align_get_double(const char* pBuf);
|
||||||
|
|
||||||
|
@ -171,14 +173,14 @@ typedef struct tDataTypeDescriptor {
|
||||||
char algorithm, char *const buffer, int bufferSize);
|
char algorithm, char *const buffer, int bufferSize);
|
||||||
int (*decompFunc)(const char *const input, int compressedSize, const int nelements, char *const output,
|
int (*decompFunc)(const char *const input, int compressedSize, const int nelements, char *const output,
|
||||||
int outputSize, char algorithm, char *const buffer, int bufferSize);
|
int outputSize, char algorithm, char *const buffer, int bufferSize);
|
||||||
void (*getStatisFunc)(const TSKEY *primaryKey, const void *pData, int32_t numofrow, int64_t *min, int64_t *max,
|
void (*getStatisFunc)(const void *pData, int32_t numofrow, int64_t *min, int64_t *max, int64_t *sum,
|
||||||
int64_t *sum, int16_t *minindex, int16_t *maxindex, int16_t *numofnull);
|
int16_t *minindex, int16_t *maxindex, int16_t *numofnull);
|
||||||
} tDataTypeDescriptor;
|
} tDataTypeDescriptor;
|
||||||
|
|
||||||
extern tDataTypeDescriptor tDataTypeDesc[11];
|
extern tDataTypeDescriptor tDataTypeDesc[15];
|
||||||
|
|
||||||
bool isValidDataType(int32_t type);
|
bool isValidDataType(int32_t type);
|
||||||
//bool isNull(const char *val, int32_t type);
|
|
||||||
static FORCE_INLINE bool isNull(const char *val, int32_t type) {
|
static FORCE_INLINE bool isNull(const char *val, int32_t type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
@ -200,6 +202,15 @@ static FORCE_INLINE bool isNull(const char *val, int32_t type) {
|
||||||
return varDataLen(val) == sizeof(int32_t) && *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
|
return varDataLen(val) == sizeof(int32_t) && *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
return varDataLen(val) == sizeof(int8_t) && *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
|
return varDataLen(val) == sizeof(int8_t) && *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
return *(uint8_t*) val == TSDB_DATA_UTINYINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
return *(uint16_t*) val == TSDB_DATA_USMALLINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return *(uint32_t*) val == TSDB_DATA_UINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
return *(uint64_t*) val == TSDB_DATA_UBIGINT_NULL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
@ -213,6 +224,10 @@ void* getNullValue(int32_t type);
|
||||||
void assignVal(char *val, const char *src, int32_t len, int32_t type);
|
void assignVal(char *val, const char *src, int32_t len, int32_t type);
|
||||||
void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf);
|
void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf);
|
||||||
|
|
||||||
|
int32_t tStrToInteger(const char* z, int16_t type, int32_t n, int64_t* value, bool issigned);
|
||||||
|
|
||||||
|
#define SET_DOUBLE_NULL(v) (*(uint64_t *)(v) = TSDB_DATA_DOUBLE_NULL)
|
||||||
|
|
||||||
// TODO: check if below is necessary
|
// TODO: check if below is necessary
|
||||||
#define TSDB_RELATION_INVALID 0
|
#define TSDB_RELATION_INVALID 0
|
||||||
#define TSDB_RELATION_LESS 1
|
#define TSDB_RELATION_LESS 1
|
||||||
|
|
|
@ -180,6 +180,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_NOT_EXIST, 0, 0x036A, "Tag does n
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_ALREAY_EXIST, 0, 0x036B, "Field already exists")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_ALREAY_EXIST, 0, 0x036B, "Field already exists")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_NOT_EXIST, 0, 0x036C, "Field does not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_NOT_EXIST, 0, 0x036C, "Field does not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_STABLE_NAME, 0, 0x036D, "Super table does not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_STABLE_NAME, 0, 0x036D, "Super table does not exist")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG, 0, 0x036E, "Invalid create table message")
|
||||||
|
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_NOT_SELECTED, 0, 0x0380, "Database not specified or available")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_NOT_SELECTED, 0, 0x0380, "Database not specified or available")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_ALREADY_EXIST, 0, 0x0381, "Database already exists")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_ALREADY_EXIST, 0, 0x0381, "Database already exists")
|
||||||
|
|
|
@ -117,112 +117,114 @@
|
||||||
#define TK_CACHELAST 99
|
#define TK_CACHELAST 99
|
||||||
#define TK_LP 100
|
#define TK_LP 100
|
||||||
#define TK_RP 101
|
#define TK_RP 101
|
||||||
#define TK_TAGS 102
|
#define TK_UNSIGNED 102
|
||||||
#define TK_USING 103
|
#define TK_TAGS 103
|
||||||
#define TK_AS 104
|
#define TK_USING 104
|
||||||
#define TK_COMMA 105
|
#define TK_AS 105
|
||||||
#define TK_NULL 106
|
#define TK_COMMA 106
|
||||||
#define TK_SELECT 107
|
#define TK_NULL 107
|
||||||
#define TK_UNION 108
|
#define TK_SELECT 108
|
||||||
#define TK_ALL 109
|
#define TK_UNION 109
|
||||||
#define TK_FROM 110
|
#define TK_ALL 110
|
||||||
#define TK_VARIABLE 111
|
#define TK_FROM 111
|
||||||
#define TK_INTERVAL 112
|
#define TK_VARIABLE 112
|
||||||
#define TK_FILL 113
|
#define TK_INTERVAL 113
|
||||||
#define TK_SLIDING 114
|
#define TK_FILL 114
|
||||||
#define TK_ORDER 115
|
#define TK_SLIDING 115
|
||||||
#define TK_BY 116
|
#define TK_ORDER 116
|
||||||
#define TK_ASC 117
|
#define TK_BY 117
|
||||||
#define TK_DESC 118
|
#define TK_ASC 118
|
||||||
#define TK_GROUP 119
|
#define TK_DESC 119
|
||||||
#define TK_HAVING 120
|
#define TK_GROUP 120
|
||||||
#define TK_LIMIT 121
|
#define TK_HAVING 121
|
||||||
#define TK_OFFSET 122
|
#define TK_LIMIT 122
|
||||||
#define TK_SLIMIT 123
|
#define TK_OFFSET 123
|
||||||
#define TK_SOFFSET 124
|
#define TK_SLIMIT 124
|
||||||
#define TK_WHERE 125
|
#define TK_SOFFSET 125
|
||||||
#define TK_NOW 126
|
#define TK_WHERE 126
|
||||||
#define TK_RESET 127
|
#define TK_NOW 127
|
||||||
#define TK_QUERY 128
|
#define TK_RESET 128
|
||||||
#define TK_ADD 129
|
#define TK_QUERY 129
|
||||||
#define TK_COLUMN 130
|
#define TK_ADD 130
|
||||||
#define TK_TAG 131
|
#define TK_COLUMN 131
|
||||||
#define TK_CHANGE 132
|
#define TK_TAG 132
|
||||||
#define TK_SET 133
|
#define TK_CHANGE 133
|
||||||
#define TK_KILL 134
|
#define TK_SET 134
|
||||||
#define TK_CONNECTION 135
|
#define TK_KILL 135
|
||||||
#define TK_STREAM 136
|
#define TK_CONNECTION 136
|
||||||
#define TK_COLON 137
|
#define TK_STREAM 137
|
||||||
#define TK_ABORT 138
|
#define TK_COLON 138
|
||||||
#define TK_AFTER 139
|
#define TK_ABORT 139
|
||||||
#define TK_ATTACH 140
|
#define TK_AFTER 140
|
||||||
#define TK_BEFORE 141
|
#define TK_ATTACH 141
|
||||||
#define TK_BEGIN 142
|
#define TK_BEFORE 142
|
||||||
#define TK_CASCADE 143
|
#define TK_BEGIN 143
|
||||||
#define TK_CLUSTER 144
|
#define TK_CASCADE 144
|
||||||
#define TK_CONFLICT 145
|
#define TK_CLUSTER 145
|
||||||
#define TK_COPY 146
|
#define TK_CONFLICT 146
|
||||||
#define TK_DEFERRED 147
|
#define TK_COPY 147
|
||||||
#define TK_DELIMITERS 148
|
#define TK_DEFERRED 148
|
||||||
#define TK_DETACH 149
|
#define TK_DELIMITERS 149
|
||||||
#define TK_EACH 150
|
#define TK_DETACH 150
|
||||||
#define TK_END 151
|
#define TK_EACH 151
|
||||||
#define TK_EXPLAIN 152
|
#define TK_END 152
|
||||||
#define TK_FAIL 153
|
#define TK_EXPLAIN 153
|
||||||
#define TK_FOR 154
|
#define TK_FAIL 154
|
||||||
#define TK_IGNORE 155
|
#define TK_FOR 155
|
||||||
#define TK_IMMEDIATE 156
|
#define TK_IGNORE 156
|
||||||
#define TK_INITIALLY 157
|
#define TK_IMMEDIATE 157
|
||||||
#define TK_INSTEAD 158
|
#define TK_INITIALLY 158
|
||||||
#define TK_MATCH 159
|
#define TK_INSTEAD 159
|
||||||
#define TK_KEY 160
|
#define TK_MATCH 160
|
||||||
#define TK_OF 161
|
#define TK_KEY 161
|
||||||
#define TK_RAISE 162
|
#define TK_OF 162
|
||||||
#define TK_REPLACE 163
|
#define TK_RAISE 163
|
||||||
#define TK_RESTRICT 164
|
#define TK_REPLACE 164
|
||||||
#define TK_ROW 165
|
#define TK_RESTRICT 165
|
||||||
#define TK_STATEMENT 166
|
#define TK_ROW 166
|
||||||
#define TK_TRIGGER 167
|
#define TK_STATEMENT 167
|
||||||
#define TK_VIEW 168
|
#define TK_TRIGGER 168
|
||||||
#define TK_COUNT 169
|
#define TK_VIEW 169
|
||||||
#define TK_SUM 170
|
#define TK_COUNT 170
|
||||||
#define TK_AVG 171
|
#define TK_SUM 171
|
||||||
#define TK_MIN 172
|
#define TK_AVG 172
|
||||||
#define TK_MAX 173
|
#define TK_MIN 173
|
||||||
#define TK_FIRST 174
|
#define TK_MAX 174
|
||||||
#define TK_LAST 175
|
#define TK_FIRST 175
|
||||||
#define TK_TOP 176
|
#define TK_LAST 176
|
||||||
#define TK_BOTTOM 177
|
#define TK_TOP 177
|
||||||
#define TK_STDDEV 178
|
#define TK_BOTTOM 178
|
||||||
#define TK_PERCENTILE 179
|
#define TK_STDDEV 179
|
||||||
#define TK_APERCENTILE 180
|
#define TK_PERCENTILE 180
|
||||||
#define TK_LEASTSQUARES 181
|
#define TK_APERCENTILE 181
|
||||||
#define TK_HISTOGRAM 182
|
#define TK_LEASTSQUARES 182
|
||||||
#define TK_DIFF 183
|
#define TK_HISTOGRAM 183
|
||||||
#define TK_SPREAD 184
|
#define TK_DIFF 184
|
||||||
#define TK_TWA 185
|
#define TK_SPREAD 185
|
||||||
#define TK_INTERP 186
|
#define TK_TWA 186
|
||||||
#define TK_LAST_ROW 187
|
#define TK_INTERP 187
|
||||||
#define TK_RATE 188
|
#define TK_LAST_ROW 188
|
||||||
#define TK_IRATE 189
|
#define TK_RATE 189
|
||||||
#define TK_SUM_RATE 190
|
#define TK_IRATE 190
|
||||||
#define TK_SUM_IRATE 191
|
#define TK_SUM_RATE 191
|
||||||
#define TK_AVG_RATE 192
|
#define TK_SUM_IRATE 192
|
||||||
#define TK_AVG_IRATE 193
|
#define TK_AVG_RATE 193
|
||||||
#define TK_TBID 194
|
#define TK_AVG_IRATE 194
|
||||||
#define TK_SEMI 195
|
#define TK_TBID 195
|
||||||
#define TK_NONE 196
|
#define TK_SEMI 196
|
||||||
#define TK_PREV 197
|
#define TK_NONE 197
|
||||||
#define TK_LINEAR 198
|
#define TK_PREV 198
|
||||||
#define TK_IMPORT 199
|
#define TK_LINEAR 199
|
||||||
#define TK_METRIC 200
|
#define TK_IMPORT 200
|
||||||
#define TK_TBNAME 201
|
#define TK_METRIC 201
|
||||||
#define TK_JOIN 202
|
#define TK_TBNAME 202
|
||||||
#define TK_METRICS 203
|
#define TK_JOIN 203
|
||||||
#define TK_STABLE 204
|
#define TK_METRICS 204
|
||||||
#define TK_INSERT 205
|
#define TK_STABLE 205
|
||||||
#define TK_INTO 206
|
#define TK_INSERT 206
|
||||||
#define TK_VALUES 207
|
#define TK_INTO 207
|
||||||
|
#define TK_VALUES 208
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define TK_SPACE 300
|
#define TK_SPACE 300
|
||||||
|
|
|
@ -8,27 +8,56 @@ extern "C" {
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
|
||||||
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \
|
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \
|
||||||
switch (_type) { \
|
do { \
|
||||||
case TSDB_DATA_TYPE_BOOL: \
|
switch (_type) { \
|
||||||
case TSDB_DATA_TYPE_TINYINT: \
|
case TSDB_DATA_TYPE_BOOL: \
|
||||||
(_v) = (_finalType)GET_INT8_VAL(_data); \
|
case TSDB_DATA_TYPE_TINYINT: \
|
||||||
break; \
|
(_v) = (_finalType)GET_INT8_VAL(_data); \
|
||||||
case TSDB_DATA_TYPE_SMALLINT: \
|
break; \
|
||||||
(_v) = (_finalType)GET_INT16_VAL(_data); \
|
case TSDB_DATA_TYPE_UTINYINT: \
|
||||||
break; \
|
(_v) = (_finalType)GET_UINT8_VAL(_data); \
|
||||||
case TSDB_DATA_TYPE_BIGINT: \
|
break; \
|
||||||
(_v) = (_finalType)(GET_INT64_VAL(_data)); \
|
case TSDB_DATA_TYPE_SMALLINT: \
|
||||||
break; \
|
(_v) = (_finalType)GET_INT16_VAL(_data); \
|
||||||
case TSDB_DATA_TYPE_FLOAT: \
|
break; \
|
||||||
(_v) = (_finalType)GET_FLOAT_VAL(_data); \
|
case TSDB_DATA_TYPE_USMALLINT: \
|
||||||
break; \
|
(_v) = (_finalType)GET_UINT16_VAL(_data); \
|
||||||
case TSDB_DATA_TYPE_DOUBLE: \
|
break; \
|
||||||
(_v) = (_finalType)GET_DOUBLE_VAL(_data); \
|
case TSDB_DATA_TYPE_BIGINT: \
|
||||||
break; \
|
(_v) = (_finalType)(GET_INT64_VAL(_data)); \
|
||||||
default: \
|
break; \
|
||||||
(_v) = (_finalType)GET_INT32_VAL(_data); \
|
case TSDB_DATA_TYPE_UBIGINT: \
|
||||||
break; \
|
(_v) = (_finalType)(GET_UINT64_VAL(_data)); \
|
||||||
}
|
break; \
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: \
|
||||||
|
(_v) = (_finalType)GET_FLOAT_VAL(_data); \
|
||||||
|
break; \
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: \
|
||||||
|
(_v) = (_finalType)GET_DOUBLE_VAL(_data); \
|
||||||
|
break; \
|
||||||
|
case TSDB_DATA_TYPE_UINT: \
|
||||||
|
(_v) = (_finalType)GET_UINT32_VAL(_data); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
(_v) = (_finalType)GET_INT32_VAL(_data); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define IS_SIGNED_NUMERIC_TYPE(_t) ((_t) >= TSDB_DATA_TYPE_TINYINT && (_t) <= TSDB_DATA_TYPE_BIGINT)
|
||||||
|
#define IS_UNSIGNED_NUMERIC_TYPE(_t) ((_t) >= TSDB_DATA_TYPE_UTINYINT && (_t) <= TSDB_DATA_TYPE_UBIGINT)
|
||||||
|
#define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE)
|
||||||
|
|
||||||
|
#define IS_NUMERIC_TYPE(_t) ((IS_SIGNED_NUMERIC_TYPE(_t)) || (IS_UNSIGNED_NUMERIC_TYPE(_t)) || (IS_FLOAT_TYPE(_t)))
|
||||||
|
|
||||||
|
#define IS_VALID_TINYINT(_t) ((_t) > INT8_MIN && (_t) <= INT8_MAX)
|
||||||
|
#define IS_VALID_SMALLINT(_t) ((_t) > INT16_MIN && (_t) <= INT16_MAX)
|
||||||
|
#define IS_VALID_INT(_t) ((_t) > INT32_MIN && (_t) <= INT32_MAX)
|
||||||
|
#define IS_VALID_BIGINT(_t) ((_t) > INT64_MIN && (_t) <= INT64_MAX)
|
||||||
|
#define IS_VALID_UTINYINT(_t) ((_t) >= 0 && (_t) < UINT8_MAX)
|
||||||
|
#define IS_VALID_USMALLINT(_t) ((_t) >= 0 && (_t) < UINT16_MAX)
|
||||||
|
#define IS_VALID_UINT(_t) ((_t) >= 0 && (_t) < UINT32_MAX)
|
||||||
|
#define IS_VALID_UBIGINT(_t) ((_t) >= 0 && (_t) < UINT64_MAX)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -603,15 +603,27 @@ static void printField(const char* val, TAOS_FIELD* field, int width, int32_t le
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
printf("%*d", width, *((int8_t *)val));
|
printf("%*d", width, *((int8_t *)val));
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
printf("%*u", width, *((uint8_t *)val));
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
printf("%*d", width, *((int16_t *)val));
|
printf("%*d", width, *((int16_t *)val));
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
printf("%*u", width, *((uint16_t *)val));
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
printf("%*d", width, *((int32_t *)val));
|
printf("%*d", width, *((int32_t *)val));
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
printf("%*u", width, *((uint32_t *)val));
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
printf("%*" PRId64, width, *((int64_t *)val));
|
printf("%*" PRId64, width, *((int64_t *)val));
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
printf("%*" PRIu64, width, *((uint64_t *)val));
|
||||||
|
break;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
printf("%*.5f", width, GET_FLOAT_VAL(val));
|
printf("%*.5f", width, GET_FLOAT_VAL(val));
|
||||||
break;
|
break;
|
||||||
|
@ -679,15 +691,19 @@ static int calcColWidth(TAOS_FIELD* field, int precision) {
|
||||||
return MAX(5, width); // 'false'
|
return MAX(5, width); // 'false'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
return MAX(4, width); // '-127'
|
return MAX(4, width); // '-127'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
return MAX(6, width); // '-32767'
|
return MAX(6, width); // '-32767'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
return MAX(11, width); // '-2147483648'
|
return MAX(11, width); // '-2147483648'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
return MAX(21, width); // '-9223372036854775807'
|
return MAX(21, width); // '-9223372036854775807'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
"port": 6030,
|
"port": 6030,
|
||||||
"user": "root",
|
"user": "root",
|
||||||
"password": "taosdata",
|
"password": "taosdata",
|
||||||
"thread_count": 2,
|
"thread_count": 4,
|
||||||
|
"thread_count_create_tbl": 1,
|
||||||
"result_file": "./insert_res.txt",
|
"result_file": "./insert_res.txt",
|
||||||
"databases": [{
|
"databases": [{
|
||||||
"dbinfo": {
|
"dbinfo": {
|
||||||
|
|
|
@ -93,9 +93,6 @@ extern char configDir[];
|
||||||
#define MAX_QUERY_SQL_COUNT 10
|
#define MAX_QUERY_SQL_COUNT 10
|
||||||
#define MAX_QUERY_SQL_LENGTH 256
|
#define MAX_QUERY_SQL_LENGTH 256
|
||||||
|
|
||||||
|
|
||||||
#define MAX_LINE_COUNT_IN_MEM 10000
|
|
||||||
|
|
||||||
typedef enum CREATE_SUB_TALBE_MOD_EN {
|
typedef enum CREATE_SUB_TALBE_MOD_EN {
|
||||||
PRE_CREATE_SUBTBL,
|
PRE_CREATE_SUBTBL,
|
||||||
AUTO_CREATE_SUBTBL,
|
AUTO_CREATE_SUBTBL,
|
||||||
|
@ -259,6 +256,7 @@ typedef struct SDbs_S {
|
||||||
bool queryMode;
|
bool queryMode;
|
||||||
|
|
||||||
int threadCount;
|
int threadCount;
|
||||||
|
int threadCountByCreateTbl;
|
||||||
int dbCount;
|
int dbCount;
|
||||||
SDataBase db[MAX_DB_COUNT];
|
SDataBase db[MAX_DB_COUNT];
|
||||||
|
|
||||||
|
@ -1418,7 +1416,6 @@ static int getAllChildNameOfSuperTable(TAOS * taos, char* dbName, char* sTblName
|
||||||
char command[BUFFER_SIZE] = "\0";
|
char command[BUFFER_SIZE] = "\0";
|
||||||
TAOS_RES * res;
|
TAOS_RES * res;
|
||||||
TAOS_ROW row = NULL;
|
TAOS_ROW row = NULL;
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
char* childTblName = *childTblNameOfSuperTbl;
|
char* childTblName = *childTblNameOfSuperTbl;
|
||||||
|
|
||||||
|
@ -1433,12 +1430,13 @@ static int getAllChildNameOfSuperTable(TAOS * taos, char* dbName, char* sTblName
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int childTblCount = 10000;
|
int childTblCount = 10000;
|
||||||
count = 0;
|
int count = 0;
|
||||||
childTblName = (char*)calloc(1, childTblCount * TSDB_TABLE_NAME_LEN);
|
childTblName = (char*)calloc(1, childTblCount * TSDB_TABLE_NAME_LEN);
|
||||||
char* pTblName = childTblName;
|
char* pTblName = childTblName;
|
||||||
while ((row = taos_fetch_row(res)) != NULL) {
|
while ((row = taos_fetch_row(res)) != NULL) {
|
||||||
strncpy(pTblName, (char *)row[0], TSDB_TABLE_NAME_LEN);
|
int32_t* len = taos_fetch_lengths(res);
|
||||||
|
strncpy(pTblName, (char *)row[0], len[0]);
|
||||||
//printf("==== sub table name: %s\n", pTblName);
|
//printf("==== sub table name: %s\n", pTblName);
|
||||||
count++;
|
count++;
|
||||||
if (count >= childTblCount - 1) {
|
if (count >= childTblCount - 1) {
|
||||||
|
@ -1829,38 +1827,64 @@ static void createChildTables() {
|
||||||
if ((AUTO_CREATE_SUBTBL == g_Dbs.db[i].superTbls[j].autoCreateTable) || (TBL_ALREADY_EXISTS == g_Dbs.db[i].superTbls[j].childTblExists)) {
|
if ((AUTO_CREATE_SUBTBL == g_Dbs.db[i].superTbls[j].autoCreateTable) || (TBL_ALREADY_EXISTS == g_Dbs.db[i].superTbls[j].childTblExists)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
startMultiThreadCreateChildTable(g_Dbs.db[i].superTbls[j].colsOfCreatChildTable, g_Dbs.threadCount, g_Dbs.db[i].superTbls[j].childTblCount, g_Dbs.db[i].dbName, &(g_Dbs.db[i].superTbls[j]));
|
startMultiThreadCreateChildTable(g_Dbs.db[i].superTbls[j].colsOfCreatChildTable, g_Dbs.threadCountByCreateTbl, g_Dbs.db[i].superTbls[j].childTblCount, g_Dbs.db[i].dbName, &(g_Dbs.db[i].superTbls[j]));
|
||||||
g_totalChildTables += g_Dbs.db[i].superTbls[j].childTblCount;
|
g_totalChildTables += g_Dbs.db[i].superTbls[j].childTblCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
static int taosGetLineNum(const char *fileName)
|
||||||
|
{
|
||||||
|
int lineNum = 0;
|
||||||
|
char cmd[1024] = { 0 };
|
||||||
|
char buf[1024] = { 0 };
|
||||||
|
sprintf(cmd, "wc -l %s", fileName);
|
||||||
|
|
||||||
|
FILE *fp = popen(cmd, "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
fprintf(stderr, "ERROR: failed to execute:%s, error:%s\n", cmd, strerror(errno));
|
||||||
|
return lineNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgets(buf, sizeof(buf), fp)) {
|
||||||
|
int index = strchr((const char*)buf, ' ') - buf;
|
||||||
|
buf[index] = '\0';
|
||||||
|
lineNum = atoi(buf);
|
||||||
|
}
|
||||||
|
pclose(fp);
|
||||||
|
return lineNum;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read 10000 lines at most. If more than 10000 lines, continue to read after using
|
Read 10000 lines at most. If more than 10000 lines, continue to read after using
|
||||||
*/
|
*/
|
||||||
int readTagFromCsvFileToMem(SSuperTable * supterTblInfo) {
|
int readTagFromCsvFileToMem(SSuperTable * superTblInfo) {
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
ssize_t readLen = 0;
|
ssize_t readLen = 0;
|
||||||
char * line = NULL;
|
char * line = NULL;
|
||||||
|
|
||||||
FILE *fp = fopen(supterTblInfo->tagsFile, "r");
|
FILE *fp = fopen(superTblInfo->tagsFile, "r");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
printf("Failed to open tags file: %s, reason:%s\n", supterTblInfo->tagsFile, strerror(errno));
|
printf("Failed to open tags file: %s, reason:%s\n", superTblInfo->tagsFile, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (supterTblInfo->tagDataBuf) {
|
if (superTblInfo->tagDataBuf) {
|
||||||
free(supterTblInfo->tagDataBuf);
|
free(superTblInfo->tagDataBuf);
|
||||||
supterTblInfo->tagDataBuf = NULL;
|
superTblInfo->tagDataBuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
supterTblInfo->tagDataBuf = calloc(supterTblInfo->lenOfTagOfOneRow * MAX_LINE_COUNT_IN_MEM, 1);
|
int tagCount = 10000;
|
||||||
if (supterTblInfo->tagDataBuf == NULL) {
|
int count = 0;
|
||||||
|
char* tagDataBuf = calloc(1, superTblInfo->lenOfTagOfOneRow * tagCount);
|
||||||
|
if (tagDataBuf == NULL) {
|
||||||
printf("Failed to calloc, reason:%s\n", strerror(errno));
|
printf("Failed to calloc, reason:%s\n", strerror(errno));
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((readLen = getline(&line, &n, fp)) != -1) {
|
while ((readLen = getline(&line, &n, fp)) != -1) {
|
||||||
if (('\r' == line[readLen - 1]) || ('\n' == line[readLen - 1])) {
|
if (('\r' == line[readLen - 1]) || ('\n' == line[readLen - 1])) {
|
||||||
line[--readLen] = 0;
|
line[--readLen] = 0;
|
||||||
|
@ -1870,20 +1894,35 @@ int readTagFromCsvFileToMem(SSuperTable * supterTblInfo) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(supterTblInfo->tagDataBuf + supterTblInfo->tagSampleCount * supterTblInfo->lenOfTagOfOneRow, line, readLen);
|
memcpy(tagDataBuf + count * superTblInfo->lenOfTagOfOneRow, line, readLen);
|
||||||
supterTblInfo->tagSampleCount++;
|
count++;
|
||||||
|
|
||||||
if (supterTblInfo->tagSampleCount >= MAX_LINE_COUNT_IN_MEM) {
|
if (count >= tagCount - 1) {
|
||||||
break;
|
char *tmp = realloc(tagDataBuf, (size_t)tagCount*1.5*superTblInfo->lenOfTagOfOneRow);
|
||||||
|
if (tmp != NULL) {
|
||||||
|
tagDataBuf = tmp;
|
||||||
|
tagCount = (int)(tagCount*1.5);
|
||||||
|
memset(tagDataBuf + count*superTblInfo->lenOfTagOfOneRow, 0, (size_t)((tagCount-count)*superTblInfo->lenOfTagOfOneRow));
|
||||||
|
} else {
|
||||||
|
// exit, if allocate more memory failed
|
||||||
|
printf("realloc fail for save tag val from %s\n", superTblInfo->tagsFile);
|
||||||
|
tmfree(tagDataBuf);
|
||||||
|
free(line);
|
||||||
|
fclose(fp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
superTblInfo->tagDataBuf = tagDataBuf;
|
||||||
|
superTblInfo->tagSampleCount = count;
|
||||||
|
|
||||||
free(line);
|
free(line);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readSampleFromJsonFileToMem(SSuperTable * supterTblInfo) {
|
int readSampleFromJsonFileToMem(SSuperTable * superTblInfo) {
|
||||||
// TODO
|
// TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2138,6 +2177,16 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
printf("failed to read json, threads not found");
|
printf("failed to read json, threads not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cJSON* threads2 = cJSON_GetObjectItem(root, "thread_count_create_tbl");
|
||||||
|
if (threads2 && threads2->type == cJSON_Number) {
|
||||||
|
g_Dbs.threadCountByCreateTbl = threads2->valueint;
|
||||||
|
} else if (!threads2) {
|
||||||
|
g_Dbs.threadCountByCreateTbl = 1;
|
||||||
|
} else {
|
||||||
|
printf("failed to read json, threads2 not found");
|
||||||
|
goto PARSE_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
cJSON* dbs = cJSON_GetObjectItem(root, "databases");
|
cJSON* dbs = cJSON_GetObjectItem(root, "databases");
|
||||||
if (!dbs || dbs->type != cJSON_Array) {
|
if (!dbs || dbs->type != cJSON_Array) {
|
||||||
|
@ -3008,6 +3057,10 @@ void postFreeResource() {
|
||||||
free(g_Dbs.db[i].superTbls[j].sampleDataBuf);
|
free(g_Dbs.db[i].superTbls[j].sampleDataBuf);
|
||||||
g_Dbs.db[i].superTbls[j].sampleDataBuf = NULL;
|
g_Dbs.db[i].superTbls[j].sampleDataBuf = NULL;
|
||||||
}
|
}
|
||||||
|
if (0 != g_Dbs.db[i].superTbls[j].tagDataBuf) {
|
||||||
|
free(g_Dbs.db[i].superTbls[j].tagDataBuf);
|
||||||
|
g_Dbs.db[i].superTbls[j].tagDataBuf = NULL;
|
||||||
|
}
|
||||||
if (0 != g_Dbs.db[i].superTbls[j].childTblName) {
|
if (0 != g_Dbs.db[i].superTbls[j].childTblName) {
|
||||||
free(g_Dbs.db[i].superTbls[j].childTblName);
|
free(g_Dbs.db[i].superTbls[j].childTblName);
|
||||||
g_Dbs.db[i].superTbls[j].childTblName = NULL;
|
g_Dbs.db[i].superTbls[j].childTblName = NULL;
|
||||||
|
|
|
@ -35,12 +35,9 @@
|
||||||
#include "mnodeAcct.h"
|
#include "mnodeAcct.h"
|
||||||
#include "mnodeDb.h"
|
#include "mnodeDb.h"
|
||||||
#include "mnodeDnode.h"
|
#include "mnodeDnode.h"
|
||||||
#include "mnodeMnode.h"
|
|
||||||
#include "mnodeProfile.h"
|
|
||||||
#include "mnodeSdb.h"
|
#include "mnodeSdb.h"
|
||||||
#include "mnodeShow.h"
|
#include "mnodeShow.h"
|
||||||
#include "mnodeTable.h"
|
#include "mnodeTable.h"
|
||||||
#include "mnodeUser.h"
|
|
||||||
#include "mnodeVgroup.h"
|
#include "mnodeVgroup.h"
|
||||||
#include "mnodeWrite.h"
|
#include "mnodeWrite.h"
|
||||||
#include "mnodeRead.h"
|
#include "mnodeRead.h"
|
||||||
|
@ -1003,7 +1000,7 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
SCMCreateTableMsg *pCreate1 = pMsg->rpcMsg.pCont;
|
SCMCreateTableMsg *pCreate1 = pMsg->rpcMsg.pCont;
|
||||||
if (pCreate1->numOfTables == 0) {
|
if (pCreate1->numOfTables == 0) {
|
||||||
// todo return to error message
|
return TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCreateTableMsg* pCreate = (SCreateTableMsg*)((char*)pCreate1 + sizeof(SCMCreateTableMsg));
|
SCreateTableMsg* pCreate = (SCreateTableMsg*)((char*)pCreate1 + sizeof(SCMCreateTableMsg));
|
||||||
|
@ -1032,16 +1029,39 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
|
||||||
mError("msg:%p, app:%p table:%s, failed to create, no schema input", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId);
|
mError("msg:%p, app:%p table:%s, failed to create, no schema input", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId);
|
||||||
return TSDB_CODE_MND_INVALID_TABLE_NAME;
|
return TSDB_CODE_MND_INVALID_TABLE_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pStable->schema, pCreate->schema, numOfCols * sizeof(SSchema));
|
memcpy(pStable->schema, pCreate->schema, numOfCols * sizeof(SSchema));
|
||||||
|
|
||||||
|
if (pStable->numOfColumns > TSDB_MAX_COLUMNS || pStable->numOfTags > TSDB_MAX_TAGS) {
|
||||||
|
mError("msg:%p, app:%p table:%s, failed to create, too many columns", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId);
|
||||||
|
return TSDB_CODE_MND_INVALID_TABLE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
pStable->nextColId = 0;
|
pStable->nextColId = 0;
|
||||||
|
|
||||||
|
// TODO extract method to valid the schema
|
||||||
|
int32_t schemaLen = 0;
|
||||||
|
int32_t tagLen = 0;
|
||||||
for (int32_t col = 0; col < numOfCols; col++) {
|
for (int32_t col = 0; col < numOfCols; col++) {
|
||||||
SSchema *tschema = pStable->schema;
|
SSchema *tschema = pStable->schema;
|
||||||
tschema[col].colId = pStable->nextColId++;
|
tschema[col].colId = pStable->nextColId++;
|
||||||
tschema[col].bytes = htons(tschema[col].bytes);
|
tschema[col].bytes = htons(tschema[col].bytes);
|
||||||
|
|
||||||
// todo 1. check the length of each column; 2. check the total length of all columns
|
if (col < pStable->numOfTables) {
|
||||||
assert(tschema[col].type >= TSDB_DATA_TYPE_BOOL && tschema[col].type <= TSDB_DATA_TYPE_NCHAR);
|
schemaLen += tschema[col].bytes;
|
||||||
|
} else {
|
||||||
|
tagLen += tschema[col].bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValidDataType(tschema[col].type)) {
|
||||||
|
mError("msg:%p, app:%p table:%s, failed to create, invalid data type in schema", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId);
|
||||||
|
return TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schemaLen > (TSDB_MAX_BYTES_PER_ROW || tagLen > TSDB_MAX_TAGS_LEN)) {
|
||||||
|
mError("msg:%p, app:%p table:%s, failed to create, schema is too long", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId);
|
||||||
|
return TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg->pTable = (STableObj *)pStable;
|
pMsg->pTable = (STableObj *)pStable;
|
||||||
|
|
|
@ -47,7 +47,7 @@ extern "C" {
|
||||||
|
|
||||||
// USE_LIBICONV
|
// USE_LIBICONV
|
||||||
int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs);
|
int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs);
|
||||||
bool taosMbsToUcs4(char *mbs, size_t mbs_len, char *ucs4, int32_t ucs4_max_len, size_t *len);
|
bool taosMbsToUcs4(char *mbs, size_t mbs_len, char *ucs4, int32_t ucs4_max_len, int *len);
|
||||||
int tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int bytes);
|
int tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int bytes);
|
||||||
bool taosValidateEncodec(const char *encodec);
|
bool taosValidateEncodec(const char *encodec);
|
||||||
char * taosCharsetReplace(char *charsetstr);
|
char * taosCharsetReplace(char *charsetstr);
|
||||||
|
|
|
@ -32,6 +32,7 @@ void taosPrintOsInfo();
|
||||||
int taosSystem(const char * cmd) ;
|
int taosSystem(const char * cmd) ;
|
||||||
void taosKillSystem();
|
void taosKillSystem();
|
||||||
bool taosGetSystemUid(char *uid);
|
bool taosGetSystemUid(char *uid);
|
||||||
|
char *taosGetCmdlineByPID(int pid);
|
||||||
|
|
||||||
// TAOS_OS_FUNC_SYSINFO_CORE
|
// TAOS_OS_FUNC_SYSINFO_CORE
|
||||||
void taosSetCoreDump();
|
void taosSetCoreDump();
|
||||||
|
|
|
@ -46,7 +46,7 @@ int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) {
|
||||||
return (int32_t)(ucs4_max_len - outLen);
|
return (int32_t)(ucs4_max_len - outLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, size_t *len) {
|
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, int32_t *len) {
|
||||||
memset(ucs4, 0, ucs4_max_len);
|
memset(ucs4, 0, ucs4_max_len);
|
||||||
iconv_t cd = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset);
|
iconv_t cd = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset);
|
||||||
size_t ucs4_input_len = mbsLength;
|
size_t ucs4_input_len = mbsLength;
|
||||||
|
@ -58,7 +58,7 @@ bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len
|
||||||
|
|
||||||
iconv_close(cd);
|
iconv_close(cd);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = ucs4_max_len - outLeft;
|
*len = (int32_t)(ucs4_max_len - outLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -92,7 +92,7 @@ int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, size_t *len) {
|
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, int32_t *len) {
|
||||||
memset(ucs4, 0, ucs4_max_len);
|
memset(ucs4, 0, ucs4_max_len);
|
||||||
mbstate_t state = {0};
|
mbstate_t state = {0};
|
||||||
int32_t retlen = mbsnrtowcs((wchar_t *)ucs4, (const char **)&mbs, mbsLength, ucs4_max_len / 4, &state);
|
int32_t retlen = mbsnrtowcs((wchar_t *)ucs4, (const char **)&mbs, mbsLength, ucs4_max_len / 4, &state);
|
||||||
|
|
|
@ -39,4 +39,22 @@ void osInit() {
|
||||||
strcpy(tsDnodeDir, "");
|
strcpy(tsDnodeDir, "");
|
||||||
strcpy(tsMnodeDir, "");
|
strcpy(tsMnodeDir, "");
|
||||||
strcpy(tsOsName, "Linux");
|
strcpy(tsOsName, "Linux");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char cmdline[1024];
|
||||||
|
|
||||||
|
char *taosGetCmdlineByPID(int pid)
|
||||||
|
{
|
||||||
|
sprintf(cmdline, "/proc/%d/cmdline",pid);
|
||||||
|
FILE* f = fopen(cmdline,"r");
|
||||||
|
if(f){
|
||||||
|
size_t size;
|
||||||
|
size = fread(cmdline, sizeof(char), 1024, f);
|
||||||
|
if(size>0){
|
||||||
|
if('\n'==cmdline[size-1])
|
||||||
|
cmdline[size-1]='\0';
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
return cmdline;
|
||||||
|
}
|
||||||
|
|
|
@ -13,17 +13,17 @@
|
||||||
* 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_TSYNTAXTREEFUNCTION_H
|
#ifndef TDENGINE_QARITHMETICOPERATOR_H
|
||||||
#define TDENGINE_TSYNTAXTREEFUNCTION_H
|
#define TDENGINE_QARITHMETICOPERATOR_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (*_bi_consumer_fn_t)(void *left, void *right, int32_t numOfLeft, int32_t numOfRight, void *output,
|
typedef void (*_arithmetic_operator_fn_t)(void *left, int32_t numLeft, int32_t leftType, void *right, int32_t numRight,
|
||||||
int32_t order);
|
int32_t rightType, void *output, int32_t order);
|
||||||
|
|
||||||
_bi_consumer_fn_t getArithmeticOperatorFn(int32_t leftType, int32_t rightType, int32_t optr);
|
_arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "tsqlfunction.h"
|
#include "tsqlfunction.h"
|
||||||
|
|
||||||
struct SColumnFilterElem;
|
struct SColumnFilterElem;
|
||||||
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, char* val1, char* val2);
|
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, const char* val1, const char* val2, int16_t type);
|
||||||
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
|
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
|
||||||
|
|
||||||
typedef struct SResultRowPool {
|
typedef struct SResultRowPool {
|
||||||
|
|
|
@ -60,11 +60,10 @@ static FORCE_INLINE char *getPosInResultPage(SQueryRuntimeEnv *pRuntimeEnv, int3
|
||||||
pQuery->pExpr1[columnIndex].bytes * realRowId;
|
pQuery->pExpr1[columnIndex].bytes * realRowId;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isNull_filter(SColumnFilterElem *pFilter, char* minval, char* maxval);
|
bool isNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
||||||
bool notNull_filter(SColumnFilterElem *pFilter, char* minval, char* maxval);
|
bool notNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type);
|
||||||
|
|
||||||
__filter_func_t *getRangeFilterFuncArray(int32_t type);
|
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr);
|
||||||
__filter_func_t *getValueFilterFuncArray(int32_t type);
|
|
||||||
|
|
||||||
SResultRowPool* initResultRowPool(size_t size);
|
SResultRowPool* initResultRowPool(size_t size);
|
||||||
SResultRow* getNewResultRow(SResultRowPool* p);
|
SResultRow* getNewResultRow(SResultRowPool* p);
|
||||||
|
|
|
@ -22,8 +22,7 @@ extern "C" {
|
||||||
|
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
|
||||||
extern int32_t qDebugFlag;
|
extern uint32_t qDebugFlag;
|
||||||
extern int8_t tscEmbedded;
|
|
||||||
|
|
||||||
#define qFatal(...) do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", 255, __VA_ARGS__); }} while(0)
|
#define qFatal(...) do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", 255, __VA_ARGS__); }} while(0)
|
||||||
#define qError(...) do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", 255, __VA_ARGS__); }} while(0)
|
#define qError(...) do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", 255, __VA_ARGS__); }} while(0)
|
||||||
|
|
|
@ -291,6 +291,13 @@ typename(A) ::= ids(X) LP signed(Y) RP. {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// define the unsigned number type
|
||||||
|
typename(A) ::= ids(X) UNSIGNED(Z). {
|
||||||
|
X.type = 0;
|
||||||
|
X.n = ((Z.z + Z.n) - X.z);
|
||||||
|
tSqlSetColumnType (&A, &X);
|
||||||
|
}
|
||||||
|
|
||||||
%type signed {int64_t}
|
%type signed {int64_t}
|
||||||
signed(A) ::= INTEGER(X). { A = strtol(X.z, NULL, 10); }
|
signed(A) ::= INTEGER(X). { A = strtol(X.z, NULL, 10); }
|
||||||
signed(A) ::= PLUS INTEGER(X). { A = strtol(X.z, NULL, 10); }
|
signed(A) ::= PLUS INTEGER(X). { A = strtol(X.z, NULL, 10); }
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -197,76 +197,76 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
|
||||||
* exprLeft + exprRight
|
* exprLeft + exprRight
|
||||||
* the type of returned value of one expression is always double float precious
|
* the type of returned value of one expression is always double float precious
|
||||||
*/
|
*/
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(TSDB_DATA_TYPE_DOUBLE, TSDB_DATA_TYPE_DOUBLE, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
fp(pLeftOutput, pRightOutput, numOfRows, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
|
||||||
|
|
||||||
} else if (pRight->nodeType == TSQL_NODE_COL) { // exprLeft + columnRight
|
} else if (pRight->nodeType == TSQL_NODE_COL) { // exprLeft + columnRight
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(TSDB_DATA_TYPE_DOUBLE, pRight->pSchema->type, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
|
|
||||||
// set input buffer
|
// set input buffer
|
||||||
char *pInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
char *pInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
||||||
if (order == TSDB_ORDER_DESC) {
|
if (order == TSDB_ORDER_DESC) {
|
||||||
reverseCopy(pdata, pInputData, pRight->pSchema->type, numOfRows);
|
reverseCopy(pdata, pInputData, pRight->pSchema->type, numOfRows);
|
||||||
fp(pLeftOutput, pdata, numOfRows, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pdata, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
|
||||||
} else {
|
} else {
|
||||||
fp(pLeftOutput, pInputData, numOfRows, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pInputData, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // exprLeft + 12
|
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // exprLeft + 12
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(TSDB_DATA_TYPE_DOUBLE, pRight->pVal->nType, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
fp(pLeftOutput, &pRight->pVal->i64Key, numOfRows, 1, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
} else if (pLeft->nodeType == TSQL_NODE_COL) {
|
} else if (pLeft->nodeType == TSQL_NODE_COL) {
|
||||||
// column data specified on left-hand-side
|
// column data specified on left-hand-side
|
||||||
char *pLeftInputData = getSourceDataBlock(param, pLeft->pSchema->name, pLeft->pSchema->colId);
|
char *pLeftInputData = getSourceDataBlock(param, pLeft->pSchema->name, pLeft->pSchema->colId);
|
||||||
if (pRight->nodeType == TSQL_NODE_EXPR) { // columnLeft + expr2
|
if (pRight->nodeType == TSQL_NODE_EXPR) { // columnLeft + expr2
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pSchema->type, TSDB_DATA_TYPE_DOUBLE, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
|
|
||||||
if (order == TSDB_ORDER_DESC) {
|
if (order == TSDB_ORDER_DESC) {
|
||||||
reverseCopy(pdata, pLeftInputData, pLeft->pSchema->type, numOfRows);
|
reverseCopy(pdata, pLeftInputData, pLeft->pSchema->type, numOfRows);
|
||||||
fp(pdata, pRightOutput, numOfRows, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pdata, numOfRows, pLeft->pSchema->type, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
|
||||||
} else {
|
} else {
|
||||||
fp(pLeftInputData, pRightOutput, numOfRows, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftInputData, numOfRows, pLeft->pSchema->type, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pRight->nodeType == TSQL_NODE_COL) { // columnLeft + columnRight
|
} else if (pRight->nodeType == TSQL_NODE_COL) { // columnLeft + columnRight
|
||||||
// column data specified on right-hand-side
|
// column data specified on right-hand-side
|
||||||
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pSchema->type, pRight->pSchema->type, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
|
|
||||||
// both columns are descending order, do not reverse the source data
|
// both columns are descending order, do not reverse the source data
|
||||||
fp(pLeftInputData, pRightInputData, numOfRows, numOfRows, pOutput, order);
|
OperatorFn(pLeftInputData, numOfRows, pLeft->pSchema->type, pRightInputData, numOfRows, pRight->pSchema->type, pOutput, order);
|
||||||
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // columnLeft + 12
|
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // columnLeft + 12
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pSchema->type, pRight->pVal->nType, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
|
|
||||||
if (order == TSDB_ORDER_DESC) {
|
if (order == TSDB_ORDER_DESC) {
|
||||||
reverseCopy(pdata, pLeftInputData, pLeft->pSchema->type, numOfRows);
|
reverseCopy(pdata, pLeftInputData, pLeft->pSchema->type, numOfRows);
|
||||||
fp(pdata, &pRight->pVal->i64Key, numOfRows, 1, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pdata, numOfRows, pLeft->pSchema->type, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
|
||||||
} else {
|
} else {
|
||||||
fp(pLeftInputData, &pRight->pVal->i64Key, numOfRows, 1, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(pLeftInputData, numOfRows, pLeft->pSchema->type, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// column data specified on left-hand-side
|
// column data specified on left-hand-side
|
||||||
if (pRight->nodeType == TSQL_NODE_EXPR) { // 12 + expr2
|
if (pRight->nodeType == TSQL_NODE_EXPR) { // 12 + expr2
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pVal->nType, TSDB_DATA_TYPE_DOUBLE, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
fp(&pLeft->pVal->i64Key, pRightOutput, 1, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
|
||||||
|
|
||||||
} else if (pRight->nodeType == TSQL_NODE_COL) { // 12 + columnRight
|
} else if (pRight->nodeType == TSQL_NODE_COL) { // 12 + columnRight
|
||||||
// column data specified on right-hand-side
|
// column data specified on right-hand-side
|
||||||
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pVal->nType, pRight->pSchema->type, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
|
|
||||||
if (order == TSDB_ORDER_DESC) {
|
if (order == TSDB_ORDER_DESC) {
|
||||||
reverseCopy(pdata, pRightInputData, pRight->pSchema->type, numOfRows);
|
reverseCopy(pdata, pRightInputData, pRight->pSchema->type, numOfRows);
|
||||||
fp(&pLeft->pVal->i64Key, pdata, numOfRows, 1, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, pdata, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
|
||||||
} else {
|
} else {
|
||||||
fp(&pLeft->pVal->i64Key, pRightInputData, 1, numOfRows, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, pRightInputData, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // 12 + 12
|
} else if (pRight->nodeType == TSQL_NODE_VALUE) { // 12 + 12
|
||||||
_bi_consumer_fn_t fp = getArithmeticOperatorFn(pLeft->pVal->nType, pRight->pVal->nType, pExprs->_node.optr);
|
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
|
||||||
fp(&pLeft->pVal->i64Key, &pRight->pVal->i64Key, 1, 1, pOutput, TSDB_ORDER_ASC);
|
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) {
|
||||||
tbufWriteInt32(bw, pVal->nLen);
|
tbufWriteInt32(bw, pVal->nLen);
|
||||||
tbufWrite(bw, pVal->pz, pVal->nLen);
|
tbufWrite(bw, pVal->pz, pVal->nLen);
|
||||||
} else {
|
} else {
|
||||||
tbufWriteInt64(bw, pVal->i64Key);
|
tbufWriteInt64(bw, pVal->i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (expr->nodeType == TSQL_NODE_COL) {
|
} else if (expr->nodeType == TSQL_NODE_COL) {
|
||||||
|
@ -355,7 +355,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
|
||||||
pVal->pz = calloc(1, pVal->nLen + 1);
|
pVal->pz = calloc(1, pVal->nLen + 1);
|
||||||
tbufReadToBuffer(br, pVal->pz, pVal->nLen);
|
tbufReadToBuffer(br, pVal->pz, pVal->nLen);
|
||||||
} else {
|
} else {
|
||||||
pVal->i64Key = tbufReadInt64(br);
|
pVal->i64 = tbufReadInt64(br);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pExpr->nodeType == TSQL_NODE_COL) {
|
} else if (pExpr->nodeType == TSQL_NODE_COL) {
|
||||||
|
|
|
@ -212,22 +212,22 @@ bool doFilterData(SQuery *pQuery, int32_t elemPos) {
|
||||||
|
|
||||||
bool isnull = isNull(pElem, pFilterInfo->info.type);
|
bool isnull = isNull(pElem, pFilterInfo->info.type);
|
||||||
if (isnull) {
|
if (isnull) {
|
||||||
if (pFilterElem->fp == isNull_filter) {
|
if (pFilterElem->fp == isNullOperator) {
|
||||||
qualified = true;
|
qualified = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pFilterElem->fp == notNull_filter) {
|
if (pFilterElem->fp == notNullOperator) {
|
||||||
qualified = true;
|
qualified = true;
|
||||||
break;
|
break;
|
||||||
} else if (pFilterElem->fp == isNull_filter) {
|
} else if (pFilterElem->fp == isNullOperator) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFilterElem->fp(pFilterElem, pElem, pElem)) {
|
if (pFilterElem->fp(pFilterElem, pElem, pElem, pFilterInfo->info.type)) {
|
||||||
qualified = true;
|
qualified = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -759,7 +759,7 @@ static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == pResultRowInfo->size - 1) {
|
if (i == pResultRowInfo->size - 1) {
|
||||||
pResultRowInfo->curIndex = i;
|
pResultRowInfo->curIndex = i;
|
||||||
} else {
|
} else {
|
||||||
pResultRowInfo->curIndex = i + 1; // current not closed result object
|
pResultRowInfo->curIndex = i + 1; // current not closed result object
|
||||||
}
|
}
|
||||||
|
@ -1372,7 +1372,7 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, int32_t offset) {
|
||||||
|
|
||||||
#if defined(_DEBUG_VIEW)
|
#if defined(_DEBUG_VIEW)
|
||||||
printf("elem in comp ts file:%" PRId64 ", key:%" PRId64 ", tag:%"PRIu64", query order:%d, ts order:%d, traverse:%d, index:%d\n",
|
printf("elem in comp ts file:%" PRId64 ", key:%" PRId64 ", tag:%"PRIu64", query order:%d, ts order:%d, traverse:%d, index:%d\n",
|
||||||
elem.ts, key, elem.tag.i64Key, pQuery->order.order, pRuntimeEnv->pTsBuf->tsOrder,
|
elem.ts, key, elem.tag.i64, pQuery->order.order, pRuntimeEnv->pTsBuf->tsOrder,
|
||||||
pRuntimeEnv->pTsBuf->cur.order, pRuntimeEnv->pTsBuf->cur.tsIndex);
|
pRuntimeEnv->pTsBuf->cur.order, pRuntimeEnv->pTsBuf->cur.tsIndex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1412,7 +1412,7 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
|
||||||
|
|
||||||
// denote the order type
|
// denote the order type
|
||||||
if ((functionId == TSDB_FUNC_LAST_DST || functionId == TSDB_FUNC_LAST)) {
|
if ((functionId == TSDB_FUNC_LAST_DST || functionId == TSDB_FUNC_LAST)) {
|
||||||
return pCtx->param[0].i64Key == pQuery->order.order;
|
return pCtx->param[0].i64 == pQuery->order.order;
|
||||||
}
|
}
|
||||||
|
|
||||||
// in the supplementary scan, only the following functions need to be executed
|
// in the supplementary scan, only the following functions need to be executed
|
||||||
|
@ -1781,9 +1781,9 @@ void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY
|
||||||
* top/bottom values emerge, so does diff function
|
* top/bottom values emerge, so does diff function
|
||||||
*/
|
*/
|
||||||
if (functionId == TSDB_FUNC_TWA) {
|
if (functionId == TSDB_FUNC_TWA) {
|
||||||
pCtx->param[1].i64Key = pQuery->window.skey;
|
pCtx->param[1].i64 = pQuery->window.skey;
|
||||||
pCtx->param[1].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[1].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
pCtx->param[2].i64Key = pQuery->window.ekey;
|
pCtx->param[2].i64 = pQuery->window.ekey;
|
||||||
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1813,7 +1813,7 @@ void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (functionId == TSDB_FUNC_TS_COMP) {
|
} else if (functionId == TSDB_FUNC_TS_COMP) {
|
||||||
pCtx->param[0].i64Key = vgId;
|
pCtx->param[0].i64 = vgId;
|
||||||
pCtx->param[0].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[0].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1952,12 +1952,12 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
int32_t f = pQuery->pExpr1[0].base.functionId;
|
int32_t f = pQuery->pExpr1[0].base.functionId;
|
||||||
assert(f == TSDB_FUNC_TS || f == TSDB_FUNC_TS_DUMMY);
|
assert(f == TSDB_FUNC_TS || f == TSDB_FUNC_TS_DUMMY);
|
||||||
|
|
||||||
pCtx->param[2].i64Key = order;
|
pCtx->param[2].i64 = order;
|
||||||
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
pCtx->param[3].i64Key = functionId;
|
pCtx->param[3].i64 = functionId;
|
||||||
pCtx->param[3].nType = TSDB_DATA_TYPE_BIGINT;
|
pCtx->param[3].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
|
||||||
pCtx->param[1].i64Key = pQuery->order.orderColId;
|
pCtx->param[1].i64 = pQuery->order.orderColId;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (functionId == TSDB_FUNC_ARITHM) {
|
if (functionId == TSDB_FUNC_ARITHM) {
|
||||||
|
@ -2478,7 +2478,7 @@ static bool needToLoadDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SDataStatis *pDat
|
||||||
// if isNULL query exists, load the null data column
|
// if isNULL query exists, load the null data column
|
||||||
for (int32_t j = 0; j < pFilterInfo->numOfFilters; ++j) {
|
for (int32_t j = 0; j < pFilterInfo->numOfFilters; ++j) {
|
||||||
SColumnFilterElem *pFilterElem = &pFilterInfo->pFilters[j];
|
SColumnFilterElem *pFilterElem = &pFilterInfo->pFilters[j];
|
||||||
if (pFilterElem->fp == isNull_filter) {
|
if (pFilterElem->fp == isNullOperator) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2493,13 +2493,13 @@ static bool needToLoadDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SDataStatis *pDat
|
||||||
float maxval = (float)(*(double *)(&pDataBlockst->max));
|
float maxval = (float)(*(double *)(&pDataBlockst->max));
|
||||||
|
|
||||||
for (int32_t i = 0; i < pFilterInfo->numOfFilters; ++i) {
|
for (int32_t i = 0; i < pFilterInfo->numOfFilters; ++i) {
|
||||||
if (pFilterInfo->pFilters[i].fp(&pFilterInfo->pFilters[i], (char *)&minval, (char *)&maxval)) {
|
if (pFilterInfo->pFilters[i].fp(&pFilterInfo->pFilters[i], (char *)&minval, (char *)&maxval, TSDB_DATA_TYPE_FLOAT)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pFilterInfo->numOfFilters; ++i) {
|
for (int32_t i = 0; i < pFilterInfo->numOfFilters; ++i) {
|
||||||
if (pFilterInfo->pFilters[i].fp(&pFilterInfo->pFilters[i], (char *)&pDataBlockst->min, (char *)&pDataBlockst->max)) {
|
if (pFilterInfo->pFilters[i].fp(&pFilterInfo->pFilters[i], (char *)&pDataBlockst->min, (char *)&pDataBlockst->max, pFilterInfo->info.type)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2966,7 +2966,7 @@ void setTagVal(SQueryRuntimeEnv *pRuntimeEnv, void *pTable, void *tsdb) {
|
||||||
pExprInfo->base.arg->argValue.i64, pRuntimeEnv->pCtx[0].tag.pz);
|
pExprInfo->base.arg->argValue.i64, pRuntimeEnv->pCtx[0].tag.pz);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p set tag value for join comparison, colId:%" PRId64 ", val:%" PRId64, pQInfo,
|
qDebug("QInfo:%p set tag value for join comparison, colId:%" PRId64 ", val:%" PRId64, pQInfo,
|
||||||
pExprInfo->base.arg->argValue.i64, pRuntimeEnv->pCtx[0].tag.i64Key);
|
pExprInfo->base.arg->argValue.i64, pRuntimeEnv->pCtx[0].tag.i64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3946,7 +3946,7 @@ int32_t setAdditionalInfo(SQInfo *pQInfo, void* pTable, STableQueryInfo *pTableQ
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
||||||
} else {
|
} else {
|
||||||
qError("QInfo:%p failed to find tag:%" PRId64 " in ts_comp", pQInfo, pTag->i64Key);
|
qError("QInfo:%p failed to find tag:%" PRId64 " in ts_comp", pQInfo, pTag->i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -3957,7 +3957,7 @@ int32_t setAdditionalInfo(SQInfo *pQInfo, void* pTable, STableQueryInfo *pTableQ
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64Key, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -3966,7 +3966,7 @@ int32_t setAdditionalInfo(SQInfo *pQInfo, void* pTable, STableQueryInfo *pTableQ
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64Key, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64, pTableQueryInfo->cur.blockIndex, pTableQueryInfo->cur.tsIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4930,7 +4930,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
||||||
} else {
|
} else {
|
||||||
qError("QInfo:%p failed to find tag:%"PRId64" in ts_comp", pQInfo, pTag->i64Key);
|
qError("QInfo:%p failed to find tag:%"PRId64" in ts_comp", pQInfo, pTag->i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -4941,7 +4941,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz,
|
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz,
|
||||||
cur.blockIndex, cur.tsIndex);
|
cur.blockIndex, cur.tsIndex);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64Key,
|
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64,
|
||||||
cur.blockIndex, cur.tsIndex);
|
cur.blockIndex, cur.tsIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4955,7 +4955,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
qError("QInfo:%p failed to find tag:%s in ts_comp", pQInfo, pTag->pz);
|
||||||
} else {
|
} else {
|
||||||
qError("QInfo:%p failed to find tag:%"PRId64" in ts_comp", pQInfo, pTag->i64Key);
|
qError("QInfo:%p failed to find tag:%"PRId64" in ts_comp", pQInfo, pTag->i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -4964,7 +4964,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, cur.blockIndex, cur.tsIndex);
|
qDebug("QInfo:%p find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, cur.blockIndex, cur.tsIndex);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64Key, cur.blockIndex, cur.tsIndex);
|
qDebug("QInfo:%p find tag:%"PRId64" start pos in ts_comp, blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64, cur.blockIndex, cur.tsIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4974,7 +4974,7 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
if (pTag->nType == TSDB_DATA_TYPE_BINARY || pTag->nType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
qDebug("QInfo:%p continue scan ts_comp file, tag:%s blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, cur.blockIndex, cur.tsIndex);
|
qDebug("QInfo:%p continue scan ts_comp file, tag:%s blockIndex:%d, tsIndex:%d", pQInfo, pTag->pz, cur.blockIndex, cur.tsIndex);
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p continue scan ts_comp file, tag:%"PRId64" blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64Key, cur.blockIndex, cur.tsIndex);
|
qDebug("QInfo:%p continue scan ts_comp file, tag:%"PRId64" blockIndex:%d, tsIndex:%d", pQInfo, pTag->i64, cur.blockIndex, cur.tsIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6025,7 +6025,11 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
|
||||||
pColInfo->bytes = htons(pColInfo->bytes);
|
pColInfo->bytes = htons(pColInfo->bytes);
|
||||||
pColInfo->numOfFilters = htons(pColInfo->numOfFilters);
|
pColInfo->numOfFilters = htons(pColInfo->numOfFilters);
|
||||||
|
|
||||||
assert(pColInfo->type >= TSDB_DATA_TYPE_BOOL && pColInfo->type <= TSDB_DATA_TYPE_NCHAR);
|
if (!isValidDataType(pColInfo->type)) {
|
||||||
|
qDebug("qmsg:%p, invalid data type in source column, index:%d, type:%d", pQueryMsg, col, pColInfo->type);
|
||||||
|
code = TSDB_CODE_QRY_INVALID_MSG;
|
||||||
|
goto _cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t numOfFilters = pColInfo->numOfFilters;
|
int32_t numOfFilters = pColInfo->numOfFilters;
|
||||||
if (numOfFilters > 0) {
|
if (numOfFilters > 0) {
|
||||||
|
@ -6111,7 +6115,7 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
|
||||||
if (pQueryMsg->secondStageOutput) {
|
if (pQueryMsg->secondStageOutput) {
|
||||||
pExprMsg = (SSqlFuncMsg *)pMsg;
|
pExprMsg = (SSqlFuncMsg *)pMsg;
|
||||||
*pSecStageExpr = calloc(pQueryMsg->secondStageOutput, POINTER_BYTES);
|
*pSecStageExpr = calloc(pQueryMsg->secondStageOutput, POINTER_BYTES);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQueryMsg->secondStageOutput; ++i) {
|
for (int32_t i = 0; i < pQueryMsg->secondStageOutput; ++i) {
|
||||||
(*pSecStageExpr)[i] = pExprMsg;
|
(*pSecStageExpr)[i] = pExprMsg;
|
||||||
|
|
||||||
|
@ -6445,55 +6449,18 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
|
||||||
|
|
||||||
int32_t lower = pSingleColFilter->filterInfo.lowerRelOptr;
|
int32_t lower = pSingleColFilter->filterInfo.lowerRelOptr;
|
||||||
int32_t upper = pSingleColFilter->filterInfo.upperRelOptr;
|
int32_t upper = pSingleColFilter->filterInfo.upperRelOptr;
|
||||||
|
|
||||||
if (lower == TSDB_RELATION_INVALID && upper == TSDB_RELATION_INVALID) {
|
if (lower == TSDB_RELATION_INVALID && upper == TSDB_RELATION_INVALID) {
|
||||||
qError("QInfo:%p invalid filter info", pQInfo);
|
qError("QInfo:%p invalid filter info", pQInfo);
|
||||||
return TSDB_CODE_QRY_INVALID_MSG;
|
return TSDB_CODE_QRY_INVALID_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t type = pQuery->colList[i].type;
|
pSingleColFilter->fp = getFilterOperator(lower, upper);
|
||||||
int16_t bytes = pQuery->colList[i].bytes;
|
if (pSingleColFilter->fp == NULL) {
|
||||||
|
qError("QInfo:%p invalid filter info", pQInfo);
|
||||||
// todo refactor
|
|
||||||
__filter_func_t *rangeFilterArray = getRangeFilterFuncArray(type);
|
|
||||||
__filter_func_t *filterArray = getValueFilterFuncArray(type);
|
|
||||||
|
|
||||||
if (rangeFilterArray == NULL && filterArray == NULL) {
|
|
||||||
qError("QInfo:%p failed to get filter function, invalid data type:%d", pQInfo, type);
|
|
||||||
return TSDB_CODE_QRY_INVALID_MSG;
|
return TSDB_CODE_QRY_INVALID_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((lower == TSDB_RELATION_GREATER_EQUAL || lower == TSDB_RELATION_GREATER) &&
|
pSingleColFilter->bytes = pQuery->colList[i].bytes;
|
||||||
(upper == TSDB_RELATION_LESS_EQUAL || upper == TSDB_RELATION_LESS)) {
|
|
||||||
assert(rangeFilterArray != NULL);
|
|
||||||
if (lower == TSDB_RELATION_GREATER_EQUAL) {
|
|
||||||
if (upper == TSDB_RELATION_LESS_EQUAL) {
|
|
||||||
pSingleColFilter->fp = rangeFilterArray[4];
|
|
||||||
} else {
|
|
||||||
pSingleColFilter->fp = rangeFilterArray[2];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (upper == TSDB_RELATION_LESS_EQUAL) {
|
|
||||||
pSingleColFilter->fp = rangeFilterArray[3];
|
|
||||||
} else {
|
|
||||||
pSingleColFilter->fp = rangeFilterArray[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // set callback filter function
|
|
||||||
assert(filterArray != NULL);
|
|
||||||
if (lower != TSDB_RELATION_INVALID) {
|
|
||||||
pSingleColFilter->fp = filterArray[lower];
|
|
||||||
|
|
||||||
if (upper != TSDB_RELATION_INVALID) {
|
|
||||||
qError("pQInfo:%p failed to get filter function, invalid filter condition: %d", pQInfo, type);
|
|
||||||
return TSDB_CODE_QRY_INVALID_MSG;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pSingleColFilter->fp = filterArray[upper];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert(pSingleColFilter->fp != NULL);
|
|
||||||
pSingleColFilter->bytes = bytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
j++;
|
j++;
|
||||||
|
@ -6796,7 +6763,7 @@ static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQ
|
||||||
|
|
||||||
UNUSED(ret);
|
UNUSED(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQuery->precision = tsdbGetCfg(tsdb)->precision;
|
pQuery->precision = tsdbGetCfg(tsdb)->precision;
|
||||||
|
|
||||||
if ((QUERY_IS_ASC_QUERY(pQuery) && (pQuery->window.skey > pQuery->window.ekey)) ||
|
if ((QUERY_IS_ASC_QUERY(pQuery) && (pQuery->window.skey > pQuery->window.ekey)) ||
|
||||||
|
|
|
@ -19,212 +19,174 @@
|
||||||
#include "qExecutor.h"
|
#include "qExecutor.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tsqlfunction.h"
|
#include "ttype.h"
|
||||||
|
|
||||||
#define FLT_EQUAL(_x, _y) (fabs((_x) - (_y)) <= (4 * FLT_EPSILON))
|
#define FLT_COMPAR_TOL_FACTOR 4
|
||||||
|
#define FLT_EQUAL(_x, _y) (fabs((_x) - (_y)) <= (FLT_COMPAR_TOL_FACTOR * FLT_EPSILON))
|
||||||
#define FLT_GREATER(_x, _y) (!FLT_EQUAL((_x), (_y)) && ((_x) > (_y)))
|
#define FLT_GREATER(_x, _y) (!FLT_EQUAL((_x), (_y)) && ((_x) > (_y)))
|
||||||
#define FLT_LESS(_x, _y) (!FLT_EQUAL((_x), (_y)) && ((_x) < (_y)))
|
#define FLT_LESS(_x, _y) (!FLT_EQUAL((_x), (_y)) && ((_x) < (_y)))
|
||||||
#define FLT_GREATEREQUAL(_x, _y) (FLT_EQUAL((_x), (_y)) || ((_x) > (_y)))
|
#define FLT_GREATEREQUAL(_x, _y) (FLT_EQUAL((_x), (_y)) || ((_x) > (_y)))
|
||||||
#define FLT_LESSEQUAL(_x, _y) (FLT_EQUAL((_x), (_y)) || ((_x) < (_y)))
|
#define FLT_LESSEQUAL(_x, _y) (FLT_EQUAL((_x), (_y)) || ((_x) < (_y)))
|
||||||
|
|
||||||
bool less_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool lessOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval < pFilter->filterInfo.upperBndi);
|
SColumnFilterInfo* pFilterInfo = &pFilter->filterInfo;
|
||||||
}
|
|
||||||
|
|
||||||
bool less_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
switch(type) {
|
||||||
return (*(int16_t *)minval < pFilter->filterInfo.upperBndi);
|
case TSDB_DATA_TYPE_TINYINT: return (*(int8_t *)minval < pFilterInfo->upperBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_UTINYINT: return (*(uint8_t *)minval < pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: return (*(int16_t *)minval < pFilterInfo->upperBndi);
|
||||||
bool less_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_USMALLINT: return (*(uint16_t *)minval < pFilterInfo->upperBndi);
|
||||||
return (*(int32_t *)minval < pFilter->filterInfo.upperBndi);
|
case TSDB_DATA_TYPE_INT: return (*(int32_t *)minval < pFilterInfo->upperBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_UINT: return (*(uint32_t *)minval < pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
bool less_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_BIGINT: return (*(int64_t *)minval < pFilterInfo->upperBndi);
|
||||||
return (*(int64_t *)minval < pFilter->filterInfo.upperBndi);
|
case TSDB_DATA_TYPE_UBIGINT: return (*(uint64_t *)minval < pFilterInfo->upperBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_FLOAT: return FLT_LESS(*(float*)minval, pFilter->filterInfo.upperBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: return (*(double *)minval < pFilterInfo->upperBndd);
|
||||||
bool less_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
default:
|
||||||
return FLT_LESS(*(float*)minval, pFilter->filterInfo.upperBndd);
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
bool less_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return *(double *)minval < pFilter->filterInfo.upperBndd;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
|
||||||
bool larger_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int8_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool larger_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int16_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool larger_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int32_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool larger_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int64_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool larger_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return FLT_GREATER(*(float*)maxval, pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool larger_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(double *)maxval > pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
bool lessEqual_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int8_t *)minval <= pFilter->filterInfo.upperBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lessEqual_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int16_t *)minval <= pFilter->filterInfo.upperBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lessEqual_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int32_t *)minval <= pFilter->filterInfo.upperBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lessEqual_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int64_t *)minval <= pFilter->filterInfo.upperBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lessEqual_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return FLT_LESSEQUAL(*(float*)minval, pFilter->filterInfo.upperBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lessEqual_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if ((fabs(*(double*)minval) - pFilter->filterInfo.upperBndd) <= 2 * DBL_EPSILON) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (*(double *)minval <= pFilter->filterInfo.upperBndd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
bool greaterOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) {
|
||||||
bool largeEqual_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
return (*(int8_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool largeEqual_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
switch (type) {
|
||||||
return (*(int16_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
case TSDB_DATA_TYPE_TINYINT: return (*(int8_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_UTINYINT: return (*(uint8_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: return (*(int16_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
bool largeEqual_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_USMALLINT: return (*(uint16_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
return (*(int32_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
case TSDB_DATA_TYPE_INT: return (*(int32_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_UINT: return (*(uint32_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
bool largeEqual_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_BIGINT: return (*(int64_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
return (*(int64_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
case TSDB_DATA_TYPE_UBIGINT: return (*(uint64_t *)maxval > pFilterInfo->lowerBndi);
|
||||||
}
|
case TSDB_DATA_TYPE_FLOAT: return FLT_GREATER(*(float *)maxval, pFilterInfo->lowerBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: return (*(double *)maxval > pFilterInfo->lowerBndd);
|
||||||
bool largeEqual_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
default:
|
||||||
return FLT_GREATEREQUAL(*(float*)maxval, pFilter->filterInfo.lowerBndd);
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
bool largeEqual_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (fabs(*(double *)maxval - pFilter->filterInfo.lowerBndd) <= 2 * DBL_EPSILON) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (*(double *)maxval - pFilter->filterInfo.lowerBndd > (2 * DBL_EPSILON));
|
bool lessEqualOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) {
|
||||||
|
SColumnFilterInfo* pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
|
switch(type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: return (*(int8_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: return (*(uint8_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: return (*(int16_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: return (*(uint16_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_INT: return (*(int32_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_UINT: return (*(uint32_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: return (*(int64_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: return (*(uint64_t *)minval <= pFilterInfo->upperBndi);
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: return FLT_LESSEQUAL(*(float*)minval, pFilterInfo->upperBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
if ((fabs(*(double*)minval) - pFilterInfo->upperBndd) <= 2 * DBL_EPSILON) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (*(double *)minval <= pFilterInfo->upperBndd);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool greaterEqualOperator(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: return (*(int8_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: return (*(uint8_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: return (*(int16_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: return (*(uint16_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_INT: return (*(int32_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_UINT: return (*(uint32_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: return (*(int64_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: return (*(uint64_t *)maxval >= pFilterInfo->lowerBndi);
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: return FLT_GREATEREQUAL(*(float*)maxval, pFilterInfo->lowerBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
if (fabs(*(double *)maxval - pFilterInfo->lowerBndd) <= 2 * DBL_EPSILON) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (*(double *)maxval - pFilterInfo->lowerBndd > (2 * DBL_EPSILON));
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
bool equalOperator(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
bool equal_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
if (IS_SIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_BOOL) {
|
||||||
if (*(int8_t *)minval == *(int8_t *)maxval) {
|
int64_t minv = -1, maxv = -1;
|
||||||
return (*(int8_t *)minval == pFilter->filterInfo.lowerBndi);
|
GET_TYPED_DATA(minv, int64_t, type, minval);
|
||||||
} else { /* range filter */
|
GET_TYPED_DATA(maxv, int64_t, type, maxval);
|
||||||
assert(*(int8_t *)minval < *(int8_t *)maxval);
|
|
||||||
|
|
||||||
return *(int8_t *)minval <= pFilter->filterInfo.lowerBndi && *(int8_t *)maxval >= pFilter->filterInfo.lowerBndi;
|
if (minv == maxv) {
|
||||||
}
|
return minv == pFilterInfo->lowerBndi;
|
||||||
}
|
} else {
|
||||||
|
assert(minv < maxv);
|
||||||
|
return minv <= pFilterInfo->lowerBndi && pFilterInfo->lowerBndi <= maxv;
|
||||||
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
uint64_t minv = 0, maxv = 0;
|
||||||
|
GET_TYPED_DATA(minv, uint64_t, type, minval);
|
||||||
|
GET_TYPED_DATA(maxv, uint64_t, type, maxval);
|
||||||
|
|
||||||
bool equal_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
if (minv == maxv) {
|
||||||
if (*(int16_t *)minval == *(int16_t *)maxval) {
|
return minv == pFilterInfo->lowerBndi;
|
||||||
return (*(int16_t *)minval == pFilter->filterInfo.lowerBndi);
|
} else {
|
||||||
} else { /* range filter */
|
assert(minv < maxv);
|
||||||
assert(*(int16_t *)minval < *(int16_t *)maxval);
|
return minv <= pFilterInfo->lowerBndi && pFilterInfo->lowerBndi <= maxv;
|
||||||
|
}
|
||||||
|
} else if (IS_FLOAT_TYPE(type)) {
|
||||||
|
double minv = -1, maxv = -1;
|
||||||
|
GET_TYPED_DATA(minv, double, type, minval);
|
||||||
|
GET_TYPED_DATA(maxv, double, type, maxval);
|
||||||
|
|
||||||
return *(int16_t *)minval <= pFilter->filterInfo.lowerBndi && *(int16_t *)maxval >= pFilter->filterInfo.lowerBndi;
|
if (minv == maxv) {
|
||||||
}
|
return FLT_EQUAL(minv, pFilterInfo->lowerBndd);
|
||||||
}
|
} else { // range filter
|
||||||
|
assert(minv < maxv);
|
||||||
|
return minv <= pFilterInfo->lowerBndd && pFilterInfo->lowerBndd <= maxv;
|
||||||
|
}
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
// query condition string is greater than the max length of string, not qualified data
|
||||||
|
if (pFilterInfo->len != varDataLen(minval)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool equal_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
return strncmp((char *)pFilterInfo->pz, varDataVal(minval), varDataLen(minval)) == 0;
|
||||||
if (*(int32_t *)minval == *(int32_t *)maxval) {
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
return (*(int32_t *)minval == pFilter->filterInfo.lowerBndi);
|
// query condition string is greater than the max length of string, not qualified data
|
||||||
} else { /* range filter */
|
if (pFilterInfo->len != varDataLen(minval)) {
|
||||||
assert(*(int32_t *)minval < *(int32_t *)maxval);
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return *(int32_t *)minval <= pFilter->filterInfo.lowerBndi && *(int32_t *)maxval >= pFilter->filterInfo.lowerBndi;
|
return wcsncmp((wchar_t *)pFilterInfo->pz, varDataVal(minval), varDataLen(minval) / TSDB_NCHAR_SIZE) == 0;
|
||||||
}
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
bool equal_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(int64_t *)minval == *(int64_t *)maxval) {
|
|
||||||
return (*(int64_t *)minval == pFilter->filterInfo.lowerBndi);
|
|
||||||
} else { /* range filter */
|
|
||||||
assert(*(int64_t *)minval < *(int64_t *)maxval);
|
|
||||||
|
|
||||||
return *(int64_t *)minval <= pFilter->filterInfo.lowerBndi && *(int64_t *)maxval >= pFilter->filterInfo.lowerBndi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// user specified input filter value and the original saved float value may needs to
|
|
||||||
// increase the tolerance to obtain the correct result.
|
|
||||||
bool equal_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(float *)minval == *(float *)maxval) {
|
|
||||||
return FLT_EQUAL(*(float*)minval, pFilter->filterInfo.lowerBndd);
|
|
||||||
} else { // range filter
|
|
||||||
assert(*(float *)minval < *(float *)maxval);
|
|
||||||
return *(float *)minval <= pFilter->filterInfo.lowerBndd && *(float *)maxval >= pFilter->filterInfo.lowerBndd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(double *)minval == *(double *)maxval) {
|
|
||||||
return (fabs(*(double *)minval - pFilter->filterInfo.lowerBndd) <= 2 * DBL_EPSILON);
|
|
||||||
} else { // range filter
|
|
||||||
assert(*(double *)minval < *(double *)maxval);
|
|
||||||
return *(double *)minval <= pFilter->filterInfo.lowerBndi && *(double *)maxval >= pFilter->filterInfo.lowerBndi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal_str(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
// query condition string is greater than the max length of string, not qualified data
|
|
||||||
if (pFilter->filterInfo.len != varDataLen(minval)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return strncmp((char *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal_nchar(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
// query condition string is greater than the max length of string, not qualified data
|
|
||||||
if (pFilter->filterInfo.len != varDataLen(minval)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return wcsncmp((wchar_t *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
bool like_str(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool likeOperator(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
||||||
return patternMatch((char *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval), &info) == TSDB_PATTERN_MATCH;
|
return patternMatch((char *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval), &info) == TSDB_PATTERN_MATCH;
|
||||||
}
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
||||||
bool like_nchar(SColumnFilterElem* pFilter, char* minval, char *maxval) {
|
return WCSPatternMatch((wchar_t*)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE, &info) == TSDB_PATTERN_MATCH;
|
||||||
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
|
} else {
|
||||||
|
return false;
|
||||||
return WCSPatternMatch((wchar_t*)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE, &info) == TSDB_PATTERN_MATCH;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
@ -236,362 +198,237 @@ bool like_nchar(SColumnFilterElem* pFilter, char* minval, char *maxval) {
|
||||||
* During pre-filter stage, if there is one element that locates in [minval, maxval],
|
* During pre-filter stage, if there is one element that locates in [minval, maxval],
|
||||||
* the filter function will return true.
|
* the filter function will return true.
|
||||||
*/
|
*/
|
||||||
bool nequal_i8(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
// TODO not equal need to refactor
|
||||||
if (*(int8_t *)minval == *(int8_t *)maxval) {
|
bool notEqualOperator(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval != pFilter->filterInfo.lowerBndi);
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
if (IS_SIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_BOOL) {
|
||||||
}
|
int64_t minv = -1, maxv = -1;
|
||||||
|
GET_TYPED_DATA(minv, int64_t, type, minval);
|
||||||
|
GET_TYPED_DATA(maxv, int64_t, type, maxval);
|
||||||
|
|
||||||
bool nequal_i16(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
if (minv == maxv) {
|
||||||
if (*(int16_t *)minval == *(int16_t *)maxval) {
|
return minv != pFilterInfo->lowerBndi;
|
||||||
return (*(int16_t *)minval != pFilter->filterInfo.lowerBndi);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nequal_i32(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(int32_t *)minval == *(int32_t *)maxval) {
|
|
||||||
return (*(int32_t *)minval != pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nequal_i64(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(int64_t *)minval == *(int64_t *)maxval) {
|
|
||||||
return (*(int64_t *)minval != pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nequal_ds(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(float *)minval == *(float *)maxval) {
|
|
||||||
return !FLT_EQUAL(*(float *)minval, pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nequal_dd(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (*(double *)minval == *(double *)maxval) {
|
|
||||||
return (*(double *)minval != pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nequal_str(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
if (pFilter->filterInfo.len != varDataLen(minval)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
uint64_t minv = 0, maxv = 0;
|
||||||
|
GET_TYPED_DATA(minv, uint64_t, type, minval);
|
||||||
|
GET_TYPED_DATA(maxv, uint64_t, type, maxval);
|
||||||
|
|
||||||
return strncmp((char *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)) != 0;
|
if (minv == maxv) {
|
||||||
}
|
return minv != pFilterInfo->lowerBndi;
|
||||||
|
}
|
||||||
bool nequal_nchar(SColumnFilterElem *pFilter, char* minval, char *maxval) {
|
|
||||||
if (pFilter->filterInfo.len > pFilter->bytes) {
|
|
||||||
return true;
|
return true;
|
||||||
|
} else if (IS_FLOAT_TYPE(type)) {
|
||||||
|
double minv = -1, maxv = -1;
|
||||||
|
GET_TYPED_DATA(minv, double, type, minval);
|
||||||
|
GET_TYPED_DATA(maxv, double, type, maxval);
|
||||||
|
|
||||||
|
if (minv == maxv) {
|
||||||
|
return !FLT_EQUAL(minv, pFilterInfo->lowerBndd);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
if (pFilterInfo->len != varDataLen(minval)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return strncmp((char *)pFilterInfo->pz, varDataVal(minval), varDataLen(minval)) != 0;
|
||||||
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (pFilterInfo->len != varDataLen(minval)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return wcsncmp((wchar_t *)pFilterInfo->pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE) != 0;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wcsncmp((wchar_t *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE) != 0;
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
bool isNull_filter(SColumnFilterElem *pFilter, char* minval, char* maxval) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool notNull_filter(SColumnFilterElem *pFilter, char* minval, char* maxval) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
// dummy filter, not used
|
||||||
bool rangeFilter_i32_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool isNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) {
|
||||||
return (*(int32_t *)minval <= pFilter->filterInfo.upperBndi && *(int32_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rangeFilter_i32_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool notNullOperator(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) {
|
||||||
return (*(int32_t *)minval<pFilter->filterInfo.upperBndi &&*(int32_t *)maxval> pFilter->filterInfo.lowerBndi);
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_i32_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int32_t *)minval < pFilter->filterInfo.upperBndi && *(int32_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_i32_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int32_t *)minval <= pFilter->filterInfo.upperBndi && *(int32_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
bool rangeFilter_i8_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool rangeFilter_ii(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval <= pFilter->filterInfo.upperBndi && *(int8_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return ((*(int8_t *)minval <= pFilterInfo->upperBndi) && (*(int8_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
return ((*(uint8_t *)minval <= pFilterInfo->upperBndi) && (*(uint8_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return ((*(int16_t *)minval <= pFilterInfo->upperBndi) && (*(int16_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
return ((*(uint16_t *)minval <= pFilterInfo->upperBndi) && (*(uint16_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
return ((*(int32_t *)minval <= pFilterInfo->upperBndi) && (*(int32_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return ((*(uint32_t *)minval <= pFilterInfo->upperBndi) && (*(uint32_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
return ((*(int64_t *)minval <= pFilterInfo->upperBndi) && (*(int64_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
return ((*(uint64_t *)minval <= pFilterInfo->upperBndi) && (*(uint64_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return FLT_LESSEQUAL(*(float *)minval, pFilterInfo->upperBndd) &&
|
||||||
|
FLT_GREATEREQUAL(*(float *)maxval, pFilterInfo->lowerBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return (*(double *)minval <= pFilterInfo->upperBndd && *(double *)maxval >= pFilterInfo->lowerBndd);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rangeFilter_i8_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool rangeFilter_ee(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval<pFilter->filterInfo.upperBndi &&*(int8_t *)maxval> pFilter->filterInfo.lowerBndi);
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return ((*(int8_t *)minval < pFilterInfo->upperBndi) && (*(int8_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
return ((*(uint8_t *)minval < pFilterInfo->upperBndi) && (*(uint8_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return ((*(int16_t *)minval < pFilterInfo->upperBndi) && (*(int16_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
return ((*(uint16_t *)minval < pFilterInfo->upperBndi) && (*(uint16_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
return ((*(int32_t *)minval < pFilterInfo->upperBndi) && (*(int32_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return ((*(uint32_t *)minval < pFilterInfo->upperBndi) && (*(uint32_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
return ((*(int64_t *)minval < pFilterInfo->upperBndi) && (*(int64_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
return ((*(uint64_t *)minval < pFilterInfo->upperBndi) && (*(uint64_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return ((*(float *)minval < pFilterInfo->upperBndd) && (*(float *)maxval > pFilterInfo->lowerBndd));
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return ((*(double *)minval < pFilterInfo->upperBndd) && (*(double *)maxval > pFilterInfo->lowerBndd));
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rangeFilter_i8_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool rangeFilter_ie(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval < pFilter->filterInfo.upperBndi && *(int8_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return ((*(int8_t *)minval < pFilterInfo->upperBndi) && (*(int8_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
return ((*(uint8_t *)minval < pFilterInfo->upperBndi) && (*(uint8_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return ((*(int16_t *)minval < pFilterInfo->upperBndi) && (*(int16_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
return ((*(uint16_t *)minval < pFilterInfo->upperBndi) && (*(uint16_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
return ((*(int32_t *)minval < pFilterInfo->upperBndi) && (*(int32_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return ((*(uint32_t *)minval < pFilterInfo->upperBndi) && (*(uint32_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
return ((*(int64_t *)minval < pFilterInfo->upperBndi) && (*(int64_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
return ((*(uint64_t *)minval < pFilterInfo->upperBndi) && (*(uint64_t *)maxval >= pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return ((*(float *)minval < pFilterInfo->upperBndd) && (*(float *)maxval >= pFilterInfo->lowerBndd));
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return ((*(double *)minval < pFilterInfo->upperBndd) && (*(double *)maxval >= pFilterInfo->lowerBndd));
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rangeFilter_i8_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
bool rangeFilter_ei(SColumnFilterElem *pFilter, const char *minval, const char *maxval, int16_t type) {
|
||||||
return (*(int8_t *)minval <= pFilter->filterInfo.upperBndi && *(int8_t *)maxval > pFilter->filterInfo.lowerBndi);
|
SColumnFilterInfo *pFilterInfo = &pFilter->filterInfo;
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
switch (type) {
|
||||||
bool rangeFilter_i16_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
return (*(int16_t *)minval <= pFilter->filterInfo.upperBndi && *(int16_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
return ((*(int8_t *)minval <= pFilterInfo->upperBndi) && (*(int8_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
}
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
return ((*(uint8_t *)minval <= pFilterInfo->upperBndi) && (*(uint8_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
bool rangeFilter_i16_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
return (*(int16_t *)minval<pFilter->filterInfo.upperBndi &&*(int16_t *)maxval> pFilter->filterInfo.lowerBndi);
|
return ((*(int16_t *)minval <= pFilterInfo->upperBndi) && (*(int16_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
}
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
return ((*(uint16_t *)minval <= pFilterInfo->upperBndi) && (*(uint16_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
bool rangeFilter_i16_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_INT:
|
||||||
return (*(int16_t *)minval < pFilter->filterInfo.upperBndi && *(int16_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
return ((*(int32_t *)minval <= pFilterInfo->upperBndi) && (*(int32_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
}
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
return ((*(uint32_t *)minval <= pFilterInfo->upperBndi) && (*(uint32_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
bool rangeFilter_i16_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
return (*(int16_t *)minval <= pFilter->filterInfo.upperBndi && *(int16_t *)maxval > pFilter->filterInfo.lowerBndi);
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
}
|
return ((*(int64_t *)minval <= pFilterInfo->upperBndi) && (*(int64_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
////////////////////////////////////////////////////////////////////////
|
return ((*(uint64_t *)minval <= pFilterInfo->upperBndi) && (*(uint64_t *)maxval > pFilterInfo->lowerBndi));
|
||||||
bool rangeFilter_i64_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
return (*(int64_t *)minval <= pFilter->filterInfo.upperBndi && *(int64_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
return FLT_GREATER(*(float *)maxval, pFilterInfo->lowerBndd) &&
|
||||||
}
|
FLT_LESSEQUAL(*(float *)minval, pFilterInfo->upperBndd);
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
bool rangeFilter_i64_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
return ((*(double *)minval <= pFilterInfo->upperBndd) && (*(double *)maxval > pFilterInfo->lowerBndd));
|
||||||
return (*(int64_t *)minval<pFilter->filterInfo.upperBndi &&*(int64_t *)maxval> pFilter->filterInfo.lowerBndi);
|
default:
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
bool rangeFilter_i64_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int64_t *)minval < pFilter->filterInfo.upperBndi && *(int64_t *)maxval >= pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_i64_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(int64_t *)minval <= pFilter->filterInfo.upperBndi && *(int64_t *)maxval > pFilter->filterInfo.lowerBndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
bool rangeFilter_ds_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return FLT_LESSEQUAL(*(float *)minval, pFilter->filterInfo.upperBndd) &&
|
|
||||||
FLT_GREATEREQUAL(*(float *)maxval, pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_ds_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(float *)minval<pFilter->filterInfo.upperBndd &&*(float *)maxval> pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_ds_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(float *)minval < pFilter->filterInfo.upperBndd && *(float *)maxval >= pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_ds_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return FLT_GREATER(*(float *)maxval, pFilter->filterInfo.lowerBndd) &&
|
|
||||||
FLT_LESSEQUAL(*(float *)minval, pFilter->filterInfo.upperBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
bool rangeFilter_dd_ii(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(double *)minval <= pFilter->filterInfo.upperBndd && *(double *)maxval >= pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_dd_ee(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(double *)minval<pFilter->filterInfo.upperBndd &&*(double *)maxval> pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_dd_ie(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(double *)minval < pFilter->filterInfo.upperBndd && *(double *)maxval >= pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool rangeFilter_dd_ei(SColumnFilterElem *pFilter, char *minval, char *maxval) {
|
|
||||||
return (*(double *)minval <= pFilter->filterInfo.upperBndd && *(double *)maxval > pFilter->filterInfo.lowerBndd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
bool (*filterFunc_i8[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
bool (*filterOperators[])(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) = {
|
||||||
NULL,
|
NULL,
|
||||||
less_i8,
|
lessOperator,
|
||||||
larger_i8,
|
greaterOperator,
|
||||||
equal_i8,
|
equalOperator,
|
||||||
lessEqual_i8,
|
lessEqualOperator,
|
||||||
largeEqual_i8,
|
greaterEqualOperator,
|
||||||
nequal_i8,
|
notEqualOperator,
|
||||||
NULL,
|
likeOperator,
|
||||||
isNull_filter,
|
isNullOperator,
|
||||||
notNull_filter,
|
notNullOperator,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool (*filterFunc_i16[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
bool (*rangeFilterOperators[])(SColumnFilterElem *pFilter, const char* minval, const char* maxval, int16_t type) = {
|
||||||
NULL,
|
NULL,
|
||||||
less_i16,
|
rangeFilter_ee,
|
||||||
larger_i16,
|
rangeFilter_ie,
|
||||||
equal_i16,
|
rangeFilter_ei,
|
||||||
lessEqual_i16,
|
rangeFilter_ii,
|
||||||
largeEqual_i16,
|
|
||||||
nequal_i16,
|
|
||||||
NULL,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool (*filterFunc_i32[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
__filter_func_t getFilterOperator(int32_t lowerOptr, int32_t upperOptr) {
|
||||||
NULL,
|
__filter_func_t funcFp = NULL;
|
||||||
less_i32,
|
|
||||||
larger_i32,
|
|
||||||
equal_i32,
|
|
||||||
lessEqual_i32,
|
|
||||||
largeEqual_i32,
|
|
||||||
nequal_i32,
|
|
||||||
NULL,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*filterFunc_i64[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
if ((lowerOptr == TSDB_RELATION_GREATER_EQUAL || lowerOptr == TSDB_RELATION_GREATER) &&
|
||||||
NULL,
|
(upperOptr == TSDB_RELATION_LESS_EQUAL || upperOptr == TSDB_RELATION_LESS)) {
|
||||||
less_i64,
|
if (lowerOptr == TSDB_RELATION_GREATER_EQUAL) {
|
||||||
larger_i64,
|
if (upperOptr == TSDB_RELATION_LESS_EQUAL) {
|
||||||
equal_i64,
|
funcFp = rangeFilterOperators[4];
|
||||||
lessEqual_i64,
|
} else {
|
||||||
largeEqual_i64,
|
funcFp = rangeFilterOperators[2];
|
||||||
nequal_i64,
|
}
|
||||||
NULL,
|
} else {
|
||||||
isNull_filter,
|
if (upperOptr == TSDB_RELATION_LESS_EQUAL) {
|
||||||
notNull_filter,
|
funcFp = rangeFilterOperators[3];
|
||||||
};
|
} else {
|
||||||
|
funcFp = rangeFilterOperators[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // set callback filter function
|
||||||
|
if (lowerOptr != TSDB_RELATION_INVALID) {
|
||||||
|
funcFp = filterOperators[lowerOptr];
|
||||||
|
|
||||||
bool (*filterFunc_ds[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
// invalid filter condition: %d", pQInfo, type
|
||||||
NULL,
|
if (upperOptr != TSDB_RELATION_INVALID) {
|
||||||
less_ds,
|
return NULL;
|
||||||
larger_ds,
|
}
|
||||||
equal_ds,
|
} else {
|
||||||
lessEqual_ds,
|
funcFp = filterOperators[upperOptr];
|
||||||
largeEqual_ds,
|
}
|
||||||
nequal_ds,
|
|
||||||
NULL,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*filterFunc_dd[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
less_dd,
|
|
||||||
larger_dd,
|
|
||||||
equal_dd,
|
|
||||||
lessEqual_dd,
|
|
||||||
largeEqual_dd,
|
|
||||||
nequal_dd,
|
|
||||||
NULL,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*filterFunc_str[])(SColumnFilterElem* pFilter, char* minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
equal_str,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
nequal_str,
|
|
||||||
like_str,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*filterFunc_nchar[])(SColumnFilterElem* pFitler, char* minval, char* maxval) = {
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
equal_nchar,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
nequal_nchar,
|
|
||||||
like_nchar,
|
|
||||||
isNull_filter,
|
|
||||||
notNull_filter,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_i8[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_i8_ee,
|
|
||||||
rangeFilter_i8_ie,
|
|
||||||
rangeFilter_i8_ei,
|
|
||||||
rangeFilter_i8_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_i16[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_i16_ee,
|
|
||||||
rangeFilter_i16_ie,
|
|
||||||
rangeFilter_i16_ei,
|
|
||||||
rangeFilter_i16_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_i32[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_i32_ee,
|
|
||||||
rangeFilter_i32_ie,
|
|
||||||
rangeFilter_i32_ei,
|
|
||||||
rangeFilter_i32_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_i64[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_i64_ee,
|
|
||||||
rangeFilter_i64_ie,
|
|
||||||
rangeFilter_i64_ei,
|
|
||||||
rangeFilter_i64_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_ds[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_ds_ee,
|
|
||||||
rangeFilter_ds_ie,
|
|
||||||
rangeFilter_ds_ei,
|
|
||||||
rangeFilter_ds_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool (*rangeFilterFunc_dd[])(SColumnFilterElem *pFilter, char *minval, char *maxval) = {
|
|
||||||
NULL,
|
|
||||||
rangeFilter_dd_ee,
|
|
||||||
rangeFilter_dd_ie,
|
|
||||||
rangeFilter_dd_ei,
|
|
||||||
rangeFilter_dd_ii,
|
|
||||||
};
|
|
||||||
|
|
||||||
__filter_func_t* getRangeFilterFuncArray(int32_t type) {
|
|
||||||
switch(type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: return rangeFilterFunc_i8;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: return rangeFilterFunc_i16;
|
|
||||||
case TSDB_DATA_TYPE_INT: return rangeFilterFunc_i32;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: //timestamp uses bigint filter
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: return rangeFilterFunc_i64;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: return rangeFilterFunc_ds;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: return rangeFilterFunc_dd;
|
|
||||||
default:return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
__filter_func_t* getValueFilterFuncArray(int32_t type) {
|
return funcFp;
|
||||||
switch(type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: return filterFunc_i8;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: return filterFunc_i16;
|
|
||||||
case TSDB_DATA_TYPE_INT: return filterFunc_i32;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: //timestamp uses bigint filter
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: return filterFunc_i64;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: return filterFunc_ds;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: return filterFunc_dd;
|
|
||||||
case TSDB_DATA_TYPE_BINARY: return filterFunc_str;
|
|
||||||
case TSDB_DATA_TYPE_NCHAR: return filterFunc_nchar;
|
|
||||||
default: return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,11 +174,11 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) {
|
||||||
if ((*pHisto)->numOfElems >= 1 && idx < (*pHisto)->numOfEntries) {
|
if ((*pHisto)->numOfElems >= 1 && idx < (*pHisto)->numOfEntries) {
|
||||||
if (idx > 0) {
|
if (idx > 0) {
|
||||||
assert((*pHisto)->elems[idx - 1].val <= val);
|
assert((*pHisto)->elems[idx - 1].val <= val);
|
||||||
|
} else {
|
||||||
|
assert((*pHisto)->elems[idx].val > val);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert((*pHisto)->elems[idx].val > val);
|
|
||||||
} else if ((*pHisto)->numOfElems > 0) {
|
} else if ((*pHisto)->numOfElems > 0) {
|
||||||
assert((*pHisto)->elems[(*pHisto)->numOfEntries].val < val);
|
assert((*pHisto)->elems[(*pHisto)->numOfEntries].val <= val);
|
||||||
}
|
}
|
||||||
|
|
||||||
histogramCreateBin(*pHisto, idx, val);
|
histogramCreateBin(*pHisto, idx, val);
|
||||||
|
|
|
@ -129,11 +129,11 @@ tSQLExpr *tSqlExprIdValueCreate(SStrToken *pToken, int32_t optrType) {
|
||||||
pSqlExpr->nSQLOptr = optrType;
|
pSqlExpr->nSQLOptr = optrType;
|
||||||
} else if (optrType == TK_NOW) {
|
} else if (optrType == TK_NOW) {
|
||||||
// use microsecond by default
|
// use microsecond by default
|
||||||
pSqlExpr->val.i64Key = taosGetTimestamp(TSDB_TIME_PRECISION_MICRO);
|
pSqlExpr->val.i64 = taosGetTimestamp(TSDB_TIME_PRECISION_MICRO);
|
||||||
pSqlExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
|
pSqlExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
pSqlExpr->nSQLOptr = TK_TIMESTAMP; // TK_TIMESTAMP used to denote the time value is in microsecond
|
pSqlExpr->nSQLOptr = TK_TIMESTAMP; // TK_TIMESTAMP used to denote the time value is in microsecond
|
||||||
} else if (optrType == TK_VARIABLE) {
|
} else if (optrType == TK_VARIABLE) {
|
||||||
int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->val.i64Key);
|
int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->val.i64);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
terrno = TSDB_CODE_TSC_SQL_SYNTAX_ERROR;
|
terrno = TSDB_CODE_TSC_SQL_SYNTAX_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -200,25 +200,25 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
||||||
|
|
||||||
switch (optrType) {
|
switch (optrType) {
|
||||||
case TK_PLUS: {
|
case TK_PLUS: {
|
||||||
pExpr->val.i64Key = pLeft->val.i64Key + pRight->val.i64Key;
|
pExpr->val.i64 = pLeft->val.i64 + pRight->val.i64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_MINUS: {
|
case TK_MINUS: {
|
||||||
pExpr->val.i64Key = pLeft->val.i64Key - pRight->val.i64Key;
|
pExpr->val.i64 = pLeft->val.i64 - pRight->val.i64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_STAR: {
|
case TK_STAR: {
|
||||||
pExpr->val.i64Key = pLeft->val.i64Key * pRight->val.i64Key;
|
pExpr->val.i64 = pLeft->val.i64 * pRight->val.i64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_DIVIDE: {
|
case TK_DIVIDE: {
|
||||||
pExpr->nSQLOptr = TK_FLOAT;
|
pExpr->nSQLOptr = TK_FLOAT;
|
||||||
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||||
pExpr->val.dKey = (double)pLeft->val.i64Key / pRight->val.i64Key;
|
pExpr->val.dKey = (double)pLeft->val.i64 / pRight->val.i64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_REM: {
|
case TK_REM: {
|
||||||
pExpr->val.i64Key = pLeft->val.i64Key % pRight->val.i64Key;
|
pExpr->val.i64 = pLeft->val.i64 % pRight->val.i64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,8 +231,8 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
|
||||||
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
|
||||||
pExpr->nSQLOptr = TK_FLOAT;
|
pExpr->nSQLOptr = TK_FLOAT;
|
||||||
|
|
||||||
double left = (pLeft->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pLeft->val.dKey : pLeft->val.i64Key;
|
double left = (pLeft->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pLeft->val.dKey : pLeft->val.i64;
|
||||||
double right = (pRight->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pRight->val.dKey : pRight->val.i64Key;
|
double right = (pRight->val.nType == TSDB_DATA_TYPE_DOUBLE) ? pRight->val.dKey : pRight->val.i64;
|
||||||
|
|
||||||
switch (optrType) {
|
switch (optrType) {
|
||||||
case TK_PLUS: {
|
case TK_PLUS: {
|
||||||
|
@ -384,7 +384,7 @@ void tSqlSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType)
|
||||||
pField->name[pName->n] = 0;
|
pField->name[pName->n] = 0;
|
||||||
|
|
||||||
pField->type = pType->type;
|
pField->type = pType->type;
|
||||||
if(pField->type < TSDB_DATA_TYPE_BOOL || pField->type > TSDB_DATA_TYPE_NCHAR){
|
if(!isValidDataType(pField->type)){
|
||||||
pField->bytes = 0;
|
pField->bytes = 0;
|
||||||
} else {
|
} else {
|
||||||
pField->bytes = pType->bytes;
|
pField->bytes = pType->bytes;
|
||||||
|
@ -393,50 +393,60 @@ void tSqlSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType)
|
||||||
}
|
}
|
||||||
|
|
||||||
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
|
// set the field type invalid
|
||||||
pField->type = -1;
|
pField->type = -1;
|
||||||
|
pField->name[0] = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < tListLen(tDataTypeDesc); ++i) {
|
int32_t i = 0;
|
||||||
if ((strncasecmp(type->z, tDataTypeDesc[i].aName, tDataTypeDesc[i].nameLen) == 0) &&
|
while (i < tListLen(tDataTypeDesc)) {
|
||||||
(type->n == tDataTypeDesc[i].nameLen)) {
|
if ((type->n == tDataTypeDesc[i].nameLen) &&
|
||||||
pField->type = i;
|
(strncasecmp(type->z, tDataTypeDesc[i].aName, tDataTypeDesc[i].nameLen) == 0)) {
|
||||||
pField->bytes = tDataTypeDesc[i].nSize;
|
|
||||||
|
|
||||||
if (i == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
/*
|
|
||||||
* for nchar, the TOKENTYPE is the number of character, so the length is the
|
|
||||||
* number of bytes in UCS-4 format, which is 4 times larger than the
|
|
||||||
* number of characters
|
|
||||||
*/
|
|
||||||
if (type->type == 0) {
|
|
||||||
pField->bytes = 0;
|
|
||||||
} else {
|
|
||||||
int32_t bytes = -(int32_t)(type->type);
|
|
||||||
if (bytes > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
|
||||||
// we have to postpone reporting the error because it cannot be done here
|
|
||||||
// as pField->bytes is int16_t, use 'TSDB_MAX_NCHAR_LEN + 1' to avoid overflow
|
|
||||||
bytes = TSDB_MAX_NCHAR_LEN + 1;
|
|
||||||
} else {
|
|
||||||
bytes = bytes * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
|
|
||||||
}
|
|
||||||
pField->bytes = (int16_t)bytes;
|
|
||||||
}
|
|
||||||
} else if (i == TSDB_DATA_TYPE_BINARY) {
|
|
||||||
/* for binary, the TOKENTYPE is the length of binary */
|
|
||||||
if (type->type == 0) {
|
|
||||||
pField->bytes = 0;
|
|
||||||
} else {
|
|
||||||
int32_t bytes = -(int32_t)(type->type);
|
|
||||||
if (bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {
|
|
||||||
// refer comment for NCHAR above
|
|
||||||
bytes = TSDB_MAX_BINARY_LEN + 1;
|
|
||||||
} else {
|
|
||||||
bytes += VARSTR_HEADER_SIZE;
|
|
||||||
}
|
|
||||||
pField->bytes = (int16_t)bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == tListLen(tDataTypeDesc)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pField->type = i;
|
||||||
|
pField->bytes = tDataTypeDesc[i].nSize;
|
||||||
|
|
||||||
|
if (i == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
/*
|
||||||
|
* for nchar, the TOKENTYPE is the number of character, so the length is the
|
||||||
|
* number of bytes in UCS-4 format, which is 4 times larger than the number of characters
|
||||||
|
*/
|
||||||
|
if (type->type == 0) {
|
||||||
|
pField->bytes = 0;
|
||||||
|
} else {
|
||||||
|
int32_t bytes = -(int32_t)(type->type);
|
||||||
|
if (bytes > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
|
// we have to postpone reporting the error because it cannot be done here
|
||||||
|
// as pField->bytes is int16_t, use 'TSDB_MAX_NCHAR_LEN + 1' to avoid overflow
|
||||||
|
bytes = TSDB_MAX_NCHAR_LEN + 1;
|
||||||
|
} else {
|
||||||
|
bytes = bytes * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
pField->bytes = (int16_t)bytes;
|
||||||
|
}
|
||||||
|
} else if (i == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
/* for binary, the TOKENTYPE is the length of binary */
|
||||||
|
if (type->type == 0) {
|
||||||
|
pField->bytes = 0;
|
||||||
|
} else {
|
||||||
|
int32_t bytes = -(int32_t)(type->type);
|
||||||
|
if (bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {
|
||||||
|
// refer comment for NCHAR above
|
||||||
|
bytes = TSDB_MAX_BINARY_LEN + 1;
|
||||||
|
} else {
|
||||||
|
bytes += VARSTR_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pField->bytes = (int16_t)bytes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ static SKeyword keywordTable[] = {
|
||||||
{"PRECISION", TK_PRECISION},
|
{"PRECISION", TK_PRECISION},
|
||||||
{"LP", TK_LP},
|
{"LP", TK_LP},
|
||||||
{"RP", TK_RP},
|
{"RP", TK_RP},
|
||||||
|
{"UNSIGNED", TK_UNSIGNED},
|
||||||
{"TAGS", TK_TAGS},
|
{"TAGS", TK_TAGS},
|
||||||
{"USING", TK_USING},
|
{"USING", TK_USING},
|
||||||
{"AS", TK_AS},
|
{"AS", TK_AS},
|
||||||
|
|
|
@ -268,7 +268,7 @@ static void writeDataToDisk(STSBuf* pTSBuf) {
|
||||||
metaLen += (int32_t)fwrite(pBlock->tag.pz, 1, (size_t)pBlock->tag.nLen, pTSBuf->f);
|
metaLen += (int32_t)fwrite(pBlock->tag.pz, 1, (size_t)pBlock->tag.nLen, pTSBuf->f);
|
||||||
} else if (pBlock->tag.nType != TSDB_DATA_TYPE_NULL) {
|
} else if (pBlock->tag.nType != TSDB_DATA_TYPE_NULL) {
|
||||||
metaLen += (int32_t)fwrite(&pBlock->tag.nLen, 1, sizeof(pBlock->tag.nLen), pTSBuf->f);
|
metaLen += (int32_t)fwrite(&pBlock->tag.nLen, 1, sizeof(pBlock->tag.nLen), pTSBuf->f);
|
||||||
metaLen += (int32_t)fwrite(&pBlock->tag.i64Key, 1, (size_t) pBlock->tag.nLen, pTSBuf->f);
|
metaLen += (int32_t)fwrite(&pBlock->tag.i64, 1, (size_t) pBlock->tag.nLen, pTSBuf->f);
|
||||||
} else {
|
} else {
|
||||||
trueLen = 0;
|
trueLen = 0;
|
||||||
metaLen += (int32_t)fwrite(&trueLen, 1, sizeof(pBlock->tag.nLen), pTSBuf->f);
|
metaLen += (int32_t)fwrite(&trueLen, 1, sizeof(pBlock->tag.nLen), pTSBuf->f);
|
||||||
|
@ -351,7 +351,7 @@ STSBlock* readDataFromDisk(STSBuf* pTSBuf, int32_t order, bool decomp) {
|
||||||
sz = fread(pBlock->tag.pz, (size_t)pBlock->tag.nLen, 1, pTSBuf->f);
|
sz = fread(pBlock->tag.pz, (size_t)pBlock->tag.nLen, 1, pTSBuf->f);
|
||||||
UNUSED(sz);
|
UNUSED(sz);
|
||||||
} else if (pBlock->tag.nType != TSDB_DATA_TYPE_NULL) { //TODO check the return value
|
} else if (pBlock->tag.nType != TSDB_DATA_TYPE_NULL) { //TODO check the return value
|
||||||
sz = fread(&pBlock->tag.i64Key, (size_t) pBlock->tag.nLen, 1, pTSBuf->f);
|
sz = fread(&pBlock->tag.i64, (size_t) pBlock->tag.nLen, 1, pTSBuf->f);
|
||||||
UNUSED(sz);
|
UNUSED(sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -955,7 +955,7 @@ void tsBufDisplay(STSBuf* pTSBuf) {
|
||||||
while (tsBufNextPos(pTSBuf)) {
|
while (tsBufNextPos(pTSBuf)) {
|
||||||
STSElem elem = tsBufGetElem(pTSBuf);
|
STSElem elem = tsBufGetElem(pTSBuf);
|
||||||
if (elem.tag->nType == TSDB_DATA_TYPE_BIGINT) {
|
if (elem.tag->nType == TSDB_DATA_TYPE_BIGINT) {
|
||||||
printf("%d-%" PRId64 "-%" PRId64 "\n", elem.id, elem.tag->i64Key, elem.ts);
|
printf("%d-%" PRId64 "-%" PRId64 "\n", elem.id, elem.tag->i64, elem.ts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2302
src/query/src/sql.c
2302
src/query/src/sql.c
File diff suppressed because it is too large
Load Diff
|
@ -471,7 +471,7 @@ tExprNode *createExpr1() {
|
||||||
pRight->pVal = (tVariant*) calloc(1, sizeof(tVariant));
|
pRight->pVal = (tVariant*) calloc(1, sizeof(tVariant));
|
||||||
|
|
||||||
pRight->pVal->nType = TSDB_DATA_TYPE_INT;
|
pRight->pVal->nType = TSDB_DATA_TYPE_INT;
|
||||||
pRight->pVal->i64Key = 12;
|
pRight->pVal->i64 = 12;
|
||||||
|
|
||||||
auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode));
|
auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode));
|
||||||
pRoot->nodeType = TSQL_NODE_EXPR;
|
pRoot->nodeType = TSQL_NODE_EXPR;
|
||||||
|
@ -574,7 +574,7 @@ void exprSerializeTest1() {
|
||||||
tVariant* v2 = p2->_node.pRight->pVal;
|
tVariant* v2 = p2->_node.pRight->pVal;
|
||||||
|
|
||||||
ASSERT_EQ(v1->nType, v2->nType);
|
ASSERT_EQ(v1->nType, v2->nType);
|
||||||
ASSERT_EQ(v1->i64Key, v2->i64Key);
|
ASSERT_EQ(v1->i64, v2->i64);
|
||||||
ASSERT_EQ(p1->_node.hasPK, p2->_node.hasPK);
|
ASSERT_EQ(p1->_node.hasPK, p2->_node.hasPK);
|
||||||
|
|
||||||
tExprTreeDestroy(&p1, nullptr);
|
tExprTreeDestroy(&p1, nullptr);
|
||||||
|
|
|
@ -34,7 +34,7 @@ void simpleTest() {
|
||||||
int32_t num = 10;
|
int32_t num = 10;
|
||||||
tVariant t = {0};
|
tVariant t = {0};
|
||||||
t.nType = TSDB_DATA_TYPE_BIGINT;
|
t.nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
t.i64Key = 1;
|
t.i64 = 1;
|
||||||
|
|
||||||
int64_t* list = createTsList(10, 10000000, 30);
|
int64_t* list = createTsList(10, 10000000, 30);
|
||||||
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
|
@ -61,7 +61,7 @@ void largeTSTest() {
|
||||||
int32_t num = 1000000;
|
int32_t num = 1000000;
|
||||||
tVariant t = {0};
|
tVariant t = {0};
|
||||||
t.nType = TSDB_DATA_TYPE_BIGINT;
|
t.nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
t.i64Key = 1;
|
t.i64 = 1;
|
||||||
|
|
||||||
int64_t* list = createTsList(num, 10000000, 30);
|
int64_t* list = createTsList(num, 10000000, 30);
|
||||||
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
|
@ -93,7 +93,7 @@ void multiTagsTest() {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
free(list);
|
free(list);
|
||||||
|
@ -104,7 +104,7 @@ void multiTagsTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->block.tag.i64Key, numOfTags - 1);
|
EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1);
|
||||||
EXPECT_EQ(pTSBuf->numOfGroups, 1);
|
EXPECT_EQ(pTSBuf->numOfGroups, 1);
|
||||||
|
|
||||||
tsBufFlush(pTSBuf);
|
tsBufFlush(pTSBuf);
|
||||||
|
@ -131,7 +131,7 @@ void multiVnodeTagsTest() {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
free(list);
|
free(list);
|
||||||
|
@ -144,11 +144,11 @@ void multiVnodeTagsTest() {
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
||||||
EXPECT_EQ(pTSBuf->block.tag.i64Key, numOfTags - 1);
|
EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1);
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->block.tag.i64Key, numOfTags - 1);
|
EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1);
|
||||||
|
|
||||||
tsBufFlush(pTSBuf);
|
tsBufFlush(pTSBuf);
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
|
@ -175,7 +175,7 @@ void loadDataTest() {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
printf("%d - %" PRIu64 "\n", i, list[0]);
|
printf("%d - %" PRIu64 "\n", i, list[0]);
|
||||||
|
@ -190,11 +190,11 @@ void loadDataTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC);
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
||||||
EXPECT_EQ(pTSBuf->block.tag.i64Key, numOfTags - 1);
|
EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1);
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t));
|
||||||
|
|
||||||
EXPECT_EQ(pTSBuf->block.tag.i64Key, numOfTags - 1);
|
EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1);
|
||||||
|
|
||||||
tsBufFlush(pTSBuf);
|
tsBufFlush(pTSBuf);
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
|
@ -253,7 +253,7 @@ void TSTraverse() {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
printf("%d - %d - %" PRIu64 ", %" PRIu64 "\n", j, i, list[0], list[num - 1]);
|
printf("%d - %d - %" PRIu64 ", %" PRIu64 "\n", j, i, list[0], list[num - 1]);
|
||||||
|
@ -297,14 +297,14 @@ void TSTraverse() {
|
||||||
|
|
||||||
tVariant t = {0};
|
tVariant t = {0};
|
||||||
t.nType = TSDB_DATA_TYPE_BIGINT;
|
t.nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
t.i64Key = startTag;
|
t.i64 = startTag;
|
||||||
|
|
||||||
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
||||||
|
|
||||||
int32_t totalOutput = 10;
|
int32_t totalOutput = 10;
|
||||||
while (1) {
|
while (1) {
|
||||||
STSElem elem = tsBufGetElem(pTSBuf);
|
STSElem elem = tsBufGetElem(pTSBuf);
|
||||||
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64Key, elem.ts);
|
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts);
|
||||||
|
|
||||||
if (!tsBufNextPos(pTSBuf)) {
|
if (!tsBufNextPos(pTSBuf)) {
|
||||||
break;
|
break;
|
||||||
|
@ -314,7 +314,7 @@ void TSTraverse() {
|
||||||
totalOutput = 10;
|
totalOutput = 10;
|
||||||
|
|
||||||
startTag -= 1;
|
startTag -= 1;
|
||||||
t.i64Key = startTag;
|
t.i64 = startTag;
|
||||||
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
||||||
|
|
||||||
if (startTag == 0) {
|
if (startTag == 0) {
|
||||||
|
@ -345,14 +345,14 @@ void TSTraverse() {
|
||||||
|
|
||||||
startVnode = 1;
|
startVnode = 1;
|
||||||
startTag = 2;
|
startTag = 2;
|
||||||
t.i64Key = startTag;
|
t.i64 = startTag;
|
||||||
|
|
||||||
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
||||||
|
|
||||||
totalOutput = 10;
|
totalOutput = 10;
|
||||||
while (1) {
|
while (1) {
|
||||||
STSElem elem = tsBufGetElem(pTSBuf);
|
STSElem elem = tsBufGetElem(pTSBuf);
|
||||||
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64Key, elem.ts);
|
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts);
|
||||||
|
|
||||||
if (!tsBufNextPos(pTSBuf)) {
|
if (!tsBufNextPos(pTSBuf)) {
|
||||||
break;
|
break;
|
||||||
|
@ -362,7 +362,7 @@ void TSTraverse() {
|
||||||
totalOutput = 10;
|
totalOutput = 10;
|
||||||
|
|
||||||
startTag -= 1;
|
startTag -= 1;
|
||||||
t.i64Key = startTag;
|
t.i64 = startTag;
|
||||||
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
tsBufGetElemStartPos(pTSBuf, startVnode, &t);
|
||||||
|
|
||||||
if (startTag < 0) {
|
if (startTag < 0) {
|
||||||
|
@ -414,7 +414,7 @@ void mergeDiffVnodeBufferTest() {
|
||||||
int64_t start = 10000000;
|
int64_t start = 10000000;
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf1, 1, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf1, 1, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
tsBufAppend(pTSBuf2, 9, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf2, 9, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
|
@ -451,7 +451,7 @@ void mergeIdenticalVnodeBufferTest() {
|
||||||
int64_t start = 10000000;
|
int64_t start = 10000000;
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
|
|
||||||
tsBufAppend(pTSBuf1, 12, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf1, 12, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
free(list);
|
free(list);
|
||||||
|
@ -462,7 +462,7 @@ void mergeIdenticalVnodeBufferTest() {
|
||||||
for (int32_t i = numOfTags; i < numOfTags * 2; ++i) {
|
for (int32_t i = numOfTags; i < numOfTags * 2; ++i) {
|
||||||
int64_t* list = createTsList(num, start, step);
|
int64_t* list = createTsList(num, start, step);
|
||||||
|
|
||||||
t.i64Key = i;
|
t.i64 = i;
|
||||||
tsBufAppend(pTSBuf2, 77, &t, (const char*)list, num * sizeof(int64_t));
|
tsBufAppend(pTSBuf2, 77, &t, (const char*)list, num * sizeof(int64_t));
|
||||||
free(list);
|
free(list);
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ void mergeIdenticalVnodeBufferTest() {
|
||||||
EXPECT_EQ(elem.id, 77);
|
EXPECT_EQ(elem.id, 77);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64Key, elem.ts);
|
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsBufDestroy(pTSBuf1);
|
tsBufDestroy(pTSBuf1);
|
||||||
|
|
|
@ -27,22 +27,22 @@ int32_t testValidateName(char* name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _init_tvariant_bool(tVariant* t) {
|
static void _init_tvariant_bool(tVariant* t) {
|
||||||
t->i64Key = TSDB_FALSE;
|
t->i64 = TSDB_FALSE;
|
||||||
t->nType = TSDB_DATA_TYPE_BOOL;
|
t->nType = TSDB_DATA_TYPE_BOOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _init_tvariant_tinyint(tVariant* t) {
|
static void _init_tvariant_tinyint(tVariant* t) {
|
||||||
t->i64Key = -27;
|
t->i64 = -27;
|
||||||
t->nType = TSDB_DATA_TYPE_TINYINT;
|
t->nType = TSDB_DATA_TYPE_TINYINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _init_tvariant_int(tVariant* t) {
|
static void _init_tvariant_int(tVariant* t) {
|
||||||
t->i64Key = -23997659;
|
t->i64 = -23997659;
|
||||||
t->nType = TSDB_DATA_TYPE_INT;
|
t->nType = TSDB_DATA_TYPE_INT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _init_tvariant_bigint(tVariant* t) {
|
static void _init_tvariant_bigint(tVariant* t) {
|
||||||
t->i64Key = -3333333333333;
|
t->i64 = -3333333333333;
|
||||||
t->nType = TSDB_DATA_TYPE_BIGINT;
|
t->nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,19 +446,19 @@ TEST(testCase, tvariant_convert) {
|
||||||
_init_tvariant_bool(&t);
|
_init_tvariant_bool(&t);
|
||||||
|
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 0);
|
EXPECT_EQ(t.i64, 0);
|
||||||
|
|
||||||
_init_tvariant_bool(&t);
|
_init_tvariant_bool(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, 0);
|
EXPECT_EQ(t.i64, 0);
|
||||||
|
|
||||||
_init_tvariant_bool(&t);
|
_init_tvariant_bool(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_SMALLINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_SMALLINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, 0);
|
EXPECT_EQ(t.i64, 0);
|
||||||
|
|
||||||
_init_tvariant_bool(&t);
|
_init_tvariant_bool(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, 0);
|
EXPECT_EQ(t.i64, 0);
|
||||||
|
|
||||||
_init_tvariant_bool(&t);
|
_init_tvariant_bool(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -481,23 +481,23 @@ TEST(testCase, tvariant_convert) {
|
||||||
// 2. tinyint to other data types
|
// 2. tinyint to other data types
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 1);
|
EXPECT_EQ(t.i64, 1);
|
||||||
|
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -27);
|
EXPECT_EQ(t.i64, -27);
|
||||||
|
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_SMALLINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_SMALLINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -27);
|
EXPECT_EQ(t.i64, -27);
|
||||||
|
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_INT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_INT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -27);
|
EXPECT_EQ(t.i64, -27);
|
||||||
|
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -27);
|
EXPECT_EQ(t.i64, -27);
|
||||||
|
|
||||||
_init_tvariant_tinyint(&t);
|
_init_tvariant_tinyint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -521,7 +521,7 @@ TEST(testCase, tvariant_convert) {
|
||||||
// types//////////////////////////////////////////////////////////////////
|
// types//////////////////////////////////////////////////////////////////
|
||||||
_init_tvariant_int(&t);
|
_init_tvariant_int(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 1);
|
EXPECT_EQ(t.i64, 1);
|
||||||
|
|
||||||
_init_tvariant_int(&t);
|
_init_tvariant_int(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
||||||
|
@ -531,11 +531,11 @@ TEST(testCase, tvariant_convert) {
|
||||||
|
|
||||||
_init_tvariant_int(&t);
|
_init_tvariant_int(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_INT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_INT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -23997659);
|
EXPECT_EQ(t.i64, -23997659);
|
||||||
|
|
||||||
_init_tvariant_int(&t);
|
_init_tvariant_int(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -23997659);
|
EXPECT_EQ(t.i64, -23997659);
|
||||||
|
|
||||||
_init_tvariant_int(&t);
|
_init_tvariant_int(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -559,7 +559,7 @@ TEST(testCase, tvariant_convert) {
|
||||||
// type//////////////////////////////////////////////////////////////////////////////
|
// type//////////////////////////////////////////////////////////////////////////////
|
||||||
_init_tvariant_bigint(&t);
|
_init_tvariant_bigint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 1);
|
EXPECT_EQ(t.i64, 1);
|
||||||
|
|
||||||
_init_tvariant_bigint(&t);
|
_init_tvariant_bigint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_TINYINT), 0);
|
||||||
|
@ -572,7 +572,7 @@ TEST(testCase, tvariant_convert) {
|
||||||
|
|
||||||
_init_tvariant_bigint(&t);
|
_init_tvariant_bigint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -3333333333333);
|
EXPECT_EQ(t.i64, -3333333333333);
|
||||||
|
|
||||||
_init_tvariant_bigint(&t);
|
_init_tvariant_bigint(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -596,11 +596,11 @@ TEST(testCase, tvariant_convert) {
|
||||||
// types////////////////////////////////////////////////////////////////////////
|
// types////////////////////////////////////////////////////////////////////////
|
||||||
_init_tvariant_float(&t);
|
_init_tvariant_float(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 1);
|
EXPECT_EQ(t.i64, 1);
|
||||||
|
|
||||||
_init_tvariant_float(&t);
|
_init_tvariant_float(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -8991212199);
|
EXPECT_EQ(t.i64, -8991212199);
|
||||||
|
|
||||||
_init_tvariant_float(&t);
|
_init_tvariant_float(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -626,14 +626,14 @@ TEST(testCase, tvariant_convert) {
|
||||||
t.nLen = strlen(t.pz);
|
t.nLen = strlen(t.pz);
|
||||||
t.nType = TSDB_DATA_TYPE_BINARY;
|
t.nType = TSDB_DATA_TYPE_BINARY;
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 1);
|
EXPECT_EQ(t.i64, 1);
|
||||||
|
|
||||||
_init_tvariant_binary(&t);
|
_init_tvariant_binary(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), -1);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), -1);
|
||||||
|
|
||||||
_init_tvariant_binary(&t);
|
_init_tvariant_binary(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, 200000);
|
EXPECT_EQ(t.i64, 200000);
|
||||||
|
|
||||||
_init_tvariant_binary(&t);
|
_init_tvariant_binary(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -659,14 +659,14 @@ TEST(testCase, tvariant_convert) {
|
||||||
t.nLen = wcslen(t.wpz);
|
t.nLen = wcslen(t.wpz);
|
||||||
t.nType = TSDB_DATA_TYPE_NCHAR;
|
t.nType = TSDB_DATA_TYPE_NCHAR;
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
EXPECT_EQ(t.i64Key, 0);
|
EXPECT_EQ(t.i64, 0);
|
||||||
|
|
||||||
_init_tvariant_nchar(&t);
|
_init_tvariant_nchar(&t);
|
||||||
EXPECT_LE(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
EXPECT_LE(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BOOL), 0);
|
||||||
|
|
||||||
_init_tvariant_nchar(&t);
|
_init_tvariant_nchar(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_BIGINT), 0);
|
||||||
EXPECT_EQ(t.i64Key, -2000000);
|
EXPECT_EQ(t.i64, -2000000);
|
||||||
|
|
||||||
_init_tvariant_nchar(&t);
|
_init_tvariant_nchar(&t);
|
||||||
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
EXPECT_EQ(tVariantTypeSetType(&t, TSDB_DATA_TYPE_FLOAT), 0);
|
||||||
|
@ -732,34 +732,34 @@ static SStrToken createStrToken(char* s) {
|
||||||
TEST(testCase, isValidNumber_test) {
|
TEST(testCase, isValidNumber_test) {
|
||||||
SStrToken t1 = createStrToken("123abc");
|
SStrToken t1 = createStrToken("123abc");
|
||||||
|
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_ILLEGAL);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_ILLEGAL);
|
||||||
|
|
||||||
t1 = createStrToken("0xabc");
|
t1 = createStrToken("0xabc");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_HEX);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_HEX);
|
||||||
|
|
||||||
t1 = createStrToken("0b11101");
|
t1 = createStrToken("0b11101");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_BIN);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_BIN);
|
||||||
|
|
||||||
t1 = createStrToken(".134abc");
|
t1 = createStrToken(".134abc");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_ILLEGAL);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_ILLEGAL);
|
||||||
|
|
||||||
t1 = createStrToken("1e1 ");
|
t1 = createStrToken("1e1 ");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_ILLEGAL);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_ILLEGAL);
|
||||||
|
|
||||||
t1 = createStrToken("1+2");
|
t1 = createStrToken("1+2");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_ILLEGAL);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_ILLEGAL);
|
||||||
|
|
||||||
t1 = createStrToken("-0x123");
|
t1 = createStrToken("-0x123");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_HEX);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_HEX);
|
||||||
|
|
||||||
t1 = createStrToken("-1");
|
t1 = createStrToken("-1");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_INTEGER);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_INTEGER);
|
||||||
|
|
||||||
t1 = createStrToken("-0b1110");
|
t1 = createStrToken("-0b1110");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_BIN);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_BIN);
|
||||||
|
|
||||||
t1 = createStrToken("-.234");
|
t1 = createStrToken("-.234");
|
||||||
EXPECT_EQ(isValidNumber(&t1), TK_FLOAT);
|
EXPECT_EQ(tGetNumericStringType(&t1), TK_FLOAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, getTempFilePath_test) {
|
TEST(testCase, getTempFilePath_test) {
|
||||||
|
|
|
@ -753,8 +753,8 @@ static int tsdbWriteBlockToFile(SRWHelper *pHelper, SFile *pFile, SDataCols *pDa
|
||||||
pCompCol->type = pDataCol->type;
|
pCompCol->type = pDataCol->type;
|
||||||
if (tDataTypeDesc[pDataCol->type].getStatisFunc) {
|
if (tDataTypeDesc[pDataCol->type].getStatisFunc) {
|
||||||
(*tDataTypeDesc[pDataCol->type].getStatisFunc)(
|
(*tDataTypeDesc[pDataCol->type].getStatisFunc)(
|
||||||
(TSKEY *)(pDataCols->cols[0].pData), pDataCol->pData, rowsToWrite, &(pCompCol->min), &(pCompCol->max),
|
pDataCol->pData, rowsToWrite, &(pCompCol->min), &(pCompCol->max), &(pCompCol->sum), &(pCompCol->minIndex),
|
||||||
&(pCompCol->sum), &(pCompCol->minIndex), &(pCompCol->maxIndex), &(pCompCol->numOfNull));
|
&(pCompCol->maxIndex), &(pCompCol->numOfNull));
|
||||||
}
|
}
|
||||||
nColsNotAllNull++;
|
nColsNotAllNull++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ bool isKeyWord(const char *z, int32_t len);
|
||||||
* @param pToken
|
* @param pToken
|
||||||
* @return token type, if it is not a number, TK_ILLEGAL will return
|
* @return token type, if it is not a number, TK_ILLEGAL will return
|
||||||
*/
|
*/
|
||||||
static FORCE_INLINE int32_t isValidNumber(const SStrToken* pToken) {
|
static FORCE_INLINE int32_t tGetNumericStringType(const SStrToken* pToken) {
|
||||||
const char* z = pToken->z;
|
const char* z = pToken->z;
|
||||||
int32_t type = TK_ILLEGAL;
|
int32_t type = TK_ILLEGAL;
|
||||||
|
|
||||||
|
@ -111,7 +111,6 @@ static FORCE_INLINE int32_t isValidNumber(const SStrToken* pToken) {
|
||||||
|
|
||||||
type = TK_FLOAT;
|
type = TK_FLOAT;
|
||||||
goto _end;
|
goto _end;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case '0': {
|
case '0': {
|
||||||
|
|
|
@ -51,7 +51,22 @@ int32_t compareDoubleIntVal(const void *pLeft, const void *pRight) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
||||||
float ret = GET_FLOAT_VAL(pLeft) - GET_FLOAT_VAL(pRight);
|
float p1 = GET_FLOAT_VAL(pLeft);
|
||||||
|
float p2 = GET_FLOAT_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(p1) && isnan(p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p2)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
float ret = p1 - p2;
|
||||||
if (fabs(ret) < FLT_EPSILON) {
|
if (fabs(ret) < FLT_EPSILON) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -60,7 +75,22 @@ int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
||||||
double ret = GET_DOUBLE_VAL(pLeft) - GET_DOUBLE_VAL(pRight);
|
double p1 = GET_DOUBLE_VAL(pLeft);
|
||||||
|
double p2 = GET_DOUBLE_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(p1) && isnan(p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p2)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
double ret = p1 - p2;
|
||||||
if (fabs(ret) < FLT_EPSILON) {
|
if (fabs(ret) < FLT_EPSILON) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = m_alt_db
|
$dbPrefix = m_alt_db
|
||||||
|
@ -114,7 +114,7 @@ endi
|
||||||
sql drop table tb
|
sql drop table tb
|
||||||
sql drop table mt
|
sql drop table mt
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
### ALTER TABLE WHILE STREAMING [TBASE271]
|
### ALTER TABLE WHILE STREAMING [TBASE271]
|
||||||
#sql create table tb1 (ts timestamp, c1 int, c2 nchar(5), c3 int)
|
#sql create table tb1 (ts timestamp, c1 int, c2 nchar(5), c3 int)
|
||||||
#sql create table strm as select count(*), avg(c1), first(c2), sum(c3) from tb1 interval(2s)
|
#sql create table strm as select count(*), avg(c1), first(c2), sum(c3) from tb1 interval(2s)
|
||||||
|
@ -147,7 +147,7 @@ sleep 500
|
||||||
#sql alter table tb1 add column c3 int
|
#sql alter table tb1 add column c3 int
|
||||||
#sleep 3000
|
#sleep 3000
|
||||||
#sql insert into tb1 values (now, 3, 'taos', 3);
|
#sql insert into tb1 values (now, 3, 'taos', 3);
|
||||||
#sleep 500
|
#sleep 100
|
||||||
#sql select * from strm
|
#sql select * from strm
|
||||||
#if $rows != 3 then
|
#if $rows != 3 then
|
||||||
# return -1
|
# return -1
|
||||||
|
@ -186,7 +186,7 @@ sql create database $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table mt (ts timestamp, c1 int, c2 nchar(7), c3 int) tags (t1 int)
|
sql create table mt (ts timestamp, c1 int, c2 nchar(7), c3 int) tags (t1 int)
|
||||||
sql create table tb using mt tags(1)
|
sql create table tb using mt tags(1)
|
||||||
sleep 500
|
sleep 100
|
||||||
sql insert into tb values ('2018-11-01 16:30:00.000', 1, 'insert', 1)
|
sql insert into tb values ('2018-11-01 16:30:00.000', 1, 'insert', 1)
|
||||||
sql alter table mt drop column c3
|
sql alter table mt drop column c3
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql reset query cache
|
sql reset query cache
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ if $data13 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
print ================== insert values into table
|
print ================== insert values into table
|
||||||
sql insert into car1 values (now, 1, 1,1 ) (now +1s, 2,2,2,) car2 values (now, 1,3,3)
|
sql insert into car1 values (now, 1, 1,1 ) (now +1s, 2,2,2,) car2 values (now, 1,3,3)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print ========== alter_stable.sim
|
print ========== alter_stable.sim
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 2
|
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 2
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ sleep 3000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
sql use $db
|
sql use $db
|
||||||
|
|
||||||
#### auto create multiple tables
|
#### auto create multiple tables
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 4
|
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 4
|
||||||
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = db
|
$dbPrefix = db
|
||||||
|
@ -49,7 +49,7 @@ while $t < $tbNum
|
||||||
endw
|
endw
|
||||||
print ====== tables created
|
print ====== tables created
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
sql drop table tb2
|
sql drop table tb2
|
||||||
$x = 0
|
$x = 0
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
sql drop database if exists ecdb
|
sql drop database if exists ecdb
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
#========================================= setup environment ================================
|
#========================================= setup environment ================================
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print ========== columnValues.sim
|
print ========== columnValues.sim
|
||||||
|
@ -21,6 +21,7 @@ run general/parser/columnValue_int.sim
|
||||||
run general/parser/columnValue_bigint.sim
|
run general/parser/columnValue_bigint.sim
|
||||||
run general/parser/columnValue_float.sim
|
run general/parser/columnValue_float.sim
|
||||||
run general/parser/columnValue_double.sim
|
run general/parser/columnValue_double.sim
|
||||||
|
run general/parser/columnValue_unsign.sim
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
@ -374,9 +374,9 @@ endi
|
||||||
|
|
||||||
## case 04: illegal input
|
## case 04: illegal input
|
||||||
################## when overflow, auto set max
|
################## when overflow, auto set max
|
||||||
sql create table st_bigint_e0 using mt_bigint tags (9223372036854775808)
|
sql_error create table st_bigint_e0 using mt_bigint tags (9223372036854775808)
|
||||||
sql_error create table st_bigint_e0_1 using mt_bigint tags (-9223372036854775808)
|
sql_error create table st_bigint_e0_1 using mt_bigint tags (-9223372036854775808)
|
||||||
sql create table st_bigint_e0_2 using mt_bigint tags (92233720368547758080)
|
sql_error create table st_bigint_e0_2 using mt_bigint tags (92233720368547758080)
|
||||||
sql_error create table st_bigint_e0_3 using mt_bigint tags (-9223372036854775809)
|
sql_error create table st_bigint_e0_3 using mt_bigint tags (-9223372036854775809)
|
||||||
#sql_error create table st_bigint_e0 using mt_bigint tags (12.80) truncate integer part
|
#sql_error create table st_bigint_e0 using mt_bigint tags (12.80) truncate integer part
|
||||||
#sql_error create table st_bigint_e0 using mt_bigint tags (-11.80)
|
#sql_error create table st_bigint_e0 using mt_bigint tags (-11.80)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
####
|
####
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
####
|
####
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
@ -211,23 +211,28 @@ if $data01 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql insert into st_float_6 values (now, 3.40282347e+38)
|
sql_error insert into st_float_6 values (now, 3.40282347e+38)
|
||||||
|
sql_error insert into st_float_6 values (now, -3.40282347e+38)
|
||||||
|
|
||||||
|
sql insert into st_float_6 values(now, 340282346638528859811704183484516925440.00000)
|
||||||
sql select * from st_float_6
|
sql select * from st_float_6
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#if $data01 != 340282346638528859811704183484516925440.00000 then
|
|
||||||
# print ==== data01:$data01, expect:340282346638528859811704183484516925440.00000
|
if $data01 != 340282346638528859811704183484516925440.00000 then
|
||||||
# return -1
|
print ==== data01:$data01, expect:340282346638528859811704183484516925440.00000
|
||||||
#endi
|
return -1
|
||||||
sql insert into st_float_7 values (now, -3.40282347e+38)
|
endi
|
||||||
|
sql insert into st_float_7 values (now, -340282346638528859811704183484516925440.00000)
|
||||||
sql select * from st_float_7
|
sql select * from st_float_7
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#if $data01 != -340282346638528859811704183484516925440.00000 then
|
if $data01 != -340282346638528859811704183484516925440.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
sql insert into st_float_8 values (now, +100.89)
|
sql insert into st_float_8 values (now, +100.89)
|
||||||
sql select * from st_float_8
|
sql select * from st_float_8
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
|
@ -343,111 +348,119 @@ sql select * from st_float_21
|
||||||
if $data01 != NULL then
|
if $data01 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
sql insert into st_float_22 using mt_float tags (127) values (now, 3.40282347e+38)
|
|
||||||
|
sql_error insert into st_float_22 using mt_float tags (127) values (now, 3.40282347e+38)
|
||||||
|
|
||||||
|
sql insert into st_float_22 using mt_float tags (127) values (now, 340282346638528859811704183484516925440.00000)
|
||||||
sql select tagname from st_float_22
|
sql select tagname from st_float_22
|
||||||
#if $data00 != 127 then
|
if $data00 != 127.00000 then
|
||||||
# return -1
|
print expect 127.00000, actual: $data00
|
||||||
#endi
|
return -1
|
||||||
sql select * from st_float_22
|
endi
|
||||||
#if $data01 != 127 then
|
|
||||||
# return -1
|
sql select tbname, tagname from st_float_22
|
||||||
#endi
|
if $data01 != 127.00000 then
|
||||||
sql insert into st_float_23 using mt_float tags (-127) values (now, -3.40282347e+38)
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql insert into st_float_23 using mt_float tags (-127) values (now, -340282346638528859811704183484516925440.00000)
|
||||||
sql select tagname from st_float_23
|
sql select tagname from st_float_23
|
||||||
#if $data00 != -127 then
|
if $data00 != -127.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql select * from st_float_23
|
|
||||||
#if $data01 != -127 then
|
|
||||||
# return -1
|
|
||||||
#endi
|
|
||||||
sql insert into st_float_24 using mt_float tags (10) values (now, 10)
|
sql insert into st_float_24 using mt_float tags (10) values (now, 10)
|
||||||
sql select tagname from st_float_24
|
sql select tagname from st_float_24
|
||||||
#if $data00 != 10 then
|
if $data00 != 10.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql select * from st_float_24
|
sql select * from st_float_24
|
||||||
#if $data01 != 10 then
|
if $data01 != 10.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
sql insert into st_float_25 using mt_float tags ("-0") values (now, "-0")
|
sql insert into st_float_25 using mt_float tags ("-0") values (now, "-0")
|
||||||
sql select tagname from st_float_25
|
sql select tagname from st_float_25
|
||||||
#if $data00 != 0 then
|
if $data00 != -0.00000 then
|
||||||
# return -1
|
print expect -0.00000, actual: $data00
|
||||||
#endi
|
return -1
|
||||||
|
endi
|
||||||
sql select * from st_float_25
|
sql select * from st_float_25
|
||||||
#if $data01 != 0 then
|
if $data01 != -0.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql insert into st_float_26 using mt_float tags ('123') values (now, '12.3')
|
sql insert into st_float_26 using mt_float tags ('123') values (now, '12.3')
|
||||||
sql select tagname from st_float_26
|
sql select tagname from st_float_26
|
||||||
#if $data00 != 123 then
|
if $data00 != 123.00000 then
|
||||||
# return -1
|
print expect 123.00000, actual: $data00
|
||||||
#endi
|
return -1
|
||||||
|
endi
|
||||||
sql select * from st_float_26
|
sql select * from st_float_26
|
||||||
#if $data01 != 123 then
|
if $data01 != 12.30000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql insert into st_float_27 using mt_float tags (+056) values (now, +0005.6)
|
sql insert into st_float_27 using mt_float tags (+056) values (now, +0005.6)
|
||||||
sql select tagname from st_float_27
|
sql select tagname from st_float_27
|
||||||
#if $data00 != 56 then
|
if $data00 != 56.00000 then
|
||||||
# return -1
|
print expect 56.00000, actual:$data00
|
||||||
#endi
|
return -1
|
||||||
|
endi
|
||||||
sql select * from st_float_27
|
sql select * from st_float_27
|
||||||
#if $data01 != 56 then
|
if $data01 != 5.60000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql insert into st_float_28 using mt_float tags (-056) values (now, -005.6)
|
sql insert into st_float_28 using mt_float tags (-056) values (now, -005.6)
|
||||||
sql select tagname from st_float_28
|
sql select tagname from st_float_28
|
||||||
#if $data00 != -56 then
|
if $data00 != -56.00000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
sql select * from st_float_28
|
sql select * from st_float_28
|
||||||
#if $data01 != -56 then
|
if $data01 != -5.60000 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
### case 03: alter tag values
|
### case 03: alter tag values
|
||||||
#sql alter table st_float_0 set tag tagname=3.40282347e+38
|
sql alter table st_float_0 set tag tagname=340282346638528859811704183484516925440.00000
|
||||||
#sql select tagname from st_float_0
|
sql select tagname from st_float_0
|
||||||
##if $data00 != 127 then
|
if $data00 != 340282346638528859811704183484516925440.00000 then
|
||||||
## return -1
|
return -1
|
||||||
##endi
|
endi
|
||||||
#sql alter table st_float_0 set tag tagname=-3.40282347e+38
|
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname=-340282346638528859811704183484516925440.00000
|
||||||
##if $data00 != -127 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != -340282346638528859811704183484516925440.00000 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname=+10.340
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname=+10.340
|
||||||
##if $data00 != 100 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != 10.34000 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname=-33.87
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname=-33.87
|
||||||
##if $data00 != -33 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != -33.87000 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname='+9.8'
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname='+9.8'
|
||||||
##if $data00 != 98 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != 9.80000 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname='-07.6'
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname='-07.6'
|
||||||
##if $data00 != -76 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != -7.60000 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname=+0012.871
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname=+0012.871
|
||||||
##if $data00 != 12 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != 12.87100 then
|
||||||
##endi
|
return -1
|
||||||
#sql alter table st_float_0 set tag tagname=-00063.582
|
endi
|
||||||
#sql select tagname from st_float_0
|
sql alter table st_float_0 set tag tagname=-00063.582
|
||||||
##if $data00 != -63 then
|
sql select tagname from st_float_0
|
||||||
## return -1
|
if $data00 != -63.58200 then
|
||||||
##endi
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
## case 04: illegal input
|
## case 04: illegal input
|
||||||
sql_error create table st_float_e0 using mt_float tags (3.50282347e+38)
|
sql_error create table st_float_e0 using mt_float tags (3.50282347e+38)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
sql create database if not exists db
|
sql create database if not exists db
|
||||||
sql use db
|
sql use db
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
sleep 100
|
||||||
|
sql connect
|
||||||
|
sql create database if not exists db
|
||||||
|
sql use db
|
||||||
|
|
||||||
|
sql drop table if exists mt_unsigned;
|
||||||
|
|
||||||
|
sql create table mt_unsigned (ts timestamp, a tinyint unsigned, b smallint unsigned, c int unsigned, d bigint unsigned, e tinyint, f smallint, g int, h bigint, j bool) tags (t1 tinyint unsigned, t2 smallint unsigned, t3 int unsigned, t4 bigint unsigned, t5 tinyint, t6 smallint, t7 int, t8 bigint);
|
||||||
|
sql create table mt_unsigned_1 using mt_unsigned tags(0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
sql alter table mt_unsigned_1 set tag t1=138;
|
||||||
|
sql alter table mt_unsigned_1 set tag t2=32769;
|
||||||
|
sql alter table mt_unsigned_1 set tag t3=294967295;
|
||||||
|
sql alter table mt_unsigned_1 set tag t4=446744073709551615;
|
||||||
|
sql select t1,t2,t3,t4 from mt_unsigned_1
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print $data00, $data01, $data02, $data03
|
||||||
|
|
||||||
|
if $data00 != 138 then
|
||||||
|
print expect 138, actual: $data00
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 32769 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 294967295 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 446744073709551615 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql_error sql alter table mt_unsigned_1 set tag t1 = 999;
|
||||||
|
sql_error sql alter table mt_unsigned_1 set tag t2 = 95535;
|
||||||
|
sql_error sql alter table mt_unsigned_1 set tag t3 = 8294967295l;
|
||||||
|
sql_error sql alter table mt_unsigned_1 set tag t4 = 19446744073709551615;
|
||||||
|
|
||||||
|
sql_error create table mt_unsigned_2 using mt_unsigned tags(-1, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_3 using mt_unsigned tags(0, -1, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_4 using mt_unsigned tags(0, 0, -1, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_5 using mt_unsigned tags(0, 0, 0, -1, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
sql_error create table mt_unsigned_2 using mt_unsigned tags(255, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_3 using mt_unsigned tags(0, 65535, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_4 using mt_unsigned tags(0, 0, 4294967295, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_5 using mt_unsigned tags(0, 0, 0, 18446744073709551615, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
sql_error create table mt_unsigned_2 using mt_unsigned tags(999, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_3 using mt_unsigned tags(0, 95535, 0, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_4 using mt_unsigned tags(0, 0, 5294967295l, 0, 0, 0, 0, 0);
|
||||||
|
sql_error create table mt_unsigned_5 using mt_unsigned tags(0, 0, 0, 28446744073709551615u, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
sql alter table mt_unsigned_1 set tag t1=NULL;
|
||||||
|
sql alter table mt_unsigned_1 set tag t2=NULL;
|
||||||
|
sql alter table mt_unsigned_1 set tag t3=NULL;
|
||||||
|
sql alter table mt_unsigned_1 set tag t4=NULL;
|
||||||
|
sql select t1,t2,t3,t4 from mt_unsigned_1
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1;
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != NULL then
|
||||||
|
print expect NULL, actual: $data00
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != NULL then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != NULL then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != NULL then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql insert into mt_unsigned_1 values(now, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql insert into mt_unsigned_1 values(now, 1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||||
|
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, NULL, -1, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, NULL, NULL, -1, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, 255, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, 65535, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, NULL, 4294967295, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql_error insert into mt_unsigned_1 values(now, NULL, NULL, NULL, 18446744073709551615, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
sql select count(a),count(b),count(c),count(d), count(e) from mt_unsigned_1
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select a+b+c from mt_unsigned_1 where a is null;
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxTablesperVnode -v 100
|
system sh/cfg.sh -n dnode1 -c maxTablesperVnode -v 100
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = sc_db
|
$dbPrefix = sc_db
|
||||||
|
@ -84,10 +84,10 @@ print ================== restart server to commit data into disk
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
sleep 3000
|
sleep 3000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
print ====== select from table and check num of rows returned
|
print ====== select from table and check num of rows returned
|
||||||
sql use $db
|
sql use $db
|
||||||
|
|
|
@ -5,7 +5,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print ========== db name and table name check in create and drop, describe
|
print ========== db name and table name check in create and drop, describe
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = m_fl_db
|
$dbPrefix = m_fl_db
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = fl1_db
|
$dbPrefix = fl1_db
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = m_fl_db
|
$dbPrefix = m_fl_db
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxTablespervnode -v 4
|
system sh/cfg.sh -n dnode1 -c maxTablespervnode -v 4
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = first_db
|
$dbPrefix = first_db
|
||||||
|
@ -81,7 +81,7 @@ sleep 3000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
run general/parser/first_last_query.sim
|
run general/parser/first_last_query.sim
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ sleep 1000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
sql use test
|
sql use test
|
||||||
sql select count(*), last(ts) from tm0 interval(1s)
|
sql select count(*), last(ts) from tm0 interval(1s)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = first_db
|
$dbPrefix = first_db
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
system sh/cfg.sh -n dnode1 -c tableMetaKeepTimer -v 3
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = m_func_db
|
$dbPrefix = m_func_db
|
||||||
|
@ -274,7 +274,7 @@ sleep 1000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
sql use m_func_db0
|
sql use m_func_db0
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = group_db
|
$dbPrefix = group_db
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = impt_db
|
$dbPrefix = impt_db
|
||||||
|
@ -64,7 +64,7 @@ sleep 2000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
sql use $db
|
sql use $db
|
||||||
sql select * from tb
|
sql select * from tb
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = ic_db
|
$dbPrefix = ic_db
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = ic_db
|
$dbPrefix = ic_db
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
system sh/cfg.sh -n dnode1 -c ctime -v 30
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = ic_db
|
$dbPrefix = ic_db
|
||||||
|
|
|
@ -6,7 +6,7 @@ system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 2000
|
sleep 2000
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
sql create database mul_db
|
sql create database mul_db
|
||||||
|
|
|
@ -5,7 +5,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
print ======================== dnode1 start
|
print ======================== dnode1 start
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ if $rows != 1 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql drop database $db
|
sql drop database $db
|
||||||
sleep 500
|
sleep 100
|
||||||
sql create database $db
|
sql create database $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table stb1 (ts timestamp, c1 int) tags(t1 int)
|
sql create table stb1 (ts timestamp, c1 int) tags(t1 int)
|
||||||
|
@ -136,7 +136,7 @@ if $data21 != 1.000000000 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql drop database $db
|
sql drop database $db
|
||||||
sleep 500
|
sleep 100
|
||||||
sql create database $db
|
sql create database $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table stb (ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 nchar(10), c6 binary(20)) tags(t1 int, t2 bigint, t3 double, t4 float, t5 nchar(10))
|
sql create table stb (ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 nchar(10), c6 binary(20)) tags(t1 int, t2 bigint, t3 double, t4 float, t5 nchar(10))
|
||||||
|
|
|
@ -3,7 +3,7 @@ system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = intp_db
|
$dbPrefix = intp_db
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = intp_db
|
$dbPrefix = intp_db
|
||||||
|
|
|
@ -7,7 +7,7 @@ system sh/cfg.sh -n dnode1 -c rpcDebugFlag -v 135
|
||||||
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = join_db
|
$dbPrefix = join_db
|
||||||
|
|
|
@ -6,7 +6,7 @@ system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
$dbPrefix = join_m_db
|
$dbPrefix = join_m_db
|
||||||
$tbPrefix = join_tb
|
$tbPrefix = join_tb
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
system sh/cfg.sh -n dnode1 -c maxtablespervnode -v 4
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = lr_db
|
$dbPrefix = lr_db
|
||||||
|
@ -66,7 +66,7 @@ sleep 3000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
run general/parser/lastrow_query.sim
|
run general/parser/lastrow_query.sim
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = lr_db
|
$dbPrefix = lr_db
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 1
|
system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 1
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = lm_db
|
$dbPrefix = lm_db
|
||||||
|
@ -70,7 +70,7 @@ sleep 3000
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
print ================== server restart completed
|
print ================== server restart completed
|
||||||
sql connect
|
sql connect
|
||||||
sleep 500
|
sleep 100
|
||||||
|
|
||||||
run general/parser/limit_tb.sim
|
run general/parser/limit_tb.sim
|
||||||
run general/parser/limit_stb.sim
|
run general/parser/limit_stb.sim
|
||||||
|
|
|
@ -4,7 +4,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
system sh/cfg.sh -n dnode1 -c walLevel -v 0
|
||||||
system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 1
|
system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 1
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
sleep 500
|
sleep 100
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
$dbPrefix = lm1_db
|
$dbPrefix = lm1_db
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue