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

16
#include "plannodes.h"
X
Xiaoyu Wang 已提交
17
#include "querynodes.h"
18

19 20
typedef enum ETraversalOrder {
  TRAVERSAL_PREORDER = 1,
D
dapan1121 已提交
21 22
  TRAVERSAL_INORDER,
  TRAVERSAL_POSTORDER,
23
} ETraversalOrder;
24

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

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

X
Xiaoyu Wang 已提交
32 33
static EDealRes walkNode(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext,
                         FNodeDispatcher dispatcher) {
34
  if (NULL == pNode) {
35
    return DEAL_RES_CONTINUE;
36 37
  }

38 39 40 41 42 43 44
  EDealRes res = DEAL_RES_CONTINUE;

  if (TRAVERSAL_PREORDER == order) {
    res = walker(pNode, pContext);
    if (DEAL_RES_CONTINUE != res) {
      return res;
    }
45 46
  }

47 48 49 50 51 52 53 54 55 56 57 58
  res = dispatcher(pNode, order, walker, pContext);

  if (DEAL_RES_ERROR != res && DEAL_RES_END != res && TRAVERSAL_POSTORDER == order) {
    res = walker(pNode, pContext);
  }

  return res;
}

static EDealRes dispatchExpr(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext) {
  EDealRes res = DEAL_RES_CONTINUE;

59 60 61
  switch (nodeType(pNode)) {
    case QUERY_NODE_COLUMN:
    case QUERY_NODE_VALUE:
62
    case QUERY_NODE_LIMIT:
63
      // these node types with no subnodes
64
      break;
65 66
    case QUERY_NODE_OPERATOR: {
      SOperatorNode* pOpNode = (SOperatorNode*)pNode;
67
      res = walkExpr(pOpNode->pLeft, order, walker, pContext);
68
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
69
        res = walkExpr(pOpNode->pRight, order, walker, pContext);
70
      }
71
      break;
72 73
    }
    case QUERY_NODE_LOGIC_CONDITION:
74
      res = walkExprs(((SLogicConditionNode*)pNode)->pParameterList, order, walker, pContext);
75
      break;
76
    case QUERY_NODE_FUNCTION:
77
      res = walkExprs(((SFunctionNode*)pNode)->pParameterList, order, walker, pContext);
78
      break;
79 80
    case QUERY_NODE_REAL_TABLE:
    case QUERY_NODE_TEMP_TABLE:
X
Xiaoyu Wang 已提交
81
      break;  // todo
82 83
    case QUERY_NODE_JOIN_TABLE: {
      SJoinTableNode* pJoinTableNode = (SJoinTableNode*)pNode;
84
      res = walkExpr(pJoinTableNode->pLeft, order, walker, pContext);
85
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
86
        res = walkExpr(pJoinTableNode->pRight, order, walker, pContext);
87
      }
88
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
89
        res = walkExpr(pJoinTableNode->pOnCond, order, walker, pContext);
90
      }
91
      break;
92 93
    }
    case QUERY_NODE_GROUPING_SET:
94
      res = walkExprs(((SGroupingSetNode*)pNode)->pParameterList, order, walker, pContext);
95
      break;
96
    case QUERY_NODE_ORDER_BY_EXPR:
97
      res = walkExpr(((SOrderByExprNode*)pNode)->pExpr, order, walker, pContext);
98
      break;
99 100
    case QUERY_NODE_STATE_WINDOW: {
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
101
      res = walkExpr(pState->pExpr, order, walker, pContext);
102
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
103
        res = walkExpr(pState->pCol, order, walker, pContext);
104
      }
105
      break;
106
    }
X
Xiaoyu Wang 已提交
107 108
    case QUERY_NODE_SESSION_WINDOW: {
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
109
      res = walkExpr((SNode*)pSession->pCol, order, walker, pContext);
110
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
111
        res = walkExpr((SNode*)pSession->pGap, order, walker, pContext);
X
Xiaoyu Wang 已提交
112
      }
113
      break;
X
Xiaoyu Wang 已提交
114
    }
115 116
    case QUERY_NODE_INTERVAL_WINDOW: {
      SIntervalWindowNode* pInterval = (SIntervalWindowNode*)pNode;
117
      res = walkExpr(pInterval->pInterval, order, walker, pContext);
118
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
119
        res = walkExpr(pInterval->pOffset, order, walker, pContext);
120
      }
121
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
122
        res = walkExpr(pInterval->pSliding, order, walker, pContext);
123
      }
124
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
125
        res = walkExpr(pInterval->pFill, order, walker, pContext);
126
      }
127
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
128
        res = walkExpr(pInterval->pCol, order, walker, pContext);
X
bugfix  
Xiaoyu Wang 已提交
129
      }
130 131 132
      break;
    }
    case QUERY_NODE_NODE_LIST:
133
      res = walkExprs(((SNodeListNode*)pNode)->pNodeList, order, walker, pContext);
134
      break;
X
Xiaoyu Wang 已提交
135 136 137 138 139 140
    case QUERY_NODE_FILL: {
      SFillNode* pFill = (SFillNode*)pNode;
      res = walkExpr(pFill->pValues, order, walker, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExpr(pFill->pWStartTs, order, walker, pContext);
      }
141
      break;
X
Xiaoyu Wang 已提交
142
    }
143
    case QUERY_NODE_RAW_EXPR:
144
      res = walkExpr(((SRawExprNode*)pNode)->pNode, order, walker, pContext);
145
      break;
D
dapan1121 已提交
146
    case QUERY_NODE_TARGET:
147
      res = walkExpr(((STargetNode*)pNode)->pExpr, order, walker, pContext);
D
dapan1121 已提交
148
      break;
X
Xiaoyu Wang 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
    case QUERY_NODE_WHEN_THEN: {
      SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
      res = walkExpr(pWhenThen->pWhen, order, walker, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExpr(pWhenThen->pThen, order, walker, pContext);
      }
      break;
    }
    case QUERY_NODE_CASE_WHEN: {
      SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)pNode;
      res = walkExpr(pCaseWhen->pCase, order, walker, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExpr(pCaseWhen->pElse, order, walker, pContext);
      }
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExprs(pCaseWhen->pWhenThenList, order, walker, pContext);
      }
      break;
    }
X
Xiaoyu Wang 已提交
168 169 170 171 172 173 174 175 176 177 178
    case QUERY_NODE_EVENT_WINDOW: {
      SEventWindowNode* pEvent = (SEventWindowNode*)pNode;
      res = walkExpr(pEvent->pCol, order, walker, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExpr(pEvent->pStartCond, order, walker, pContext);
      }
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = walkExpr(pEvent->pEndCond, order, walker, pContext);
      }
      break;
    }
179 180 181 182
    default:
      break;
  }

183 184 185
  return res;
}

186 187 188 189 190
static EDealRes walkExpr(SNode* pNode, ETraversalOrder order, FNodeWalker walker, void* pContext) {
  return walkNode(pNode, order, walker, pContext, dispatchExpr);
}

static EDealRes walkExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeWalker walker, void* pContext) {
191 192
  SNode* node;
  FOREACH(node, pNodeList) {
193
    EDealRes res = walkExpr(node, order, walker, pContext);
194 195
    if (DEAL_RES_ERROR == res || DEAL_RES_END == res) {
      return res;
196 197
    }
  }
198
  return DEAL_RES_CONTINUE;
199 200
}

201
void nodesWalkExpr(SNode* pNode, FNodeWalker walker, void* pContext) {
202
  (void)walkExpr(pNode, TRAVERSAL_PREORDER, walker, pContext);
203 204
}

X
Xiaoyu Wang 已提交
205
void nodesWalkExprs(SNodeList* pNodeList, FNodeWalker walker, void* pContext) {
206
  (void)walkExprs(pNodeList, TRAVERSAL_PREORDER, walker, pContext);
207 208
}

209
void nodesWalkExprPostOrder(SNode* pNode, FNodeWalker walker, void* pContext) {
210
  (void)walkExpr(pNode, TRAVERSAL_POSTORDER, walker, pContext);
211 212
}

X
Xiaoyu Wang 已提交
213
void nodesWalkExprsPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext) {
214
  (void)walkExprs(pList, TRAVERSAL_POSTORDER, walker, pContext);
215
}
216

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

219
static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewriter rewriter, void* pContext) {
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
  if (NULL == pRawNode || NULL == *pRawNode) {
    return DEAL_RES_CONTINUE;
  }

  EDealRes res = DEAL_RES_CONTINUE;

  if (TRAVERSAL_PREORDER == order) {
    res = rewriter(pRawNode, pContext);
    if (DEAL_RES_CONTINUE != res) {
      return res;
    }
  }

  SNode* pNode = *pRawNode;
  switch (nodeType(pNode)) {
    case QUERY_NODE_COLUMN:
    case QUERY_NODE_VALUE:
    case QUERY_NODE_LIMIT:
      // these node types with no subnodes
      break;
    case QUERY_NODE_OPERATOR: {
      SOperatorNode* pOpNode = (SOperatorNode*)pNode;
242
      res = rewriteExpr(&(pOpNode->pLeft), order, rewriter, pContext);
243
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
244
        res = rewriteExpr(&(pOpNode->pRight), order, rewriter, pContext);
245 246 247 248
      }
      break;
    }
    case QUERY_NODE_LOGIC_CONDITION:
249
      res = rewriteExprs(((SLogicConditionNode*)pNode)->pParameterList, order, rewriter, pContext);
250 251
      break;
    case QUERY_NODE_FUNCTION:
252
      res = rewriteExprs(((SFunctionNode*)pNode)->pParameterList, order, rewriter, pContext);
253 254 255
      break;
    case QUERY_NODE_REAL_TABLE:
    case QUERY_NODE_TEMP_TABLE:
X
Xiaoyu Wang 已提交
256
      break;  // todo
257 258
    case QUERY_NODE_JOIN_TABLE: {
      SJoinTableNode* pJoinTableNode = (SJoinTableNode*)pNode;
259
      res = rewriteExpr(&(pJoinTableNode->pLeft), order, rewriter, pContext);
260
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
261
        res = rewriteExpr(&(pJoinTableNode->pRight), order, rewriter, pContext);
262
      }
263
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
264
        res = rewriteExpr(&(pJoinTableNode->pOnCond), order, rewriter, pContext);
265 266 267 268
      }
      break;
    }
    case QUERY_NODE_GROUPING_SET:
269
      res = rewriteExprs(((SGroupingSetNode*)pNode)->pParameterList, order, rewriter, pContext);
270 271
      break;
    case QUERY_NODE_ORDER_BY_EXPR:
272
      res = rewriteExpr(&(((SOrderByExprNode*)pNode)->pExpr), order, rewriter, pContext);
273
      break;
274 275
    case QUERY_NODE_STATE_WINDOW: {
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
276
      res = rewriteExpr(&pState->pExpr, order, rewriter, pContext);
277
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
278
        res = rewriteExpr(&pState->pCol, order, rewriter, pContext);
279
      }
280
      break;
281 282 283
    }
    case QUERY_NODE_SESSION_WINDOW: {
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
284
      res = rewriteExpr((SNode**)&pSession->pCol, order, rewriter, pContext);
285
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
286
        res = rewriteExpr((SNode**)&pSession->pGap, order, rewriter, pContext);
287
      }
288
      break;
289
    }
290 291
    case QUERY_NODE_INTERVAL_WINDOW: {
      SIntervalWindowNode* pInterval = (SIntervalWindowNode*)pNode;
292
      res = rewriteExpr(&(pInterval->pInterval), order, rewriter, pContext);
293
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
294
        res = rewriteExpr(&(pInterval->pOffset), order, rewriter, pContext);
295
      }
296
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
297
        res = rewriteExpr(&(pInterval->pSliding), order, rewriter, pContext);
298
      }
299
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
300
        res = rewriteExpr(&(pInterval->pFill), order, rewriter, pContext);
301
      }
302
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
303
        res = rewriteExpr(&(pInterval->pCol), order, rewriter, pContext);
X
bugfix  
Xiaoyu Wang 已提交
304
      }
305 306 307
      break;
    }
    case QUERY_NODE_NODE_LIST:
308
      res = rewriteExprs(((SNodeListNode*)pNode)->pNodeList, order, rewriter, pContext);
309
      break;
X
Xiaoyu Wang 已提交
310 311 312 313 314 315
    case QUERY_NODE_FILL: {
      SFillNode* pFill = (SFillNode*)pNode;
      res = rewriteExpr(&pFill->pValues, order, rewriter, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExpr(&(pFill->pWStartTs), order, rewriter, pContext);
      }
316
      break;
X
Xiaoyu Wang 已提交
317
    }
318
    case QUERY_NODE_RAW_EXPR:
319
      res = rewriteExpr(&(((SRawExprNode*)pNode)->pNode), order, rewriter, pContext);
320
      break;
D
dapan1121 已提交
321
    case QUERY_NODE_TARGET:
322
      res = rewriteExpr(&(((STargetNode*)pNode)->pExpr), order, rewriter, pContext);
D
dapan1121 已提交
323
      break;
X
Xiaoyu Wang 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
    case QUERY_NODE_WHEN_THEN: {
      SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
      res = rewriteExpr(&pWhenThen->pWhen, order, rewriter, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExpr(&pWhenThen->pThen, order, rewriter, pContext);
      }
      break;
    }
    case QUERY_NODE_CASE_WHEN: {
      SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)pNode;
      res = rewriteExpr(&pCaseWhen->pCase, order, rewriter, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExpr(&pCaseWhen->pElse, order, rewriter, pContext);
      }
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExprs(pCaseWhen->pWhenThenList, order, rewriter, pContext);
      }
      break;
    }
X
Xiaoyu Wang 已提交
343 344 345 346 347 348 349 350 351 352 353
    case QUERY_NODE_EVENT_WINDOW: {
      SEventWindowNode* pEvent = (SEventWindowNode*)pNode;
      res = rewriteExpr(&pEvent->pCol, order, rewriter, pContext);
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExpr(&pEvent->pStartCond, order, rewriter, pContext);
      }
      if (DEAL_RES_ERROR != res && DEAL_RES_END != res) {
        res = rewriteExpr(&pEvent->pEndCond, order, rewriter, pContext);
      }
      break;
    }
354 355 356 357
    default:
      break;
  }

358
  if (DEAL_RES_ERROR != res && DEAL_RES_END != res && TRAVERSAL_POSTORDER == order) {
359 360 361 362 363 364
    res = rewriter(pRawNode, pContext);
  }

  return res;
}

365
static EDealRes rewriteExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeRewriter rewriter, void* pContext) {
366 367
  SNode** pNode;
  FOREACH_FOR_REWRITE(pNode, pNodeList) {
368
    EDealRes res = rewriteExpr(pNode, order, rewriter, pContext);
369 370
    if (DEAL_RES_ERROR == res || DEAL_RES_END == res) {
      return res;
371 372 373 374 375
    }
  }
  return DEAL_RES_CONTINUE;
}

X
Xiaoyu Wang 已提交
376
void nodesRewriteExpr(SNode** pNode, FNodeRewriter rewriter, void* pContext) {
377
  (void)rewriteExpr(pNode, TRAVERSAL_PREORDER, rewriter, pContext);
378 379
}

X
Xiaoyu Wang 已提交
380
void nodesRewriteExprs(SNodeList* pList, FNodeRewriter rewriter, void* pContext) {
381
  (void)rewriteExprs(pList, TRAVERSAL_PREORDER, rewriter, pContext);
382 383
}

X
Xiaoyu Wang 已提交
384
void nodesRewriteExprPostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext) {
385
  (void)rewriteExpr(pNode, TRAVERSAL_POSTORDER, rewriter, pContext);
386 387
}

X
Xiaoyu Wang 已提交
388
void nodesRewriteExprsPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext) {
389
  (void)rewriteExprs(pList, TRAVERSAL_POSTORDER, rewriter, pContext);
390
}
X
Xiaoyu Wang 已提交
391 392 393 394 395 396 397 398

void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext) {
  if (NULL == pSelect) {
    return;
  }

  switch (clause) {
    case SQL_CLAUSE_FROM:
X
Xiaoyu Wang 已提交
399 400
      nodesWalkExpr(pSelect->pFromTable, walker, pContext);
      nodesWalkExpr(pSelect->pWhere, walker, pContext);
X
Xiaoyu Wang 已提交
401
    case SQL_CLAUSE_WHERE:
X
Xiaoyu Wang 已提交
402
      nodesWalkExprs(pSelect->pPartitionByList, walker, pContext);
403 404
      nodesWalkExprs(pSelect->pTags, walker, pContext);
      nodesWalkExpr(pSelect->pSubtable, walker, pContext);
X
Xiaoyu Wang 已提交
405
    case SQL_CLAUSE_PARTITION_BY:
X
Xiaoyu Wang 已提交
406
      nodesWalkExpr(pSelect->pWindow, walker, pContext);
X
Xiaoyu Wang 已提交
407
    case SQL_CLAUSE_WINDOW:
X
Xiaoyu Wang 已提交
408 409 410
      if (NULL != pSelect->pWindow && QUERY_NODE_INTERVAL_WINDOW == nodeType(pSelect->pWindow)) {
        nodesWalkExpr(((SIntervalWindowNode*)pSelect->pWindow)->pFill, walker, pContext);
      }
411
    case SQL_CLAUSE_FILL:
X
Xiaoyu Wang 已提交
412
      nodesWalkExprs(pSelect->pGroupByList, walker, pContext);
X
Xiaoyu Wang 已提交
413
    case SQL_CLAUSE_GROUP_BY:
X
Xiaoyu Wang 已提交
414
      nodesWalkExpr(pSelect->pHaving, walker, pContext);
X
Xiaoyu Wang 已提交
415
    case SQL_CLAUSE_HAVING:
416
    case SQL_CLAUSE_SELECT:
X
Xiaoyu Wang 已提交
417
    case SQL_CLAUSE_DISTINCT:
418
      nodesWalkExprs(pSelect->pOrderByList, walker, pContext);
X
Xiaoyu Wang 已提交
419
    case SQL_CLAUSE_ORDER_BY:
X
Xiaoyu Wang 已提交
420
      nodesWalkExprs(pSelect->pProjectionList, walker, pContext);
X
Xiaoyu Wang 已提交
421 422 423 424 425 426 427 428 429 430 431 432 433 434
    default:
      break;
  }

  return;
}

void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext) {
  if (NULL == pSelect) {
    return;
  }

  switch (clause) {
    case SQL_CLAUSE_FROM:
X
Xiaoyu Wang 已提交
435 436
      nodesRewriteExpr(&(pSelect->pFromTable), rewriter, pContext);
      nodesRewriteExpr(&(pSelect->pWhere), rewriter, pContext);
X
Xiaoyu Wang 已提交
437
    case SQL_CLAUSE_WHERE:
X
Xiaoyu Wang 已提交
438
      nodesRewriteExprs(pSelect->pPartitionByList, rewriter, pContext);
439 440
      nodesRewriteExprs(pSelect->pTags, rewriter, pContext);
      nodesRewriteExpr(&(pSelect->pSubtable), rewriter, pContext);
X
Xiaoyu Wang 已提交
441
    case SQL_CLAUSE_PARTITION_BY:
X
Xiaoyu Wang 已提交
442
      nodesRewriteExpr(&(pSelect->pWindow), rewriter, pContext);
X
Xiaoyu Wang 已提交
443
    case SQL_CLAUSE_WINDOW:
X
Xiaoyu Wang 已提交
444 445 446
      if (NULL != pSelect->pWindow && QUERY_NODE_INTERVAL_WINDOW == nodeType(pSelect->pWindow)) {
        nodesRewriteExpr(&(((SIntervalWindowNode*)pSelect->pWindow)->pFill), rewriter, pContext);
      }
447
    case SQL_CLAUSE_FILL:
X
Xiaoyu Wang 已提交
448
      nodesRewriteExprs(pSelect->pGroupByList, rewriter, pContext);
X
Xiaoyu Wang 已提交
449
    case SQL_CLAUSE_GROUP_BY:
X
Xiaoyu Wang 已提交
450
      nodesRewriteExpr(&(pSelect->pHaving), rewriter, pContext);
X
Xiaoyu Wang 已提交
451
    case SQL_CLAUSE_HAVING:
452
    case SQL_CLAUSE_SELECT:
X
Xiaoyu Wang 已提交
453
    case SQL_CLAUSE_DISTINCT:
X
Xiaoyu Wang 已提交
454
      nodesRewriteExprs(pSelect->pOrderByList, rewriter, pContext);
X
Xiaoyu Wang 已提交
455
    case SQL_CLAUSE_ORDER_BY:
X
Xiaoyu Wang 已提交
456
      nodesRewriteExprs(pSelect->pProjectionList, rewriter, pContext);
X
Xiaoyu Wang 已提交
457 458 459 460 461 462
    default:
      break;
  }

  return;
}