001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.*; 004 005/* 006* Date: 2010-4-13 007* Time: 17:06:00 008*/ 009public class TOutputClause extends TParseTreeNode { 010 011 private TResultColumnList selectItemList = null; 012 013 public void setSelectItemList2(TResultColumnList selectItemList2) { 014 this.selectItemList2 = selectItemList2; 015 } 016 017 private TResultColumnList selectItemList2 = null; 018 private TObjectName intoTable = null; 019 020 public void setIntoColumnList(TObjectNameList intoColumnList) { 021 this.intoColumnList = intoColumnList; 022 } 023 024 private TObjectNameList intoColumnList = null; 025 026 public void init(Object arg1,Object arg2) 027 { 028 selectItemList = (TResultColumnList)arg1; 029 if (arg2 != null){ 030 intoTable = (TObjectName)arg2; 031 } 032 } 033 034 public TObjectNameList getIntoColumnList() { 035 return intoColumnList; 036 } 037 038 public TObjectName getIntoTable() { 039 return intoTable; 040 } 041 042 public TResultColumnList getSelectItemList2() { 043 return selectItemList2; 044 } 045 046 public TResultColumnList getSelectItemList() { 047 return selectItemList; 048 } 049 050 public void doParse(TCustomSqlStatement psql, ESqlClause plocation){ 051 //selectItemList.doParse(psql, ESqlClause.output); 052 TResultColumn rc=null; 053 for(int i=0;i<selectItemList.size();i++){ 054 rc = selectItemList.getResultColumn(i); 055 if ((rc.toString().toLowerCase().startsWith("deleted")) ||(rc.toString().toLowerCase().startsWith("inserted"))){ 056 if (rc.getFieldAttr() != null){ 057 TObjectName fieldAttr = rc.getFieldAttr(); 058 fieldAttr.setLocation(ESqlClause.output); 059 060 // Detect inserted/deleted pseudo table qualifier. 061 // Common case: parser produces objectToken="inserted", partToken="col" 062 // Edge case: parser produces partToken="inserted", propertyToken="col" (needs swap) 063 TSourceToken objectToken = fieldAttr.getObjectToken(); 064 TSourceToken partToken = fieldAttr.getPartToken(); 065 TSourceToken propertyToken = fieldAttr.getPropertyToken(); 066 067 if (objectToken != null && propertyToken == null) { 068 // Common case: objectToken=inserted/deleted, partToken=columnName 069 String objName = objectToken.toString().toUpperCase(); 070 if ("INSERTED".equals(objName)) { 071 fieldAttr.setPseudoTableType(EPseudoTableType.inserted); 072 } else if ("DELETED".equals(objName)) { 073 fieldAttr.setPseudoTableType(EPseudoTableType.deleted); 074 } 075 } else if (partToken != null && propertyToken != null) { 076 // Edge case: partToken=inserted/deleted, propertyToken=columnName (needs swap) 077 String partName = partToken.toString().toUpperCase(); 078 if ("INSERTED".equals(partName)) { 079 fieldAttr.setPseudoTableType(EPseudoTableType.inserted); 080 } else if ("DELETED".equals(partName)) { 081 fieldAttr.setPseudoTableType(EPseudoTableType.deleted); 082 } 083 if (fieldAttr.getPseudoTableType() != EPseudoTableType.none) { 084 fieldAttr.setObjectToken(partToken); 085 fieldAttr.setPartToken(propertyToken); 086 fieldAttr.setPropertyToken(null); 087 } 088 } 089 090 psql.tables.getTable(0).getLinkedColumns().addObjectName(fieldAttr); 091 fieldAttr.setSourceTable(psql.tables.getTable(0)); 092 } 093 }else if (rc.toString().equalsIgnoreCase("$action")){ 094 rc.getFieldAttr().setDbObjectType(EDbObjectType.constant); 095 }else { 096 rc.doParse(psql,ESqlClause.output); 097 } 098 } 099 100 if (intoTable != null){ 101 intoTable.setObjectType(TObjectName.ttobjTable); 102 // add this table reference to 103 TTable lcTable = new TTable(); 104 lcTable.setTableName(intoTable); 105 lcTable.setEffectType(ETableEffectType.tetOutput); 106 if (intoColumnList != null){ 107 for(int i=0;i<intoColumnList.size();i++){ 108 lcTable.getObjectNameReferences().addObjectName(intoColumnList.getObjectName(i)); 109 intoColumnList.getObjectName(i).setLocation(ESqlClause.output); 110 lcTable.getLinkedColumns().addObjectName(intoColumnList.getObjectName(i)); 111 intoColumnList.getObjectName(i).setSourceTable(lcTable); 112 } 113 } 114 psql.tables.addTable(lcTable); 115 } 116 117 if (selectItemList2 != null){ 118 119 selectItemList2.doParse(psql, ESqlClause.output); 120 } 121 122 } 123 124 public void accept(TParseTreeVisitor v){ 125 v.preVisit(this); 126 v.postVisit(this); 127 } 128 129 public void acceptChildren(TParseTreeVisitor v){ 130 v.preVisit(this); 131 132 // Visit OUTPUT columns 133 if (selectItemList != null) { 134 selectItemList.acceptChildren(v); 135 } 136 137 // Visit INTO table and columns 138 if (intoTable != null) { 139 intoTable.acceptChildren(v); 140 } 141 if (intoColumnList != null) { 142 intoColumnList.acceptChildren(v); 143 } 144 145 // Visit secondary select list (if any) 146 if (selectItemList2 != null) { 147 selectItemList2.acceptChildren(v); 148 } 149 150 v.postVisit(this); 151 } 152 153 public void setSelectItemList(TResultColumnList selectItemList) { 154 this.selectItemList = selectItemList; 155 } 156 157 public void setIntoTable(TObjectName intoTable) { 158 this.intoTable = intoTable; 159 } 160}