[TD-2090]
This commit is contained in:
parent
d7e8b4c184
commit
c0ea91ef53
|
@ -130,11 +130,11 @@ typedef struct STopBotInfo {
|
||||||
} STopBotInfo;
|
} STopBotInfo;
|
||||||
|
|
||||||
// leastsquares do not apply to super table
|
// leastsquares do not apply to super table
|
||||||
typedef struct SLeastsquareInfo {
|
typedef struct SLeastsquaresInfo {
|
||||||
double mat[2][3];
|
double mat[2][3];
|
||||||
double startVal;
|
double startVal;
|
||||||
int64_t num;
|
int64_t num;
|
||||||
} SLeastsquareInfo;
|
} SLeastsquaresInfo;
|
||||||
|
|
||||||
typedef struct SAPercentileInfo {
|
typedef struct SAPercentileInfo {
|
||||||
SHistogramInfo *pHisto;
|
SHistogramInfo *pHisto;
|
||||||
|
@ -316,7 +316,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
||||||
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
*bytes = TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE; // string
|
*bytes = MAX(TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
||||||
*interBytes = *bytes;
|
*interBytes = *bytes;
|
||||||
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
|
@ -2756,7 +2756,7 @@ static bool leastsquares_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// 2*3 matrix
|
// 2*3 matrix
|
||||||
pInfo->startVal = pCtx->param[0].dKey;
|
pInfo->startVal = pCtx->param[0].dKey;
|
||||||
|
@ -2783,7 +2783,7 @@ static bool leastsquares_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
double(*param)[3] = pInfo->mat;
|
double(*param)[3] = pInfo->mat;
|
||||||
double x = pInfo->startVal;
|
double x = pInfo->startVal;
|
||||||
|
@ -2853,40 +2853,40 @@ static void leastsquares_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
double(*param)[3] = pInfo->mat;
|
double(*param)[3] = pInfo->mat;
|
||||||
|
|
||||||
switch (pCtx->inputType) {
|
switch (pCtx->inputType) {
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int32_t *p = pData;
|
int32_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t *p = pData;
|
int8_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int16_t *p = pData;
|
int16_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t *p = pData;
|
int64_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float *p = pData;
|
float *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double *p = pData;
|
double *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -2904,15 +2904,10 @@ static void leastsquares_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
// no data in query
|
// no data in query
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pInfo->num == 0) {
|
if (pInfo->num == 0) {
|
||||||
if (pCtx->outputType == TSDB_DATA_TYPE_BINARY || pCtx->outputType == TSDB_DATA_TYPE_NCHAR) {
|
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
||||||
setVardataNull(pCtx->aOutputBuf, pCtx->outputType);
|
|
||||||
} else {
|
|
||||||
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1257,7 +1257,7 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
|
||||||
return QUERY_IS_ASC_QUERY(pQuery);
|
return QUERY_IS_ASC_QUERY(pQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo add comments
|
// 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].i64Key == pQuery->order.order;
|
||||||
}
|
}
|
||||||
|
@ -2419,7 +2419,7 @@ static void ensureOutputBufferSimple(SQueryRuntimeEnv* pRuntimeEnv, int32_t capa
|
||||||
assert(bytes > 0 && capacity > 0);
|
assert(bytes > 0 && capacity > 0);
|
||||||
|
|
||||||
char *tmp = realloc(pQuery->sdata[i], bytes * capacity + sizeof(tFilePage));
|
char *tmp = realloc(pQuery->sdata[i], bytes * capacity + sizeof(tFilePage));
|
||||||
if (tmp == NULL) { // todo handle the oom
|
if (tmp == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
} else {
|
} else {
|
||||||
pQuery->sdata[i] = (tFilePage *)tmp;
|
pQuery->sdata[i] = (tFilePage *)tmp;
|
||||||
|
@ -2450,7 +2450,7 @@ static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pB
|
||||||
assert(bytes > 0 && newSize > 0);
|
assert(bytes > 0 && newSize > 0);
|
||||||
|
|
||||||
char *tmp = realloc(pQuery->sdata[i], bytes * newSize + sizeof(tFilePage));
|
char *tmp = realloc(pQuery->sdata[i], bytes * newSize + sizeof(tFilePage));
|
||||||
if (tmp == NULL) { // todo handle the oom
|
if (tmp == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
} else {
|
} else {
|
||||||
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
||||||
|
@ -3343,11 +3343,11 @@ void resetCtxOutputBuf(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
SResultRow* pRow = NULL;
|
SResultRow* pRow = NULL;
|
||||||
if (pRuntimeEnv->windowResInfo.size == 0) {
|
// if (pRuntimeEnv->windowResInfo.size == 0) {
|
||||||
int32_t groupIndex = 0;
|
int32_t groupIndex = 0;
|
||||||
int32_t uid = 0;
|
int32_t uid = 0;
|
||||||
pRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, (char *)&groupIndex, sizeof(groupIndex), true, uid);
|
pRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, (char *)&groupIndex, sizeof(groupIndex), true, uid);
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
||||||
|
|
|
@ -534,7 +534,7 @@ if $data03 != 99.000000000 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print ============>td-1765
|
print ============>td-1765
|
||||||
sql select percentile(c4, 49),min(c4),max(c4),avg(c4),stddev(c4) from group_tb0 group by c8;
|
sql select percentile(c4, 49),min(c4),max(c4),avg(c4),stddev(c4) from group_tb0 group by c8;
|
||||||
if $rows != 100 then
|
if $rows != 100 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -579,6 +579,24 @@ if $data14 != 2886.607004772 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
print ================>td-2090
|
||||||
|
sql select leastsquares(c2, 1, 1) from group_tb1 group by c8;
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @{slop:0.000000, intercept:0.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != @{slop:0.000000, intercept:1.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data90 != @{slop:0.000000, intercept:9.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
#=========================== group by multi tags ======================
|
#=========================== group by multi tags ======================
|
||||||
sql create table st (ts timestamp, c int) tags (t1 int, t2 int, t3 int, t4 int);
|
sql create table st (ts timestamp, c int) tags (t1 int, t2 int, t3 int, t4 int);
|
||||||
sql create table t1 using st tags(1, 1, 1, 1);
|
sql create table t1 using st tags(1, 1, 1, 1);
|
||||||
|
|
Loading…
Reference in New Issue