Merge pull request #25242 from taosdata/feat/ly_query

adj last function
This commit is contained in:
dapan1121 2024-04-15 16:04:23 +08:00 committed by GitHub
commit 34a943a1f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 219 additions and 6 deletions

View File

@ -158,6 +158,7 @@ extern int32_t tsMetaCacheMaxSize;
extern int32_t tsSlowLogThreshold;
extern int32_t tsSlowLogScope;
extern int32_t tsTimeSeriesThreshold;
extern bool tsMultiResultFunctionStarReturnTags;
// client
extern int32_t tsMinSlidingTime;

View File

@ -171,6 +171,7 @@ int32_t tsMetaCacheMaxSize = -1; // MB
int32_t tsSlowLogThreshold = 3; // seconds
int32_t tsSlowLogScope = SLOW_LOG_TYPE_ALL;
int32_t tsTimeSeriesThreshold = 50;
bool tsMultiResultFunctionStarReturnTags = false;
/*
* denote if the server needs to compress response message at the application layer to client, including query rsp,
@ -550,6 +551,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, CFG_SCOPE_BOTH, CFG_DYN_BOTH) != 0) return -1;
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 200000, CFG_SCOPE_BOTH, CFG_DYN_NONE) != 0) return -1;
if (cfgAddBool(pCfg, "multiResultFunctionStarReturnTags", tsMultiResultFunctionStarReturnTags, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
return 0;
}
@ -1117,6 +1120,8 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
tsKeepAliveIdle = cfgGetItem(pCfg, "keepAliveIdle")->i32;
tsExperimental = cfgGetItem(pCfg, "experimental")->bval;
tsMultiResultFunctionStarReturnTags = cfgGetItem(pCfg, "multiResultFunctionStarReturnTags")->bval;
return 0;
}
@ -1760,7 +1765,8 @@ static int32_t taosCfgDynamicOptionsForClient(SConfig *pCfg, char *name) {
{"shellActivityTimer", &tsShellActivityTimer},
{"slowLogThreshold", &tsSlowLogThreshold},
{"useAdapter", &tsUseAdapter},
{"experimental", &tsExperimental}};
{"experimental", &tsExperimental},
{"multiResultFunctionStarReturnTags", &tsMultiResultFunctionStarReturnTags} };
if (taosCfgSetOption(debugOptions, tListLen(debugOptions), pItem, true) != 0) {
taosCfgSetOption(options, tListLen(options), pItem, false);

View File

@ -3442,9 +3442,9 @@ static int32_t createMultiResFuncsParas(STranslateContext* pCxt, SNodeList* pSrc
SNode* pPara = NULL;
FOREACH(pPara, pSrcParas) {
if (nodesIsStar(pPara)) {
code = createAllColumns(pCxt, true, &pExprs);
code = createAllColumns(pCxt, !tsMultiResultFunctionStarReturnTags, &pExprs);
} else if (nodesIsTableStar(pPara)) {
code = createTableAllCols(pCxt, (SColumnNode*)pPara, true, &pExprs);
code = createTableAllCols(pCxt, (SColumnNode*)pPara, !tsMultiResultFunctionStarReturnTags, &pExprs);
} else {
code = nodesListMakeStrictAppend(&pExprs, nodesCloneNode(pPara));
}

View File

@ -2689,7 +2689,8 @@ static bool isNeedSplitCacheLastFunc(SFunctionNode* pFunc, SScanLogicNode* pScan
int32_t funcType = pFunc->funcType;
if ((FUNCTION_TYPE_LAST_ROW != funcType || (FUNCTION_TYPE_LAST_ROW == funcType && TSDB_CACHE_MODEL_LAST_VALUE == pScan->cacheLastMode)) &&
(FUNCTION_TYPE_LAST != funcType || (FUNCTION_TYPE_LAST == funcType && (TSDB_CACHE_MODEL_LAST_ROW == pScan->cacheLastMode ||
QUERY_NODE_OPERATOR == nodeType(nodesListGetNode(pFunc->pParameterList, 0)) || QUERY_NODE_VALUE == nodeType(nodesListGetNode(pFunc->pParameterList, 0))))) &&
QUERY_NODE_OPERATOR == nodeType(nodesListGetNode(pFunc->pParameterList, 0)) || QUERY_NODE_VALUE == nodeType(nodesListGetNode(pFunc->pParameterList, 0)) ||
COLUMN_TYPE_COLUMN != ((SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0))->colType))) &&
FUNCTION_TYPE_SELECT_VALUE != funcType && FUNCTION_TYPE_GROUP_KEY != funcType) {
return true;
}
@ -2709,8 +2710,9 @@ static bool lastRowScanOptCheckFuncList(SLogicNode* pNode, int8_t cacheLastModel
if (FUNCTION_TYPE_LAST == pAggFunc->funcType) {
if (QUERY_NODE_COLUMN == nodeType(pParam)) {
SColumnNode* pCol = (SColumnNode*)pParam;
if (pCol->colType != COLUMN_TYPE_COLUMN) {
return false;
if (pCol->colType != COLUMN_TYPE_COLUMN && TSDB_CACHE_MODEL_LAST_ROW != cacheLastModel) {
needSplitFuncCount++;
*hasOtherFunc = true;
}
if (lastColId != pCol->colId) {
lastColId = pCol->colId;
@ -2991,6 +2993,13 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic
}
}
}
FOREACH(pColNode, pScan->pScanPseudoCols) {
if (nodesEqualNode(pParamNode, pColNode)) {
if (funcType != FUNCTION_TYPE_LAST) {
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
}
}
}
}
}
@ -3129,6 +3138,10 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg,
if (TSDB_CODE_SUCCESS != code) {
return code;
}
code = nodesCollectColumnsFromNode((SNode*)list, NULL, COLLECT_COL_TYPE_TAG, &pScan->pScanPseudoCols);
if (TSDB_CODE_SUCCESS != code) {
return code;
}
nodesFree(list);
bool found = false;
FOREACH(pNode, pScan->pScanCols) {
@ -3150,6 +3163,10 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg,
if (TSDB_CODE_SUCCESS != code) {
return code;
}
code = createColumnByRewriteExprs(pScan->pScanPseudoCols, &pScan->node.pTargets);
if (TSDB_CODE_SUCCESS != code) {
return code;
}
OPTIMIZE_FLAG_CLEAR_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_SCAN_PATH);
}

View File

@ -0,0 +1,189 @@
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/exec.sh -n dnode1 -s start
sql connect
sql alter local "multiResultFunctionStarReturnTags" "0";
print step1=====================
sql drop database if exists test;
sql create database test vgroups 4 CACHEMODEL 'both';
sql use test;
sql create stable st(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
sql create table t1 using st tags(1,1,1);
sql create table t2 using st tags(2,2,2);
sql create table t3 using st tags(3,3,3);
sql create table t4 using st tags(NULL,4,4);
sql insert into t1 values(1648791211000,1,1,1);
sql insert into t1 values(1648791211001,2,2,2);
sql insert into t2 values(1648791211002,3,3,3);
sql insert into t2 values(1648791211003,4,4,4);
sql insert into t3 values(1648791211004,5,5,5);
sql insert into t3 values(1648791211005,6,6,6);
sql insert into t4 values(1648791211007,NULL,NULL,NULL);
sql select last(*),last_row(*) from st;
if $cols != 8 then
print ======cols=$cols
return -1
endi
sql alter local "multiResultFunctionStarReturnTags" "1";
sql select last(*),last_row(*) from st;
if $cols != 14 then
print ======cols=$cols
return -1
endi
sql select last(*) from st;
if $cols != 7 then
return -1
endi
sql select last_row(*) from st;
if $cols != 7 then
return -1
endi
sql select last(*),last_row(*) from t1;
if $cols != 8 then
return -1
endi
print step2=====================
sql drop database if exists test1;
sql create database test1 vgroups 4 CACHEMODEL 'last_row';
sql use test1;
sql create stable st(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
sql create table t1 using st tags(1,1,1);
sql create table t2 using st tags(2,2,2);
sql create table t3 using st tags(3,3,3);
sql create table t4 using st tags(NULL,4,4);
sql insert into t1 values(1648791211000,1,1,1);
sql insert into t1 values(1648791211001,2,2,2);
sql insert into t2 values(1648791211002,3,3,3);
sql insert into t2 values(1648791211003,4,4,4);
sql insert into t3 values(1648791211004,5,5,5);
sql insert into t3 values(1648791211005,6,6,6);
sql insert into t4 values(1648791211007,NULL,NULL,NULL);
sql select last(*),last_row(*) from st;
if $cols != 14 then
return -1
endi
sql select last(*) from st;
if $cols != 7 then
return -1
endi
return -1
sql select last_row(*) from st;
if $cols != 7 then
return -1
endi
sql select last(*),last_row(*) from t1;
if $cols != 8 then
return -1
endi
print step3=====================
sql drop database if exists test2;
sql create database test2 vgroups 4 CACHEMODEL 'last_value';
sql use test2;
sql create stable st(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
sql create table t1 using st tags(1,1,1);
sql create table t2 using st tags(2,2,2);
sql create table t3 using st tags(3,3,3);
sql create table t4 using st tags(NULL,4,4);
sql insert into t1 values(1648791211000,1,1,1);
sql insert into t1 values(1648791211001,2,2,2);
sql insert into t2 values(1648791211002,3,3,3);
sql insert into t2 values(1648791211003,4,4,4);
sql insert into t3 values(1648791211004,5,5,5);
sql insert into t3 values(1648791211005,6,6,6);
sql insert into t4 values(1648791211007,NULL,NULL,NULL);
sql select last(*),last_row(*) from st;
if $cols != 14 then
return -1
endi
sql select last(*) from st;
if $cols != 7 then
return -1
endi
sql select last_row(*) from st;
if $cols != 7 then
return -1
endi
sql select last(*),last_row(*) from t1;
if $cols != 8 then
return -1
endi
sql drop database if exists test4;
sql create database test4 vgroups 4;
sql use test4;
sql create stable st(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
sql create table t1 using st tags(1,1,1);
sql create table t2 using st tags(2,2,2);
sql create table t3 using st tags(3,3,3);
sql create table t4 using st tags(NULL,4,4);
sql insert into t1 values(1648791211000,1,1,1);
sql insert into t1 values(1648791211001,2,2,2);
sql insert into t2 values(1648791211002,3,3,3);
sql insert into t2 values(1648791211003,4,4,4);
sql insert into t3 values(1648791211004,5,5,5);
sql insert into t3 values(1648791211005,6,6,6);
sql insert into t4 values(1648791211007,NULL,NULL,NULL);
sql select last(*),last_row(*) from st;
if $cols != 14 then
return -1
endi
sql select last(*) from st;
if $cols != 7 then
return -1
endi
sql select last_row(*) from st;
if $cols != 7 then
return -1
endi
sql select last(*),last_row(*) from t1;
if $cols != 8 then
return -1
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT