decimal scalar ops and comparision
This commit is contained in:
parent
f18e5879f4
commit
494a16713e
|
@ -365,6 +365,13 @@ typedef struct tDataTypeCompress {
|
||||||
extern tDataTypeDescriptor tDataTypes[TSDB_DATA_TYPE_MAX];
|
extern tDataTypeDescriptor tDataTypes[TSDB_DATA_TYPE_MAX];
|
||||||
extern tDataTypeCompress tDataCompress[TSDB_DATA_TYPE_MAX];
|
extern tDataTypeCompress tDataCompress[TSDB_DATA_TYPE_MAX];
|
||||||
|
|
||||||
|
typedef struct SDataType {
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t precision;
|
||||||
|
uint8_t scale;
|
||||||
|
int32_t bytes;
|
||||||
|
} SDataType;
|
||||||
|
|
||||||
bool isValidDataType(int32_t type);
|
bool isValidDataType(int32_t type);
|
||||||
|
|
||||||
int32_t operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type);
|
int32_t operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type);
|
||||||
|
@ -373,7 +380,9 @@ void *getDataMin(int32_t type, void *value);
|
||||||
void *getDataMax(int32_t type, void *value);
|
void *getDataMax(int32_t type, void *value);
|
||||||
|
|
||||||
#define STypeMod int32_t
|
#define STypeMod int32_t
|
||||||
uint8_t decimalTypeFromPrecision(uint8_t precision);
|
uint8_t decimalTypeFromPrecision(uint8_t precision);
|
||||||
|
STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale);
|
||||||
|
void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ extern "C" {
|
||||||
|
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "ttypes.h"
|
#include "ttypes.h"
|
||||||
typedef struct SDataType SDataType;
|
|
||||||
typedef struct SValue SValue;
|
typedef struct SValue SValue;
|
||||||
typedef void DecimalType;
|
typedef void DecimalType;
|
||||||
|
|
||||||
|
@ -50,7 +49,6 @@ void makeDecimal128(Decimal128* pDec128, int64_t hi, uint64_t low);
|
||||||
|
|
||||||
#define DECIMAL_WORD_NUM(TYPE) sizeof(TYPE) / sizeof(DecimalWord)
|
#define DECIMAL_WORD_NUM(TYPE) sizeof(TYPE) / sizeof(DecimalWord)
|
||||||
|
|
||||||
int32_t decimalCalcTypeMod(const SDataType* pType);
|
|
||||||
void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale);
|
void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale);
|
||||||
|
|
||||||
int32_t decimal64FromStr(const char* str, int32_t len, uint8_t expectPrecision, uint8_t expectScale, Decimal64* result);
|
int32_t decimal64FromStr(const char* str, int32_t len, uint8_t expectPrecision, uint8_t expectScale, Decimal64* result);
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tsimplehash.h"
|
#include "tsimplehash.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
#include "ttypes.h"
|
||||||
|
|
||||||
#define TABLE_TOTAL_COL_NUM(pMeta) ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags)
|
#define TABLE_TOTAL_COL_NUM(pMeta) ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags)
|
||||||
#define TABLE_META_SIZE(pMeta) \
|
#define TABLE_META_SIZE(pMeta) \
|
||||||
|
@ -45,13 +46,6 @@ typedef struct SRawExprNode {
|
||||||
bool isPseudoColumn;
|
bool isPseudoColumn;
|
||||||
} SRawExprNode;
|
} SRawExprNode;
|
||||||
|
|
||||||
typedef struct SDataType {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t precision;
|
|
||||||
uint8_t scale;
|
|
||||||
int32_t bytes;
|
|
||||||
} SDataType;
|
|
||||||
|
|
||||||
typedef struct SExprNode {
|
typedef struct SExprNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
SDataType resType;
|
SDataType resType;
|
||||||
|
|
|
@ -86,6 +86,9 @@ int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight);
|
||||||
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight);
|
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight);
|
||||||
int32_t compareLenBinaryVal(const void *pLeft, const void *pRight);
|
int32_t compareLenBinaryVal(const void *pLeft, const void *pRight);
|
||||||
|
|
||||||
|
int32_t compareDecimal64(const void* pleft, const void* pright);
|
||||||
|
int32_t compareDecimal128(const void* pleft, const void* pright);
|
||||||
|
|
||||||
int32_t comparestrRegexMatch(const void *pLeft, const void *pRight);
|
int32_t comparestrRegexMatch(const void *pLeft, const void *pRight);
|
||||||
int32_t comparestrRegexNMatch(const void *pLeft, const void *pRight);
|
int32_t comparestrRegexNMatch(const void *pLeft, const void *pRight);
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,14 @@ int32_t tsCompressBigint2(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int3
|
||||||
int32_t nBuf);
|
int32_t nBuf);
|
||||||
int32_t tsDecompressBigint2(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
int32_t tsDecompressBigint2(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
void *pBuf, int32_t nBuf);
|
void *pBuf, int32_t nBuf);
|
||||||
|
int32_t tsCompressDecimal64(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf);
|
||||||
|
int32_t tsDecompressDecimal64(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf);
|
||||||
|
int32_t tsCompressDecimal128(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf);
|
||||||
|
int32_t tsDecompressDecimal128(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* STREAM COMPRESSION
|
* STREAM COMPRESSION
|
||||||
|
|
|
@ -2508,7 +2508,7 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, bool convertUcs4) {
|
||||||
if (convertUcs4) {
|
if (convertUcs4) {
|
||||||
code = doConvertUCS4(pResultInfo, colLength);
|
code = doConvertUCS4(pResultInfo, colLength);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code && convertUcs4) {
|
||||||
code = convertDecimalType(pResultInfo);
|
code = convertDecimalType(pResultInfo);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -64,7 +64,7 @@ uint8_t getDefaultEncode(uint8_t type) {
|
||||||
return TSDB_COLVAL_ENCODE_DISABLED;
|
return TSDB_COLVAL_ENCODE_DISABLED;
|
||||||
case TSDB_DATA_TYPE_DECIMAL64:
|
case TSDB_DATA_TYPE_DECIMAL64:
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
return TSDB_COLVAL_ENCODE_SIMPLE8B;
|
return TSDB_COLVAL_ENCODE_DISABLED;
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
case TSDB_DATA_TYPE_BLOB:
|
||||||
return TSDB_COLVAL_ENCODE_SIMPLE8B;
|
return TSDB_COLVAL_ENCODE_SIMPLE8B;
|
||||||
case TSDB_DATA_TYPE_MEDIUMBLOB:
|
case TSDB_DATA_TYPE_MEDIUMBLOB:
|
||||||
|
@ -416,7 +416,7 @@ int8_t validColEncode(uint8_t type, uint8_t l1) {
|
||||||
} else if (type == TSDB_DATA_TYPE_GEOMETRY) {
|
} else if (type == TSDB_DATA_TYPE_GEOMETRY) {
|
||||||
return 1;
|
return 1;
|
||||||
} else if (type == TSDB_DATA_TYPE_DECIMAL64 || type == TSDB_DATA_TYPE_DECIMAL) {
|
} else if (type == TSDB_DATA_TYPE_DECIMAL64 || type == TSDB_DATA_TYPE_DECIMAL) {
|
||||||
return 1;
|
return l1 == TSDB_COLVAL_ENCODE_DISABLED ? 1 : 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3196,7 +3196,15 @@ int32_t blockEncode(const SSDataBlock* pBlock, char* data, size_t dataBuflen, in
|
||||||
*((int8_t*)data) = pColInfoData->info.type;
|
*((int8_t*)data) = pColInfoData->info.type;
|
||||||
data += sizeof(int8_t);
|
data += sizeof(int8_t);
|
||||||
|
|
||||||
*((int32_t*)data) = pColInfoData->info.bytes;
|
int32_t bytes = pColInfoData->info.bytes;
|
||||||
|
*((int32_t*)data) = bytes;
|
||||||
|
if (IS_DECIMAL_TYPE(pColInfoData->info.type)) {
|
||||||
|
bytes <<= 16;
|
||||||
|
bytes |= pColInfoData->info.precision;
|
||||||
|
bytes <<= 8;
|
||||||
|
bytes |= pColInfoData->info.scale;
|
||||||
|
*(int32_t*)data = bytes;
|
||||||
|
}
|
||||||
data += sizeof(int32_t);
|
data += sizeof(int32_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3334,6 +3342,11 @@ int32_t blockDecode(SSDataBlock* pBlock, const char* pData, const char** pEndPos
|
||||||
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
pBlock->info.hasVarCol = true;
|
pBlock->info.hasVarCol = true;
|
||||||
}
|
}
|
||||||
|
if (IS_DECIMAL_TYPE(pColInfoData->info.type)) {
|
||||||
|
pColInfoData->info.scale = pColInfoData->info.bytes & 0xFF;
|
||||||
|
pColInfoData->info.precision = pColInfoData->info.precision = (pColInfoData->info.bytes & 0xFF00) >> 8;
|
||||||
|
pColInfoData->info.bytes >>= 24;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = blockDataEnsureCapacity(pBlock, numOfRows);
|
int32_t code = blockDataEnsureCapacity(pBlock, numOfRows);
|
||||||
|
|
|
@ -94,10 +94,11 @@ tDataTypeCompress tDataCompress[TSDB_DATA_TYPE_MAX] = {
|
||||||
{TSDB_DATA_TYPE_JSON, 4, TSDB_MAX_JSON_TAG_LEN, "JSON", 0, 0, tsCompressString2, tsDecompressString2},
|
{TSDB_DATA_TYPE_JSON, 4, TSDB_MAX_JSON_TAG_LEN, "JSON", 0, 0, tsCompressString2, tsDecompressString2},
|
||||||
{TSDB_DATA_TYPE_VARBINARY, 9, 1, "VARBINARY", 0, 0, tsCompressString2,
|
{TSDB_DATA_TYPE_VARBINARY, 9, 1, "VARBINARY", 0, 0, tsCompressString2,
|
||||||
tsDecompressString2}, // placeholder, not implemented
|
tsDecompressString2}, // placeholder, not implemented
|
||||||
{TSDB_DATA_TYPE_DECIMAL, 7, 1, "DECIMAL", 0, 0, NULL, NULL}, // placeholder, not implemented
|
{TSDB_DATA_TYPE_DECIMAL, 7, DECIMAL128_BYTES, "DECIMAL", 0, 0, tsCompressDecimal128, tsDecompressDecimal128}, // placeholder, not implemented
|
||||||
{TSDB_DATA_TYPE_BLOB, 4, 1, "BLOB", 0, 0, NULL, NULL}, // placeholder, not implemented
|
{TSDB_DATA_TYPE_BLOB, 4, 1, "BLOB", 0, 0, NULL, NULL}, // placeholder, not implemented
|
||||||
{TSDB_DATA_TYPE_MEDIUMBLOB, 10, 1, "MEDIUMBLOB", 0, 0, NULL, NULL}, // placeholder, not implemented
|
{TSDB_DATA_TYPE_MEDIUMBLOB, 10, 1, "MEDIUMBLOB", 0, 0, NULL, NULL}, // placeholder, not implemented
|
||||||
{TSDB_DATA_TYPE_GEOMETRY, 8, 1, "GEOMETRY", 0, 0, tsCompressString2, tsDecompressString2},
|
{TSDB_DATA_TYPE_GEOMETRY, 8, 1, "GEOMETRY", 0, 0, tsCompressString2, tsDecompressString2},
|
||||||
|
{TSDB_DATA_TYPE_DECIMAL64, 9, DECIMAL64_BYTES, "DECIMAL64", 0, 0, tsCompressDecimal64, tsDecompressDecimal64}, // placeholder, not implemented
|
||||||
// TODO wjm decimal compress
|
// TODO wjm decimal compress
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -236,3 +237,13 @@ int32_t operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type) {
|
||||||
uint8_t decimalTypeFromPrecision(uint8_t precision) {
|
uint8_t decimalTypeFromPrecision(uint8_t precision) {
|
||||||
return precision > TSDB_DECIMAL64_MAX_PRECISION ? TSDB_DATA_TYPE_DECIMAL : TSDB_DATA_TYPE_DECIMAL64;
|
return precision > TSDB_DECIMAL64_MAX_PRECISION ? TSDB_DATA_TYPE_DECIMAL : TSDB_DATA_TYPE_DECIMAL64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STypeMod decimalCalcTypeMod(uint8_t prec, uint8_t scale) {
|
||||||
|
return ((STypeMod)prec << 8) + scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale) {
|
||||||
|
*precision = (uint8_t)((typeMod >> 8) & 0xFF);
|
||||||
|
*scale = (uint8_t)(typeMod & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ target_include_directories(
|
||||||
)
|
)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
decimal
|
decimal
|
||||||
PRIVATE os util common qcom nodes
|
PRIVATE os common
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "decimal.h"
|
#include "decimal.h"
|
||||||
#include "querynodes.h"
|
|
||||||
#include "wideInteger.h"
|
#include "wideInteger.h"
|
||||||
|
#include "tdataformat.h"
|
||||||
|
|
||||||
typedef enum DecimalInternalType {
|
typedef enum DecimalInternalType {
|
||||||
DECIMAL_64 = 0,
|
DECIMAL_64 = 0,
|
||||||
|
@ -50,6 +50,10 @@ static uint8_t maxPrecision(DecimalInternalType type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const uint8_t typeConvertDecimalPrec[] = {
|
||||||
|
0, 1, 3, 5, 10, 19, TSDB_DECIMAL128_MAX_PRECISION, TSDB_DECIMAL_MAX_PRECISION, 0, 19, 10, 3, 5, 10, 20, 0,
|
||||||
|
0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
int32_t decimalGetRetType(const SDataType* pLeftT, const SDataType* pRightT, EOperatorType opType,
|
int32_t decimalGetRetType(const SDataType* pLeftT, const SDataType* pRightT, EOperatorType opType,
|
||||||
SDataType* pOutType) {
|
SDataType* pOutType) {
|
||||||
if (IS_FLOAT_TYPE(pLeftT->type) || IS_FLOAT_TYPE(pRightT->type) || IS_VAR_DATA_TYPE(pLeftT->type) ||
|
if (IS_FLOAT_TYPE(pLeftT->type) || IS_FLOAT_TYPE(pRightT->type) || IS_VAR_DATA_TYPE(pLeftT->type) ||
|
||||||
|
@ -69,12 +73,12 @@ int32_t decimalGetRetType(const SDataType* pLeftT, const SDataType* pRightT, EOp
|
||||||
uint8_t p1 = pLeftT->precision, s1 = pLeftT->scale, p2 = pRightT->precision, s2 = pRightT->scale;
|
uint8_t p1 = pLeftT->precision, s1 = pLeftT->scale, p2 = pRightT->precision, s2 = pRightT->scale;
|
||||||
|
|
||||||
if (!IS_DECIMAL_TYPE(pLeftT->type)) {
|
if (!IS_DECIMAL_TYPE(pLeftT->type)) {
|
||||||
p1 = TSDB_DECIMAL_MAX_PRECISION;
|
p1 = typeConvertDecimalPrec[pLeftT->type];
|
||||||
s1 = s2; // TODO wjm take which scale? Maybe use default DecimalMax
|
s1 = 0;
|
||||||
}
|
}
|
||||||
if (!IS_DECIMAL_TYPE(pRightT->type)) {
|
if (!IS_DECIMAL_TYPE(pRightT->type)) {
|
||||||
p1 = TSDB_DECIMAL_MAX_PRECISION;
|
p2 = typeConvertDecimalPrec[pRightT->type];
|
||||||
s2 = s1;
|
s2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (opType) {
|
switch (opType) {
|
||||||
|
@ -104,26 +108,13 @@ int32_t decimalGetRetType(const SDataType* pLeftT, const SDataType* pRightT, EOp
|
||||||
pOutType->precision = TSDB_DECIMAL_MAX_PRECISION;
|
pOutType->precision = TSDB_DECIMAL_MAX_PRECISION;
|
||||||
pOutType->scale = TMAX(minScale, (int8_t)(pOutType->scale) - delta);
|
pOutType->scale = TMAX(minScale, (int8_t)(pOutType->scale) - delta);
|
||||||
}
|
}
|
||||||
pOutType->type =
|
pOutType->type = TSDB_DATA_TYPE_DECIMAL;
|
||||||
pOutType->precision > TSDB_DECIMAL64_MAX_PRECISION ? TSDB_DATA_TYPE_DECIMAL : TSDB_DATA_TYPE_DECIMAL64;
|
|
||||||
pOutType->bytes = tDataTypes[pOutType->type].bytes;
|
pOutType->bytes = tDataTypes[pOutType->type].bytes;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* result);
|
static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* result);
|
||||||
|
|
||||||
int32_t decimalCalcTypeMod(const SDataType* pType) {
|
|
||||||
if (IS_DECIMAL_TYPE(pType->type)) {
|
|
||||||
return (pType->precision << 8) + pType->scale;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decimalFromTypeMod(STypeMod typeMod, uint8_t* precision, uint8_t* scale) {
|
|
||||||
*precision = (uint8_t)((typeMod >> 8) & 0xFF);
|
|
||||||
*scale = (uint8_t)(typeMod & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* result) {
|
static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* result) {
|
||||||
int32_t code = 0, pos = 0;
|
int32_t code = 0, pos = 0;
|
||||||
result->precision = 0;
|
result->precision = 0;
|
||||||
|
@ -675,6 +666,8 @@ static int32_t decimal128ToStr(const DecimalType* pInt, uint8_t scale, char* pBu
|
||||||
int32_t wholeLen = len - scale;
|
int32_t wholeLen = len - scale;
|
||||||
if (wholeLen > 0) {
|
if (wholeLen > 0) {
|
||||||
TAOS_STRNCAT(pBuf, buf, wholeLen);
|
TAOS_STRNCAT(pBuf, buf, wholeLen);
|
||||||
|
} else {
|
||||||
|
TAOS_STRNCAT(pBuf, "0", 2);
|
||||||
}
|
}
|
||||||
if (scale > 0) {
|
if (scale > 0) {
|
||||||
TAOS_STRNCAT(pBuf, ".", 2);
|
TAOS_STRNCAT(pBuf, ".", 2);
|
||||||
|
@ -698,20 +691,6 @@ int32_t decimalToStr(const DecimalType* pDec, int8_t dataType, int8_t precision,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool needScaleToOutScale(EOperatorType op) {
|
|
||||||
switch (op) {
|
|
||||||
case OP_TYPE_ADD:
|
|
||||||
case OP_TYPE_SUB:
|
|
||||||
return true; // convert precision and scale
|
|
||||||
case OP_TYPE_MULTI:
|
|
||||||
case OP_TYPE_DIV:
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decimalAddLargePositive(Decimal* pX, const SDataType* pXT, const Decimal* pY, const SDataType* pYT,
|
static void decimalAddLargePositive(Decimal* pX, const SDataType* pXT, const Decimal* pY, const SDataType* pYT,
|
||||||
const SDataType* pOT) {
|
const SDataType* pOT) {
|
||||||
Decimal wholeX = *pX, wholeY = *pY, fracX = {0}, fracY = {0};
|
Decimal wholeX = *pX, wholeY = *pY, fracX = {0}, fracY = {0};
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "decimal.h"
|
#include "decimal.h"
|
||||||
#include "libs/nodes/querynodes.h"
|
#include "libs/nodes/querynodes.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
|
#include "tdatablock.h"
|
||||||
#include "wideInteger.h"
|
#include "wideInteger.h"
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -133,6 +135,30 @@ struct NumericType<128> {
|
||||||
static constexpr int8_t maxPrec = TSDB_DECIMAL_MAX_PRECISION;
|
static constexpr int8_t maxPrec = TSDB_DECIMAL_MAX_PRECISION;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct TrivialTypeInfo {
|
||||||
|
using TrivialType = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DEFINE_TRIVIAL_TYPE_HELPER(type, tsdb_type) \
|
||||||
|
template <> \
|
||||||
|
struct TrivialTypeInfo<type> { \
|
||||||
|
static constexpr type dataType = tsdb_type; \
|
||||||
|
static constexpr int32_t bytes = sizeof(type); \
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(int8_t, TSDB_DATA_TYPE_TINYINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(uint8_t, TSDB_DATA_TYPE_UTINYINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(int16_t, TSDB_DATA_TYPE_SMALLINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(uint16_t, TSDB_DATA_TYPE_USMALLINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(int32_t, TSDB_DATA_TYPE_INT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(uint32_t, TSDB_DATA_TYPE_UINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(int64_t, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(uint64_t, TSDB_DATA_TYPE_UBIGINT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(float, TSDB_DATA_TYPE_FLOAT);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(double, TSDB_DATA_TYPE_DOUBLE);
|
||||||
|
DEFINE_TRIVIAL_TYPE_HELPER(bool, TSDB_DATA_TYPE_BOOL);
|
||||||
|
|
||||||
template <int ByteNum>
|
template <int ByteNum>
|
||||||
class Numeric {
|
class Numeric {
|
||||||
using Type = typename NumericType<ByteNum>::Type;
|
using Type = typename NumericType<ByteNum>::Type;
|
||||||
|
@ -178,25 +204,43 @@ class Numeric {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <int ByteNum2, int ByteNumO = 128>
|
template <int ByteNumO, typename T>
|
||||||
Numeric<ByteNumO> operator+(const Numeric<ByteNum2>& r) {
|
Numeric<ByteNumO> binaryOp(const T& r, EOperatorType op) {
|
||||||
return binaryOp<ByteNum2, ByteNumO>(r, OP_TYPE_ADD);
|
using TypeInfo = TrivialTypeInfo<T>;
|
||||||
|
SDataType lt{.type = NumericType<ByteNum>::dataType, .precision = prec_, .scale = scale_, .bytes = ByteNum};
|
||||||
|
SDataType rt{.type = TypeInfo::dataType, .precision = 0, .scale = 0, .bytes = TypeInfo::bytes};
|
||||||
|
SDataType ot = getRetType(op, lt, rt);
|
||||||
|
Numeric<ByteNumO> out{ot.precision, ot.scale, "0"};
|
||||||
|
int32_t code = decimalOp(op, <, &rt, &ot, &dec_, &r, &out);
|
||||||
|
if (code != 0) throw std::overflow_error(tstrerror(code));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
#define DEFINE_OPERATOR(op, op_type) \
|
||||||
|
template <int ByteNum2, int ByteNumO = 128> \
|
||||||
|
Numeric<ByteNumO> operator op(const Numeric<ByteNum2>& r) { \
|
||||||
|
cout << *this << " " #op " " << r << " = "; \
|
||||||
|
auto res = binaryOp<ByteNum2, ByteNumO>(r, op_type); \
|
||||||
|
cout << res << endl; \
|
||||||
|
return res; \
|
||||||
}
|
}
|
||||||
|
|
||||||
template <int ByteNum2, int ByteNumO = 128>
|
DEFINE_OPERATOR(+, OP_TYPE_ADD);
|
||||||
Numeric<ByteNumO> operator-(const Numeric<ByteNum2>& r) {
|
DEFINE_OPERATOR(-, OP_TYPE_SUB);
|
||||||
return binaryOp<ByteNum2, ByteNumO>(r, OP_TYPE_SUB);
|
DEFINE_OPERATOR(*, OP_TYPE_MULTI);
|
||||||
}
|
DEFINE_OPERATOR(/, OP_TYPE_DIV);
|
||||||
|
|
||||||
template <int ByteNum2, int ByteNumO = 128>
|
#define DEFINE_OPERATOR_T(op, op_type) \
|
||||||
Numeric<ByteNumO> operator*(const Numeric<ByteNum2>& r) {
|
template <typename T, int ByteNumO = 128> \
|
||||||
return binaryOp<ByteNum2, ByteNumO>(r, OP_TYPE_MULTI);
|
Numeric<ByteNumO> operator op(const T & r) { \
|
||||||
}
|
cout << *this << " " #op " " << r << " = "; \
|
||||||
|
auto res = binaryOp<ByteNumO, T>(r, op_type); \
|
||||||
template <int ByteNum2, int ByteNumO = 128>
|
cout << res << endl; \
|
||||||
Numeric<ByteNumO> operator/(const Numeric<ByteNum2>& r) {
|
return res; \
|
||||||
return binaryOp<ByteNum2, ByteNumO>(r, OP_TYPE_DIV);
|
|
||||||
}
|
}
|
||||||
|
DEFINE_OPERATOR_T(+, OP_TYPE_ADD);
|
||||||
|
DEFINE_OPERATOR_T(-, OP_TYPE_SUB);
|
||||||
|
DEFINE_OPERATOR_T(*, OP_TYPE_MULTI);
|
||||||
|
DEFINE_OPERATOR_T(/, OP_TYPE_DIV);
|
||||||
|
|
||||||
template <int ByteNum2>
|
template <int ByteNum2>
|
||||||
Numeric& operator+=(const Numeric<ByteNum2>& r) {
|
Numeric& operator+=(const Numeric<ByteNum2>& r) {
|
||||||
|
@ -240,12 +284,10 @@ TEST(decimal, numeric) {
|
||||||
Numeric<64> dec{10, 4, "123.456"};
|
Numeric<64> dec{10, 4, "123.456"};
|
||||||
Numeric<64> dec2{18, 10, "123456.123123"};
|
Numeric<64> dec2{18, 10, "123456.123123"};
|
||||||
auto o = dec + dec2;
|
auto o = dec + dec2;
|
||||||
cout << dec << " + " << dec2 << " = " << o << endl;
|
|
||||||
ASSERT_EQ(o.toString(), "123579.5791230000");
|
ASSERT_EQ(o.toString(), "123579.5791230000");
|
||||||
|
|
||||||
Numeric<128> dec128{37, 10, "123456789012300.09876543"};
|
Numeric<128> dec128{37, 10, "123456789012300.09876543"};
|
||||||
o = dec + dec128;
|
o = dec + dec128;
|
||||||
cout << dec << " + " << dec128 << " = " << o << endl;
|
|
||||||
ASSERT_EQ(o.toStringTrimTailingZeros(), "123456789012423.55476543");
|
ASSERT_EQ(o.toStringTrimTailingZeros(), "123456789012423.55476543");
|
||||||
ASSERT_EQ(o.toString(), "123456789012423.5547654300");
|
ASSERT_EQ(o.toString(), "123456789012423.5547654300");
|
||||||
|
|
||||||
|
@ -256,25 +298,52 @@ TEST(decimal, numeric) {
|
||||||
ASSERT_EQ(os2.toStringTrimTailingZeros(), dec.toStringTrimTailingZeros());
|
ASSERT_EQ(os2.toStringTrimTailingZeros(), dec.toStringTrimTailingZeros());
|
||||||
|
|
||||||
os = dec * dec2;
|
os = dec * dec2;
|
||||||
cout << dec << " * " << dec2 << " = " << os << endl;
|
|
||||||
ASSERT_EQ(os.toStringTrimTailingZeros(), "15241399.136273088");
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "15241399.136273088");
|
||||||
ASSERT_EQ(os.toString(), "15241399.13627308800000");
|
ASSERT_EQ(os.toString(), "15241399.13627308800000");
|
||||||
|
|
||||||
os = dec * dec128;
|
os = dec * dec128;
|
||||||
cout << dec << " * " << dec128 << " = " << os << endl;
|
|
||||||
ASSERT_EQ(os.toStringTrimTailingZeros(), "15241481344302520.993184");
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "15241481344302520.993184");
|
||||||
ASSERT_EQ(os.toString(), "15241481344302520.993184");
|
ASSERT_EQ(os.toString(), "15241481344302520.993184");
|
||||||
|
|
||||||
os2 = os / dec128;
|
os2 = os / dec128;
|
||||||
cout << os << " / " << dec128 << " = " << os2 << endl;
|
|
||||||
ASSERT_EQ(os2.toStringTrimTailingZeros(), "123.456");
|
ASSERT_EQ(os2.toStringTrimTailingZeros(), "123.456");
|
||||||
ASSERT_EQ(os2.toString(), "123.456000");
|
ASSERT_EQ(os2.toString(), "123.456000");
|
||||||
|
|
||||||
os = dec2 / dec;
|
os = dec2 / dec;
|
||||||
cout << dec2 << " / " << dec << " = " << os;
|
|
||||||
ASSERT_EQ(os.toString(), "1000.000997302682737169518");
|
ASSERT_EQ(os.toString(), "1000.000997302682737169518");
|
||||||
|
|
||||||
|
int32_t a = 123;
|
||||||
|
os = dec + a;
|
||||||
|
ASSERT_EQ(os.toString(), "246.4560");
|
||||||
|
|
||||||
|
os = dec * a;
|
||||||
|
ASSERT_EQ(os.toString(), "15185.0880");
|
||||||
|
|
||||||
|
os = dec / 2;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "61.728");
|
||||||
|
|
||||||
|
os = dec2 / 2;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "61728.0615615");
|
||||||
|
|
||||||
|
os = dec128 / 2;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "61728394506150.049382715");
|
||||||
|
|
||||||
|
auto dec3 = Numeric<64>(10, 2, "171154.38");
|
||||||
|
os = dec3 / 2;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "85577.19");
|
||||||
|
|
||||||
|
auto dec4 = Numeric<64>(10, 5, "1.23456");
|
||||||
|
os = dec4 / 2;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "0.61728");
|
||||||
|
|
||||||
|
os = dec4 / 123123123;
|
||||||
|
ASSERT_EQ(os.toStringTrimTailingZeros(), "0.0000000100270361075880117");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TEST where decimal column in (...)
|
||||||
|
// TEST same decimal type with different scale doing comparing or operations
|
||||||
|
// TEST case when select common type
|
||||||
|
|
||||||
TEST(decimal, a) {
|
TEST(decimal, a) {
|
||||||
__int128 a = generate_big_int128(37);
|
__int128 a = generate_big_int128(37);
|
||||||
extractWideInteger<9>(a);
|
extractWideInteger<9>(a);
|
||||||
|
@ -326,20 +395,28 @@ TEST(decimal128, divide) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(decimal, cpi_taos_fetch_rows) {
|
TEST(decimal, cpi_taos_fetch_rows) {
|
||||||
//GTEST_SKIP();
|
|
||||||
const char* host = "127.0.0.1";
|
const char* host = "127.0.0.1";
|
||||||
const char* user = "root";
|
const char* user = "root";
|
||||||
const char* passwd = "taosdata";
|
const char* passwd = "taosdata";
|
||||||
const char* db = "test";
|
const char* db = "test_api";
|
||||||
const char* sql = "select c1, c2 from nt";
|
const char* create_tb = "create table if not exists test_api.nt(ts timestamp, c1 decimal(10, 2), c2 decimal(38, 10))";
|
||||||
|
const char* sql = "select c1, c2 from test_api.nt";
|
||||||
|
const char* sql_insert = "insert into test_api.nt values(now, 123456.123, 98472981092.1209111)";
|
||||||
|
|
||||||
TAOS* pTaos = taos_connect(host, user, passwd, db, 0);
|
TAOS* pTaos = taos_connect(host, user, passwd, NULL, 0);
|
||||||
if (!pTaos) {
|
if (!pTaos) {
|
||||||
cout << "taos connect failed: " << host << " " << taos_errstr(NULL);
|
cout << "taos connect failed: " << host << " " << taos_errstr(NULL);
|
||||||
FAIL();
|
FAIL();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* res = taos_query(pTaos, sql);
|
auto* res = taos_query(pTaos, (std::string("create database if not exists ") + db).c_str());
|
||||||
|
taos_free_result(res);
|
||||||
|
res = taos_query(pTaos, create_tb);
|
||||||
|
taos_free_result(res);
|
||||||
|
res = taos_query(pTaos, sql_insert);
|
||||||
|
taos_free_result(res);
|
||||||
|
|
||||||
|
res = taos_query(pTaos, sql);
|
||||||
int32_t code = taos_errno(res);
|
int32_t code = taos_errno(res);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
||||||
|
@ -359,6 +436,7 @@ TEST(decimal, cpi_taos_fetch_rows) {
|
||||||
code = taos_errno(res);
|
code = taos_errno(res);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
||||||
|
taos_free_result(res);
|
||||||
FAIL();
|
FAIL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,8 +447,35 @@ TEST(decimal, cpi_taos_fetch_rows) {
|
||||||
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
cout << "taos_query with sql: " << sql << " failed: " << taos_errstr(res);
|
||||||
FAIL();
|
FAIL();
|
||||||
}
|
}
|
||||||
|
if (numOfRows > 0) {
|
||||||
|
int32_t version = *(int32_t*)pData;
|
||||||
|
ASSERT_EQ(version, BLOCK_VERSION_1);
|
||||||
|
int32_t rows = *(int32_t*)((char*)pData + 4 + 4);
|
||||||
|
int32_t colNum = *(int32_t*)((char*)pData + 4 + 4 + 4);
|
||||||
|
int32_t bytes_skip = 4 + 4 + 4 + 4 + 4 + 8;
|
||||||
|
char* p = (char*)pData + bytes_skip;
|
||||||
|
// col1
|
||||||
|
int8_t t = *(int8_t*)p;
|
||||||
|
int32_t type_mod = *(int32_t*)(p + 1);
|
||||||
|
|
||||||
SSDataBlock* pBlock;
|
ASSERT_EQ(t, TSDB_DATA_TYPE_DECIMAL64);
|
||||||
|
auto check_type_mod = [](int32_t type_mod, uint8_t prec, uint8_t scale, int32_t bytes) {
|
||||||
|
ASSERT_EQ(type_mod & 0xFF, scale);
|
||||||
|
ASSERT_EQ((type_mod & 0xFF00) >> 8, prec);
|
||||||
|
ASSERT_EQ(type_mod >> 24, bytes);
|
||||||
|
};
|
||||||
|
check_type_mod(type_mod, 10, 2, 8);
|
||||||
|
|
||||||
|
// col2
|
||||||
|
p += 5;
|
||||||
|
t = *(int8_t*)p;
|
||||||
|
type_mod = *(int32_t*)(p + 1);
|
||||||
|
check_type_mod(type_mod, 38, 10, 16);
|
||||||
|
|
||||||
|
p = p + 5 + BitmapLen(numOfRows) + colNum * 4;
|
||||||
|
int64_t row1Val = *(int64_t*)p;
|
||||||
|
ASSERT_EQ(row1Val, 12345612);
|
||||||
|
}
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
|
|
||||||
taos_close(pTaos);
|
taos_close(pTaos);
|
||||||
|
@ -466,8 +571,8 @@ TEST(decimal, decimalOpRetType) {
|
||||||
EOperatorType op = OP_TYPE_ADD;
|
EOperatorType op = OP_TYPE_ADD;
|
||||||
auto ta = getDecimalType(10, 2);
|
auto ta = getDecimalType(10, 2);
|
||||||
auto tb = getDecimalType(10, 2);
|
auto tb = getDecimalType(10, 2);
|
||||||
SDataType tc{}, tExpect = {.type = TSDB_DATA_TYPE_DECIMAL64, .precision = 11, .scale = 2, .bytes = sizeof(Decimal64)};
|
SDataType tc{}, tExpect = {.type = TSDB_DATA_TYPE_DECIMAL, .precision = 11, .scale = 2, .bytes = sizeof(Decimal)};
|
||||||
int32_t code = decimalGetRetType(&ta, &tb, op, &tc);
|
int32_t code = decimalGetRetType(&ta, &tb, op, &tc);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(tExpect, tc);
|
ASSERT_EQ(tExpect, tc);
|
||||||
|
|
||||||
|
@ -477,7 +582,7 @@ TEST(decimal, decimalOpRetType) {
|
||||||
code = decimalGetRetType(&ta, &tb, op, &tc);
|
code = decimalGetRetType(&ta, &tb, op, &tc);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
tExpect.type = TSDB_DATA_TYPE_DECIMAL;
|
tExpect.type = TSDB_DATA_TYPE_DECIMAL;
|
||||||
tExpect.precision = TSDB_DECIMAL_MAX_PRECISION;
|
tExpect.precision = 22;
|
||||||
tExpect.scale = 2;
|
tExpect.scale = 2;
|
||||||
tExpect.bytes = sizeof(Decimal);
|
tExpect.bytes = sizeof(Decimal);
|
||||||
ASSERT_EQ(tExpect, tc);
|
ASSERT_EQ(tExpect, tc);
|
||||||
|
@ -492,6 +597,15 @@ TEST(decimal, decimalOpRetType) {
|
||||||
tExpect.scale = 0;
|
tExpect.scale = 0;
|
||||||
tExpect.bytes = 8;
|
tExpect.bytes = 8;
|
||||||
ASSERT_EQ(tExpect, tc);
|
ASSERT_EQ(tExpect, tc);
|
||||||
|
|
||||||
|
op = OP_TYPE_DIV;
|
||||||
|
ta = getDecimalType(10, 2);
|
||||||
|
tb = getDecimalType(10, 2);
|
||||||
|
tExpect.type = TSDB_DATA_TYPE_DECIMAL;
|
||||||
|
tExpect.precision = 23;
|
||||||
|
tExpect.scale = 13;
|
||||||
|
tExpect.bytes = sizeof(Decimal);
|
||||||
|
code = decimalGetRetType(&ta, &tb, op, &tc);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(decimal, op) {
|
TEST(decimal, op) {
|
||||||
|
@ -507,15 +621,15 @@ TEST(decimal, op) {
|
||||||
code = decimal64FromStr(strb, strlen(strb), tb.precision, tb.scale, &b);
|
code = decimal64FromStr(strb, strlen(strb), tb.precision, tb.scale, &b);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SDataType tc{}, tExpect{.type = TSDB_DATA_TYPE_DECIMAL64, .precision = 11, .scale = 2, .bytes = sizeof(Decimal64)};
|
SDataType tc{}, tExpect{.type = TSDB_DATA_TYPE_DECIMAL, .precision = 11, .scale = 2, .bytes = sizeof(Decimal)};
|
||||||
code = decimalGetRetType(&ta, &tb, op, &tc);
|
code = decimalGetRetType(&ta, &tb, op, &tc);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(tc, tExpect);
|
ASSERT_EQ(tc, tExpect);
|
||||||
Decimal64 res{};
|
Decimal res{};
|
||||||
code = decimalOp(op, &ta, &tb, &tc, &a, &b, &res);
|
code = decimalOp(op, &ta, &tb, &tc, &a, &b, &res);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
checkDecimal(&res, TSDB_DATA_TYPE_DECIMAL64, tc.precision, tc.scale, "580.11");
|
checkDecimal(&res, TSDB_DATA_TYPE_DECIMAL, tc.precision, tc.scale, "580.11");
|
||||||
|
|
||||||
a = {1234567890};
|
a = {1234567890};
|
||||||
b = {9876543210};
|
b = {9876543210};
|
||||||
|
|
|
@ -1509,7 +1509,7 @@ int64_t int64SafeSub(int64_t a, int64_t b) {
|
||||||
|
|
||||||
STypeMod calcTypeMod(const SDataType* pType) {
|
STypeMod calcTypeMod(const SDataType* pType) {
|
||||||
if (IS_DECIMAL_TYPE(pType->type)) {
|
if (IS_DECIMAL_TYPE(pType->type)) {
|
||||||
return decimalCalcTypeMod(pType);
|
return decimalCalcTypeMod(pType->precision, pType->scale);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,8 @@ __compar_fn_t gDataCompare[] = {
|
||||||
setChkInBytes2, setChkInBytes4, setChkInBytes8, comparestrRegexMatch,
|
setChkInBytes2, setChkInBytes4, setChkInBytes8, comparestrRegexMatch,
|
||||||
comparestrRegexNMatch, setChkNotInBytes1, setChkNotInBytes2, setChkNotInBytes4,
|
comparestrRegexNMatch, setChkNotInBytes1, setChkNotInBytes2, setChkNotInBytes4,
|
||||||
setChkNotInBytes8, compareChkNotInString, comparestrPatternNMatch, comparewcsPatternNMatch,
|
setChkNotInBytes8, compareChkNotInString, comparestrPatternNMatch, comparewcsPatternNMatch,
|
||||||
comparewcsRegexMatch, comparewcsRegexNMatch, compareLenBinaryVal
|
comparewcsRegexMatch, comparewcsRegexNMatch, compareLenBinaryVal, compareDecimal64,
|
||||||
|
compareDecimal128,
|
||||||
};
|
};
|
||||||
|
|
||||||
__compar_fn_t gInt8SignCompare[] = {compareInt8Val, compareInt8Int16, compareInt8Int32,
|
__compar_fn_t gInt8SignCompare[] = {compareInt8Val, compareInt8Int16, compareInt8Int32,
|
||||||
|
@ -350,6 +351,11 @@ int32_t filterGetCompFuncIdx(int32_t type, int32_t optr, int8_t *comparFn, bool
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
*comparFn = 14;
|
*comparFn = 14;
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DECIMAL64:
|
||||||
|
*comparFn = 31;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
|
*comparFn = 32;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
*comparFn = 0;
|
*comparFn = 0;
|
||||||
|
@ -362,7 +368,7 @@ int32_t filterGetCompFuncIdx(int32_t type, int32_t optr, int8_t *comparFn, bool
|
||||||
int32_t filterGetCompFunc(__compar_fn_t *func, int32_t type, int32_t optr) {
|
int32_t filterGetCompFunc(__compar_fn_t *func, int32_t type, int32_t optr) {
|
||||||
int8_t compFuncIdx = 0;
|
int8_t compFuncIdx = 0;
|
||||||
int32_t code = filterGetCompFuncIdx(type, optr, &compFuncIdx, true);
|
int32_t code = filterGetCompFuncIdx(type, optr, &compFuncIdx, true);
|
||||||
*func = gDataCompare[compFuncIdx];
|
if (TSDB_CODE_SUCCESS == code) *func = gDataCompare[compFuncIdx];
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,10 +43,12 @@
|
||||||
{ .type = (col).type, .precision = (col).precision, .bytes = (col).bytes, .scale = (col).scale }
|
{ .type = (col).type, .precision = (col).precision, .bytes = (col).bytes, .scale = (col).scale }
|
||||||
|
|
||||||
bool noConvertBeforeCompare(int32_t leftType, int32_t rightType, int32_t optr) {
|
bool noConvertBeforeCompare(int32_t leftType, int32_t rightType, int32_t optr) {
|
||||||
return IS_NUMERIC_TYPE(leftType) && IS_NUMERIC_TYPE(rightType) &&
|
return !IS_DECIMAL_TYPE(leftType) && !IS_DECIMAL_TYPE(rightType) && IS_NUMERIC_TYPE(leftType) &&
|
||||||
(optr >= OP_TYPE_GREATER_THAN && optr <= OP_TYPE_NOT_EQUAL);
|
IS_NUMERIC_TYPE(rightType) && (optr >= OP_TYPE_GREATER_THAN && optr <= OP_TYPE_NOT_EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t vectorMathOpForDecimal(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t step, int32_t i, EOperatorType op);
|
||||||
|
|
||||||
int32_t convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) {
|
int32_t convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) {
|
||||||
switch (outType) {
|
switch (outType) {
|
||||||
case TSDB_DATA_TYPE_BOOL: {
|
case TSDB_DATA_TYPE_BOOL: {
|
||||||
|
@ -1027,53 +1029,55 @@ int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut,
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t gConvertTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
|
int8_t gConvertTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
|
||||||
/* NULL BOOL TINY SMAL INT BIG FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM*/
|
/*NULL BOOL TINY SMAL INT BIG FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM DEC64*/
|
||||||
/*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
/*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 5, 9, 5, 11, 12, 13, 14, 0, -1, 0, 0, 0, -1,
|
/*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 5, 9, 5, 11, 12, 13, 14, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 5, 9, 5, 3, 4, 5, 7, 0, -1, 0, 0, 0, -1,
|
/*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 5, 9, 5, 3, 4, 5, 7, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 5, 9, 5, 3, 4, 5, 7, 0, -1, 0, 0, 0, -1,
|
/*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 5, 9, 5, 3, 4, 5, 7, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 5, 9, 5, 4, 4, 5, 7, 0, -1, 0, 0, 0, -1,
|
/*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 5, 9, 5, 4, 4, 5, 7, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 5, 9, 5, 5, 5, 5, 7, 0, -1, 0, 0, 0, -1,
|
/*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 5, 9, 5, 5, 5, 5, 7, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 6, 6, 6, 6, 6, 6, 6, 0, -1, 0, 0, 0, -1,
|
/*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 6, 6, 6, 6, 6, 6, 6, 0, -1, 7, 0, 0, -1, 7,
|
||||||
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, -1, 0, 0, 0, -1,
|
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, -1, 7, 0, 0, -1, 7,
|
||||||
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 16, 0, 0, 0, 20,
|
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 16, 7, 0, 0, 20, 7,
|
||||||
/*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 7, 0, -1, 0, 0, 0, -1,
|
/*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 7, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 16, 0, 0, 0, -1,
|
/*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 16, 7, 0, 0, -1, 7,
|
||||||
/*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 0, -1, 0, 0, 0, -1,
|
/*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, -1, 0, 0, 0, -1,
|
/*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, -1, 0, 0, 0, -1,
|
/*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1,
|
/*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 17, 0, 0, -1, 17,
|
||||||
/*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1,
|
/*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, -1,
|
||||||
/*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1,
|
/*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 7,
|
||||||
/*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1,
|
/*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, -1, 17,
|
||||||
/*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1,
|
/*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1,
|
||||||
/*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1,
|
/*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1,
|
||||||
/*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0
|
/*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1,
|
||||||
|
/*DEC64*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
|
int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
|
||||||
/* NULL BOOL TINY SMAL INT BIGI FLOA DOUB VARC TIM NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM*/
|
/*NULL BOOL TINY SMAL INT BIGI FLOA DOUB VARC TIM NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM DEC64*/
|
||||||
/*NULL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, 20,
|
/*NULL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -1, -1, 20, 21,
|
||||||
/*BOOL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1,
|
/*BOOL*/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*TINY*/ 0, 0, 2, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, -1, -1, -1, -1, -1, -1,
|
/*TINY*/ 0, 0, 2, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*SMAL*/ 0, 0, 0, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, -1, -1, -1, -1, -1, -1,
|
/*SMAL*/ 0, 0, 0, 3, 4, 5, 8, 8, 8, 5, 10, 3, 4, 5, 8, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*INT */ 0, 0, 0, 0, 4, 5, 8, 8, 8, 5, 10, 4, 4, 5, 8, -1, -1, -1, -1, -1, -1,
|
/*INT */ 0, 0, 0, 0, 4, 5, 8, 8, 8, 5, 10, 4, 4, 5, 8, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*BIGI*/ 0, 0, 0, 0, 0, 5, 8, 8, 8, 5, 10, 5, 5, 5, 8, -1, -1, -1, -1, -1, -1,
|
/*BIGI*/ 0, 0, 0, 0, 0, 5, 8, 8, 8, 5, 10, 5, 5, 5, 8, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*FLOA*/ 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 10, 8, 8, 8, 8, -1, -1, -1, -1, -1, -1,
|
/*FLOA*/ 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 10, 8, 8, 8, 8, -1, -1, 7, -1, -1, -1, 7,
|
||||||
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 10, 8, 8, 8, 8, -1, -1, -1, -1, -1, -1,
|
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 10, 8, 8, 8, 8, -1, -1, 7, -1, -1, -1, 7,
|
||||||
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 10, 8, 8, 8, 8, -1, 16, -1, -1, -1, -1,
|
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 10, 8, 8, 8, 8, -1, 16, 7, -1, -1, -1, 7,
|
||||||
/*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 5, 5, 5, 8, -1, -1, -1, -1, -1, -1,
|
/*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 5, 5, 5, 8, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, -1, -1, -1, -1, -1, -1,
|
/*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, -1, -1, 7, -1, -1, -1, 7,
|
||||||
/*UTINY*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1,
|
/*UTINY*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, -1, -1, -1, -1, -1, -1,
|
/*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, -1, -1, -1, -1, -1, -1,
|
/*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, -1, -1, -1, -1,
|
/*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, 17, -1, -1, -1, 17,
|
||||||
/*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -1, -1, -1, -1, -1,
|
/*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -1, -1, -1, -1, -1, -1,
|
||||||
/*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -1, -1, -1, -1,
|
/*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -1, -1, -1, -1, -1,
|
||||||
/*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1,
|
/*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 17,
|
||||||
/*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1,
|
/*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1,
|
||||||
/*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1,
|
/*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1,
|
||||||
/*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
|
/*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, -1,
|
||||||
|
/*DEC64*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
|
int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
|
||||||
|
@ -1117,6 +1121,9 @@ int32_t vectorConvertCols(SScalarParam *pLeft, SScalarParam *pRight, SScalarPara
|
||||||
int32_t leftType = GET_PARAM_TYPE(pLeft);
|
int32_t leftType = GET_PARAM_TYPE(pLeft);
|
||||||
int32_t rightType = GET_PARAM_TYPE(pRight);
|
int32_t rightType = GET_PARAM_TYPE(pRight);
|
||||||
if (leftType == rightType) {
|
if (leftType == rightType) {
|
||||||
|
if (IS_DECIMAL_TYPE(leftType)) {
|
||||||
|
//TODO wjm force do conversion for decimal type
|
||||||
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1309,23 +1316,7 @@ int32_t vectorMathAdd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
||||||
SCL_ERR_JRET(vectorMathAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
|
SCL_ERR_JRET(vectorMathAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
|
||||||
}
|
}
|
||||||
} else if (IS_DECIMAL_TYPE(pOutputCol->info.type)) {
|
} else if (IS_DECIMAL_TYPE(pOutputCol->info.type)) {
|
||||||
Decimal *output = (Decimal *)pOutputCol->pData;
|
SCL_ERR_JRET(vectorMathOpForDecimal(pLeft, pRight, pOut, step, i, OP_TYPE_ADD));
|
||||||
if (pLeft->numOfRows == pRight->numOfRows) {
|
|
||||||
for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
|
|
||||||
if (IS_NULL) {
|
|
||||||
colDataSetNULL(pOutputCol, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SDataType leftType = GET_COL_DATA_TYPE(pLeft->columnData->info),
|
|
||||||
rightType = GET_COL_DATA_TYPE(pRight->columnData->info),
|
|
||||||
outType = GET_COL_DATA_TYPE(pOutputCol->info);
|
|
||||||
SCL_ERR_JRET(decimalOp(OP_TYPE_ADD, &leftType, &rightType, &outType, colDataGetData(pLeftCol, i),
|
|
||||||
colDataGetData(pRightCol, i), output));
|
|
||||||
}
|
|
||||||
} else if (pLeft->numOfRows == 1) {
|
|
||||||
// TODO wjm
|
|
||||||
} else if (pRight->numOfRows == 1) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1402,10 +1393,8 @@ int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
||||||
int32_t leftConvert = 0, rightConvert = 0;
|
int32_t leftConvert = 0, rightConvert = 0;
|
||||||
SColumnInfoData *pLeftCol = NULL;
|
SColumnInfoData *pLeftCol = NULL;
|
||||||
SColumnInfoData *pRightCol = NULL;
|
SColumnInfoData *pRightCol = NULL;
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
|
||||||
|
|
||||||
if (checkOperatorRestypeIsTimestamp(OP_TYPE_SUB, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight))) { // timestamp minus duration
|
if (pOutputCol->info.type == TSDB_DATA_TYPE_TIMESTAMP) { // timestamp minus duration
|
||||||
int64_t *output = (int64_t *)pOutputCol->pData;
|
int64_t *output = (int64_t *)pOutputCol->pData;
|
||||||
_getBigintValue_fn_t getVectorBigintValueFnLeft;
|
_getBigintValue_fn_t getVectorBigintValueFnLeft;
|
||||||
_getBigintValue_fn_t getVectorBigintValueFnRight;
|
_getBigintValue_fn_t getVectorBigintValueFnRight;
|
||||||
|
@ -1431,7 +1420,9 @@ int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
||||||
*output = leftRes - rightRes;
|
*output = leftRes - rightRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (pOutputCol->info.type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
||||||
double *output = (double *)pOutputCol->pData;
|
double *output = (double *)pOutputCol->pData;
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
||||||
|
@ -1455,6 +1446,8 @@ int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
||||||
} else if (pRight->numOfRows == 1) {
|
} else if (pRight->numOfRows == 1) {
|
||||||
SCL_ERR_JRET(vectorMathSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i));
|
SCL_ERR_JRET(vectorMathSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i));
|
||||||
}
|
}
|
||||||
|
} else if (pOutputCol->info.type == TSDB_DATA_TYPE_DECIMAL) {
|
||||||
|
SCL_ERR_JRET(vectorMathOpForDecimal(pLeft, pRight, pOut, step, i, OP_TYPE_SUB));
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1502,31 +1495,35 @@ int32_t vectorMathMultiply(SScalarParam *pLeft, SScalarParam *pRight, SScalarPar
|
||||||
int32_t leftConvert = 0, rightConvert = 0;
|
int32_t leftConvert = 0, rightConvert = 0;
|
||||||
SColumnInfoData *pLeftCol = NULL;
|
SColumnInfoData *pLeftCol = NULL;
|
||||||
SColumnInfoData *pRightCol = NULL;
|
SColumnInfoData *pRightCol = NULL;
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
if (pOutputCol->info.type == TSDB_DATA_TYPE_DECIMAL) {
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
SCL_ERR_JRET(vectorMathOpForDecimal(pLeft, pRight, pOut, step, i, OP_TYPE_MULTI));
|
||||||
|
} else {
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
||||||
|
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
|
SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
|
SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
|
||||||
|
|
||||||
double *output = (double *)pOutputCol->pData;
|
double *output = (double *)pOutputCol->pData;
|
||||||
if (pLeft->numOfRows == pRight->numOfRows) {
|
if (pLeft->numOfRows == pRight->numOfRows) {
|
||||||
for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
|
for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
|
||||||
if (IS_NULL) {
|
if (IS_NULL) {
|
||||||
colDataSetNULL(pOutputCol, i);
|
colDataSetNULL(pOutputCol, i);
|
||||||
continue; // TODO set null or ignore
|
continue; // TODO set null or ignore
|
||||||
|
}
|
||||||
|
double leftRes = 0;
|
||||||
|
double rightRes = 0;
|
||||||
|
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
||||||
|
SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes));
|
||||||
|
*output = leftRes * rightRes;
|
||||||
}
|
}
|
||||||
double leftRes = 0;
|
} else if (pLeft->numOfRows == 1) {
|
||||||
double rightRes = 0;
|
SCL_ERR_JRET(vectorMathMultiplyHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
} else if (pRight->numOfRows == 1) {
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes));
|
SCL_ERR_JRET(vectorMathMultiplyHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
|
||||||
*output = leftRes * rightRes;
|
|
||||||
}
|
}
|
||||||
} else if (pLeft->numOfRows == 1) {
|
|
||||||
SCL_ERR_JRET(vectorMathMultiplyHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
|
|
||||||
} else if (pRight->numOfRows == 1) {
|
|
||||||
SCL_ERR_JRET(vectorMathMultiplyHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1546,37 +1543,21 @@ int32_t vectorMathDivide(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam
|
||||||
int32_t leftConvert = 0, rightConvert = 0;
|
int32_t leftConvert = 0, rightConvert = 0;
|
||||||
SColumnInfoData *pLeftCol = NULL;
|
SColumnInfoData *pLeftCol = NULL;
|
||||||
SColumnInfoData *pRightCol = NULL;
|
SColumnInfoData *pRightCol = NULL;
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
if (pOutputCol->info.type == TSDB_DATA_TYPE_DECIMAL) {
|
||||||
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
SCL_ERR_JRET(vectorMathOpForDecimal(pLeft, pRight, pOut, step, i, OP_TYPE_DIV));
|
||||||
|
} else {
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
||||||
|
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
||||||
|
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
_getDoubleValue_fn_t getVectorDoubleValueFnLeft;
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
_getDoubleValue_fn_t getVectorDoubleValueFnRight;
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
|
SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
|
SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
|
||||||
|
|
||||||
double *output = (double *)pOutputCol->pData;
|
double *output = (double *)pOutputCol->pData;
|
||||||
if (pLeft->numOfRows == pRight->numOfRows) {
|
if (pLeft->numOfRows == pRight->numOfRows) {
|
||||||
for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
|
for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
|
||||||
if (IS_NULL) { // divide by 0 check
|
if (IS_NULL) { // divide by 0 check
|
||||||
colDataSetNULL(pOutputCol, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double rightRes = 0;
|
|
||||||
SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes)));
|
|
||||||
if (rightRes == 0) {
|
|
||||||
colDataSetNULL(pOutputCol, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double leftRes = 0;
|
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
|
||||||
*output = leftRes / rightRes;
|
|
||||||
}
|
|
||||||
} else if (pLeft->numOfRows == 1) {
|
|
||||||
if (IS_HELPER_NULL(pLeftCol, 0)) { // Set pLeft->numOfRows NULL value
|
|
||||||
colDataSetNNULL(pOutputCol, 0, pRight->numOfRows);
|
|
||||||
} else {
|
|
||||||
for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
|
|
||||||
if (IS_HELPER_NULL(pRightCol, i)) { // divide by 0 check
|
|
||||||
colDataSetNULL(pOutputCol, i);
|
colDataSetNULL(pOutputCol, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1587,29 +1568,49 @@ int32_t vectorMathDivide(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
double leftRes = 0;
|
double leftRes = 0;
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, 0, &leftRes));
|
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
||||||
*output = leftRes / rightRes;
|
*output = leftRes / rightRes;
|
||||||
}
|
}
|
||||||
}
|
} else if (pLeft->numOfRows == 1) {
|
||||||
} else if (pRight->numOfRows == 1) {
|
if (IS_HELPER_NULL(pLeftCol, 0)) { // Set pLeft->numOfRows NULL value
|
||||||
if (IS_HELPER_NULL(pRightCol, 0)) { // Set pLeft->numOfRows NULL value (divde by 0 check)
|
colDataSetNNULL(pOutputCol, 0, pRight->numOfRows);
|
||||||
colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
|
|
||||||
} else {
|
|
||||||
double rightRes = 0;
|
|
||||||
SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes)));
|
|
||||||
if (rightRes == 0) {
|
|
||||||
colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
|
|
||||||
} else {
|
} else {
|
||||||
for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
|
for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
|
||||||
if (IS_HELPER_NULL(pLeftCol, i)) {
|
if (IS_HELPER_NULL(pRightCol, i)) { // divide by 0 check
|
||||||
|
colDataSetNULL(pOutputCol, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
double rightRes = 0;
|
||||||
|
SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes)));
|
||||||
|
if (rightRes == 0) {
|
||||||
colDataSetNULL(pOutputCol, i);
|
colDataSetNULL(pOutputCol, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
double leftRes = 0;
|
double leftRes = 0;
|
||||||
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, 0, &leftRes));
|
||||||
*output = leftRes / rightRes;
|
*output = leftRes / rightRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (pRight->numOfRows == 1) {
|
||||||
|
if (IS_HELPER_NULL(pRightCol, 0)) { // Set pLeft->numOfRows NULL value (divde by 0 check)
|
||||||
|
colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
|
||||||
|
} else {
|
||||||
|
double rightRes = 0;
|
||||||
|
SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes)));
|
||||||
|
if (rightRes == 0) {
|
||||||
|
colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
|
||||||
|
} else {
|
||||||
|
for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
|
||||||
|
if (IS_HELPER_NULL(pLeftCol, i)) {
|
||||||
|
colDataSetNULL(pOutputCol, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
double leftRes = 0;
|
||||||
|
SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
|
||||||
|
*output = leftRes / rightRes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1908,6 +1909,10 @@ int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pLeftVar, SScalarPara
|
||||||
} else {
|
} else {
|
||||||
fp = filterGetCompFuncEx(lType, rType, optr);
|
fp = filterGetCompFuncEx(lType, rType, optr);
|
||||||
}
|
}
|
||||||
|
if (!fp) {
|
||||||
|
qError("doVecotrCompare failed with fp is NULL, op: %d, lType: %d, rType: %d", optr, lType, rType);
|
||||||
|
return TSDB_CODE_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if (pLeftVar != NULL) {
|
if (pLeftVar != NULL) {
|
||||||
SCL_ERR_RET(filterGetCompFunc(&fpVar, GET_PARAM_TYPE(pLeftVar), optr));
|
SCL_ERR_RET(filterGetCompFunc(&fpVar, GET_PARAM_TYPE(pLeftVar), optr));
|
||||||
|
@ -2241,3 +2246,50 @@ bool checkOperatorRestypeIsTimestamp(EOperatorType opType, int32_t lType, int32_
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t vectorMathOpOneRowForDecimal(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t step,
|
||||||
|
int32_t i, EOperatorType op, SScalarParam *pOneRowParam) {
|
||||||
|
SScalarParam *pNotOneRowParam = pLeft == pOneRowParam ? pRight : pLeft;
|
||||||
|
Decimal *output = (Decimal *)pOut->columnData->pData;
|
||||||
|
int32_t code = 0;
|
||||||
|
SDataType leftType = GET_COL_DATA_TYPE(pLeft->columnData->info),
|
||||||
|
rightType = GET_COL_DATA_TYPE(pRight->columnData->info),
|
||||||
|
outType = GET_COL_DATA_TYPE(pOut->columnData->info);
|
||||||
|
if (IS_HELPER_NULL(pOneRowParam->columnData, 0)) {
|
||||||
|
colDataSetNNULL(pOut->columnData, 0, pNotOneRowParam->numOfRows);
|
||||||
|
} else {
|
||||||
|
for (; i < pNotOneRowParam->numOfRows && i >= 0 && TSDB_CODE_SUCCESS == code; i += step, output += 1) {
|
||||||
|
if (IS_HELPER_NULL(pNotOneRowParam->columnData, i)) {
|
||||||
|
colDataSetNULL(pOut->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
code = decimalOp(op, &leftType, &rightType, &outType,
|
||||||
|
colDataGetData(pLeft->columnData, pLeft == pOneRowParam ? 0 : i),
|
||||||
|
colDataGetData(pRight->columnData, pRight == pOneRowParam ? 0 : i), output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t vectorMathOpForDecimal(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t step, int32_t i, EOperatorType op) {
|
||||||
|
Decimal *output = (Decimal *)pOut->columnData->pData;
|
||||||
|
int32_t code = 0;
|
||||||
|
SDataType leftType = GET_COL_DATA_TYPE(pLeft->columnData->info),
|
||||||
|
rightType = GET_COL_DATA_TYPE(pRight->columnData->info),
|
||||||
|
outType = GET_COL_DATA_TYPE(pOut->columnData->info);
|
||||||
|
if (pLeft->numOfRows == pRight->numOfRows) {
|
||||||
|
for (; i < pRight->numOfRows && i >= 0 && TSDB_CODE_SUCCESS == code; i += step, output += 1) {
|
||||||
|
if (IS_NULL) {
|
||||||
|
colDataSetNULL(pOut->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
code = decimalOp(op, &leftType, &rightType, &outType, colDataGetData(pLeft->columnData, i),
|
||||||
|
colDataGetData(pRight->columnData, i), output);
|
||||||
|
}
|
||||||
|
} else if (pLeft->numOfRows == 1) {
|
||||||
|
code = vectorMathOpOneRowForDecimal(pLeft, pRight, pOut, step, i, op, pLeft);
|
||||||
|
} else if (pRight->numOfRows == 1) {
|
||||||
|
code = vectorMathOpOneRowForDecimal(pLeft, pRight, pOut, step, i, op, pRight);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ if(TD_LINUX)
|
||||||
util
|
util
|
||||||
PUBLIC os common
|
PUBLIC os common
|
||||||
PUBLIC lz4_static fast-lzma2 pcre2-8
|
PUBLIC lz4_static fast-lzma2 pcre2-8
|
||||||
PUBLIC api cjson geos_c TSZ
|
PUBLIC api cjson geos_c TSZ decimal
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "osString.h"
|
#include "osString.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
|
#include "decimal.h"
|
||||||
|
|
||||||
int32_t setChkInBytes1(const void *pLeft, const void *pRight) {
|
int32_t setChkInBytes1(const void *pLeft, const void *pRight) {
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
|
||||||
|
@ -1034,6 +1035,21 @@ int32_t compareUint64Uint32(const void *pLeft, const void *pRight) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t compareDecimal64(const void* pleft, const void* pright) {
|
||||||
|
SDecimalOps* pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL64);
|
||||||
|
if (pOps->gt(pleft, pright, WORD_NUM(Decimal64))) return 1;
|
||||||
|
if (pOps->lt(pleft, pright, WORD_NUM(Decimal64))) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDecimal128(const void* pleft, const void* pright) {
|
||||||
|
SDecimalOps* pOps = getDecimalOps(TSDB_DATA_TYPE_DECIMAL);
|
||||||
|
if (pOps->gt(pleft, pright, WORD_NUM(Decimal128))) return 1;
|
||||||
|
if (pOps->lt(pleft,pright, WORD_NUM(Decimal128))) return -1;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); }
|
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1637,7 +1637,7 @@ int32_t tsDecompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int
|
||||||
int8_t alvl = tsGetCompressL2Level(l2, lvl); \
|
int8_t alvl = tsGetCompressL2Level(l2, lvl); \
|
||||||
return compressL2Dict[l2].comprFn(pIn, nIn, pOut, nOut, type, alvl); \
|
return compressL2Dict[l2].comprFn(pIn, nIn, pOut, nOut, type, alvl); \
|
||||||
} else { \
|
} else { \
|
||||||
uTrace("dencode:%s, decompress:%s, level:%d, type:%s", "disabled", compressL2Dict[l1].name, lvl, \
|
uTrace("dencode:%s, decompress:%s, level:%d, type:%s", "disabled", compressL2Dict[l2].name, lvl, \
|
||||||
tDataTypes[type].name); \
|
tDataTypes[type].name); \
|
||||||
return compressL2Dict[l2].decomprFn(pIn, nIn, pOut, nOut, type); \
|
return compressL2Dict[l2].decomprFn(pIn, nIn, pOut, nOut, type); \
|
||||||
} \
|
} \
|
||||||
|
@ -1831,6 +1831,25 @@ int32_t tsDecompressBigint2(void *pIn, int32_t nIn, int32_t nEle, void *pOut, in
|
||||||
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_BIGINT, 0);
|
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_BIGINT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tsCompressDecimal64(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf) {
|
||||||
|
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_DECIMAL64, 1);
|
||||||
|
}
|
||||||
|
int32_t tsDecompressDecimal64(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf) {
|
||||||
|
|
||||||
|
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_DECIMAL64, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsCompressDecimal128(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf) {
|
||||||
|
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_DECIMAL, 1);
|
||||||
|
}
|
||||||
|
int32_t tsDecompressDecimal128(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint32_t cmprAlg,
|
||||||
|
void *pBuf, int32_t nBuf) {
|
||||||
|
FUNC_COMPRESS_IMPL(pIn, nIn, nEle, pOut, nOut, cmprAlg, pBuf, nBuf, TSDB_DATA_TYPE_DECIMAL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void tcompressDebug(uint32_t cmprAlg, uint8_t *l1Alg, uint8_t *l2Alg, uint8_t *level) {
|
void tcompressDebug(uint32_t cmprAlg, uint8_t *l1Alg, uint8_t *l2Alg, uint8_t *level) {
|
||||||
DEFINE_VAR(cmprAlg)
|
DEFINE_VAR(cmprAlg)
|
||||||
*l1Alg = l1;
|
*l1Alg = l1;
|
||||||
|
@ -1903,6 +1922,12 @@ int32_t getWordLength(char type) {
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
wordLength = CHAR_BYTES;
|
wordLength = CHAR_BYTES;
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DECIMAL64:
|
||||||
|
wordLength = DECIMAL64_BYTES;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
|
wordLength = DECIMAL128_BYTES;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
uError("Invalid decompress integer type:%d", type);
|
uError("Invalid decompress integer type:%d", type);
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
|
|
@ -32,13 +32,13 @@ class DecimalType:
|
||||||
if allow_weight_overflow:
|
if allow_weight_overflow:
|
||||||
weight = secrets.randbelow(40)
|
weight = secrets.randbelow(40)
|
||||||
else:
|
else:
|
||||||
weight = secrets.randbelow(self.precision + 1)
|
weight = secrets.randbelow(self.precision - self.scale)
|
||||||
if allow_scale_overflow:
|
if allow_scale_overflow:
|
||||||
dscale = secrets.randbelow(40 - weight + 1)
|
dscale = secrets.randbelow(40 - weight + 1)
|
||||||
else:
|
else:
|
||||||
dscale = secrets.randbelow(self.precision - weight + 1)
|
dscale = secrets.randbelow(self.precision - weight + 1)
|
||||||
digits :str = ''
|
digits :str = ''
|
||||||
for i in range(dscale):
|
for _ in range(weight):
|
||||||
digits += str(secrets.randbelow(10))
|
digits += str(secrets.randbelow(10))
|
||||||
if dscale > 0:
|
if dscale > 0:
|
||||||
digits += '.'
|
digits += '.'
|
||||||
|
@ -411,9 +411,9 @@ class TDTestCase:
|
||||||
tdLog.printNoPrefix("-------- test create decimal column")
|
tdLog.printNoPrefix("-------- test create decimal column")
|
||||||
self.columns = [
|
self.columns = [
|
||||||
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(10, 2))),
|
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(10, 2))),
|
||||||
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(20, 2))),
|
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(20, 4))),
|
||||||
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(30, 2))),
|
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(30, 8))),
|
||||||
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(38, 2))),
|
DataType(TypeEnum.DECIMAL, type_mod=DataType.get_decimal_type_mod(DecimalType(38, 10))),
|
||||||
DataType(TypeEnum.TINYINT),
|
DataType(TypeEnum.TINYINT),
|
||||||
DataType(TypeEnum.INT),
|
DataType(TypeEnum.INT),
|
||||||
DataType(TypeEnum.BIGINT),
|
DataType(TypeEnum.BIGINT),
|
||||||
|
@ -453,13 +453,15 @@ class TDTestCase:
|
||||||
## drop index from stb
|
## drop index from stb
|
||||||
### These ops will override the previous stbobjs and meta entries, so test it
|
### These ops will override the previous stbobjs and meta entries, so test it
|
||||||
|
|
||||||
|
## TODO test encode and compress for decimal type
|
||||||
|
|
||||||
def test_insert_decimal_values(self):
|
def test_insert_decimal_values(self):
|
||||||
|
|
||||||
for i in range(self.c_table_num):
|
for i in range(self.c_table_num):
|
||||||
pass
|
pass
|
||||||
#TableInserter(tdSql, self.db_name, f"{self.c_table_prefix}{i}", self.columns, self.tags).insert(1, 1537146000000, 500)
|
#TableInserter(tdSql, self.db_name, f"{self.c_table_prefix}{i}", self.columns, self.tags).insert(1, 1537146000000, 500)
|
||||||
|
|
||||||
TableInserter(tdSql, self.db_name, self.norm_table_name, self.columns).insert(1, 1537146000000, 500)
|
TableInserter(tdSql, self.db_name, self.norm_table_name, self.columns).insert(100, 1537146000000, 500)
|
||||||
|
|
||||||
|
|
||||||
## insert null/None for decimal type
|
## insert null/None for decimal type
|
||||||
|
|
Loading…
Reference in New Issue