Merge pull request #5371 from taosdata/hotfix/TD-3184
[TD-3184]last(*) with group by doesn't work
This commit is contained in:
commit
9a42050b99
|
@ -1872,6 +1872,24 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void setLastOrderForGoupBy(SQueryInfo* pQueryInfo, STableMetaInfo* pTableMetaInfo) { // todo refactor
|
||||
SSqlGroupbyExpr* pGroupBy = &pQueryInfo->groupbyExpr;
|
||||
if (pGroupBy->numOfGroupCols > 0) {
|
||||
size_t idx = taosArrayGetSize(pQueryInfo->exprList);
|
||||
for(int32_t k = 0; k < pGroupBy->numOfGroupCols; ++k) {
|
||||
SColIndex* pIndex = taosArrayGet(pGroupBy->columnInfo, k);
|
||||
if (!TSDB_COL_IS_TAG(pIndex->flag) && pIndex->colIndex < tscGetNumOfColumns(pTableMetaInfo->pTableMeta)) { // group by normal columns
|
||||
SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, idx - 1);
|
||||
pExpr->numOfParams = 1;
|
||||
pExpr->param->i64 = TSDB_ORDER_ASC;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t colIndex, tSqlExprItem* pItem, bool finalResult) {
|
||||
STableMetaInfo* pTableMetaInfo = NULL;
|
||||
int32_t optr = pItem->pNode->nSQLOptr;
|
||||
|
@ -2152,6 +2170,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
if (setExprInfoForFunctions(pCmd, pQueryInfo, &pSchema[j], cvtFunc, name, colIndex++, &index, finalResult) != 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (optr == TK_LAST) {
|
||||
setLastOrderForGoupBy(pQueryInfo, pTableMetaInfo);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -2173,24 +2195,12 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
bool multiColOutput = pItem->pNode->pParam->nExpr > 1;
|
||||
setResultColName(name, pItem, cvtFunc.originFuncId, &pParamElem->pNode->colInfo, multiColOutput);
|
||||
|
||||
if (setExprInfoForFunctions(pCmd, pQueryInfo, pSchema, cvtFunc, name, colIndex + i, &index, finalResult) != 0) {
|
||||
if (setExprInfoForFunctions(pCmd, pQueryInfo, pSchema, cvtFunc, name, colIndex++, &index, finalResult) != 0) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
if (optr == TK_LAST) { // todo refactor
|
||||
SSqlGroupbyExpr* pGroupBy = &pQueryInfo->groupbyExpr;
|
||||
if (pGroupBy->numOfGroupCols > 0) {
|
||||
for(int32_t k = 0; k < pGroupBy->numOfGroupCols; ++k) {
|
||||
SColIndex* pIndex = taosArrayGet(pGroupBy->columnInfo, k);
|
||||
if (!TSDB_COL_IS_TAG(pIndex->flag) && pIndex->colIndex < tscGetNumOfColumns(pTableMetaInfo->pTableMeta)) { // group by normal columns
|
||||
SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, colIndex + i);
|
||||
pExpr->numOfParams = 1;
|
||||
pExpr->param->i64 = TSDB_ORDER_ASC;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (optr == TK_LAST) {
|
||||
setLastOrderForGoupBy(pQueryInfo, pTableMetaInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2220,6 +2230,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
colIndex++;
|
||||
|
||||
if (optr == TK_LAST) {
|
||||
setLastOrderForGoupBy(pQueryInfo, pTableMetaInfo);
|
||||
}
|
||||
}
|
||||
|
||||
numOfFields += tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
system sh/stop_dnodes.sh
|
||||
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 maxtablesPerVnode -v 2
|
||||
system sh/exec.sh -n dnode1 -s start
|
||||
|
||||
sleep 100
|
||||
sql connect
|
||||
print ======================== dnode1 start
|
||||
|
||||
$db = testdb
|
||||
|
||||
sql create database $db
|
||||
sql use $db
|
||||
|
||||
sql create stable st2 (ts timestamp, f1 int, f2 float, f3 double, f4 bigint, f5 smallint, f6 tinyint, f7 bool, f8 binary(10), f9 nchar(10)) tags (id1 int, id2 float, id3 nchar(10), id4 double, id5 smallint, id6 bigint, id7 binary(10))
|
||||
|
||||
sql create table tb1 using st2 tags (1,1.0,"1",1.0,1,1,"1");
|
||||
|
||||
sql insert into tb1 values (now-200s,1,1.0,1.0,1,1,1,true,"1","1")
|
||||
sql insert into tb1 values (now-100s,2,2.0,2.0,2,2,2,true,"2","2")
|
||||
sql insert into tb1 values (now,3,3.0,3.0,3,3,3,true,"3","3")
|
||||
sql insert into tb1 values (now+100s,4,4.0,4.0,4,4,4,true,"4","4")
|
||||
sql insert into tb1 values (now+200s,4,4.0,4.0,4,4,4,true,"4","4")
|
||||
sql insert into tb1 values (now+300s,4,4.0,4.0,4,4,4,true,"4","4")
|
||||
sql insert into tb1 values (now+400s,4,4.0,4.0,4,4,4,true,"4","4")
|
||||
sql insert into tb1 values (now+500s,4,4.0,4.0,4,4,4,true,"4","4")
|
||||
|
||||
sql select f1,last(*) from st2 group by f1;
|
||||
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data00 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data02 != 1 then
|
||||
print $data02
|
||||
return -1
|
||||
endi
|
||||
if $data03 != 1.00000 then
|
||||
return -1
|
||||
endi
|
||||
if $data04 != 1.000000000 then
|
||||
return -1
|
||||
endi
|
||||
if $data05 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data06 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data07 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data08 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data09 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select f1,last(f1,st2.*) from st2 group by f1;
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data00 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data01 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data03 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data04 != 1.00000 then
|
||||
return -1
|
||||
endi
|
||||
if $data05 != 1.000000000 then
|
||||
return -1
|
||||
endi
|
||||
if $data06 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data07 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data08 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data09 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue