001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.TSourceToken; 004import gudusoft.gsqlparser.nodes.hana.TTimeTravel; 005import gudusoft.gsqlparser.nodes.mssql.TForXMLClause; 006import gudusoft.gsqlparser.nodes.mssql.TOptionClause; 007import gudusoft.gsqlparser.nodes.teradata.TExpandOnClause; 008import gudusoft.gsqlparser.nodes.hive.*; 009import gudusoft.gsqlparser.nodes.teradata.THashByClause; 010import gudusoft.gsqlparser.nodes.vertica.TTimeSeries; 011import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 012 013import java.util.ArrayList; 014 015/** 016 * Internal used by parser, reprsents raw parse tree node of select statement. 017*/ 018public class TSelectSqlNode extends TParseTreeNode{ 019 020 private TForXMLClause forXMLClause; 021 022 public void setForXMLClause(TForXMLClause forXMLClause) { 023 this.forXMLClause = forXMLClause; 024 } 025 026 public TForXMLClause getForXMLClause() { 027 return forXMLClause; 028 } 029 030 public void setRelationExpr(TRelationExpr relationExpr) { 031 this.relationExpr = relationExpr; 032 } 033 034 public TRelationExpr getRelationExpr() { 035 return relationExpr; 036 } 037 038 private TRelationExpr relationExpr = null; 039 040 private TClusterBy clusterBy; 041 042 public void setClusterBy(TClusterBy clusterBy) { 043 this.clusterBy = clusterBy; 044 } 045 046 public TClusterBy getClusterBy() { 047 return clusterBy; 048 } 049 050 private boolean isConsume; 051 052 public void setConsume(boolean consume) { 053 isConsume = consume; 054 } 055 056 public boolean isConsume() { 057 return isConsume; 058 } 059 060 public void setHiveFromQuery(boolean hiveFromQuery) { 061 isHiveFromQuery = hiveFromQuery; 062 } 063 064 private boolean isHiveFromQuery = false; 065 066 public boolean isHiveFromQuery() { 067 return isHiveFromQuery; 068 } 069 070 public void setHiveBodyList(ArrayList<TParseTreeNode> hiveBodyList) { 071 this.hiveBodyList = hiveBodyList; 072 } 073 074 /** 075 * @deprecated since 2.6.3.5, insert and select statement after from query 076 * is represented by {@link TSelectSqlNode#getSelectSqlNodes()} or {@link TInsertSqlNode#getInsertSqlNodes()} 077 * 078 * @return 079 */ 080 public ArrayList<TParseTreeNode> getHiveBodyList() { 081 return hiveBodyList; 082 } 083 084 private ArrayList<TParseTreeNode> hiveBodyList; 085 086 087 088// private TExpression skipOffset; 089// private TExpression firstMax; 090// private TExpression limitMax; 091// 092// public void setSkipOffset(TExpression skipOffset) { 093// this.skipOffset = skipOffset; 094// } 095// 096// public void setFirstMax(TExpression firstMax) { 097// this.firstMax = firstMax; 098// } 099// 100// public void setLimitMax(TExpression limitMax) { 101// this.limitMax = limitMax; 102// } 103// 104// /** 105// * Informix skip offset 106// * @return skip offset 107// */ 108// public TExpression getSkipOffset() { 109// 110// return skipOffset; 111// } 112// 113// /** 114// * Informix first Max 115// * @return first Max 116// */ 117// public TExpression getFirstMax() { 118// return firstMax; 119// } 120// 121// /** 122// * Informix limit max 123// * @return limit max 124// */ 125// public TExpression getLimitMax() { 126// return limitMax; 127// } 128 129 private THashByClause hashByClause; 130 131 public void setHashByClause(THashByClause hashByClause) { 132 this.hashByClause = hashByClause; 133 } 134 135 public THashByClause getHashByClause() { 136 return hashByClause; 137 } 138 139 private THavingClause havingClause; 140 141 public void setHavingClause(THavingClause havingClause) { 142 this.havingClause = havingClause; 143 if (this.groupByClause != null){ 144 this.groupByClause.setHavingClause(havingClause.getCondition()); 145 }else{ 146 this.groupByClause = new TGroupBy(); 147 this.groupByClause.setHavingClause(havingClause.getCondition()); 148 } 149 } 150 151 public THavingClause getHavingClause() { 152 return havingClause; 153 } 154 155 private TPTNodeList<TParseTreeNode> queryClauseList; 156 157 public void setQueryClauseList(TPTNodeList<TParseTreeNode> queryClauseList) { 158 this.queryClauseList = queryClauseList; 159 for(int i=0;i<this.queryClauseList.size();i++){ 160 TParseTreeNode parseTreeNode = this.queryClauseList.getElement(i); 161 if (parseTreeNode instanceof TFromTableList){ 162 //from clause 163 this.setFromTableList((TFromTableList)parseTreeNode); 164 }else if (parseTreeNode instanceof THashByClause){ 165 this.setHashByClause((THashByClause)parseTreeNode); 166 }else if (parseTreeNode instanceof TWhereClause){ 167 this.setWhereCondition((TWhereClause)parseTreeNode); 168 }else if (parseTreeNode instanceof TGroupBy){ 169 this.setGroupByClause((TGroupBy)parseTreeNode); 170 }else if (parseTreeNode instanceof THavingClause){ 171 this.setHavingClause((THavingClause)parseTreeNode); 172 }else if (parseTreeNode instanceof TQualifyClause){ 173 this.setQualifyClause((TQualifyClause)parseTreeNode); 174 }else if (parseTreeNode instanceof TSampleClause){ 175 this.setSampleClause((TSampleClause)parseTreeNode); 176 }else if (parseTreeNode instanceof TExpandOnClause){ 177 this.setExpandOnClause((TExpandOnClause)parseTreeNode); 178 }else if (parseTreeNode instanceof TTeradataWithClause){ 179 this.setWithClause((TTeradataWithClause)parseTreeNode); 180 }else if (parseTreeNode instanceof TOrderBy){ 181 this.setOrderbyClause((TOrderBy)parseTreeNode); 182 }else if (parseTreeNode instanceof TIntoClause){ 183 this.setIntoClause((TIntoClause)parseTreeNode); 184 }else if (parseTreeNode instanceof TClusterBy){ 185 this.setClusterBy((TClusterBy)parseTreeNode); 186 }else if (parseTreeNode instanceof TDistributeBy){ 187 this.setDistributeBy((TDistributeBy)parseTreeNode); 188 }else if (parseTreeNode instanceof TSortBy){ 189 this.setSortBy((TSortBy)parseTreeNode); 190 } 191 } 192 } 193 194 public void setSelectModifiers(ArrayList<TSelectModifier> selectModifiers) { 195 this.selectModifiers = selectModifiers; 196 } 197 198 public ArrayList<TSelectModifier> getSelectModifiers() { 199 return selectModifiers; 200 } 201 202 private ArrayList<TSelectModifier> selectModifiers; 203 204 private TWithTableLock withTableLock; 205 206 public void setWithTableLock(TWithTableLock withTableLock) { 207 this.withTableLock = withTableLock; 208 } 209 210 public TWithTableLock getWithTableLock() { 211 212 return withTableLock; 213 } 214 215 private TTimeSeries timeSeries; 216 217 public void setTimeSeries(TTimeSeries timeSeries) { 218 this.timeSeries = timeSeries; 219 } 220 221 public TTimeSeries getTimeSeries() { 222 223 return timeSeries; 224 } 225 226 private TTimeTravel timeTravel; // hana 227 private THintClause hintClause; //hana 228 229 public TTimeTravel getTimeTravel() { 230 return timeTravel; 231 } 232 233 public void setClauses(TPTNodeList<TParseTreeNode> clauses){ 234 for(int i=0;i<clauses.size();i++){ 235 TParseTreeNode node = clauses.getElement(i); 236 if (node instanceof TForUpdate){ 237 this.forupdateClause = (TForUpdate)node; 238 }else if (node instanceof TOrderBy){ 239 this.orderbyClause = (TOrderBy)node; 240 }else if (node instanceof TLimitClause){ 241 this.limitClause = (TLimitClause)node; 242 }else if (node instanceof TTimeTravel){ 243 this.timeTravel = (TTimeTravel)node; 244 } 245 } 246 } 247 248 249 public void setHintClause(THintClause hintClause) { 250 this.hintClause = hintClause; 251 } 252 253 public THintClause getHintClause() { 254 255 return hintClause; 256 } 257 258 public int getParenthesisCount() { 259 return parenthesisCount; 260 } 261 262 public void incParenthesisCount() { 263 this.parenthesisCount++; 264 } 265 266 private int parenthesisCount = 0; 267 private int parenthissisCountBeforeOrder = 0; 268 269 270 public void setParenthesisCount(int parenthesisCount) { 271 this.parenthesisCount = parenthesisCount; 272 } 273 274 public void setParenthissisCountBeforeOrder() { 275 276 this.parenthissisCountBeforeOrder = parenthesisCount; 277 parenthesisCount = 0; 278 } 279 280 public int getParenthissisCountBeforeOrder() { 281 282 return parenthissisCountBeforeOrder; 283 } 284 285 private TOffsetClause offsetClause; 286 287 public void setOffsetClause(TOffsetClause offsetClause) { 288 this.offsetClause = offsetClause; 289 } 290 291 public TOffsetClause getOffsetClause() { 292 293 return offsetClause; 294 } 295 296 public void setOptionClause(TOptionClause optionClause) { 297 this.optionClause = optionClause; 298 } 299 300 public TOptionClause getOptionClause() { 301 302 return optionClause; 303 } 304 305 /** 306 * sql server option clause 307 * @see gudusoft.gsqlparser.nodes.mssql.TOptionClause 308 */ 309 private TOptionClause optionClause; 310 311 private TLateralView lateralView; 312 313 public void setLateralView(TLateralView lateralView) { 314 this.lateralView = lateralView; 315 } 316 317 public TLateralView getLateralView() { 318 319 return lateralView; 320 } 321 322 private TSortBy sortBy; 323 324 public void setSortBy(TSortBy sortBy) { 325 this.sortBy = sortBy; 326 } 327 328 public TSortBy getSortBy() { 329 330 return sortBy; 331 } 332 333 private TDistributeBy distributeBy; 334 335 public void setDistributeBy(TDistributeBy distributeBy) { 336 this.distributeBy = distributeBy; 337 } 338 339 public TDistributeBy getDistributeBy() { 340 341 return distributeBy; 342 } 343 344// private THiveClusterBy hiveClusterBy; 345// 346// public void setHiveClusterBy(THiveClusterBy hiveClusterBy) { 347// this.hiveClusterBy = hiveClusterBy; 348// } 349// 350// public THiveClusterBy getHiveClusterBy() { 351// 352// return hiveClusterBy; 353// } 354 355 private THiveTransformClause transformClause; 356 357 public THiveTransformClause getTransformClause() { 358 return transformClause; 359 } 360 361 public void setTransformClause(THiveTransformClause transformClause) { 362 this.transformClause = transformClause; 363 } 364 365 public void setHiveHintClause(THiveHintClause hiveHintClause) { 366 this.hiveHintClause = hiveHintClause; 367 } 368 369 public THiveHintClause getHiveHintClause() { 370 return hiveHintClause; 371 } 372 373 private THiveHintClause hiveHintClause; 374 375 private TIntoTableClause intoTableClause; 376 377 public void setIntoTableClause(TIntoTableClause intoTableClause) { 378 this.intoTableClause = intoTableClause; 379 } 380 381 public TIntoTableClause getIntoTableClause() { 382 383 return intoTableClause; 384 } 385 386 public void setSelectToken(TSourceToken selectToken) { 387 this.selectToken = selectToken; 388 } 389 390 public TSourceToken getSelectToken() { 391 392 return selectToken; 393 } 394 395 private TSourceToken selectToken = null; 396 397 private TResultColumnList resultColumnList; 398 399 public TSelectDistinct getSelectDistinct() { 400 return selectDistinct; 401 } 402 403 public void setSelectDistinct(TSelectDistinct selectDistinct) { 404 405 this.selectDistinct = selectDistinct; 406 } 407 408 private TSelectDistinct selectDistinct = null; 409 410 public void setTopClause(TTopClause topClause) { 411 this.topClause = topClause; 412 } 413 414 public TTopClause getTopClause() { 415 416 return topClause; 417 } 418 419 private TTopClause topClause = null; 420 421 public void setComputeClause(TComputeClause computeClause) { 422 423 this.computeClause = computeClause; 424 } 425 426 public TComputeClause getComputeClause() { 427 return computeClause; 428 } 429 430 private TComputeClause computeClause = null; 431 432 public TResultColumnList getResultColumnList() { 433 return resultColumnList; 434 } 435 436 public TFromTableList getFromTableList() { 437 return fromTableList; 438 } 439 440 public TWhereClause getWhereCondition() { 441 return whereCondition; 442 } 443 444 private TFromTableList fromTableList; 445 446 public void setResultColumnList(TResultColumnList resultColumnList) { 447 this.resultColumnList = resultColumnList; 448 } 449 450 public void setFromTableList(TFromTableList fromTableList) { 451 this.fromTableList = fromTableList; 452 } 453 454 public void setWhereCondition(TWhereClause whereCondition) { 455 this.whereCondition = whereCondition; 456 } 457 458 private TWhereClause whereCondition; 459 460 private TSelectSqlNode leftNode,rightNode; 461 462 public TCTEList cteList; 463 464 public TCTEList getCteList() { 465 return cteList; 466 } 467 468 public int getSetOperator() { 469 return setOperator; 470 } 471 472 private int setOperator = 0; 473 474 public void setSetOperator(int setOperator) { 475 this.setOperator = setOperator; 476 } 477 public void setSetOperator(TSourceToken st1, TSourceToken st2) 478 { 479 if (st1.toString().equalsIgnoreCase("union")){ 480 if (st2 == null){ 481 this.setOperator = TSelectSqlStatement.setOperator_union; 482 }else if (st2.toString().equalsIgnoreCase("all")){ 483 this.setOperator = TSelectSqlStatement.setOperator_unionall; 484 }else if (st2.toString().equalsIgnoreCase("distinct")){ 485 this.setOperator = TSelectSqlStatement.SET_OPERATOR_UNIONDISTINCT; 486 } 487 } 488 else if (st1.toString().equalsIgnoreCase("intersect")){ 489 if (st2 == null){ 490 this.setOperator = TSelectSqlStatement.setOperator_intersect; 491 }else if (st2.toString().equalsIgnoreCase("all")){ 492 this.setOperator = TSelectSqlStatement.setOperator_intersectall; 493 }else if (st2.toString().equalsIgnoreCase("distinct")){ 494 this.setOperator = TSelectSqlStatement.SET_OPERATOR_INTERSECTDISTINCT; 495 } 496 } 497 else if (st1.toString().equalsIgnoreCase("minus")){ 498 if (st2 == null){ 499 this.setOperator = TSelectSqlStatement.setOperator_minus; 500 }else if (st2.toString().equalsIgnoreCase("all")){ 501 this.setOperator = TSelectSqlStatement.setOperator_minusall; 502 }else if (st2.toString().equalsIgnoreCase("distinct")){ 503 this.setOperator = TSelectSqlStatement.SET_OPERATOR_MINUSDISTINCT; 504 } 505 } 506 else if (st1.toString().equalsIgnoreCase("except")){ 507 if (st2 == null){ 508 this.setOperator = TSelectSqlStatement.setOperator_except; 509 }else if (st2.toString().equalsIgnoreCase("all")){ 510 this.setOperator = TSelectSqlStatement.setOperator_exceptall; 511 }else if (st2.toString().equalsIgnoreCase("distinct")){ 512 this.setOperator = TSelectSqlStatement.SET_OPERATOR_EXCEPTDISTINCT; 513 } 514 } 515 } 516 517 public TSelectSqlNode getLeftNode() { 518 return leftNode; 519 } 520 521 public TSelectSqlNode getRightNode() { 522 return rightNode; 523 } 524 525 public void init(Object arg1, Object arg2) 526 { 527 leftNode = (TSelectSqlNode)arg1; 528 rightNode = (TSelectSqlNode)arg2; 529 } 530 531 public boolean isCombinedQuery(){ 532 // combine multiple queries using the set operators UNION, UNION ALL, INTERSECT, and MINUS. 533 return (setOperator > 0); 534 } 535 536 public TOrderBy getOrderbyClause() { 537 return orderbyClause; 538 } 539 540 private TOrderBy orderbyClause; 541 542 public void setOrderbyClause(TOrderBy orderbyClause) { 543 this.orderbyClause = orderbyClause; 544 if (orderbyClause == null) return; 545 546 if (orderbyClause.getOffsetClause() != null ){ // 在 sqlserver yacc rule中, offset clause 先被挂在了order by clause 下 547 this.setOffsetClause(orderbyClause.getOffsetClause()); 548 } 549 if (orderbyClause.getFetchFirstClause() != null){ 550 this.setFetchFirstClause(orderbyClause.getFetchFirstClause()); 551 } 552 553 } 554 555 public TForUpdate getForupdateClause() { 556 return forupdateClause; 557 } 558 559 private TForUpdate forupdateClause; 560 561 public void setForupdateClause(TParseTreeNode forupdateClause) { 562 if (forupdateClause instanceof TForUpdate){ 563 this.forupdateClause = (TForUpdate) forupdateClause; 564 }else if (forupdateClause instanceof TForXMLClause){ 565 this.forXMLClause = (TForXMLClause)forupdateClause; 566 } 567 } 568 569 public THierarchical getHierarchicalClause() { 570 return hierarchicalClause; 571 } 572 573 private THierarchical hierarchicalClause; 574 575 public void setHierarchicalClause(THierarchical hierarchicalClause) { 576 this.hierarchicalClause = hierarchicalClause; 577 } 578 579 public TGroupBy getGroupByClause() { 580 return groupByClause; 581 } 582 583 private TGroupBy groupByClause; 584 585 public void setGroupByClause(TGroupBy groupByClause) { 586 this.groupByClause = groupByClause; 587 if (groupByClause != null){ 588 if ((groupByClause.getQualifyClause() != null)&&(this.getQualifyClause() == null)){ 589 this.setQualifyClause(groupByClause.getQualifyClause()); 590 } 591 if ((this.getHavingClause() != null)&&(this.groupByClause.getHavingClause() == null)){ 592 this.groupByClause.setHavingClause(this.getHavingClause().getCondition()); 593 } 594 } 595 } 596 597 private TIntoClause intoClause = null; 598 599 public void setIntoClause(TIntoClause intoClause) { 600 if (intoClause == null) return; 601 this.intoClause = intoClause; 602 } 603 604 public TIntoClause getIntoClause() { 605 606 return intoClause; 607 } 608 609 private TQualifyClause qualifyClause = null; 610 611 public void setQualifyClause(TQualifyClause qualifyClause) { 612 if (qualifyClause == null) return; 613 this.qualifyClause = qualifyClause; 614 } 615 616 public TQualifyClause getQualifyClause() { 617 618 return qualifyClause; 619 } 620 621 private TSampleClause sampleClause = null; 622 623 public void setSampleClause(TSampleClause sampleClause) { 624 this.sampleClause = sampleClause; 625 } 626 627 public TSampleClause getSampleClause() { 628 629 return sampleClause; 630 } 631 632 private TTeradataWithClause withClause = null; 633 634 public TTeradataWithClause getWithClause() { 635 return withClause; 636 } 637 638 public void setWithClause(TTeradataWithClause withClause) { 639 640 this.withClause = withClause; 641 } 642 643 private TLimitClause limitClause = null; 644 645 public void setLimitClause(TLimitClause limitClause) { 646 this.limitClause = limitClause; 647 } 648 649 public TLimitClause getLimitClause() { 650 651 return limitClause; 652 } 653 654 private TFetchFirstClause fetchFirstClause = null; 655 656 public void setFetchFirstClause(TFetchFirstClause fetchFirstClause) { 657 this.fetchFirstClause = fetchFirstClause; 658 } 659 660 public TFetchFirstClause getFetchFirstClause() { 661 662 return fetchFirstClause; 663 } 664 665 private TOptimizeForClause optimizeForClause = null; 666 667 public void setOptimizeForClause(TOptimizeForClause optimizeForClause) { 668 this.optimizeForClause = optimizeForClause; 669 } 670 671 public TOptimizeForClause getOptimizeForClause() { 672 673 return optimizeForClause; 674 } 675 676 private TIsolationClause isolationClause = null; 677 678 public void setIsolationClause(TIsolationClause isolationClause) { 679 this.isolationClause = isolationClause; 680 } 681 682 public TIsolationClause getIsolationClause() { 683 return isolationClause; 684 } 685 686 public void setValueClause(TValueClause valueClause) { 687 this.valueClause = valueClause; 688 this.setStartToken(valueClause); 689 this.setEndToken(valueClause); 690 } 691 692 public TValueClause getValueClause() { 693 694 return valueClause; 695 } 696 697 private TValueClause valueClause = null; 698 699 private TPTNodeList <TLockingClause> lockingClauses; 700 701 public TPTNodeList<TLockingClause> getLockingClauses() { 702 return lockingClauses; 703 } 704 705 public void setLockingClauses(TPTNodeList<TLockingClause> lockingClauses) { 706 this.lockingClauses = lockingClauses; 707 } 708 709// private TSelectLimit selectLimit; 710// 711// public void setSelectLimit(TSelectLimit selectLimit) { 712// this.selectLimit = selectLimit; 713// } 714// 715// public TSelectLimit getSelectLimit() { 716// 717// return selectLimit; 718// } 719 720 private TWindowClause windowClause; 721 722 public void setWindowClause(TWindowClause windowClause) { 723 this.windowClause = windowClause; 724 } 725 726 public TWindowClause getWindowClause() { 727 728 return windowClause; 729 } 730 731 private TExpandOnClause expandOnClause; 732 733 public TExpandOnClause getExpandOnClause() { 734 return expandOnClause; 735 } 736 737 public void setExpandOnClause(TExpandOnClause expandOnClause) { 738 739 this.expandOnClause = expandOnClause; 740 } 741 742 public static void setFromList(ArrayList<TSelectSqlNode> selectSqlNode, TFromTableList fromTables){ 743 for(int i=0;i<selectSqlNode.size();i++){ 744 TSelectSqlNode select = selectSqlNode.get(i); 745 select.setFromTableList(fromTables); 746 } 747 } 748 749 private ArrayList<TSelectSqlNode> selectSqlNodes; 750 751 public ArrayList<TSelectSqlNode> getSelectSqlNodes() { 752 return selectSqlNodes; 753 } 754 755 public void setSelectSqlNodes(ArrayList<TSelectSqlNode> selectSqlNodes){ 756 this.selectSqlNodes = selectSqlNodes; 757 } 758 759 public static TSelectSqlNode getFirstSelectSqlNode(ArrayList<TSelectSqlNode> selectSqlNodes){ 760 return selectSqlNodes.get(0); 761 } 762 763}