• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4720

08 Sep 2025 08:43AM UTC coverage: 58.139% (-0.6%) from 58.762%
#4720

push

travis-ci

web-flow
Merge pull request #32881 from taosdata/enh/add-new-windows-ci

fix(ci): update workflow reference to use new Windows CI YAML

133181 of 292179 branches covered (45.58%)

Branch coverage included in aggregate %.

201691 of 283811 relevant lines covered (71.07%)

5442780.71 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

78.41
/source/libs/nodes/src/nodesTraverseFuncs.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "plannodes.h"
17
#include "querynodes.h"
18
#include "tmsg.h"
19

20
typedef enum ETraversalOrder {
21
  TRAVERSAL_PREORDER = 1,
22
  TRAVERSAL_INORDER,
23
  TRAVERSAL_POSTORDER,
24
} ETraversalOrder;
25

26
typedef EDealRes (*FNodeDispatcher)(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext);
27

28
static EDealRes walkExpr(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext);
29
static EDealRes walkExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeWalker walker, void* pContext);
30
static EDealRes walkPhysiPlan(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext);
31
static EDealRes walkPhysiPlans(SNodeList* pNodeList, ETraversalOrder order, FNodeWalker walker, void* pContext);
32

33
static EDealRes walkNode(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext,
40,695,899✔
34
                         FNodeDispatcher dispatcher) {
35
  if (NULL == pNode) {
40,695,899✔
36
    return DEAL_RES_CONTINUE;
1,020,666✔
37
  }
38

39
  EDealRes res = DEAL_RES_CONTINUE;
39,675,233✔
40

41
  if (TRAVERSAL_PREORDER == order) {
39,675,233✔
42
    res = walker(pNode, pContext);
11,834,167✔
43
    if (DEAL_RES_CONTINUE != res) {
11,841,804✔
44
      return res;
1,498,243✔
45
    }
46
  }
47

48
  res = dispatcher(pNode, order, walker, pContext);
38,184,627✔
49

50
  if (DEAL_RES_ERROR != res && DEAL_RES_END != res && TRAVERSAL_POSTORDER == order) {
38,193,908!
51
    res = walker(pNode, pContext);
27,840,627✔
52
  }
53

54
  return res;
38,236,113✔
55
}
56

57
static EDealRes dispatchExpr(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext) {
38,190,343✔
58
  EDealRes res = DEAL_RES_CONTINUE;
38,190,343✔
59

60
  switch (nodeType(pNode)) {
38,190,343!
61
    case QUERY_NODE_COLUMN:
26,513,302✔
62
    case QUERY_NODE_VALUE:
63
    case QUERY_NODE_LIMIT:
64
      // these node types with no subnodes
65
      break;
26,513,302✔
66
    case QUERY_NODE_OPERATOR: {
4,377,000✔
67
      SOperatorNode* pOpNode = (SOperatorNode*)pNode;
4,377,000✔
68
      res = walkExpr(pOpNode->pLeft, order, walker, pContext);
4,377,000✔
69
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,376,668✔
70
        res = walkExpr(pOpNode->pRight, order, walker, pContext);
4,375,449✔
71
      }
72
      break;
4,376,733✔
73
    }
74
    case QUERY_NODE_LOGIC_CONDITION:
339,290✔
75
      res = walkExprs(((SLogicConditionNode*)pNode)->pParameterList, order, walker, pContext);
339,290✔
76
      break;
339,375✔
77
    case QUERY_NODE_FUNCTION:
6,498,249✔
78
      res = walkExprs(((SFunctionNode*)pNode)->pParameterList, order, walker, pContext);
6,498,249✔
79
      break;
6,497,985✔
80
    case QUERY_NODE_REAL_TABLE:
187,371✔
81
    case QUERY_NODE_TEMP_TABLE:
82
    case QUERY_NODE_VIRTUAL_TABLE:
83
      break;  // todo
187,371✔
84
    case QUERY_NODE_JOIN_TABLE: {
19,538✔
85
      SJoinTableNode* pJoinTableNode = (SJoinTableNode*)pNode;
19,538✔
86
      res = walkExpr(pJoinTableNode->pLeft, order, walker, pContext);
19,538✔
87
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
19,538!
88
        res = walkExpr(pJoinTableNode->pRight, order, walker, pContext);
19,538✔
89
      }
90
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
19,538!
91
        res = walkExpr(pJoinTableNode->pOnCond, order, walker, pContext);
19,538✔
92
      }
93
      break;
19,538✔
94
    }
95
    case QUERY_NODE_GROUPING_SET:
16,288✔
96
      res = walkExprs(((SGroupingSetNode*)pNode)->pParameterList, order, walker, pContext);
16,288✔
97
      break;
16,288✔
98
    case QUERY_NODE_ORDER_BY_EXPR:
41,297✔
99
      res = walkExpr(((SOrderByExprNode*)pNode)->pExpr, order, walker, pContext);
41,297✔
100
      break;
41,298✔
101
    case QUERY_NODE_STATE_WINDOW: {
529✔
102
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
529✔
103
      res = walkExpr(pState->pExpr, order, walker, pContext);
529✔
104
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
529!
105
        res = walkExpr(pState->pCol, order, walker, pContext);
529✔
106
      }
107
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
529!
108
        res = walkExpr(pState->pTrueForLimit, order, walker, pContext);
529✔
109
      }
110
      break;
529✔
111
    }
112
    case QUERY_NODE_SESSION_WINDOW: {
658✔
113
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
658✔
114
      res = walkExpr((SNode*)pSession->pCol, order, walker, pContext);
658✔
115
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
658!
116
        res = walkExpr((SNode*)pSession->pGap, order, walker, pContext);
658✔
117
      }
118
      break;
658✔
119
    }
120
    case QUERY_NODE_INTERVAL_WINDOW: {
10,726✔
121
      SIntervalWindowNode* pInterval = (SIntervalWindowNode*)pNode;
10,726✔
122
      res = walkExpr(pInterval->pInterval, order, walker, pContext);
10,726✔
123
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
10,726!
124
        res = walkExpr(pInterval->pOffset, order, walker, pContext);
10,726✔
125
      }
126
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
10,726!
127
        res = walkExpr(pInterval->pSliding, order, walker, pContext);
10,726✔
128
      }
129
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
10,726!
130
        res = walkExpr(pInterval->pFill, order, walker, pContext);
10,726✔
131
      }
132
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
10,726!
133
        res = walkExpr(pInterval->pCol, order, walker, pContext);
10,726✔
134
      }
135
      break;
10,726✔
136
    }
137
    case QUERY_NODE_NODE_LIST:
32,852✔
138
      res = walkExprs(((SNodeListNode*)pNode)->pNodeList, order, walker, pContext);
32,852✔
139
      break;
32,851✔
140
    case QUERY_NODE_FILL: {
660✔
141
      SFillNode* pFill = (SFillNode*)pNode;
660✔
142
      res = walkExpr(pFill->pValues, order, walker, pContext);
660✔
143
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
660!
144
        res = walkExpr(pFill->pWStartTs, order, walker, pContext);
660✔
145
      }
146
      break;
660✔
147
    }
148
    case QUERY_NODE_RAW_EXPR:
×
149
      res = walkExpr(((SRawExprNode*)pNode)->pNode, order, walker, pContext);
×
150
      break;
×
151
    case QUERY_NODE_TARGET:
1,401✔
152
      res = walkExpr(((STargetNode*)pNode)->pExpr, order, walker, pContext);
1,401✔
153
      break;
1,400✔
154
    case QUERY_NODE_WHEN_THEN: {
6,757✔
155
      SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
6,757✔
156
      res = walkExpr(pWhenThen->pWhen, order, walker, pContext);
6,757✔
157
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
6,757!
158
        res = walkExpr(pWhenThen->pThen, order, walker, pContext);
6,757✔
159
      }
160
      break;
6,757✔
161
    }
162
    case QUERY_NODE_CASE_WHEN: {
5,546✔
163
      SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)pNode;
5,546✔
164
      res = walkExpr(pCaseWhen->pCase, order, walker, pContext);
5,546✔
165
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
5,546!
166
        res = walkExpr(pCaseWhen->pElse, order, walker, pContext);
5,546✔
167
      }
168
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
5,546!
169
        res = walkExprs(pCaseWhen->pWhenThenList, order, walker, pContext);
5,546✔
170
      }
171
      break;
5,546✔
172
    }
173
    case QUERY_NODE_EVENT_WINDOW: {
489✔
174
      SEventWindowNode* pEvent = (SEventWindowNode*)pNode;
489✔
175
      res = walkExpr(pEvent->pCol, order, walker, pContext);
489✔
176
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
489!
177
        res = walkExpr(pEvent->pStartCond, order, walker, pContext);
489✔
178
      }
179
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
489!
180
        res = walkExpr(pEvent->pEndCond, order, walker, pContext);
489✔
181
      }
182
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
489!
183
        res = walkExpr(pEvent->pTrueForLimit, order, walker, pContext);
489✔
184
      }
185
      break;
489✔
186
    }
187
    case QUERY_NODE_PERIOD_WINDOW: {
150✔
188
      SPeriodWindowNode* pPeriod = (SPeriodWindowNode*)pNode;
150✔
189
      res = walkExpr(pPeriod->pOffset, order, walker, pContext);
150✔
190
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
150!
191
        res = walkExpr(pPeriod->pPeroid, order, walker, pContext);
150✔
192
      }
193
      break;
150✔
194
    }
195
    case QUERY_NODE_COUNT_WINDOW: {
378✔
196
      SCountWindowNode* pCount = (SCountWindowNode*)pNode;
378✔
197
      res = walkExpr(pCount->pCol, order, walker, pContext);
378✔
198
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
378!
199
        res = walkExprs(pCount->pColList, order, walker, pContext);
378✔
200
      }
201
      break;
378✔
202
    }
203
    case QUERY_NODE_ANOMALY_WINDOW: {
×
204
      SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
×
205
      res = walkExpr(pAnomaly->pExpr, order, walker, pContext);
×
206
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
×
207
        res = walkExpr(pAnomaly->pCol, order, walker, pContext);
×
208
      }
209
      break;
×
210
    }
211
    default:
137,862✔
212
      break;
137,862✔
213
  }
214

215
  return res;
38,189,896✔
216
}
217

218
static EDealRes walkExpr(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext) {
40,723,690✔
219
  return walkNode(pNode, order, walker, pContext, dispatchExpr);
40,723,690✔
220
}
221

222
static EDealRes walkExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeWalker walker, void* pContext) {
8,160,470✔
223
  SNode* node;
224
  FOREACH(node, pNodeList) {
35,137,567✔
225
    EDealRes res = walkExpr(node, order, walker, pContext);
26,996,278✔
226
    if (DEAL_RES_ERROR == res || DEAL_RES_END == res) {
27,001,483!
227
      return res;
24,386✔
228
    }
229
  }
230
  return DEAL_RES_CONTINUE;
8,141,289✔
231
}
232

233
void nodesWalkExpr(SNode* pNode, FNodeWalker walker, void* pContext) {
1,313,340✔
234
  EDealRes res;
235
  res = walkExpr(pNode, TRAVERSAL_PREORDER, walker, pContext);
1,313,340✔
236
}
1,313,172✔
237

238
void nodesWalkExprs(SNodeList* pNodeList, FNodeWalker walker, void* pContext) {
1,244,283✔
239
  EDealRes res;
240
  res = walkExprs(pNodeList, TRAVERSAL_PREORDER, walker, pContext);
1,244,283✔
241
}
1,244,447✔
242

243
void nodesWalkExprPostOrder(SNode* pNode, FNodeWalker walker, void* pContext) {
3,494,516✔
244
  EDealRes res;
245
  res = walkExpr(pNode, TRAVERSAL_POSTORDER, walker, pContext);
3,494,516✔
246
}
3,496,318✔
247

248
void nodesWalkExprsPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext) {
24,358✔
249
  EDealRes res;
250
  res = walkExprs(pList, TRAVERSAL_POSTORDER, walker, pContext);
24,358✔
251
}
24,358✔
252

253
static void checkParamIsFunc(SFunctionNode* pFunc) {
635,796✔
254
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
635,796✔
255
  for (int32_t i = 0; i < numOfParams; ++i) {
1,767,950✔
256
    SNode* pPara = nodesListGetNode(pFunc->pParameterList, i);
1,132,110✔
257
    if (numOfParams > 1 && nodeType(pPara) == QUERY_NODE_FUNCTION) {
1,132,154✔
258
      ((SFunctionNode*)pPara)->node.asParam = true;
104,949✔
259
    }
260
    if (nodeType(pPara) == QUERY_NODE_COLUMN) {
1,132,154✔
261
      ((SColumnNode*)pPara)->node.asParam = true;
747,046✔
262
    }
263
    if (nodeType(pPara) == QUERY_NODE_VALUE) {
1,132,154✔
264
      ((SValueNode*)pPara)->node.asParam = true;
203,447✔
265
    }
266
  }
267
}
635,840✔
268

269
static EDealRes rewriteExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeRewriter rewriter, void* pContext);
270

271
static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewriter rewriter, void* pContext) {
11,041,373✔
272
  if (NULL == pRawNode || NULL == *pRawNode) {
11,041,373!
273
    return DEAL_RES_CONTINUE;
336,953✔
274
  }
275

276
  EDealRes res = DEAL_RES_CONTINUE;
10,704,420✔
277

278
  if (TRAVERSAL_PREORDER == order) {
10,704,420✔
279
    res = rewriter(pRawNode, pContext);
1,757,725✔
280
    if (DEAL_RES_CONTINUE != res) {
1,757,679✔
281
      return res;
231,612✔
282
    }
283
  }
284

285
  SNode* pNode = *pRawNode;
10,472,762✔
286
  switch (nodeType(pNode)) {
10,472,762!
287
    case QUERY_NODE_COLUMN:
8,487,681✔
288
    case QUERY_NODE_VALUE:
289
    case QUERY_NODE_LIMIT:
290
      // these node types with no subnodes
291
      break;
8,487,681✔
292
    case QUERY_NODE_OPERATOR: {
977,717✔
293
      SOperatorNode* pOpNode = (SOperatorNode*)pNode;
977,717✔
294
      res = rewriteExpr(&(pOpNode->pLeft), order, rewriter, pContext);
977,717✔
295
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
977,554✔
296
        res = rewriteExpr(&(pOpNode->pRight), order, rewriter, pContext);
977,516✔
297
      }
298
      break;
977,696✔
299
    }
300
    case QUERY_NODE_LOGIC_CONDITION:
270,469✔
301
      res = rewriteExprs(((SLogicConditionNode*)pNode)->pParameterList, order, rewriter, pContext);
270,469✔
302
      break;
270,511✔
303
    case QUERY_NODE_FUNCTION: {
635,802✔
304
      SFunctionNode* pFunc = (SFunctionNode*)pNode;
635,802✔
305
      checkParamIsFunc(pFunc);
635,802✔
306
      res = rewriteExprs(pFunc->pParameterList, order, rewriter, pContext);
635,802✔
307
      break;
635,784✔
308
    }
309
    case QUERY_NODE_REAL_TABLE:
26,438✔
310
    case QUERY_NODE_TEMP_TABLE:
311
    case QUERY_NODE_VIRTUAL_TABLE:
312
      break;  // todo
26,438✔
313
    case QUERY_NODE_JOIN_TABLE: {
2,919✔
314
      SJoinTableNode* pJoinTableNode = (SJoinTableNode*)pNode;
2,919✔
315
      res = rewriteExpr(&(pJoinTableNode->pLeft), order, rewriter, pContext);
2,919✔
316
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
2,919!
317
        res = rewriteExpr(&(pJoinTableNode->pRight), order, rewriter, pContext);
2,919✔
318
      }
319
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
2,919!
320
        res = rewriteExpr(&(pJoinTableNode->pOnCond), order, rewriter, pContext);
2,919✔
321
      }
322
      break;
2,919✔
323
    }
324
    case QUERY_NODE_GROUPING_SET:
4,840✔
325
      res = rewriteExprs(((SGroupingSetNode*)pNode)->pParameterList, order, rewriter, pContext);
4,840✔
326
      break;
4,840✔
327
    case QUERY_NODE_ORDER_BY_EXPR:
28,864✔
328
      res = rewriteExpr(&(((SOrderByExprNode*)pNode)->pExpr), order, rewriter, pContext);
28,864✔
329
      break;
28,863✔
330
    case QUERY_NODE_STATE_WINDOW: {
267✔
331
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
267✔
332
      res = rewriteExpr(&pState->pExpr, order, rewriter, pContext);
267✔
333
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
267!
334
        res = rewriteExpr(&pState->pCol, order, rewriter, pContext);
267✔
335
      }
336
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
267!
337
        res = rewriteExpr(&pState->pTrueForLimit, order, rewriter, pContext);
267✔
338
      }
339
      break;
267✔
340
    }
341
    case QUERY_NODE_SESSION_WINDOW: {
300✔
342
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
300✔
343
      res = rewriteExpr((SNode**)&pSession->pCol, order, rewriter, pContext);
300✔
344
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
300!
345
        res = rewriteExpr((SNode**)&pSession->pGap, order, rewriter, pContext);
300✔
346
      }
347
      break;
300✔
348
    }
349
    case QUERY_NODE_INTERVAL_WINDOW: {
4,602✔
350
      SIntervalWindowNode* pInterval = (SIntervalWindowNode*)pNode;
4,602✔
351
      res = rewriteExpr(&(pInterval->pInterval), order, rewriter, pContext);
4,602✔
352
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,602!
353
        res = rewriteExpr(&(pInterval->pOffset), order, rewriter, pContext);
4,602✔
354
      }
355
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,602!
356
        res = rewriteExpr(&(pInterval->pSliding), order, rewriter, pContext);
4,602✔
357
      }
358
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,602!
359
        res = rewriteExpr(&(pInterval->pSOffset), order, rewriter, pContext);
4,602✔
360
      }
361
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,602!
362
        res = rewriteExpr(&(pInterval->pFill), order, rewriter, pContext);
4,602✔
363
      }
364
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
4,602!
365
        res = rewriteExpr(&(pInterval->pCol), order, rewriter, pContext);
4,602✔
366
      }
367
      break;
4,602✔
368
    }
369
    case QUERY_NODE_NODE_LIST:
32,550✔
370
      res = rewriteExprs(((SNodeListNode*)pNode)->pNodeList, order, rewriter, pContext);
32,550✔
371
      break;
32,545✔
372
    case QUERY_NODE_FILL: {
934✔
373
      SFillNode* pFill = (SFillNode*)pNode;
934✔
374
      res = rewriteExpr(&pFill->pValues, order, rewriter, pContext);
934✔
375
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
934!
376
        res = rewriteExpr(&(pFill->pWStartTs), order, rewriter, pContext);
934✔
377
      }
378
      if (DEAL_RES_ERROR!= res && DEAL_RES_END!= res) {
934!
379
        res = rewriteExpr(&(pFill->pTimeRange), order, rewriter, pContext);
934✔
380
      }
381
      break;
934✔
382
    }
383
    case QUERY_NODE_RAW_EXPR:
×
384
      res = rewriteExpr(&(((SRawExprNode*)pNode)->pNode), order, rewriter, pContext);
×
385
      break;
×
386
    case QUERY_NODE_TARGET:
×
387
      res = rewriteExpr(&(((STargetNode*)pNode)->pExpr), order, rewriter, pContext);
×
388
      break;
×
389
    case QUERY_NODE_WHEN_THEN: {
219✔
390
      SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
219✔
391
      res = rewriteExpr(&pWhenThen->pWhen, order, rewriter, pContext);
219✔
392
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
219!
393
        res = rewriteExpr(&pWhenThen->pThen, order, rewriter, pContext);
219✔
394
      }
395
      break;
219✔
396
    }
397
    case QUERY_NODE_CASE_WHEN: {
150✔
398
      SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)pNode;
150✔
399
      res = rewriteExpr(&pCaseWhen->pCase, order, rewriter, pContext);
150✔
400
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
150!
401
        res = rewriteExpr(&pCaseWhen->pElse, order, rewriter, pContext);
150✔
402
      }
403
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
150!
404
        res = rewriteExprs(pCaseWhen->pWhenThenList, order, rewriter, pContext);
150✔
405
      }
406
      break;
150✔
407
    }
408
    case QUERY_NODE_EVENT_WINDOW: {
228✔
409
      SEventWindowNode* pEvent = (SEventWindowNode*)pNode;
228✔
410
      res = rewriteExpr(&pEvent->pCol, order, rewriter, pContext);
228✔
411
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
228!
412
        res = rewriteExpr(&pEvent->pStartCond, order, rewriter, pContext);
228✔
413
      }
414
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
228!
415
        res = rewriteExpr(&pEvent->pEndCond, order, rewriter, pContext);
210✔
416
      }
417
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
228!
418
        res = rewriteExpr(&pEvent->pTrueForLimit, order, rewriter, pContext);
204✔
419
      }
420
      break;
228✔
421
    }
422
    case QUERY_NODE_WINDOW_OFFSET: {
×
423
      SWindowOffsetNode* pWin = (SWindowOffsetNode*)pNode;
×
424
      res = rewriteExpr(&pWin->pStartOffset, order, rewriter, pContext);
×
425
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
×
426
        res = rewriteExpr(&pWin->pEndOffset, order, rewriter, pContext);
×
427
      }
428
      break;
×
429
    }
430
    case QUERY_NODE_COUNT_WINDOW: {
174✔
431
      SCountWindowNode* pCount = (SCountWindowNode*)pNode;
174✔
432
      res = rewriteExpr(&pCount->pCol, order, rewriter, pContext);
174✔
433
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
174!
434
        res = rewriteExprs(pCount->pColList, order, rewriter, pContext);
174✔
435
      }
436
      break;
174✔
437
    }
438
    case QUERY_NODE_ANOMALY_WINDOW: {
×
439
      SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
×
440
      res = rewriteExpr(&pAnomaly->pExpr, order, rewriter, pContext);
×
441
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
×
442
        res = rewriteExpr(&pAnomaly->pCol, order, rewriter, pContext);
×
443
      }
444
      break;
×
445
    }
446
    case QUERY_NODE_PERIOD_WINDOW: {
150✔
447
      SPeriodWindowNode* pPeriod = (SPeriodWindowNode*)pNode;
150✔
448
      res = rewriteExpr(&pPeriod->pOffset, order, rewriter, pContext);
150✔
449
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
150!
450
        res = rewriteExpr(&pPeriod->pPeroid, order, rewriter, pContext);
150✔
451
      }
452
      break;
150✔
453
    }
454
    case QUERY_NODE_STREAM_TAG_DEF: {
×
455
      SStreamTagDefNode* pTagDef = (SStreamTagDefNode*)pNode;
×
456
      res = rewriteExpr(&pTagDef->pTagExpr, order, rewriter, pContext);
×
457
      break;
×
458
    }
459
    case QUERY_NODE_TIME_RANGE: {
×
460
      STimeRangeNode* pTimeRange = (STimeRangeNode*)pNode;
×
461
      res = rewriteExpr(&pTimeRange->pStart, order, rewriter, pContext);
×
462
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
×
463
        res = rewriteExpr(&pTimeRange->pEnd, order, rewriter, pContext);
×
464
      }
465
      break;
×
466
    }
467

468
    default:
×
469
      break;
×
470
  }
471

472
  if (DEAL_RES_ERROR != res && DEAL_RES_END != res && TRAVERSAL_POSTORDER == order) {
10,472,759!
473
    res = rewriter(pRawNode, pContext);
8,963,397✔
474
  }
475

476
  return res;
10,472,950✔
477
}
478

479
static EDealRes rewriteExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeRewriter rewriter, void* pContext) {
1,246,792✔
480
  SNode** pNode;
481
  FOREACH_FOR_REWRITE(pNode, pNodeList) {
9,288,327✔
482
    EDealRes res = rewriteExpr(pNode, order, rewriter, pContext);
8,042,633✔
483
    if (DEAL_RES_ERROR == res || DEAL_RES_END == res) {
8,041,334!
484
      return res;
×
485
    }
486
  }
487
  return DEAL_RES_CONTINUE;
1,245,694✔
488
}
489

490
void nodesRewriteExpr(SNode** pNode, FNodeRewriter rewriter, void* pContext) {
177,308✔
491
  (void)rewriteExpr(pNode, TRAVERSAL_PREORDER, rewriter, pContext);
177,308✔
492
}
177,317✔
493

494
void nodesRewriteExprs(SNodeList* pList, FNodeRewriter rewriter, void* pContext) {
263,165✔
495
  (void)rewriteExprs(pList, TRAVERSAL_PREORDER, rewriter, pContext);
263,165✔
496
}
263,176✔
497

498
void nodesRewriteExprPostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext) {
796,578✔
499
  (void)rewriteExpr(pNode, TRAVERSAL_POSTORDER, rewriter, pContext);
796,578✔
500
}
796,752✔
501

502
void nodesRewriteExprsPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext) {
39,815✔
503
  (void)rewriteExprs(pList, TRAVERSAL_POSTORDER, rewriter, pContext);
39,815✔
504
}
39,794✔
505

506
void nodesWalkSelectStmtImpl(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext) {
198,995✔
507
  if (NULL == pSelect) {
198,995!
508
    return;
×
509
  }
510

511
  switch (clause) {
198,995!
512
    case SQL_CLAUSE_FROM:
173,701✔
513
      nodesWalkExpr(pSelect->pFromTable, walker, pContext);
173,701✔
514
      nodesWalkExpr(pSelect->pWhere, walker, pContext);
173,695✔
515
    case SQL_CLAUSE_WHERE:
176,295✔
516
      nodesWalkExprs(pSelect->pPartitionByList, walker, pContext);
176,295✔
517
    case SQL_CLAUSE_PARTITION_BY:
180,550✔
518
      nodesWalkExpr(pSelect->pWindow, walker, pContext);
180,550✔
519
    case SQL_CLAUSE_WINDOW:
181,829✔
520
      if (NULL != pSelect->pWindow) {
181,829✔
521
        if (QUERY_NODE_INTERVAL_WINDOW == nodeType(pSelect->pWindow)) {
13,013✔
522
          nodesWalkExpr(((SIntervalWindowNode*)pSelect->pWindow)->pFill, walker, pContext);
10,944✔
523
        }
524
        else if (QUERY_NODE_COUNT_WINDOW == nodeType(pSelect->pWindow)) {
2,069✔
525
          nodesWalkExprs(((SCountWindowNode*)pSelect->pWindow)->pColList, walker, pContext);
356✔
526
        }
527
      }
528
    case SQL_CLAUSE_FILL:
529
      nodesWalkExprs(pSelect->pGroupByList, walker, pContext);
181,829✔
530
    case SQL_CLAUSE_GROUP_BY:
194,848✔
531
      nodesWalkExpr(pSelect->pHaving, walker, pContext);
194,848✔
532
    case SQL_CLAUSE_HAVING:
195,376✔
533
    case SQL_CLAUSE_SELECT:
534
    case SQL_CLAUSE_DISTINCT:
535
      nodesWalkExprs(pSelect->pOrderByList, walker, pContext);
195,376✔
536
    case SQL_CLAUSE_ORDER_BY:
198,965✔
537
      nodesWalkExprs(pSelect->pProjectionList, walker, pContext);
198,965✔
538
      nodesWalkExprs(pSelect->pProjectionBindList, walker, pContext);
198,903✔
539
    default:
198,921✔
540
      break;
198,921✔
541
  }
542

543
  return;
198,921✔
544
}
545

546
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext) {
196,380✔
547
  nodesWalkSelectStmtImpl(pSelect, clause, walker, pContext);
196,380✔
548
}
196,296✔
549

550
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext) {
49,395✔
551
  if (NULL == pSelect) {
49,395!
552
    return;
×
553
  }
554

555
  switch (clause) {
49,395!
556
    case SQL_CLAUSE_FROM:
23,529✔
557
      nodesRewriteExpr(&(pSelect->pFromTable), rewriter, pContext);
23,529✔
558
      nodesRewriteExpr(&(pSelect->pWhere), rewriter, pContext);
23,525✔
559
    case SQL_CLAUSE_WHERE:
23,533✔
560
      nodesRewriteExprs(pSelect->pPartitionByList, rewriter, pContext);
23,533✔
561
    case SQL_CLAUSE_PARTITION_BY:
23,523✔
562
      nodesRewriteExpr(&(pSelect->pWindow), rewriter, pContext);
23,523✔
563
    case SQL_CLAUSE_WINDOW:
24,868✔
564
      if (NULL != pSelect->pWindow) {
24,868✔
565
        if (QUERY_NODE_INTERVAL_WINDOW == nodeType(pSelect->pWindow)) {
2,597✔
566
          nodesRewriteExpr(&(((SIntervalWindowNode*)pSelect->pWindow)->pFill), rewriter, pContext);
2,092✔
567
        } else if (QUERY_NODE_COUNT_WINDOW == nodeType(pSelect->pWindow)) {
505✔
568
          nodesRewriteExprs(((SCountWindowNode*)pSelect->pWindow)->pColList, rewriter, pContext);
76✔
569
        }
570
      }
571
    case SQL_CLAUSE_FILL:
572
      nodesRewriteExprs(pSelect->pGroupByList, rewriter, pContext);
24,948✔
573
    case SQL_CLAUSE_GROUP_BY:
48,767✔
574
      nodesRewriteExpr(&(pSelect->pHaving), rewriter, pContext);
48,767✔
575
    case SQL_CLAUSE_HAVING:
49,404✔
576
    case SQL_CLAUSE_SELECT:
577
    case SQL_CLAUSE_DISTINCT:
578
      nodesRewriteExprs(pSelect->pOrderByList, rewriter, pContext);
49,404✔
579
    case SQL_CLAUSE_ORDER_BY:
49,404✔
580
      nodesRewriteExprs(pSelect->pProjectionList, rewriter, pContext);
49,404✔
581
      nodesRewriteExprs(pSelect->pProjectionBindList, rewriter, pContext);
49,405✔
582
    default:
49,407✔
583
      break;
49,407✔
584
  }
585

586
  return;
49,407✔
587
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc