001package gudusoft.gsqlparser.stmt; 002 003 004import gudusoft.gsqlparser.*; 005import gudusoft.gsqlparser.nodes.*; 006 007import java.util.EnumSet; 008 009/** 010 * Create trigger statement. 011 * 012 * supported databases: 013 * <ul> 014 * <li>DB2</li> 015 * <li>Hana</li> 016 * <li>Greenplum, represented by {@link gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTrigger}</li> 017 * <li>Informix</li> 018 * <li>MySQL</li> 019 * <li>Openedge</li> 020 * <li>Oracle, represented by {@link gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTrigger} 021 * support dml, non-dml and database trigger. 022 * </li> 023 * <li>PostgreSQL</li> 024 * <li>SQL Server, 025 * support dml, ddl trigger 026 * </li> 027 * <li>Sybase</li> 028 * <li>Teradata</li> 029 * </ul> 030 * 031 * @see TTriggeringClause 032 */ 033public class TCreateTriggerStmt extends TStoredProcedureSqlStatement { 034 public void setTriggeringClause(TTriggeringClause triggeringClause) { 035 this.triggeringClause = triggeringClause; 036 } 037 038 public TCreateTriggerStmt (EDbVendor dbvendor){ 039 super(dbvendor); 040 sqlstatementtype = ESqlStatementType.sstcreatetrigger ; 041 } 042 043 044 void buildsql() { 045 } 046 047 void clear() { 048 } 049 050 String getasprettytext() { 051 return ""; 052 } 053 054 void iterate(TVisitorAbs pvisitor) { 055 } 056 057 private TExpression whenCondition = null; 058 059 /** 060 * When condition 061 * @return when condition 062 */ 063 public TExpression getWhenCondition() { 064 return whenCondition; 065 } 066 067 private boolean alterTrigger; 068 069 public void setAlterTrigger(boolean alterTrigger) { 070 this.alterTrigger = alterTrigger; 071 } 072 073 public boolean isAlterTrigger() { 074 075 return alterTrigger; 076 } 077 @Override 078 public TObjectName getStoredProcedureName(){ 079 return triggerName; 080 } 081 082 private TTable onTable = null; 083 084 /** 085 * @deprecated As of v2.0.1.0, use {@link #getTriggeringClause()} instead 086 * 087 * @return onTable 088 */ 089 public TTable getOnTable() { 090 return onTable; 091 } 092 093 094 public TObjectName getTriggerName() { 095 return triggerName; 096 } 097 098 private TObjectName triggerName = null; 099 100 public void setTimingPoint(ETriggerTimingPoint timingPoint) { 101 this.timingPoint = timingPoint; 102 } 103 104 public void setDmlTypes(EnumSet<ETriggerDmlType> dmlTypes) { 105 this.dmlTypes = dmlTypes; 106 } 107 108 /** 109 * @deprecated As of v2.0.1.0, replaced by {@link #getTriggeringClause()} 110 * @return timing point 111 */ 112 public ETriggerTimingPoint getTimingPoint() { 113 114 return timingPoint; 115 } 116 117 /** 118 * @deprecated As of v2.0.1.0, replaced by {@link #getTriggeringClause()} 119 * @return dml 120 */ 121 public EnumSet<ETriggerDmlType> getDmlTypes() { 122 return dmlTypes; 123 } 124 125 private TFunctionCall functionCall;//postgresql 126 127 public void setFunctionCall(TFunctionCall functionCall) { 128 this.functionCall = functionCall; 129 } 130 131 /** 132 * Greenplum,postgresql executed function 133 * 134 * @return function call 135 */ 136 public TFunctionCall getFunctionCall() { 137 138 return functionCall; 139 } 140 141 public int doParseStatement(TCustomSqlStatement psql) { 142 if (rootNode == null) return -1; 143 if(!(rootNode instanceof TCreateTriggerSqlNode)) return -1; 144 TCreateTriggerSqlNode createTriggerNode = (TCreateTriggerSqlNode)rootNode; 145 146 super.doParseStatement(psql); 147 this.triggerName = createTriggerNode.getTriggerName(); 148 if (getSqlEnv().getDefaultCatalogName() != null){ 149 if (triggerName.getDatabaseToken() == null){ 150 triggerName.setDatabaseToken(new TSourceToken(getSqlEnv().getDefaultCatalogName())); 151 } 152 } 153 alterTrigger = createTriggerNode.isAlterTrigger(); 154 this.fireMode = createTriggerNode.getFireMode(); 155 timingPoint = createTriggerNode.getTimingPoint(); 156 triggeringClause = createTriggerNode.getTriggeringClause(); 157 triggeringClause.doParse(this,ESqlClause.unknown); 158 functionCall = createTriggerNode.getFunctionCall(); 159 160 onTable = tables.getTable(0); 161 162 switch (dbvendor){ 163 case dbvdb2: 164 TTriggerAction triggerAction = createTriggerNode.getTriggerAction(); 165 this.whenCondition = triggerAction.getWhenExpr(); 166 167 if (triggerAction.getStmtNode() != null){ 168 triggerAction.getStmtNode().doParse(this,ESqlClause.unknown); 169 this.getBodyStatements().add(triggerAction.getStmtNode().getStmt()); 170 }else if (triggerAction.getCompoundSqlNode() != null){ 171 TCompoundSqlNode compoundSqlNode = triggerAction.getCompoundSqlNode(); 172 if (compoundSqlNode.getDeclareStmts() != null){ 173 compoundSqlNode.getDeclareStmts().doParse(this,ESqlClause.unknown); 174 175 // push variable declare into symbolTable, and add to declareStatements 176 for(int i=0;i<compoundSqlNode.getDeclareStmts().size();i++){ 177 this.getTopStatement().getSymbolTable().push( new TSymbolTableItem(TObjectName.ttobjVariable,this,compoundSqlNode.getDeclareStmts().getStatementSqlNode(i).getStmt() )); 178 this.getDeclareStatements().add(compoundSqlNode.getDeclareStmts().getStatementSqlNode(i).getStmt()); 179 } 180 } 181 182 if (compoundSqlNode.getStmts() != null){ 183 compoundSqlNode.getStmts().doParse(this,ESqlClause.unknown); 184 185 for(int i= 0; i<compoundSqlNode.getStmts().size();i++){ 186 this.getBodyStatements().add(compoundSqlNode.getStmts().getStatementSqlNode(i).getStmt()); 187 } 188 } 189 190 if (compoundSqlNode.getDeclareStmts() != null){ 191 // pop variable declare from symbolTable 192 for(int i=0;i<compoundSqlNode.getDeclareStmts().size();i++){ 193 this.getTopStatement().getSymbolTable().pop(); 194 } 195 } 196 } 197 break; 198 case dbvmysql: 199 if (createTriggerNode.getStmt() != null){ 200 createTriggerNode.getStmt().doParse(this,ESqlClause.unknown); 201 this.getBodyStatements().add(createTriggerNode.getStmt().getStmt()); 202 } 203 else if (createTriggerNode.getBlcok() != null){ 204 if (createTriggerNode.getBlcok().getStmts() != null){ 205 createTriggerNode.getBlcok().getStmts().doParse(this,ESqlClause.unknown); 206 207 for(int i=0;i<createTriggerNode.getBlcok().getStmts().size();i++){ 208 this.getBodyStatements().add(createTriggerNode.getBlcok().getStmts().getStatementSqlNode(i).getStmt()); 209 } 210 211 } 212 } 213 break; 214 default: 215 if (createTriggerNode.getStmts() != null){ 216 createTriggerNode.getStmts().doParse(this,ESqlClause.unknown); 217 for(int i=0;i<createTriggerNode.getStmts().size();i++){ 218 this.getBodyStatements().add(createTriggerNode.getStmts().getStatementSqlNode(i).getStmt()); 219 } 220 } 221 break; 222 } 223 224 225 return 0; 226 } 227 228 private TTriggeringClause triggeringClause; 229 230 public TTriggeringClause getTriggeringClause() { 231 return triggeringClause; 232 } 233 234 private int fireMode = TBaseType.tfmFor; 235 private ETriggerTimingPoint timingPoint = ETriggerTimingPoint.ttpAfter; 236 private EnumSet <ETriggerDmlType> dmlTypes = EnumSet.noneOf(ETriggerDmlType.class); 237 238 /** 239 * @deprecated As of v1.7.2.5, replaced by {@link gudusoft.gsqlparser.ETriggerDmlType} 240 * @return insert/delete/update action 241 */ 242 public TSourceTokenList getDmlTpyes() { 243 if (this.dmlTpyes == null){ 244 this.dmlTpyes = new TSourceTokenList(); 245 } 246 return this.dmlTpyes; 247 } 248 249 private TSourceTokenList dmlTpyes = null; 250 251 /** 252 * @deprecated As of v1.7.2.5, replaced by {@link gudusoft.gsqlparser.ETriggerTimingPoint} 253 * @return trigger timing point 254 */ 255 public int getFireMode() { 256 return fireMode; 257 } 258 259 public void accept(TParseTreeVisitor v){ 260 v.preVisit(this); 261 262 v.postVisit(this); 263 } 264 public void acceptChildren(TParseTreeVisitor v){ 265 v.preVisit(this); 266 if (getBodyStatements().size() > 0) getBodyStatements().acceptChildren(v); 267 v.postVisit(this); 268 } 269 270 public void setOnTable(TTable onTable) { 271 this.onTable = onTable; 272 } 273 274 public void setTriggerName(TObjectName triggerName) { 275 this.triggerName = triggerName; 276 } 277 278 public void setFireMode(int fireMode) { 279 this.fireMode = fireMode; 280 } 281}