HPCCSQLTreeWalker.hpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2014 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef HPCCSQLTREEWALKER_HPP_
  14. #define HPCCSQLTREEWALKER_HPP_
  15. #include <stdlib.h>
  16. #include "ws_sql.hpp"
  17. /* undef SOCKET definitions to avoid collision in Antlrdefs.h*/
  18. #ifdef INVALID_SOCKET
  19. //#pragma message("UNDEFINING INVALID_SOCKET - Will be redefined by ANTLRDEFS.h" )
  20. #undef INVALID_SOCKET
  21. #endif
  22. #ifdef SOCKET
  23. //#pragma message( "UNDEFINING SOCKET - Will be redefined by ANTLRDEFS.h" )
  24. #undef SOCKET
  25. #endif
  26. /* undef SOCKET definitions to avoid collision in Antlrdefs.h*/
  27. #include "HPCCSQLLexer.h"
  28. #include "HPCCSQLParser.h"
  29. #include "SQLColumn.hpp"
  30. #include "SQLTable.hpp"
  31. #include "SQLExpression.hpp"
  32. #include "HPCCFile.hpp"
  33. #include "HPCCFileCache.hpp"
  34. #include "ECLFunction.hpp"
  35. #include "SQLJoin.hpp"
  36. typedef enum _SQLQueryType
  37. {
  38. SQLTypeUnknown=-1,
  39. SQLTypeSelect,
  40. SQLTypeCall,
  41. SQLTypeCreateAndLoad
  42. } SQLQueryType;
  43. class HPCCSQLTreeWalker: public CInterface, public IInterface
  44. {
  45. public:
  46. IMPLEMENT_IINTERFACE;
  47. private:
  48. SQLQueryType sqlType;
  49. IArrayOf<ISQLExpression> selectList;
  50. IArrayOf<SQLFieldValueExpression> groupbyList;
  51. IArrayOf<SQLFieldValueExpression> orderbyList;
  52. IArrayOf<SQLTable> tableList;
  53. int limit;
  54. int offset;
  55. string indexhint;
  56. Owned<ISQLExpression> whereClause;
  57. Owned<ISQLExpression> havingClause;
  58. Owned<HPCCFileCache> tmpHPCCFileCache;
  59. bool selectDistinct;
  60. StringBuffer procedureName;
  61. StringBuffer querySetName;
  62. IArrayOf<ISQLExpression> paramList;
  63. bool overwrite;
  64. StringBuffer tableName;
  65. StringBuffer sourceDataTableName;
  66. StringBuffer comment;
  67. StringBuffer sourceDataType;
  68. StringBuffer landingZoneIP;
  69. StringBuffer landingZonePath;
  70. StringBuffer recordDefinition;
  71. void sqlTreeWalker(pANTLR3_BASE_TREE sqlAST);
  72. void selectStatementTreeWalker(pANTLR3_BASE_TREE selectsqlAST);
  73. void callStatementTreeWalker(pANTLR3_BASE_TREE callsqlAST);
  74. void createAndLoadStatementTreeWalker(pANTLR3_BASE_TREE clsqlAST);
  75. void columnListTreeWalker(pANTLR3_BASE_TREE columnsAST, IArrayOf<SQLColumn>& collist);
  76. ISQLExpression* expressionTreeWalker(pANTLR3_BASE_TREE exprAST, pANTLR3_BASE_TREE parent);
  77. void fromTreeWalker(pANTLR3_BASE_TREE fromsqlAST);
  78. void limitTreeWalker(pANTLR3_BASE_TREE limitAST);
  79. void processAllColumns(HpccFiles * availableFiles);
  80. void verifyColumn(SQLFieldValueExpression * col );
  81. void verifyColAndDisambiguateName();
  82. void verifyAndDisambiguateNameFromList(IArrayOf<SQLFieldValueExpression> * explist);
  83. void assignParameterIndexes();
  84. int parameterizedCount;
  85. StringBuffer normalizedSQL;
  86. bool parameterizeStaticValues;
  87. public:
  88. bool isParameterizedCall();
  89. void setQuerySetName(const char * qsname)
  90. {
  91. querySetName.set(qsname);
  92. }
  93. const char * getQuerySetName()
  94. {
  95. return querySetName.str();
  96. }
  97. const char * getStoredProcName()
  98. {
  99. return procedureName.str();
  100. }
  101. int getStoredProcParamListCount()
  102. {
  103. return paramList.length();
  104. }
  105. IArrayOf<ISQLExpression>* getStoredProcParamList()
  106. {
  107. return &paramList;
  108. }
  109. void getWhereClauseString(StringBuffer & str);
  110. void getHavingClauseString(StringBuffer & str);
  111. ISQLExpression * getHavingClause();
  112. void expandWildCardColumn();
  113. HPCCSQLTreeWalker();
  114. HPCCSQLTreeWalker(pANTLR3_BASE_TREE t, IEspContext &context, bool attemptParameterization = true);
  115. virtual ~HPCCSQLTreeWalker();
  116. int getParameterizedCount() const
  117. {
  118. return parameterizedCount;
  119. }
  120. const IArrayOf<SQLTable>* getTableList() const
  121. {
  122. return const_cast <const IArrayOf<SQLTable>*> (&tableList);
  123. }
  124. const IArrayOf<ISQLExpression>* getSelectList() const
  125. {
  126. return const_cast <const IArrayOf<ISQLExpression>*> (&selectList);
  127. }
  128. const IArrayOf<ISQLExpression>* getParamList() const
  129. {
  130. return const_cast <const IArrayOf<ISQLExpression>*> (&paramList);
  131. }
  132. int getLimit() const
  133. {
  134. return limit;
  135. }
  136. void setLimit(int limit)
  137. {
  138. this->limit = limit;
  139. }
  140. int getOffset() const
  141. {
  142. return offset;
  143. }
  144. void setOffset(int _offset)
  145. {
  146. offset = _offset;
  147. }
  148. void setSqlType(SQLQueryType type)
  149. {
  150. sqlType = type;
  151. }
  152. SQLQueryType getSqlType()
  153. {
  154. return sqlType;
  155. }
  156. bool hasGroupByColumns()
  157. {
  158. return !groupbyList.empty();
  159. }
  160. bool hasOrderByColumns()
  161. {
  162. return !orderbyList.empty();
  163. }
  164. bool hasHavingClause()
  165. {
  166. return havingClause != NULL;
  167. }
  168. bool hasWhereClause()
  169. {
  170. return whereClause != NULL;
  171. }
  172. bool isSelectDistinct()
  173. {
  174. return selectDistinct;
  175. }
  176. void getOrderByString(StringBuffer & str)
  177. {
  178. getOrderByString(',', str);
  179. }
  180. void getOrderByString(char delimiter, StringBuffer & str)
  181. {
  182. ForEachItemIn(orderbyindex, orderbyList)
  183. {
  184. SQLFieldValueExpression * colexp = &orderbyList.item(orderbyindex);
  185. if (orderbyindex != 0)
  186. str.append(delimiter);
  187. str.append(colexp->getName());
  188. }
  189. }
  190. void getGroupByString(StringBuffer & str)
  191. {
  192. getGroupByString(',', str);
  193. }
  194. void getGroupByString(char delimiter, StringBuffer & str)
  195. {
  196. ForEachItemIn(groupbyindex, groupbyList)
  197. {
  198. SQLFieldValueExpression * colexp = &groupbyList.item(groupbyindex);
  199. if (groupbyindex != 0)
  200. str.append(delimiter);
  201. str.append(colexp->getName());
  202. }
  203. }
  204. ISQLExpression * getWhereClause()
  205. {
  206. return whereClause.get();
  207. }
  208. HPCCFileCache * queryHPCCFileCache()
  209. {
  210. return tmpHPCCFileCache.get();
  211. }
  212. const char* getNormalizedSQL();
  213. const char * getRecordDefinition()
  214. {
  215. return recordDefinition.str();
  216. }
  217. void setRecordDefinition(const char * _recordDefinition)
  218. {
  219. recordDefinition.set(_recordDefinition);
  220. }
  221. const char * getComment() const
  222. {
  223. return comment.str();
  224. }
  225. void setComment(const char * _comment)
  226. {
  227. comment.set(_comment);
  228. }
  229. const char * getLandingZoneIp() const
  230. {
  231. return landingZoneIP.str();
  232. }
  233. void setLandingZoneIp(const char * _landingZoneIp)
  234. {
  235. landingZoneIP.set(_landingZoneIp);
  236. }
  237. const char * getLandingZonePath() const
  238. {
  239. return landingZonePath.str();
  240. }
  241. void setLandingZonePath(const char * _landingZonePath)
  242. {
  243. landingZonePath.set(_landingZonePath);
  244. }
  245. const char * getSourceDataType() const
  246. {
  247. return sourceDataType.str();
  248. }
  249. void setSourceDataType(const char * _sourceDataType)
  250. {
  251. sourceDataType.set(_sourceDataType);
  252. }
  253. bool isOverwrite() const
  254. {
  255. return overwrite;
  256. }
  257. void setOverwrite(bool _overwrite)
  258. {
  259. overwrite = _overwrite;
  260. }
  261. const char * getSourceDataTableName() const
  262. {
  263. return sourceDataTableName.str();
  264. }
  265. void setSourceDataTableName(const char * _sourceDataTableName)
  266. {
  267. sourceDataTableName.set(_sourceDataTableName);
  268. }
  269. const char * getTableName() const
  270. {
  271. return tableName.str();
  272. }
  273. void setTableName(const char * _tableName)
  274. {
  275. tableName.set(_tableName);
  276. }
  277. private:
  278. bool normalizeSQL();
  279. };
  280. #endif /* HPCCSQLTREEWALKER_HPP_ */