Merge pull request #21365 from taosdata/fix/TD-24188
enh: optimize order by for partition by clause
This commit is contained in:
commit
27b228b79b
|
@ -37,19 +37,24 @@ typedef struct SRewriteExprCxt {
|
|||
int32_t errCode;
|
||||
SNodeList* pExprs;
|
||||
bool* pOutputs;
|
||||
bool isPartitionBy;
|
||||
} SRewriteExprCxt;
|
||||
|
||||
static void setColumnInfo(SFunctionNode* pFunc, SColumnNode* pCol) {
|
||||
static void setColumnInfo(SFunctionNode* pFunc, SColumnNode* pCol, bool isPartitionBy) {
|
||||
switch (pFunc->funcType) {
|
||||
case FUNCTION_TYPE_TBNAME:
|
||||
pCol->colType = COLUMN_TYPE_TBNAME;
|
||||
break;
|
||||
case FUNCTION_TYPE_WSTART:
|
||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||
if (!isPartitionBy) {
|
||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||
}
|
||||
pCol->colType = COLUMN_TYPE_WINDOW_START;
|
||||
break;
|
||||
case FUNCTION_TYPE_WEND:
|
||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||
if (!isPartitionBy) {
|
||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||
}
|
||||
pCol->colType = COLUMN_TYPE_WINDOW_END;
|
||||
break;
|
||||
case FUNCTION_TYPE_WDURATION:
|
||||
|
@ -103,7 +108,7 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
|
|||
strcpy(pCol->node.userAlias, ((SExprNode*)pExpr)->userAlias);
|
||||
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
|
||||
if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
|
||||
setColumnInfo((SFunctionNode*)pExpr, pCol);
|
||||
setColumnInfo((SFunctionNode*)pExpr, pCol, pCxt->isPartitionBy);
|
||||
}
|
||||
nodesDestroyNode(*pNode);
|
||||
*pNode = (SNode*)pCol;
|
||||
|
@ -142,7 +147,8 @@ static EDealRes doNameExpr(SNode* pNode, void* pContext) {
|
|||
|
||||
static int32_t rewriteExprForSelect(SNode* pExpr, SSelectStmt* pSelect, ESqlClause clause) {
|
||||
nodesWalkExpr(pExpr, doNameExpr, NULL);
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = NULL, .pOutputs = NULL};
|
||||
bool isPartitionBy = (pSelect->pPartitionByList && pSelect->pPartitionByList->length > 0) ? true : false;
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = NULL, .pOutputs = NULL, .isPartitionBy = isPartitionBy};
|
||||
cxt.errCode = nodesListMakeAppend(&cxt.pExprs, pExpr);
|
||||
if (TSDB_CODE_SUCCESS == cxt.errCode) {
|
||||
nodesRewriteSelectStmt(pSelect, clause, doRewriteExpr, &cxt);
|
||||
|
@ -170,7 +176,8 @@ static int32_t cloneRewriteExprs(SNodeList* pExprs, bool* pOutputs, SNodeList**
|
|||
static int32_t rewriteExprsForSelect(SNodeList* pExprs, SSelectStmt* pSelect, ESqlClause clause,
|
||||
SNodeList** pRewriteExprs) {
|
||||
nodesWalkExprs(pExprs, doNameExpr, NULL);
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL};
|
||||
bool isPartitionBy = (pSelect->pPartitionByList && pSelect->pPartitionByList->length > 0) ? true : false;
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL, .isPartitionBy = isPartitionBy};
|
||||
if (NULL != pRewriteExprs) {
|
||||
cxt.pOutputs = taosMemoryCalloc(LIST_LENGTH(pExprs), sizeof(bool));
|
||||
if (NULL == cxt.pOutputs) {
|
||||
|
@ -187,14 +194,14 @@ static int32_t rewriteExprsForSelect(SNodeList* pExprs, SSelectStmt* pSelect, ES
|
|||
|
||||
static int32_t rewriteExpr(SNodeList* pExprs, SNode** pTarget) {
|
||||
nodesWalkExprs(pExprs, doNameExpr, NULL);
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL};
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL, .isPartitionBy = false};
|
||||
nodesRewriteExpr(pTarget, doRewriteExpr, &cxt);
|
||||
return cxt.errCode;
|
||||
}
|
||||
|
||||
static int32_t rewriteExprs(SNodeList* pExprs, SNodeList* pTarget) {
|
||||
nodesWalkExprs(pExprs, doNameExpr, NULL);
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL};
|
||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs, .pOutputs = NULL, .isPartitionBy = false};
|
||||
nodesRewriteExprs(pTarget, doRewriteExpr, &cxt);
|
||||
return cxt.errCode;
|
||||
}
|
||||
|
|
|
@ -24,16 +24,83 @@ sql use $db
|
|||
sql create table $mt1 (ts timestamp, f1 int) TAGS(tag1 int, tag2 binary(500))
|
||||
sql create table tb0 using $mt1 tags(0, 'a');
|
||||
sql create table tb1 using $mt1 tags(1, 'b');
|
||||
sql create table tb2 using $mt1 tags(1, 'a');
|
||||
sql create table tb3 using $mt1 tags(1, 'a');
|
||||
sql create table tb4 using $mt1 tags(3, 'b');
|
||||
sql create table tb5 using $mt1 tags(3, 'a');
|
||||
sql create table tb6 using $mt1 tags(3, 'b');
|
||||
sql create table tb7 using $mt1 tags(3, 'b');
|
||||
sql create table tb2 using $mt1 tags(2, 'a');
|
||||
sql create table tb3 using $mt1 tags(3, 'a');
|
||||
sql create table tb4 using $mt1 tags(4, 'b');
|
||||
sql create table tb5 using $mt1 tags(5, 'a');
|
||||
sql create table tb6 using $mt1 tags(6, 'b');
|
||||
sql create table tb7 using $mt1 tags(7, 'b');
|
||||
|
||||
sql select * from $mt1 partition by tag1,tag2 limit 1;
|
||||
if $rows != 0 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql insert into tb0 values ('2022-04-26 15:15:08', 1);
|
||||
sql insert into tb1 values ('2022-04-26 15:15:07', 2);
|
||||
sql insert into tb2 values ('2022-04-26 15:15:06', 3);
|
||||
sql insert into tb3 values ('2022-04-26 15:15:05', 4);
|
||||
sql insert into tb4 values ('2022-04-26 15:15:04', 5);
|
||||
sql insert into tb5 values ('2022-04-26 15:15:03', 6);
|
||||
sql insert into tb6 values ('2022-04-26 15:15:02', 7);
|
||||
sql insert into tb7 values ('2022-04-26 15:15:01', 8);
|
||||
|
||||
sql select _wstart as ts, count(*) from $mt1 partition by tag1 interval(1s) order by _wstart;
|
||||
if $rows != 8 then
|
||||
return -1
|
||||
endi
|
||||
if $data00 != @22-04-26 15:15:01.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data01 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data10 != @22-04-26 15:15:02.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data11 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @22-04-26 15:15:03.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data21 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data30 != @22-04-26 15:15:04.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data31 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data40 != @22-04-26 15:15:05.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data41 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data50 != @22-04-26 15:15:06.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data51 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data60 != @22-04-26 15:15:07.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data61 != 1 then
|
||||
return -1
|
||||
endi
|
||||
if $data70 != @22-04-26 15:15:08.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data71 != 1 then
|
||||
return -1
|
||||
endi
|
||||
sql select * from (select _wstart as ts, count(*) from $mt1 partition by tag1 interval(1s) order by _wstart) order by ts;
|
||||
sql select _wstart as ts, count(*) from $mt1 interval(1s) order by _wstart;
|
||||
sql select * from (select _wstart as ts, count(*) from $mt1 interval(1s) order by _wstart) order by ts;
|
||||
sql select diff(a) from (select _wstart as ts, count(*) a from $mt1 interval(1s) order by _wstart);
|
||||
sql select diff(a) from (select _wstart as ts, count(*) a from $mt1 partition by tag1 interval(1s) order by _wstart);
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
|
|
Loading…
Reference in New Issue