/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.query.parser; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.teiid.core.types.DataTypeManagerService; import org.teiid.designer.annotation.AnnotationUtils; import org.teiid.designer.annotation.Removed; import org.teiid.designer.query.AbstractLanguageVisitor; import org.teiid.designer.query.sql.lang.IAlterProcedure; import org.teiid.designer.query.sql.lang.IAlterTrigger; import org.teiid.designer.query.sql.lang.IAlterView; import org.teiid.designer.query.sql.lang.IArrayTable; import org.teiid.designer.query.sql.lang.IBetweenCriteria; import org.teiid.designer.query.sql.lang.ICompareCriteria; import org.teiid.designer.query.sql.lang.ICompoundCriteria; import org.teiid.designer.query.sql.lang.ICreate; import org.teiid.designer.query.sql.lang.IDelete; import org.teiid.designer.query.sql.lang.IDependentSetCriteria; import org.teiid.designer.query.sql.lang.IDrop; import org.teiid.designer.query.sql.lang.IDynamicCommand; import org.teiid.designer.query.sql.lang.IExistsCriteria; import org.teiid.designer.query.sql.lang.IExpressionCriteria; import org.teiid.designer.query.sql.lang.IFrom; import org.teiid.designer.query.sql.lang.IGroupBy; import org.teiid.designer.query.sql.lang.IInsert; import org.teiid.designer.query.sql.lang.IInto; import org.teiid.designer.query.sql.lang.IIsDistinctCriteria; import org.teiid.designer.query.sql.lang.IIsNullCriteria; import org.teiid.designer.query.sql.lang.IJoinPredicate; import org.teiid.designer.query.sql.lang.IJoinType; import org.teiid.designer.query.sql.lang.ILanguageObject; import org.teiid.designer.query.sql.lang.ILimit; import org.teiid.designer.query.sql.lang.IMatchCriteria; import org.teiid.designer.query.sql.lang.INamedProcedureCall; import org.teiid.designer.query.sql.lang.INotCriteria; import org.teiid.designer.query.sql.lang.IObjectTable; import org.teiid.designer.query.sql.lang.IOption; import org.teiid.designer.query.sql.lang.IOrderBy; import org.teiid.designer.query.sql.lang.IOrderByItem; import org.teiid.designer.query.sql.lang.IQuery; import org.teiid.designer.query.sql.lang.ISelect; import org.teiid.designer.query.sql.lang.ISetClause; import org.teiid.designer.query.sql.lang.ISetClauseList; import org.teiid.designer.query.sql.lang.ISetCriteria; import org.teiid.designer.query.sql.lang.ISetQuery; import org.teiid.designer.query.sql.lang.IStoredProcedure; import org.teiid.designer.query.sql.lang.ISubqueryCompareCriteria; import org.teiid.designer.query.sql.lang.ISubqueryFromClause; import org.teiid.designer.query.sql.lang.ISubquerySetCriteria; import org.teiid.designer.query.sql.lang.ITextTable; import org.teiid.designer.query.sql.lang.IUnaryFromClause; import org.teiid.designer.query.sql.lang.IUpdate; import org.teiid.designer.query.sql.lang.IWithQueryCommand; import org.teiid.designer.query.sql.lang.IXMLTable; import org.teiid.designer.query.sql.proc.IAssignmentStatement; import org.teiid.designer.query.sql.proc.IBlock; import org.teiid.designer.query.sql.proc.IBranchingStatement; import org.teiid.designer.query.sql.proc.ICommandStatement; import org.teiid.designer.query.sql.proc.ICreateProcedureCommand; import org.teiid.designer.query.sql.proc.ICriteriaSelector; import org.teiid.designer.query.sql.proc.IDeclareStatement; import org.teiid.designer.query.sql.proc.IExceptionExpression; import org.teiid.designer.query.sql.proc.IHasCriteria; import org.teiid.designer.query.sql.proc.IIfStatement; import org.teiid.designer.query.sql.proc.ILoopStatement; import org.teiid.designer.query.sql.proc.IRaiseStatement; import org.teiid.designer.query.sql.proc.IReturnStatement; import org.teiid.designer.query.sql.proc.ITranslateCriteria; import org.teiid.designer.query.sql.proc.ITriggerAction; import org.teiid.designer.query.sql.proc.IWhileStatement; import org.teiid.designer.query.sql.symbol.IAggregateSymbol; import org.teiid.designer.query.sql.symbol.IAliasSymbol; import org.teiid.designer.query.sql.symbol.IArray; import org.teiid.designer.query.sql.symbol.ICaseExpression; import org.teiid.designer.query.sql.symbol.IConstant; import org.teiid.designer.query.sql.symbol.IDerivedColumn; import org.teiid.designer.query.sql.symbol.IElementSymbol; import org.teiid.designer.query.sql.symbol.IExpressionSymbol; import org.teiid.designer.query.sql.symbol.IFunction; import org.teiid.designer.query.sql.symbol.IGroupSymbol; import org.teiid.designer.query.sql.symbol.IMultipleElementSymbol; import org.teiid.designer.query.sql.symbol.IQueryString; import org.teiid.designer.query.sql.symbol.IReference; import org.teiid.designer.query.sql.symbol.IScalarSubquery; import org.teiid.designer.query.sql.symbol.ISearchedCaseExpression; import org.teiid.designer.query.sql.symbol.ITextLine; import org.teiid.designer.query.sql.symbol.IWindowFunction; import org.teiid.designer.query.sql.symbol.IWindowSpecification; import org.teiid.designer.query.sql.symbol.IXMLAttributes; import org.teiid.designer.query.sql.symbol.IXMLCast; import org.teiid.designer.query.sql.symbol.IXMLElement; import org.teiid.designer.query.sql.symbol.IXMLExists; import org.teiid.designer.query.sql.symbol.IXMLForest; import org.teiid.designer.query.sql.symbol.IXMLNamespaces; import org.teiid.designer.query.sql.symbol.IXMLParse; import org.teiid.designer.query.sql.symbol.IXMLQuery; import org.teiid.designer.query.sql.symbol.IXMLSerialize; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version; import org.teiid.query.parser.TeiidNodeFactory.ASTNodes; import org.teiid.query.sql.lang.AlterProcedure; import org.teiid.query.sql.lang.AlterTrigger; import org.teiid.query.sql.lang.AlterView; import org.teiid.query.sql.lang.ArrayTable; import org.teiid.query.sql.lang.BetweenCriteria; import org.teiid.query.sql.lang.Command; import org.teiid.query.sql.lang.CompareCriteria; import org.teiid.query.sql.lang.CompoundCriteria; import org.teiid.query.sql.lang.Create; import org.teiid.query.sql.lang.Criteria; import org.teiid.query.sql.lang.CriteriaSelector; import org.teiid.query.sql.lang.Delete; import org.teiid.query.sql.lang.Drop; import org.teiid.query.sql.lang.DynamicCommand; import org.teiid.query.sql.lang.ExistsCriteria; import org.teiid.query.sql.lang.ExpressionCriteria; import org.teiid.query.sql.lang.From; import org.teiid.query.sql.lang.FromClause; import org.teiid.query.sql.lang.GroupBy; import org.teiid.query.sql.lang.HasCriteria; import org.teiid.query.sql.lang.Insert; import org.teiid.query.sql.lang.Into; import org.teiid.query.sql.lang.IsDistinctCriteria; import org.teiid.query.sql.lang.IsNullCriteria; import org.teiid.query.sql.lang.JoinPredicate; import org.teiid.query.sql.lang.JoinType; import org.teiid.query.sql.lang.LanguageObject; import org.teiid.query.sql.lang.Limit; import org.teiid.query.sql.lang.MatchCriteria; import org.teiid.query.sql.lang.NotCriteria; import org.teiid.query.sql.lang.ObjectColumn; import org.teiid.query.sql.lang.ObjectTable; import org.teiid.query.sql.lang.Option; import org.teiid.query.sql.lang.OrderBy; import org.teiid.query.sql.lang.OrderByItem; import org.teiid.query.sql.lang.ProjectedColumn; import org.teiid.query.sql.lang.Query; import org.teiid.query.sql.lang.QueryCommand; import org.teiid.query.sql.lang.Select; import org.teiid.query.sql.lang.SetClause; import org.teiid.query.sql.lang.SetClauseList; import org.teiid.query.sql.lang.SetCriteria; import org.teiid.query.sql.lang.SetQuery; import org.teiid.query.sql.lang.StoredProcedure; import org.teiid.query.sql.lang.SubqueryCompareCriteria; import org.teiid.query.sql.lang.SubqueryFromClause; import org.teiid.query.sql.lang.SubquerySetCriteria; import org.teiid.query.sql.lang.TextColumn; import org.teiid.query.sql.lang.TextTable; import org.teiid.query.sql.lang.TranslateCriteria; import org.teiid.query.sql.lang.UnaryFromClause; import org.teiid.query.sql.lang.Update; import org.teiid.query.sql.lang.WithQueryCommand; import org.teiid.query.sql.lang.XMLColumn; import org.teiid.query.sql.lang.XMLTable; import org.teiid.query.sql.proc.AssignmentStatement; import org.teiid.query.sql.proc.Block; import org.teiid.query.sql.proc.BranchingStatement; import org.teiid.query.sql.proc.CommandStatement; import org.teiid.query.sql.proc.CreateProcedureCommand; import org.teiid.query.sql.proc.CreateUpdateProcedureCommand; import org.teiid.query.sql.proc.DeclareStatement; import org.teiid.query.sql.proc.ExceptionExpression; import org.teiid.query.sql.proc.IfStatement; import org.teiid.query.sql.proc.LoopStatement; import org.teiid.query.sql.proc.RaiseErrorStatement; import org.teiid.query.sql.proc.RaiseStatement; import org.teiid.query.sql.proc.ReturnStatement; import org.teiid.query.sql.proc.Statement; import org.teiid.query.sql.proc.TriggerAction; import org.teiid.query.sql.proc.WhileStatement; import org.teiid.query.sql.symbol.AggregateSymbol; import org.teiid.query.sql.symbol.AliasSymbol; import org.teiid.query.sql.symbol.Array; import org.teiid.query.sql.symbol.CaseExpression; import org.teiid.query.sql.symbol.Constant; import org.teiid.query.sql.symbol.DerivedColumn; import org.teiid.query.sql.symbol.ElementSymbol; import org.teiid.query.sql.symbol.ExpressionSymbol; import org.teiid.query.sql.symbol.Function; import org.teiid.query.sql.symbol.GroupSymbol; import org.teiid.query.sql.symbol.JSONObject; import org.teiid.query.sql.symbol.MultipleElementSymbol; import org.teiid.query.sql.symbol.QueryString; import org.teiid.query.sql.symbol.Reference; import org.teiid.query.sql.symbol.ScalarSubquery; import org.teiid.query.sql.symbol.SearchedCaseExpression; import org.teiid.query.sql.symbol.TextLine; import org.teiid.query.sql.symbol.WindowFunction; import org.teiid.query.sql.symbol.WindowSpecification; import org.teiid.query.sql.symbol.XMLAttributes; import org.teiid.query.sql.symbol.XMLCast; import org.teiid.query.sql.symbol.XMLElement; import org.teiid.query.sql.symbol.XMLExists; import org.teiid.query.sql.symbol.XMLForest; import org.teiid.query.sql.symbol.XMLNamespaces; import org.teiid.query.sql.symbol.XMLParse; import org.teiid.query.sql.symbol.XMLQuery; import org.teiid.query.sql.symbol.XMLSerialize; /** * */ @SuppressWarnings( "javadoc" ) public abstract class LanguageVisitor extends AbstractLanguageVisitor { private final ITeiidServerVersion teiidVersion; /* * Required if nodes are to be created by the visitor */ private final QueryParser parser; private DataTypeManagerService dataTypeManager; private boolean abort = false; private static final Map<Class<?>, Method> methodCache = new HashMap<Class<?>, Method>(); static { // cache all the methods on this visitor Method[] methods = LanguageVisitor.class.getMethods(); for (Method method : methods) { if (!method.getName().equals("visit")) //$NON-NLS-1$ continue; Class<?>[] params = method.getParameterTypes(); if (params == null || params.length == 0) continue; for (Class<?> param : params) { if (LanguageObject.class.isAssignableFrom(param)) { methodCache.put(param, method); } } } } /** * Construct new instance of visitor dependent on * teiid version. * * @param teiidVersion used to check visitor methods are * applicable */ public LanguageVisitor(ITeiidServerVersion teiidVersion) { this.teiidVersion = teiidVersion; this.parser = new QueryParser(teiidVersion); } /** * @return the teiidVersion */ public ITeiidServerVersion getTeiidVersion() { return this.teiidVersion; } protected boolean isTeiidVersionOrGreater(Version teiidVersion) { ITeiidServerVersion minVersion = getTeiidVersion().getMinimumVersion(); return minVersion.equals(teiidVersion.get()) || minVersion.isGreaterThan(teiidVersion.get()); } protected boolean isLessThanTeiidVersion(Version teiidVersion) { ITeiidServerVersion maxVersion = getTeiidVersion().getMaximumVersion(); return maxVersion.isLessThan(teiidVersion.get()); } /** * @return the parser */ public QueryParser getQueryParser() { return this.parser; } protected DataTypeManagerService getDataTypeManager() { if (dataTypeManager == null) dataTypeManager = DataTypeManagerService.getInstance(getTeiidVersion()); return dataTypeManager; } protected <T extends LanguageObject> T createASTNode(ASTNodes nodeType) { return TeiidNodeFactory.createASTNode(getTeiidVersion(), nodeType); } public void setAbort(boolean abort) { this.abort = abort; } public final boolean shouldAbort() { return abort; } private Method searchMethodCache(Class<?> methodClass) { Method method = methodCache.get(methodClass); if (method != null) return method; // Cannot find any method for this class but it could be a version // specific class such as Aggregate8Symbol so the class' interface Class<?>[] interfaces = methodClass.getInterfaces(); if (interfaces == null) return null; for (Class<?> iface : interfaces) { method = methodCache.get(iface); if (method != null) return method; } // Cannot find any method of this class or its interfaces but it may be // a version specific class, such as Alter8Procedure with an abstract // superclass. Class<?> superClass = null; do { superClass = methodClass.getSuperclass(); if (superClass != null) { method = methodCache.get(superClass); if (method != null) return method; } } while (superClass != null); return null; } protected void isApplicable(ILanguageObject node) { Method method = searchMethodCache(node.getClass()); if (method == null) { throw new RuntimeException("No visit method for " + node.getClass()); //$NON-NLS-1$ } String message = "The visit method " + method.toGenericString() + " is not applicable for teiid version " + teiidVersion; //$NON-NLS-1$ //$NON-NLS-2$ if (AnnotationUtils.hasAnnotation(method, Removed.class)) { Removed removed = AnnotationUtils.getAnnotation(method, Removed.class); if (AnnotationUtils.isGreaterThanOrEqualTo(removed, teiidVersion)) { throw new RuntimeException(message); } } // if (AnnotationUtils.hasAnnotation(method, Since.class)) { // Since since = AnnotationUtils.getAnnotation(method, Since.class); // if (!AnnotationUtils.isGreaterThanOrEqualTo(since, teiidVersion)) { // throw new RuntimeException(message); // } // } } public void visit(LanguageObject node) { isApplicable(node); } public void visit(Command node) { isApplicable(node); } public void visit(AlterView node) { isApplicable(node); } public void visit(AlterTrigger node) { isApplicable(node); } public void visit(AlterProcedure node) { isApplicable(node); } public void visit(TriggerAction node) { isApplicable(node); } public void visit(Drop node) { isApplicable(node); } public void visit(Create node) { isApplicable(node); } // REMOVED in TEIID 8.0 public void visit(RaiseErrorStatement node) { throw new UnsupportedOperationException(); } public void visit(RaiseStatement node) { isApplicable(node); } public void visit(ExceptionExpression node) { isApplicable(node); } public void visit(Statement node) { isApplicable(node); } public void visit(BranchingStatement node) { isApplicable(node); } public void visit(ReturnStatement node) { isApplicable(node); } public void visit(WhileStatement node) { isApplicable(node); } public void visit(LoopStatement node) { isApplicable(node); } public void visit(IfStatement node) { isApplicable(node); } public void visit(DeclareStatement node) { isApplicable(node); } public void visit(CommandStatement node) { isApplicable(node); } public void visit(CreateProcedureCommand node) { isApplicable(node); } public void visit(CreateUpdateProcedureCommand node) { throw new UnsupportedOperationException(); } public void visit(DynamicCommand node) { isApplicable(node); } public void visit(SetClauseList node) { isApplicable(node); } public void visit(SetClause node) { isApplicable(node); } public void visit(ProjectedColumn node) { isApplicable(node); } public void visit(StoredProcedure node) { isApplicable(node); } public void visit(Insert node) { isApplicable(node); } public void visit(Update node) { isApplicable(node); } public void visit(Delete node) { isApplicable(node); } public void visit(QueryCommand node) { isApplicable(node); } public void visit(WithQueryCommand node) { isApplicable(node); } public void visit(SetQuery node) { isApplicable(node); } public void visit(Query node) { isApplicable(node); } public void visit(Into node) { isApplicable(node); } public void visit(Select node) { isApplicable(node); } public void visit(ExpressionSymbol node) { isApplicable(node); } public void visit(DerivedColumn node) { isApplicable(node); } public void visit(MultipleElementSymbol node) { isApplicable(node); } public void visit(From node) { isApplicable(node); } public void visit(FromClause node) { isApplicable(node); } public void visit(JoinPredicate node) { isApplicable(node); } public void visit(JoinType node) { isApplicable(node); } public void visit(XMLSerialize node) { isApplicable(node); } public void visit(ArrayTable node) { isApplicable(node); } public void visit(TextTable node) { isApplicable(node); } public void visit(TextColumn node) { isApplicable(node); } public void visit(XMLQuery node) { isApplicable(node); } public void visit(ObjectTable node) { isApplicable(node); } public void visit(ObjectColumn node) { isApplicable(node); } public void visit(XMLTable node) { isApplicable(node); } public void visit(XMLCast node) { isApplicable(node); } public void visit(XMLExists node) { isApplicable(node); } public void visit(XMLColumn node) { isApplicable(node); } public void visit(SubqueryFromClause node) { isApplicable(node); } public void visit(UnaryFromClause node) { isApplicable(node); } public void visit(Criteria node) { isApplicable(node); } public void visit(CompoundCriteria node) { isApplicable(node); } public void visit(NotCriteria node) { isApplicable(node); } public void visit(CompareCriteria node) { isApplicable(node); } public void visit(SubqueryCompareCriteria node) { isApplicable(node); } public void visit(MatchCriteria node) { isApplicable(node); } public void visit(BetweenCriteria node) { isApplicable(node); } public void visit(IsNullCriteria node) { isApplicable(node); } public void visit(SubquerySetCriteria node) { isApplicable(node); } public void visit(SetCriteria node) { isApplicable(node); } public void visit(ExistsCriteria node) { isApplicable(node); } public void visit(GroupBy node) { isApplicable(node); } public void visit(OrderBy node) { isApplicable(node); } public void visit(OrderByItem node) { isApplicable(node); } public void visit(Limit node) { isApplicable(node); } public void visit(Option node) { isApplicable(node); } public void visit(Reference node) { isApplicable(node); } public void visit(CaseExpression node) { isApplicable(node); } public void visit(SearchedCaseExpression node) { isApplicable(node); } public void visit(IsDistinctCriteria node) { isApplicable(node); } public void visit(Function node) { isApplicable(node); } public void visit(XMLParse node) { isApplicable(node); } public void visit(QueryString node) { isApplicable(node); } public void visit(XMLElement node) { isApplicable(node); } public void visit(XMLAttributes node) { isApplicable(node); } public void visit(JSONObject node) { isApplicable(node); } public void visit(XMLForest node) { isApplicable(node); } public void visit(XMLNamespaces node) { isApplicable(node); } public void visit(AssignmentStatement node) { isApplicable(node); } public void visit(ScalarSubquery node) { isApplicable(node); } public void visit(GroupSymbol node) { isApplicable(node); } public void visit(Constant node) { isApplicable(node); } public void visit(ElementSymbol node) { isApplicable(node); } public void visit(Block node) { isApplicable(node); } public void visit(ExpressionCriteria node) { isApplicable(node); } public void visit(AliasSymbol node) { isApplicable(node); } public void visit(AggregateSymbol node) { isApplicable(node); } public void visit(WindowFunction node) { isApplicable(node); } public void visit(WindowSpecification node) { isApplicable(node); } public void visit(TextLine node) { isApplicable(node); } // REMOVED in TEIID 8.0 public void visit(CriteriaSelector node) { throw new UnsupportedOperationException(); } // REMOVED in TEIID 8.0 public void visit(HasCriteria node) { throw new UnsupportedOperationException(); } // REMOVED in TEIID 8.0 public void visit(TranslateCriteria node) { throw new UnsupportedOperationException(); } public void visit(Array node) { isApplicable(node); } // Visitor methods for language objects @Override public void visit(IBetweenCriteria obj) { visit((BetweenCriteria) obj); } @Override public void visit(ICaseExpression obj) { visit((CaseExpression) obj); } @Override public void visit(ICompareCriteria obj) { visit((CompareCriteria) obj); } @Override public void visit(ICompoundCriteria obj) { visit((CompoundCriteria) obj); } @Override public void visit(IDelete obj) { visit((Delete) obj); } @Override public void visit(IExistsCriteria obj) { visit((ExistsCriteria) obj); } @Override public void visit(IFrom obj) { visit((From) obj); } @Override public void visit(IGroupBy obj) { visit((GroupBy) obj); } @Override public void visit(IInsert obj) { visit((Insert) obj); } @Override public void visit(IIsNullCriteria obj) { visit((IsNullCriteria) obj); } @Override public void visit(IJoinPredicate obj) { visit((JoinPredicate) obj); } @Override public void visit(IJoinType obj) { visit((JoinType) obj); } @Override public void visit(ILimit obj) { visit((Limit) obj); } @Override public void visit(IMatchCriteria obj) { visit((MatchCriteria) obj); } @Override public void visit(INotCriteria obj) { visit((NotCriteria) obj); } @Override public void visit(IOption obj) { visit((Option) obj); } @Override public void visit(IOrderBy obj) { visit((OrderBy) obj); } @Override public void visit(IQuery obj) { visit((Query) obj); } @Override public void visit(ISearchedCaseExpression obj) { visit((SearchedCaseExpression) obj); } @Override public void visit(ISelect obj) { visit((Select) obj); } @Override public void visit(ISetCriteria obj) { visit((SetCriteria) obj); } @Override public void visit(ISetQuery obj) { visit((SetQuery) obj); } @Override public void visit(IStoredProcedure obj) { visit((StoredProcedure) obj); } @Override public void visit(ISubqueryCompareCriteria obj) { visit((SubqueryCompareCriteria) obj); } @Override public void visit(ISubqueryFromClause obj) { visit((SubqueryFromClause) obj); } @Override public void visit(ISubquerySetCriteria obj) { visit((SubquerySetCriteria) obj); } @Override public void visit(IUnaryFromClause obj) { visit((UnaryFromClause) obj); } @Override public void visit(IUpdate obj) { visit((Update) obj); } @Override public void visit(IInto obj) { visit((Into) obj); } public void visit(IDependentSetCriteria obj) { // No longer required } @Override public void visit(ICreate obj) { visit((Create) obj); } @Override public void visit(IDrop obj) { visit((Drop) obj); } // Visitor methods for symbol objects @Override public void visit(IAggregateSymbol obj) { visit((AggregateSymbol) obj); } @Override public void visit(IAliasSymbol obj) { visit((AliasSymbol) obj); } @Override public void visit(IMultipleElementSymbol obj) { visit((MultipleElementSymbol) obj); } @Override public void visit(INamedProcedureCall obj) { visit((MultipleElementSymbol) obj); } @Override public void visit(IConstant obj) { visit((Constant) obj); } @Override public void visit(IElementSymbol obj) { visit((ElementSymbol) obj); } @Override public void visit(IExpressionSymbol obj) { visit((ExpressionSymbol) obj); } @Override public void visit(IIsDistinctCriteria obj) { visit((IsDistinctCriteria) obj); } @Override public void visit(IFunction obj) { visit((Function) obj); } @Override public void visit(IGroupSymbol obj) { visit((GroupSymbol) obj); } @Override public void visit(IReference obj) { visit((Reference) obj); } @Override public void visit(IScalarSubquery obj) { visit((ScalarSubquery) obj); } // Visitor methods for procedure language objects @Override public void visit(IAssignmentStatement obj) { visit((AssignmentStatement) obj); } @Override public void visit(IBlock obj) { visit((Block) obj); } @Override public void visit(ICommandStatement obj) { visit((CommandStatement) obj); } @Override public void visit(ICreateProcedureCommand obj) { if (obj instanceof CreateProcedureCommand) visit((CreateProcedureCommand) obj); else visit((CreateUpdateProcedureCommand) obj); } @Override public void visit(ICriteriaSelector obj) { visit((CriteriaSelector) obj); } @Override public void visit(IDeclareStatement obj) { visit((IAssignmentStatement) obj); } @Override public void visit(IHasCriteria obj) { visit((HasCriteria) obj); } @Override public void visit(IIfStatement obj) { visit((IfStatement) obj); } @Override public void visit(IRaiseStatement obj) { if (obj instanceof RaiseStatement) visit((RaiseStatement) obj); else visit((RaiseErrorStatement) obj); } @Override public void visit(IBranchingStatement obj) { visit((BranchingStatement) obj); } @Override public void visit(ITranslateCriteria obj) { visit((TranslateCriteria) obj); } @Override public void visit(IWhileStatement obj) { visit((WhileStatement) obj); } @Override public void visit(ILoopStatement obj) { visit((LoopStatement) obj); } @Override public void visit(IDynamicCommand obj) { visit((DynamicCommand) obj); } @Override public void visit(ISetClauseList obj) { visit((SetClauseList) obj); } @Override public void visit(ISetClause obj) { visit((SetClause) obj); } @Override public void visit(IOrderByItem obj) { visit((OrderByItem) obj); } @Override public void visit(IXMLElement obj) { visit((XMLElement) obj); } @Override public void visit(IXMLAttributes obj) { visit((XMLAttributes) obj); } @Override public void visit(IXMLForest obj) { visit((XMLForest) obj); } @Override public void visit(IXMLNamespaces obj) { visit((XMLNamespaces) obj); } @Override public void visit(ITextTable obj) { visit((TextTable) obj); } @Override public void visit(ITextLine obj) { visit((TextLine) obj); } @Override public void visit(IXMLTable obj) { visit((XMLTable) obj); } @Override public void visit(IXMLExists obj) { visit((XMLExists) obj); } @Override public void visit(IXMLCast obj) { visit((XMLCast) obj); } @Override public void visit(IDerivedColumn obj) { visit((DerivedColumn) obj); } @Override public void visit(IXMLSerialize obj) { visit((XMLSerialize) obj); } @Override public void visit(IXMLQuery obj) { visit((XMLQuery) obj); } @Override public void visit(IQueryString obj) { visit((QueryString) obj); } @Override public void visit(IXMLParse obj) { visit((XMLParse) obj); } @Override public void visit(IExpressionCriteria obj) { visit((ExpressionCriteria) obj); } @Override public void visit(IWithQueryCommand obj) { visit((WithQueryCommand) obj); } @Override public void visit(ITriggerAction obj) { visit((TriggerAction) obj); } @Override public void visit(IObjectTable obj) { visit((ObjectTable) obj); } @Override public void visit(IArrayTable obj) { visit((ArrayTable) obj); } @Override public void visit(IAlterView obj) { visit((AlterView) obj); } @Override public void visit(IAlterProcedure obj) { visit((AlterProcedure) obj); } @Override public void visit(IAlterTrigger obj) { visit((AlterTrigger) obj); } @Override public void visit(IWindowFunction obj) { visit((WindowFunction) obj); } @Override public void visit(IWindowSpecification obj) { visit((WindowSpecification) obj); } @Override public void visit(IExceptionExpression obj) { visit((ExceptionExpression) obj); } @Override public void visit(IReturnStatement obj) { visit((ReturnStatement) obj); } @Override public void visit(IArray obj) { visit((Array) obj); } }