nodesToSQLFuncs.c 4.9 KB
Newer Older
D
dapan1121 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * 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/>.
 */

#include "cmdnodes.h"
#include "nodesUtil.h"
#include "plannodes.h"
#include "querynodes.h"
#include "taos.h"
#include "taoserror.h"
#include "thash.h"

D
dapan1121 已提交
24
char *gOperatorStr[] = {NULL, "+", "-", "*", "/", "%", "-", "&", "|", ">", ">=", "<", "<=", "=", "<>", 
D
dapan1121 已提交
25 26 27 28 29 30 31 32 33
                        "IN", "NOT IN", "LIKE", "NOT LIKE", "MATCH", "NMATCH", "IS NULL", "IS NOT NULL",
                        "IS TRUE", "IS FALSE", "IS UNKNOWN", "IS NOT TRUE", "IS NOT FALSE", "IS NOT UNKNOWN"};
char *gLogicConditionStr[] = {"AND", "OR", "NOT"};

int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
  switch (pNode->type) {
    case QUERY_NODE_COLUMN: {
      SColumnNode *colNode = (SColumnNode *)pNode;
      if (colNode->dbName[0]) {
D
dapan1121 已提交
34
        *len += snprintf(buf + *len, bufSize - *len, "`%s`.", colNode->dbName);
D
dapan1121 已提交
35 36 37
      }
      
      if (colNode->tableAlias[0]) {
D
dapan1121 已提交
38
        *len += snprintf(buf + *len, bufSize - *len, "`%s`.", colNode->tableAlias);
D
dapan1121 已提交
39
      } else if (colNode->tableName[0]) {
D
dapan1121 已提交
40
        *len += snprintf(buf + *len, bufSize - *len, "`%s`.", colNode->tableName);
D
dapan1121 已提交
41
      }
D
dapan1121 已提交
42 43 44 45 46 47
      
      if (colNode->tableAlias[0]) {
        *len += snprintf(buf + *len, bufSize - *len, "`%s`", colNode->colName);
      } else {
        *len += snprintf(buf + *len, bufSize - *len, "%s", colNode->colName);
      }
D
dapan1121 已提交
48 49 50 51 52 53 54 55
      
      return TSDB_CODE_SUCCESS;
    }
    case QUERY_NODE_VALUE:{
      SValueNode *colNode = (SValueNode *)pNode;
      char *t = nodesGetStrValueFromNode(colNode);
      if (NULL == t) {
        nodesError("fail to get str value from valueNode");
D
dapan1121 已提交
56
        NODES_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
D
dapan1121 已提交
57 58
      }
      
D
dapan1121 已提交
59
      *len += snprintf(buf + *len, bufSize - *len, "%s", t);
D
dapan1121 已提交
60 61 62 63 64 65
      taosMemoryFree(t);
      
      return TSDB_CODE_SUCCESS;
    }
    case QUERY_NODE_OPERATOR: {
      SOperatorNode* pOpNode = (SOperatorNode*)pNode;
D
dapan1121 已提交
66
      *len += snprintf(buf + *len, bufSize - *len, "(");
D
dapan1121 已提交
67
      if (pOpNode->pLeft) {
D
dapan1121 已提交
68
        NODES_ERR_RET(nodesNodeToSQL(pOpNode->pLeft, buf, bufSize, len));
D
dapan1121 已提交
69 70 71 72
      }

      if (pOpNode->opType >= (sizeof(gOperatorStr) / sizeof(gOperatorStr[0]))) {
        nodesError("unknown operation type:%d", pOpNode->opType);
D
dapan1121 已提交
73
        NODES_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
D
dapan1121 已提交
74 75
      }
      
D
dapan1121 已提交
76
      *len += snprintf(buf + *len, bufSize - *len, " %s ", gOperatorStr[pOpNode->opType]);
D
dapan1121 已提交
77 78

      if (pOpNode->pRight) {
D
dapan1121 已提交
79
        NODES_ERR_RET(nodesNodeToSQL(pOpNode->pRight, buf, bufSize, len));
D
dapan1121 已提交
80 81
      }    

D
dapan1121 已提交
82
      *len += snprintf(buf + *len, bufSize - *len, ")");
D
dapan1121 已提交
83 84 85 86 87 88 89 90

      return TSDB_CODE_SUCCESS;
    }
    case QUERY_NODE_LOGIC_CONDITION:{
      SLogicConditionNode* pLogicNode = (SLogicConditionNode*)pNode;
      SNode* node = NULL;
      bool first = true;
      
D
dapan1121 已提交
91
      *len += snprintf(buf + *len, bufSize - *len, "(");
D
dapan1121 已提交
92 93 94
      
      FOREACH(node, pLogicNode->pParameterList) {
        if (!first) {
D
dapan1121 已提交
95
          *len += snprintf(buf + *len, bufSize - *len, " %s ", gLogicConditionStr[pLogicNode->condType]);
D
dapan1121 已提交
96
        }
D
dapan1121 已提交
97
        NODES_ERR_RET(nodesNodeToSQL(node, buf, bufSize, len));
D
dapan1121 已提交
98 99 100
        first = false;
      }

D
dapan1121 已提交
101
      *len += snprintf(buf + *len, bufSize - *len, ")");
D
dapan1121 已提交
102 103 104 105 106 107 108 109

      return TSDB_CODE_SUCCESS;
    }
    case QUERY_NODE_FUNCTION:{
      SFunctionNode* pFuncNode = (SFunctionNode*)pNode;
      SNode* node = NULL;
      bool first = true;
      
D
dapan1121 已提交
110
      *len += snprintf(buf + *len, bufSize - *len, "%s(", pFuncNode->functionName);
D
dapan1121 已提交
111 112 113
      
      FOREACH(node, pFuncNode->pParameterList) {
        if (!first) {
D
dapan1121 已提交
114
          *len += snprintf(buf + *len, bufSize - *len, ", ");
D
dapan1121 已提交
115
        }
D
dapan1121 已提交
116
        NODES_ERR_RET(nodesNodeToSQL(node, buf, bufSize, len));
D
dapan1121 已提交
117 118 119
        first = false;
      }

D
dapan1121 已提交
120
      *len += snprintf(buf + *len, bufSize - *len, ")");
D
dapan1121 已提交
121 122 123 124 125

      return TSDB_CODE_SUCCESS;
    }
    case QUERY_NODE_NODE_LIST:{
      SNodeListNode* pListNode = (SNodeListNode *)pNode;
D
dapan1121 已提交
126 127 128
      SNode* node = NULL;
      bool first = true;
      
D
dapan1121 已提交
129
      *len += snprintf(buf + *len, bufSize - *len, "(");
D
dapan1121 已提交
130 131 132
      
      FOREACH(node, pListNode->pNodeList) {
        if (!first) {
D
dapan1121 已提交
133
          *len += snprintf(buf + *len, bufSize - *len, ", ");
D
dapan1121 已提交
134 135 136 137 138
        }
        NODES_ERR_RET(nodesNodeToSQL(node, buf, bufSize, len));
        first = false;
      }
      
D
dapan1121 已提交
139
      *len += snprintf(buf + *len, bufSize - *len, ")");
D
dapan1121 已提交
140 141 142 143 144 145 146 147

      return TSDB_CODE_SUCCESS;
    }
    default:
      break;
  }
  
  nodesError("nodesNodeToSQL unknown node = %s", nodesNodeName(pNode->type));
D
dapan1121 已提交
148
  NODES_RET(TSDB_CODE_QRY_APP_ERROR);
D
dapan1121 已提交
149
}