[teiid-commits] teiid SVN: r3131 - in trunk: api/src/main/java/org/teiid/metadata and 26 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Thu Apr 28 21:37:39 EDT 2011


Author: shawkins
Date: 2011-04-28 21:37:38 -0400 (Thu, 28 Apr 2011)
New Revision: 3131

Added:
   trunk/engine/src/main/java/org/teiid/query/resolver/command/AlterResolver.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Alter.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterProcedure.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterTrigger.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterView.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java
Modified:
   trunk/api/src/main/java/org/teiid/language/SQLConstants.java
   trunk/api/src/main/java/org/teiid/metadata/MetadataRepository.java
   trunk/api/src/main/java/org/teiid/metadata/Table.java
   trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
   trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
   trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/BatchedUpdateCommand.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
   trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
   trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java
   trunk/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java
   trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java
   trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java
   trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestEvaluatableVisitor.java
   trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
   trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java
   trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java
Log:
TEIID-1326 adding alter commands for runtime update of metadata

Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -106,6 +106,9 @@
 		public static final String TEXTAGG = "TEXTAGG"; //$NON-NLS-1$
 		
 		public static final String ARRAYTABLE = "ARRAYTABLE"; //$NON-NLS-1$
+		
+		public static final String VIEW = "VIEW"; //$NON-NLS-1$
+		public static final String INSTEAD = "INSTEAD"; //$NON-NLS-1$
 	}
 	
 	public interface Reserved {

Modified: trunk/api/src/main/java/org/teiid/metadata/MetadataRepository.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/MetadataRepository.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/api/src/main/java/org/teiid/metadata/MetadataRepository.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -27,12 +27,6 @@
  */
 public interface MetadataRepository {
 	
-	public enum TriggerOperation {
-		INSERT,
-		UPDATE,
-		DELETE
-	}
-	
 	/**
 	 * Returns an updated view definition (AS SQL only) or null if the current view definition should be used
 	 * should be used.
@@ -52,7 +46,7 @@
 	 * Returns an updated trigger definition (FOR EACH ROW ...) or null if the current view definition should be used
 	 * should be used.
 	 */
-	String getInsteadOfTriggerDefinition(String vdbName, int vdbVersion, Table table, TriggerOperation triggerOperation);
+	String getInsteadOfTriggerDefinition(String vdbName, int vdbVersion, Table table, Table.TriggerOperation triggerOperation);
 	
 	/**
 	 * 
@@ -62,7 +56,7 @@
 	 * @param triggerOperation
 	 * @param triggerDefinition
 	 */
-	void setInsteadOfTriggerDefinition(String vdbName, int vdbVersion, Table table, TriggerOperation triggerOperation, String triggerDefinition);
+	void setInsteadOfTriggerDefinition(String vdbName, int vdbVersion, Table table, Table.TriggerOperation triggerOperation, String triggerDefinition);
 	
 	/**
 	 * Returns an updated procedure definition (CREATE PROCEDURE ...) or null if the current procedure definition should be used

Modified: trunk/api/src/main/java/org/teiid/metadata/Table.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/Table.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/api/src/main/java/org/teiid/metadata/Table.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -41,7 +41,13 @@
 		MaterializedTable
 	}
 	
-    private int cardinality;
+    public static enum TriggerOperation {
+		INSERT,
+		UPDATE,
+		DELETE
+	}
+
+	private int cardinality;
     private Type tableType;
     private boolean isVirtual;
     private boolean isSystem;

Modified: trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -754,17 +754,6 @@
         return getDriverMajorVersion()+"."+getDriverMinorVersion (); //$NON-NLS-1$
     }
 
-    /**
-     * <p>This method gets a description of the forignkey columns that reference the
-     * primary key columns in the given table.  Catalog and schema names are not
-     * used to narrow down the search, but they should match the virtualdatabasename
-     * and version used to obtain this driver connection.
-     * @param name of the catalog which contains the given table.
-     * @param schema name which contains the given table.
-     * @param table name which contains the primary keys.
-     * @return ResultSet object giving the exported key info.
-     * @throws SQLException if there is an error obtaining server results
-     */
     public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
         if (catalog == null) {
         	catalog = PERCENT;
@@ -824,17 +813,6 @@
         return DOUBLE_QUOTE;
     }
 
-    /**
-     * <p>Gets a description of the primary key columns that are referenced by the
-     * foreign key columns in the given table. Catalog and schema names are not
-     * used to narrow down the search, but they should match the virtualdatabasename
-     * and version used to obtain this driver connection.
-     * @param name of the catalog which contains the given table.
-     * @param schema name which contains the given table.
-     * @param table name which contains the foreign keys.
-     * @return ResultSet object giving the imported key info.
-     * @throws SQLException if there is an error obtaining server results
-     */
     public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
     	if (catalog == null) {
         	catalog = PERCENT;
@@ -875,17 +853,6 @@
         }
     }
 
-    /**
-     * <p>Gets a description of the indexes that are present on a given table.
-     *
-     * @param name of the catalog which contains the given table.
-     * @param schema name which contains the given table.
-     * @param table name which contains the indexes.
-     * @param boolean indicating if unique key info needs to be returned.
-     * @param boolean indicating if approximate value are to be allowed.
-     * @return ResultSet object containing metadata info of index columns.
-     * @throws SQLException if catalog/schema info does not match for this connection.
-     */
     public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
         if (catalog == null) {
         	catalog = PERCENT;

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -36,7 +36,6 @@
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.core.util.Assertion;
 import org.teiid.core.util.StringUtil;
 import org.teiid.dqp.internal.process.Request;
 import org.teiid.language.SQLConstants;
@@ -49,6 +48,7 @@
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.metadata.TempMetadataStore;
 import org.teiid.query.parser.QueryParser;
+import org.teiid.query.resolver.command.AlterResolver;
 import org.teiid.query.resolver.command.BatchedUpdateResolver;
 import org.teiid.query.resolver.command.DeleteResolver;
 import org.teiid.query.resolver.command.DynamicCommandResolver;
@@ -108,6 +108,7 @@
     private static final CommandResolver BATCHED_UPDATE_RESOLVER = new BatchedUpdateResolver();
     private static final CommandResolver DYNAMIC_COMMAND_RESOLVER = new DynamicCommandResolver();
     private static final CommandResolver TEMP_TABLE_RESOLVER = new TempTableResolver();
+    private static final CommandResolver ALTER_RESOLVER = new AlterResolver();
     
     public static Command expandCommand(ProcedureContainer proc, QueryMetadataInterface metadata, AnalysisRecord analysisRecord) throws QueryResolverException, QueryMetadataException, TeiidComponentException {
     	ProcedureContainerResolver cr = (ProcedureContainerResolver)chooseResolver(proc, metadata);
@@ -194,8 +195,8 @@
 		    	ResolverVisitor.resolveLanguageObject(elementSymbol, metadata);
 		    	elementSymbol.setIsExternalReference(true);
 		    	if (!positional) {
-		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + name), (ElementSymbol)elementSymbol.clone());
-		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + name), (ElementSymbol)elementSymbol.clone());
+		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + name), elementSymbol.clone());
+		    		symbolMap.put(new ElementSymbol(ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + name), elementSymbol.clone());
 		    		elementSymbol.setShortName(name);
 		    	}
 		        elements.add(elementSymbol);
@@ -211,7 +212,7 @@
 			    		if (!ref.isPositional()) {
 			    			return ref;
 			    		}
-			    		return (ElementSymbol)elements.get(ref.getIndex()).clone();
+			    		return elements.get(ref.getIndex()).clone();
 		    		}
 		    	};
 		    	DeepPostOrderNavigator.doVisit(currentCommand, emv);
@@ -329,6 +330,9 @@
             case Command.TYPE_DYNAMIC:              return DYNAMIC_COMMAND_RESOLVER;
             case Command.TYPE_CREATE:               return TEMP_TABLE_RESOLVER;
             case Command.TYPE_DROP:                 return TEMP_TABLE_RESOLVER;
+            case Command.TYPE_ALTER_PROC:           
+            case Command.TYPE_ALTER_TRIGGER:        
+            case Command.TYPE_ALTER_VIEW:           return ALTER_RESOLVER;
             default:
                 throw new AssertionError("Unknown command type"); //$NON-NLS-1$
         }
@@ -357,7 +361,7 @@
             return false;
         }
         
-        FromClause clause = (FromClause)from.getClauses().get(0);
+        FromClause clause = from.getClauses().get(0);
         
         if (!(clause instanceof UnaryFromClause)) {
             return false;
@@ -456,19 +460,7 @@
             }
 	        Request.validateWithVisitor(new ValidationVisitor(), qmi, result);
             
-	        //ensure that null types match the view
-	        List<ElementSymbol> symbols = ResolverUtil.resolveElementsInGroup(virtualGroup, qmi);
-            List<SingleElementSymbol> projectedSymbols = result.getProjectedSymbols();
-            if (symbols.size() != projectedSymbols.size()) {
-            	Assertion.failed("View " + virtualGroup + " does not have the correct number of projected symbols"); //$NON-NLS-1$ //$NON-NLS-2$
-        	}
-            for (int i = 0; i < projectedSymbols.size(); i++) {
-            	SingleElementSymbol projectedSymbol = projectedSymbols.get(i);
-            	if (projectedSymbol.getType() != DataTypeManager.DefaultDataClasses.NULL) {
-            		continue;
-            	}
-            	ResolverUtil.setSymbolType(projectedSymbol, symbols.get(i).getType());
-            }
+	        validateProjectedSymbols(virtualGroup, qmi, result);
             cachedNode = new QueryNode(qnode.getQuery());
             cachedNode.setCommand((Command)result.clone());
 	        
@@ -488,6 +480,34 @@
 		return cachedNode;
 	}
 
+	public static void validateProjectedSymbols(GroupSymbol virtualGroup,
+			QueryMetadataInterface qmi, Command result)
+			throws QueryMetadataException, TeiidComponentException, QueryValidatorException {
+		//ensure that null types match the view
+		List<ElementSymbol> symbols = ResolverUtil.resolveElementsInGroup(virtualGroup, qmi);
+		List<SingleElementSymbol> projectedSymbols = result.getProjectedSymbols();
+		validateProjectedSymbols(virtualGroup, symbols, projectedSymbols);
+	}
+
+	public static void validateProjectedSymbols(GroupSymbol virtualGroup,
+			List<ElementSymbol> symbols,
+			List<SingleElementSymbol> projectedSymbols)
+			throws QueryValidatorException {
+		if (symbols.size() != projectedSymbols.size()) {
+			throw new QueryValidatorException(QueryPlugin.Util.getString("QueryResolver.wrong_view_symbols", virtualGroup, symbols.size(), projectedSymbols.size())); //$NON-NLS-1$
+		}
+		for (int i = 0; i < projectedSymbols.size(); i++) {
+			SingleElementSymbol projectedSymbol = projectedSymbols.get(i);
+			
+			ResolverUtil.setTypeIfNull(projectedSymbol, symbols.get(i).getType());
+			
+			if (projectedSymbol.getType() != symbols.get(i).getType()) {
+				throw new QueryValidatorException(QueryPlugin.Util.getString("QueryResolver.wrong_view_symbol_type", virtualGroup, i+1,  //$NON-NLS-1$
+						DataTypeManager.getDataTypeName(symbols.get(i).getType()), DataTypeManager.getDataTypeName(projectedSymbol.getType())));
+			}
+		}
+	}
+
 	public static boolean isView(GroupSymbol virtualGroup,
 			QueryMetadataInterface qmi) throws TeiidComponentException,
 			QueryMetadataException {

Added: trunk/engine/src/main/java/org/teiid/query/resolver/command/AlterResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/AlterResolver.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/AlterResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.resolver.command;
+
+import org.teiid.api.exception.query.QueryMetadataException;
+import org.teiid.api.exception.query.QueryResolverException;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.metadata.Table.TriggerOperation;
+import org.teiid.query.QueryPlugin;
+import org.teiid.query.metadata.TempMetadataAdapter;
+import org.teiid.query.resolver.CommandResolver;
+import org.teiid.query.resolver.QueryResolver;
+import org.teiid.query.resolver.util.ResolverUtil;
+import org.teiid.query.sql.lang.Alter;
+import org.teiid.query.sql.lang.AlterProcedure;
+import org.teiid.query.sql.lang.AlterTrigger;
+import org.teiid.query.sql.lang.Command;
+
+public class AlterResolver implements CommandResolver {
+
+	@Override
+	public void resolveCommand(Command command, TempMetadataAdapter metadata,
+			boolean resolveNullLiterals) throws QueryMetadataException,
+			QueryResolverException, TeiidComponentException {
+		Alter<? extends Command> alter = (Alter<? extends Command>)command;
+		ResolverUtil.resolveGroup(alter.getTarget(), metadata);
+		int type = Command.TYPE_QUERY;
+		boolean viewTarget = true;
+		if (alter instanceof AlterTrigger) {
+			TriggerOperation op = ((AlterTrigger)alter).getOperation();
+			switch (op) {
+			case DELETE:
+				type = Command.TYPE_DELETE;
+				break;
+			case INSERT:
+				type = Command.TYPE_INSERT;
+				break;
+			case UPDATE:
+				type = Command.TYPE_UPDATE;
+				break;
+			}
+		} else if (alter instanceof AlterProcedure) {
+			type = Command.TYPE_STORED_PROCEDURE;
+			viewTarget = false;
+		}
+		if (viewTarget && !QueryResolver.isView(alter.getTarget(), metadata)) {
+			throw new QueryResolverException(QueryPlugin.Util.getString("AlterResolver.not_a_view", alter.getTarget())); //$NON-NLS-1$
+		}
+		QueryResolver.resolveCommand(alter.getDefinition(), alter.getTarget(), type, metadata.getDesignTimeMetadata());
+	}
+
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/command/AlterResolver.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/BatchedUpdateResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -22,8 +22,6 @@
 
 package org.teiid.query.resolver.command;
 
-import java.util.Iterator;
-
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
@@ -45,8 +43,7 @@
 
         BatchedUpdateCommand batchedUpdateCommand = (BatchedUpdateCommand) command;
         
-        for (Iterator i = batchedUpdateCommand.getSubCommands().iterator(); i.hasNext();) {
-            Command subCommand = (Command)i.next();
+        for (Command subCommand : batchedUpdateCommand.getUpdateCommands()) {
             QueryResolver.setChildMetadata(subCommand, command);
             QueryResolver.resolveCommand(subCommand, metadata.getMetadata());
         }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/XMLQueryResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -73,26 +73,24 @@
 		query.setIsXML(true);
 
 		// get the group on this query
-		Collection groups = GroupCollectorVisitor.getGroups(query, true);
-		GroupSymbol group = (GroupSymbol) groups.iterator().next();
+		Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(query, true);
+		GroupSymbol group = groups.iterator().next();
 
 		//external groups
         GroupContext externalGroups = query.getExternalGroupContexts();
 
 		// valid elements for select
-		List validSelectElems = getElementsInDocument(group, metadata);
+		List<ElementSymbol> validSelectElems = getElementsInDocument(group, metadata);
 		resolveXMLSelect(query, group, validSelectElems, metadata);
 
 		// valid elements for criteria and order by
-		Collection validCriteriaElements = collectValidCriteriaElements(group, metadata);
+		Collection<ElementSymbol> validCriteriaElements = collectValidCriteriaElements(group, metadata);
 
 		Criteria crit = query.getCriteria();
 		OrderBy orderBy = query.getOrderBy();
         
-        List commands = CommandCollectorVisitor.getCommands(query);
-        for (Iterator i = commands.iterator(); i.hasNext();) {
-            Command subCommand = (Command)i.next();
-            
+        List<Command> commands = CommandCollectorVisitor.getCommands(query);
+        for (Command subCommand : commands) {
             QueryResolver.setChildMetadata(subCommand, command);
             
             QueryResolver.resolveCommand(subCommand, metadata.getMetadata());
@@ -130,7 +128,7 @@
      * @throws QueryMetadataException if resolving fails
      * @throws TeiidComponentException if resolving fails
      */
-	void resolveXMLSelect(Query query, GroupSymbol group, List validElements, QueryMetadataInterface metadata)
+	void resolveXMLSelect(Query query, GroupSymbol group, List<ElementSymbol> validElements, QueryMetadataInterface metadata)
 		throws QueryMetadataException, TeiidComponentException, QueryResolverException {
         
         GroupContext externalGroups = null;
@@ -188,7 +186,7 @@
                     resolveElement(elementSymbol, validElements, externalGroups, metadata);
 
                     // now find all the elements under this node and set as elements.
-                    List elementsInNode = getElementsUnderNode(elementSymbol, validElements, metadata);
+                    List<ElementSymbol> elementsInNode = getElementsUnderNode(elementSymbol, validElements, metadata);
                     ((AllInGroupSymbol)ss).setElementSymbols(elementsInNode);
                 }
 			} else if (ss instanceof AllSymbol) {
@@ -217,11 +215,11 @@
      * @throws TeiidComponentException
      * @throws QueryResolverException
      */
-    public static Collection collectValidCriteriaElements(GroupSymbol group, QueryMetadataInterface metadata)
+    public static Collection<ElementSymbol> collectValidCriteriaElements(GroupSymbol group, QueryMetadataInterface metadata)
         throws QueryMetadataException, TeiidComponentException, QueryResolverException {
 
         // Get all groups and elements
-        List validElements = getElementsInDocument(group, metadata);
+        List<ElementSymbol> validElements = getElementsInDocument(group, metadata);
 
         // Create GroupSymbol for temp groups and add to groups
         Collection tempGroups = metadata.getXMLTempGroups(group.getMetadataID());
@@ -257,14 +255,12 @@
      * @param metadata QueryMetadataInterface the metadata(for resolving criteria on temp groups)
      * @throws QueryResolverException if any of the above fail conditions are met
      */
-    public static void resolveXMLCriteria(Criteria criteria,GroupContext externalGroups, Collection validElements, QueryMetadataInterface metadata)
+    public static void resolveXMLCriteria(Criteria criteria,GroupContext externalGroups, Collection<ElementSymbol> validElements, QueryMetadataInterface metadata)
         throws QueryMetadataException, TeiidComponentException, QueryResolverException {
 
         // Walk through each element in criteria and check against valid elements
-        Collection critElems = ElementCollectorVisitor.getElements(criteria, false);
-        Iterator critElemIter = critElems.iterator();
-        while(critElemIter.hasNext()) {
-            ElementSymbol critElem = (ElementSymbol) critElemIter.next();
+        Collection<ElementSymbol> critElems = ElementCollectorVisitor.getElements(criteria, false);
+        for (ElementSymbol critElem : critElems) {
             if(! critElem.isExternalReference()) {
                 resolveElement(critElem, validElements, externalGroups, metadata);
             }
@@ -282,14 +278,12 @@
      * @throws QueryMetadataException if resolving fails
      * @throws TeiidComponentException if resolving fails
      */
-    static void resolveXMLOrderBy(OrderBy orderBy, GroupContext externalGroups, Collection validElements, QueryMetadataInterface metadata)
+    static void resolveXMLOrderBy(OrderBy orderBy, GroupContext externalGroups, Collection<ElementSymbol> validElements, QueryMetadataInterface metadata)
         throws QueryMetadataException, TeiidComponentException, QueryResolverException {
 
         // Walk through each element in OrderBy clause and check against valid elements
-        Collection orderElems = ElementCollectorVisitor.getElements(orderBy, false);
-        Iterator orderElemIter = orderElems.iterator();
-        while(orderElemIter.hasNext()) {
-            ElementSymbol orderElem = (ElementSymbol) orderElemIter.next();
+        Collection<ElementSymbol> orderElems = ElementCollectorVisitor.getElements(orderBy, false);
+        for (ElementSymbol orderElem : orderElems) {
             resolveElement(orderElem, validElements, externalGroups, metadata);
         }
     }
@@ -304,7 +298,7 @@
 	 * @throws QueryMetadataException
 	 * @throws TeiidComponentException
 	 */
-    static void resolveElement(ElementSymbol elem, Collection validElements, GroupContext externalGroups, QueryMetadataInterface metadata)
+    static void resolveElement(ElementSymbol elem, Collection<ElementSymbol> validElements, GroupContext externalGroups, QueryMetadataInterface metadata)
         throws QueryResolverException, QueryMetadataException, TeiidComponentException {
         
         // Get exact matching name
@@ -313,11 +307,11 @@
 
         // Prepare results
         ElementSymbol exactMatch = null;
-        List partialMatches = new ArrayList(2);     // anything over 1 is an error and should be rare
+        List<ElementSymbol> partialMatches = new ArrayList<ElementSymbol>(2);     // anything over 1 is an error and should be rare
 
         //List of XML attributes that might match the criteria element,
         //if the criteria is specified without the optional "@" sign
-        List attributeMatches = new ArrayList(2);
+        List<ElementSymbol> attributeMatches = new ArrayList<ElementSymbol>(2);
 
         // look up name based on ID match - will work for uuid version
         try {
@@ -333,10 +327,7 @@
         }
 
         // Walk through each valid element looking for a match
-        Iterator elemIter = validElements.iterator();
-        while(elemIter.hasNext()) {
-            ElementSymbol currentElem = (ElementSymbol) elemIter.next();
-
+        for (ElementSymbol currentElem : validElements) {
             // Look for exact match
             if(currentElem.getName().equalsIgnoreCase(critElemName)) {
                 exactMatch = currentElem;
@@ -368,9 +359,9 @@
         // Check for single partial match
         if(exactMatch == null){
             if (partialMatches.size() == 1) {
-                exactMatch = (ElementSymbol) partialMatches.get(0);
+                exactMatch = partialMatches.get(0);
             } else if (partialMatches.size() == 0 && attributeMatches.size() == 1){
-                exactMatch = (ElementSymbol) attributeMatches.get(0);
+                exactMatch = attributeMatches.get(0);
             }
         }
 
@@ -395,18 +386,17 @@
         }
     }
 
-    static List getElementsInDocument(GroupSymbol group, QueryMetadataInterface metadata)
-        throws QueryMetadataException, QueryResolverException, TeiidComponentException {
+    static List<ElementSymbol> getElementsInDocument(GroupSymbol group, QueryMetadataInterface metadata)
+        throws QueryMetadataException, TeiidComponentException {
         return ResolverUtil.resolveElementsInGroup(group, metadata);
     }
     
-    static List getElementsUnderNode(ElementSymbol node, List validElements, QueryMetadataInterface metadata) 
+    static List<ElementSymbol> getElementsUnderNode(ElementSymbol node, List<ElementSymbol> validElements, QueryMetadataInterface metadata) 
         throws TeiidComponentException, QueryMetadataException {
         
-        List elements = new ArrayList();
+        List<ElementSymbol> elements = new ArrayList<ElementSymbol>();
         String nodeName = metadata.getFullName(node.getMetadataID());
-        for (Iterator i = validElements.iterator(); i.hasNext();) {
-            ElementSymbol validElement = (ElementSymbol)i.next();
+        for (ElementSymbol validElement : validElements) {
             String qualifiedName = validElement.getName();
             if (qualifiedName.equals(nodeName) || qualifiedName.startsWith(nodeName+ElementSymbol.SEPARATOR)) {
                 elements.add(validElement);

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -627,16 +627,15 @@
             
             SingleElementSymbol symbol = (SingleElementSymbol)selectSymbol;
             
-            if(!DataTypeManager.DefaultDataClasses.NULL.equals(symbol.getType()) && symbol.getType() != null) {
-                continue;
-            }
-                        
-            setSymbolType(symbol, DataTypeManager.DefaultDataClasses.STRING);
+            setTypeIfNull(symbol, DataTypeManager.DefaultDataClasses.STRING);
         }
     }
 
-	public static void setSymbolType(SingleElementSymbol symbol,
+	public static void setTypeIfNull(SingleElementSymbol symbol,
 			Class<?> replacement) {
+		if(!DataTypeManager.DefaultDataClasses.NULL.equals(symbol.getType()) && symbol.getType() != null) {
+            return;
+        }
 		if(symbol instanceof AliasSymbol) {
             symbol = ((AliasSymbol)symbol).getSymbol();
         }
@@ -659,10 +658,7 @@
 		    }
 		} else if(symbol instanceof ElementSymbol) {
 		    ElementSymbol elementSymbol = (ElementSymbol)symbol;
-		    Class elementType = elementSymbol.getType();
-		    if(elementType != null && elementType.equals(DataTypeManager.DefaultDataClasses.NULL)) {
-		        elementSymbol.setType(replacement);
-		    }
+	        elementSymbol.setType(replacement);
 		}
 	}
     

Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -22,9 +22,88 @@
 
 package org.teiid.query.sql;
 
-import org.teiid.query.sql.lang.*;
-import org.teiid.query.sql.proc.*;
-import org.teiid.query.sql.symbol.*;
+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.BatchedUpdateCommand;
+import org.teiid.query.sql.lang.BetweenCriteria;
+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.Delete;
+import org.teiid.query.sql.lang.DependentSetCriteria;
+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.GroupBy;
+import org.teiid.query.sql.lang.Insert;
+import org.teiid.query.sql.lang.Into;
+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.Limit;
+import org.teiid.query.sql.lang.MatchCriteria;
+import org.teiid.query.sql.lang.NotCriteria;
+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.ProcedureContainer;
+import org.teiid.query.sql.lang.Query;
+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.TextTable;
+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.XMLTable;
+import org.teiid.query.sql.proc.AssignmentStatement;
+import org.teiid.query.sql.proc.Block;
+import org.teiid.query.sql.proc.BreakStatement;
+import org.teiid.query.sql.proc.CommandStatement;
+import org.teiid.query.sql.proc.ContinueStatement;
+import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
+import org.teiid.query.sql.proc.CriteriaSelector;
+import org.teiid.query.sql.proc.DeclareStatement;
+import org.teiid.query.sql.proc.HasCriteria;
+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.TranslateCriteria;
+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.AllInGroupSymbol;
+import org.teiid.query.sql.symbol.AllSymbol;
+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.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.XMLAttributes;
+import org.teiid.query.sql.symbol.XMLElement;
+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;
 
 /**
  * <p>The LanguageVisitor can be used to visit a LanguageObject as if it were a tree
@@ -140,4 +219,8 @@
     public void visit(WithQueryCommand obj) {}
     public void visit(TriggerAction obj) {}
     public void visit(ArrayTable obj) {}
+
+	public void visit(AlterView obj) {}
+	public void visit(AlterProcedure obj) {}
+    public void visit(AlterTrigger obj) {}
 }

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/Alter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Alter.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Alter.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,87 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.sql.lang;
+
+import java.util.List;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.SingleElementSymbol;
+
+public abstract class Alter<T extends Command> extends Command {
+	
+	private GroupSymbol target;
+	private T definition;
+	
+	public GroupSymbol getTarget() {
+		return target;
+	}
+	
+	public void setTarget(GroupSymbol target) {
+		this.target = target;
+	}
+	
+	public T getDefinition() {
+		return definition;
+	}
+	
+	public void setDefinition(T definition) {
+		this.definition = definition;
+	}
+	
+	@Override
+	public boolean areResultsCachable() {
+		return false;
+	}
+	
+	@Override
+	public List<SingleElementSymbol> getProjectedSymbols() {
+		return Command.getUpdateCommandSymbol();
+	}
+	
+	public void cloneOnTo(Alter<T> clone) {
+		copyMetadataState(clone);
+		clone.setDefinition((T)getDefinition().clone());
+		clone.setTarget(getTarget().clone());
+	}
+	
+	@Override
+	public int hashCode() {
+		return HashCodeUtil.hashCode(this.target.hashCode(), this.definition);
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (obj.getClass() != this.getClass()) {
+			return false;
+		}
+		Alter<?> other = (Alter<?>)obj;
+		return EquivalenceUtil.areEqual(this.target, other.target)
+		&& EquivalenceUtil.areEqual(this.definition, other.definition);
+	}
+	
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/lang/Alter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterProcedure.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterProcedure.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterProcedure.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+package org.teiid.query.sql.lang;
+
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
+
+public class AlterProcedure extends Alter<CreateUpdateProcedureCommand> {
+	
+	@Override
+	public void acceptVisitor(LanguageVisitor visitor) {
+		visitor.visit(this);
+	}
+	
+	@Override
+	public AlterProcedure clone() {
+		AlterProcedure clone = new AlterProcedure();
+		this.cloneOnTo(clone);
+		return clone;
+	}
+	
+	@Override
+	public int getType() {
+		return TYPE_ALTER_PROC;
+	}
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterProcedure.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterTrigger.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterTrigger.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterTrigger.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.sql.lang;
+
+import org.teiid.metadata.Table;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.proc.TriggerAction;
+
+public class AlterTrigger extends Alter<TriggerAction> {
+	
+	private Table.TriggerOperation operation;
+	
+	public Table.TriggerOperation getOperation() {
+		return operation;
+	}
+	
+	public void setOperation(Table.TriggerOperation operation) {
+		this.operation = operation;
+	}
+	
+	@Override
+	public void acceptVisitor(LanguageVisitor visitor) {
+		visitor.visit(this);
+	}
+	
+	@Override
+	public AlterTrigger clone() {
+		AlterTrigger clone = new AlterTrigger();
+		cloneOnTo(clone);
+		clone.operation = operation;
+		return clone;
+	}
+	
+	@Override
+	public int getType() {
+		return TYPE_ALTER_TRIGGER;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (!super.equals(obj)) {
+			return false;
+		}
+		if (obj == this) {
+			return true;
+		}
+		AlterTrigger other = (AlterTrigger)obj;
+		return other.operation == this.operation;
+	}
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterTrigger.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterView.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterView.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterView.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+package org.teiid.query.sql.lang;
+
+import org.teiid.query.sql.LanguageVisitor;
+
+public class AlterView extends Alter<QueryCommand> {
+	
+	@Override
+	public void acceptVisitor(LanguageVisitor visitor) {
+		visitor.visit(this);
+	}
+	
+	@Override
+	public AlterView clone() {
+		AlterView clone = new AlterView();
+		this.cloneOnTo(clone);
+		return clone;
+	}
+	
+	@Override
+	public int getType() {
+		return TYPE_ALTER_VIEW;
+	}
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/lang/AlterView.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/BatchedUpdateCommand.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/BatchedUpdateCommand.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/BatchedUpdateCommand.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -40,13 +40,6 @@
     protected List<Command> commands;
     private List<VariableContext> variableContexts; //processing state
     
-    /** 
-     * @see org.teiid.query.sql.lang.Command#getSubCommands()
-     */
-    public List<Command> getSubCommands() {
-        return commands;
-    }
-    
     /**
      *  
      * @param updateCommands
@@ -62,7 +55,7 @@
      * @since 4.2
      */
     public List<Command> getUpdateCommands() {
-        return getSubCommands();
+        return commands;
     }
 
     /** 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -26,7 +26,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -103,6 +102,12 @@
     public static final int TYPE_DROP = 12;
     
     public static final int TYPE_TRIGGER_ACTION = 13;
+    
+    public static final int TYPE_ALTER_VIEW = 14;
+    
+    public static final int TYPE_ALTER_PROC = 15;
+    
+    public static final int TYPE_ALTER_TRIGGER = 16;
 
     private static List<SingleElementSymbol> updateCommandSymbol;
     
@@ -144,15 +149,6 @@
 		this.correlatedReferences = correlatedReferences;
 	}
 
-    /**
-     * Gets the subCommands (both embedded and non-embedded) under this command.  In general the returned list
-     * is not safe to manipulate (see @link#CommandContainer insead) 
-     * @return
-     */
-    public List<Command> getSubCommands() {
-        return CommandCollectorVisitor.getCommands(this);
-    }
-    
     public void setTemporaryMetadata(Map metadata) {
         this.tempGroupIDs = metadata;
     }
@@ -264,9 +260,7 @@
         
         // Add children recursively
         tabLevel++;
-        Iterator iter = getSubCommands().iterator();
-        while(iter.hasNext()) {
-            Command subCommand = (Command) iter.next();
+        for (Command subCommand : CommandCollectorVisitor.getCommands(this)) {
             subCommand.printCommandTree(str, tabLevel);
         }
     }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -26,6 +26,9 @@
 
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
+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.BatchedUpdateCommand;
 import org.teiid.query.sql.lang.BetweenCriteria;
@@ -667,6 +670,30 @@
         postVisitVisitor(obj);
     }
     
+    @Override
+    public void visit(AlterProcedure obj) {
+    	preVisitVisitor(obj);
+        visitNode(obj.getTarget());
+        visitNode(obj.getDefinition());
+        postVisitVisitor(obj);
+    }
+    
+    @Override
+    public void visit(AlterTrigger obj) {
+    	preVisitVisitor(obj);
+        visitNode(obj.getTarget());
+        visitNode(obj.getDefinition());
+        postVisitVisitor(obj);
+    }
+    
+    @Override
+    public void visit(AlterView obj) {
+    	preVisitVisitor(obj);
+        visitNode(obj.getTarget());
+        visitNode(obj.getDefinition());
+        postVisitVisitor(obj);
+    }
+    
     public static void doVisit(LanguageObject object, LanguageVisitor visitor, boolean order) {
     	doVisit(object, visitor, order, false);
     }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/CommandCollectorVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -27,6 +27,9 @@
 
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
+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.BatchedUpdateCommand;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.ExistsCriteria;
@@ -116,6 +119,21 @@
         this.commands.addAll(obj.getUpdateCommands());
     }
     
+    @Override
+    public void visit(AlterProcedure alterProcedure) {
+    	this.commands.add(alterProcedure.getDefinition());
+    }
+    
+    @Override
+    public void visit(AlterTrigger alterTrigger) {
+    	this.commands.add(alterTrigger.getDefinition());
+    }
+    
+    @Override
+    public void visit(AlterView alterView) {
+    	this.commands.add(alterView.getDefinition());
+    }
+    
     /**
      * Helper to quickly get the commands from obj
      * @param obj Language object

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -38,6 +38,9 @@
 import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
+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.AtomicCriteria;
 import org.teiid.query.sql.lang.BetweenCriteria;
@@ -1955,6 +1958,55 @@
         append(SPACE);
         outputDisplayName(obj.getName());
     }
+    
+    @Override
+    public void visit(AlterProcedure alterProcedure) {
+    	append(ALTER);
+    	append(SPACE);
+    	append(PROCEDURE);
+    	append(SPACE);
+    	append(alterProcedure.getTarget());
+    	beginClause(1);
+    	append(AS);
+    	addCacheHint(alterProcedure.getCacheHint());
+    	append(alterProcedure.getDefinition().getBlock());
+    }
+    
+    @Override
+    public void visit(AlterTrigger alterTrigger) {
+    	append(ALTER);
+    	append(SPACE);
+    	append(TRIGGER);
+    	append(SPACE);
+    	append(ON);
+    	append(SPACE);
+    	append(alterTrigger.getTarget());
+    	beginClause(0);
+    	append(NonReserved.INSTEAD);
+    	append(SPACE);
+    	append(OF);
+    	append(SPACE);
+    	append(alterTrigger.getOperation());
+    	beginClause(0);
+    	append(AS);
+    	append("\n"); //$NON-NLS-1$
+        addTabs(0);
+    	append(alterTrigger.getDefinition());
+    }
+    
+    @Override
+    public void visit(AlterView alterView) {
+    	append(ALTER);
+    	append(SPACE);
+    	append(NonReserved.VIEW);
+    	append(SPACE);
+    	append(alterView.getTarget());
+    	beginClause(0);
+    	append(AS);
+    	append("\n"); //$NON-NLS-1$
+        addTabs(0);
+    	append(alterView.getDefinition());
+    }
 
     public static String escapeSinglePart( String part ) {
         if (isReservedWord(part)) {

Modified: trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/validator/AbstractValidationVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -128,18 +128,18 @@
         return false;
 	}   
 	
-    protected Collection validateElementsSupport(Collection elements, int supportsFlag) {
+    protected Collection<ElementSymbol> validateElementsSupport(Collection<ElementSymbol> elements, int supportsFlag) {
 	    // Collect any identifiers not supporting flag
-	    List dontSupport = null;  
+	    List<ElementSymbol> dontSupport = null;  
         ElementSymbol symbol = null;              
 
         try {
-	        Iterator elemIter = elements.iterator();
+	        Iterator<ElementSymbol> elemIter = elements.iterator();
             while(elemIter.hasNext()) {
-		    symbol = (ElementSymbol) elemIter.next();
+		    symbol = elemIter.next();
                if(! getMetadata().elementSupports(symbol.getMetadataID(), supportsFlag)) {
                     if(dontSupport == null) { 
-                        dontSupport = new ArrayList();
+                        dontSupport = new ArrayList<ElementSymbol>();
                     } 
                     dontSupport.add(symbol);    
                 }            

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -49,11 +49,16 @@
 import org.teiid.query.function.FunctionLibrary;
 import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.function.source.XMLSystemFunctions;
+import org.teiid.query.metadata.StoredProcedureInfo;
 import org.teiid.query.metadata.SupportConstants;
+import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.ProcedureReservedWords;
+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.BatchedUpdateCommand;
 import org.teiid.query.sql.lang.BetweenCriteria;
 import org.teiid.query.sql.lang.Command;
@@ -175,11 +180,11 @@
     // ############### Visitor methods for language objects ##################
     
     public void visit(BatchedUpdateCommand obj) {
-        List commands = obj.getUpdateCommands();
+        List<Command> commands = obj.getUpdateCommands();
         Command command = null;
         int type = 0;
         for (int i = 0; i < commands.size(); i++) {
-            command = (Command)commands.get(i);
+            command = commands.get(i);
             type = command.getType();
             if (type != Command.TYPE_INSERT &&
                 type != Command.TYPE_UPDATE &&
@@ -295,7 +300,7 @@
     	}
         this.validateRowLimitFunctionNotInInvalidCriteria(obj);
         
-		Collection projSymbols = obj.getCommand().getProjectedSymbols();
+		Collection<SingleElementSymbol> projSymbols = obj.getCommand().getProjectedSymbols();
 
 		//Subcommand should have one projected symbol (query with one expression
 		//in SELECT or stored procedure execution that returns a single value).
@@ -358,8 +363,8 @@
                     handleValidationError(QueryPlugin.Util.getString("ERR.015.004.0036"), obj);  //$NON-NLS-1$
                 }
                 
-                for (Iterator functions = FunctionCollectorVisitor.getFunctions(obj.getArg(1), false).iterator(); functions.hasNext();) {
-                    Function function = (Function)functions.next();
+                for (Iterator<Function> functions = FunctionCollectorVisitor.getFunctions(obj.getArg(1), false).iterator(); functions.hasNext();) {
+                    Function function = functions.next();
                     
                     if (function.getFunctionDescriptor().getName().equalsIgnoreCase(FunctionLibrary.CONTEXT)) {
                         handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.Context_function_nested"), obj); //$NON-NLS-1$
@@ -522,7 +527,7 @@
         // CompareCriteria which is entirely it's own conjunct (not OR'ed with anything else)
         if (isXML) {
             // Collect all occurrances of rowlimit and rowlimitexception functions
-            List rowLimitFunctions = new ArrayList();
+            List<Function> rowLimitFunctions = new ArrayList<Function>();
             FunctionCollectorVisitor visitor = new FunctionCollectorVisitor(rowLimitFunctions, FunctionLibrary.ROWLIMIT);
             PreOrderNavigator.doVisit(obj, visitor); 
             visitor = new FunctionCollectorVisitor(rowLimitFunctions, FunctionLibrary.ROWLIMITEXCEPTION);
@@ -532,7 +537,7 @@
                 
                 // Verify each use of rowlimit function is in a compare criteria that is 
                 // entirely it's own conjunct
-                Iterator conjunctIter = Criteria.separateCriteriaByAnd(obj).iterator();            
+                Iterator<Criteria> conjunctIter = Criteria.separateCriteriaByAnd(obj).iterator();            
                 
                 int i = 0;
                 while (conjunctIter.hasNext() && i<functionCount ) {
@@ -587,7 +592,7 @@
 			return;
 		}
 
-    	Collection transleElmnts = ElementCollectorVisitor.getElements(obj, true);
+    	Collection<ElementSymbol> transleElmnts = ElementCollectorVisitor.getElements(obj, true);
     	Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(this.currentCommand, true);
 		int selectType = obj.getSelector().getSelectorType();
 
@@ -616,10 +621,10 @@
                     }
 				}
 			}
-	    	Iterator critEmlntIter = ElementCollectorVisitor.getElements(predCrit, true).iterator();
+	    	Iterator<ElementSymbol> critEmlntIter = ElementCollectorVisitor.getElements(predCrit, true).iterator();
 	    	// collect all elements elements on the criteria map to
 	    	while(critEmlntIter.hasNext()) {
-	    		ElementSymbol criteriaElement = (ElementSymbol) critEmlntIter.next();
+	    		ElementSymbol criteriaElement = critEmlntIter.next();
 	    		if(transleElmnts.contains(criteriaElement)) {
 		    		Expression mappedExpr = (Expression) symbolMap.get(criteriaElement);
 		    		if(mappedExpr instanceof AggregateSymbol) {
@@ -639,9 +644,9 @@
     		return;
     	}
 
-        Collection elements = ElementCollectorVisitor.getElements(obj, true);
+        Collection<ElementSymbol> elements = ElementCollectorVisitor.getElements(obj, true);
         
-        Collection cantSelect = validateElementsSupport(
+        Collection<ElementSymbol> cantSelect = validateElementsSupport(
             elements,
             SupportConstants.Element.SELECT );
 
@@ -771,10 +776,8 @@
             }
             
             // Validate SELECT
-            List projectedSymbols = select.getProjectedSymbols();
-            Iterator symbolIter = projectedSymbols.iterator();
-            while(symbolIter.hasNext()) {
-                SingleElementSymbol symbol = (SingleElementSymbol) symbolIter.next();
+            List<SingleElementSymbol> projectedSymbols = select.getProjectedSymbols();
+            for (SingleElementSymbol symbol : projectedSymbols) {
                 AggregateValidationVisitor.validate(symbol, visitor);                                            
             }
             
@@ -922,13 +925,13 @@
      * @since 4.2
      */
     protected void validateSelectInto(Query query) {
-        List symbols = query.getSelect().getProjectedSymbols();
+        List<SingleElementSymbol> symbols = query.getSelect().getProjectedSymbols();
         GroupSymbol intoGroup = query.getInto().getGroup();
         validateInto(query, symbols, intoGroup);
     }
 
     private void validateInto(LanguageObject query,
-                                List symbols,
+                                List<SingleElementSymbol> symbols,
                                 GroupSymbol intoGroup) {
         try {
             List elementIDs = getMetadata().getElementIDsInGroupID(intoGroup.getMetadataID());
@@ -940,14 +943,14 @@
             }
             
             for (int symbolNum = 0; symbolNum < symbols.size(); symbolNum++) {
-                SingleElementSymbol symbol = (SingleElementSymbol)symbols.get(symbolNum);
+                SingleElementSymbol symbol = symbols.get(symbolNum);
                 Object elementID = elementIDs.get(symbolNum);
                 // Check if supports updates
                 if (!getMetadata().elementSupports(elementID, SupportConstants.Element.UPDATE)) {
                     handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.element_updates_not_allowed", getMetadata().getFullName(elementID)), intoGroup); //$NON-NLS-1$
                 }
 
-                Class symbolType = symbol.getType();
+                Class<?> symbolType = symbol.getType();
                 String symbolTypeName = DataTypeManager.getDataTypeName(symbolType);
                 String targetTypeName = getMetadata().getElementType(elementID);
                 if (symbolTypeName.equals(targetTypeName)) {
@@ -970,17 +973,16 @@
      * @since 4.2
      */
     protected void validateContainsRowsUpdatedVariable(CreateUpdateProcedureCommand obj) {
-        final Collection assignVars = new ArrayList();
+        final Collection<ElementSymbol> assignVars = new ArrayList<ElementSymbol>();
        // Use visitor to find assignment statements
         LanguageVisitor visitor = new LanguageVisitor() {
-            public void visit(AssignmentStatement obj) {
-                assignVars.add(obj.getVariable());
+            public void visit(AssignmentStatement stmt) {
+                assignVars.add(stmt.getVariable());
             }
         };
         PreOrderNavigator.doVisit(obj, visitor);
         boolean foundVar = false;
-        for(Iterator varIter = assignVars.iterator(); varIter.hasNext();) {
-            ElementSymbol variable = (ElementSymbol) varIter.next();
+        for (ElementSymbol variable : assignVars) {
             if(variable.getShortName().equalsIgnoreCase(ProcedureReservedWords.ROWS_UPDATED)) {
                 foundVar = true;
                 break;
@@ -993,7 +995,7 @@
     
     private void validateRowLimitFunctionNotInInvalidCriteria(Criteria obj) {
         // Collect all occurrances of rowlimit and rowlimitexception functions
-        List rowLimitFunctions = new ArrayList();
+        List<Function> rowLimitFunctions = new ArrayList<Function>();
         FunctionCollectorVisitor visitor = new FunctionCollectorVisitor(rowLimitFunctions, FunctionLibrary.ROWLIMIT);
         PreOrderNavigator.doVisit(obj, visitor);      
         visitor = new FunctionCollectorVisitor(rowLimitFunctions, FunctionLibrary.ROWLIMITEXCEPTION);
@@ -1062,16 +1064,16 @@
     }
     
     public void visit(Option obj) {
-        List dep = obj.getDependentGroups();
-        List notDep = obj.getNotDependentGroups();
+        List<String> dep = obj.getDependentGroups();
+        List<String> notDep = obj.getNotDependentGroups();
         if (dep != null && !dep.isEmpty()
             && notDep != null && !notDep.isEmpty()) {
             String groupName = null;
             String notDepGroup = null;
-            for (Iterator i = dep.iterator(); i.hasNext();) {
-                groupName = (String)i.next();
-                for (Iterator j = notDep.iterator(); j.hasNext();) {
-                    notDepGroup = (String)j.next();
+            for (Iterator<String> i = dep.iterator(); i.hasNext();) {
+                groupName = i.next();
+                for (Iterator<String> j = notDep.iterator(); j.hasNext();) {
+                    notDepGroup = j.next();
                     if (notDepGroup.equalsIgnoreCase(groupName)) {
                         handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.group_in_both_dep", groupName), obj); //$NON-NLS-1$
                         return;
@@ -1428,9 +1430,46 @@
     public void visit(WithQueryCommand obj) {
     	validateSubquery(obj);
     }
+    
+    public void visit(AlterView obj) {
+    	try {
+			QueryResolver.validateProjectedSymbols(obj.getTarget(), getMetadata(), obj.getDefinition());
+		} catch (QueryValidatorException e) {
+			handleValidationError(e.getMessage(), obj.getDefinition());
+		} catch (TeiidComponentException e) {
+			handleException(e);
+		}
+    }
 
-    //TODO: it may be simplier to catch this in the parser
-    private void validateSubquery(SubqueryContainer subQuery) {
+    @Override
+    public void visit(AlterProcedure obj) {
+    	GroupSymbol gs = obj.getTarget();
+    	try {
+	    	if (!gs.isProcedure() || !getMetadata().isVirtualModel(getMetadata().getModelID(gs.getMetadataID()))) {
+	    		handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.not_a_procedure", gs), gs); //$NON-NLS-1$
+	    		return;
+	    	}
+	    	StoredProcedureInfo info = getMetadata().getStoredProcedureInfoForProcedure(gs.getName());
+	    	for (SPParameter param : info.getParameters()) {
+	    		if (param.getParameterType() == SPParameter.RESULT_SET) {
+	    	    	QueryResolver.validateProjectedSymbols(gs, param.getResultSetColumns(), obj.getDefinition().getProjectedSymbols());
+	    	    	break;
+	    		}
+	    	}
+    	} catch (QueryValidatorException e) {
+			handleValidationError(e.getMessage(), obj.getDefinition().getBlock());
+    	} catch (TeiidComponentException e) {
+			handleException(e);
+		}
+    }
+    
+    @Override
+    public void visit(AlterTrigger obj) {
+    	validateGroupSupportsUpdate(obj.getTarget());
+    }
+
+    //TODO: it may be simpler to catch this in the parser
+    private void validateSubquery(SubqueryContainer<?> subQuery) {
     	if (subQuery.getCommand() instanceof Query && ((Query)subQuery.getCommand()).getInto() != null) {
         	handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.subquery_insert"), subQuery.getCommand()); //$NON-NLS-1$
         }

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2011-04-29 01:37:38 UTC (rev 3131)
@@ -491,23 +491,45 @@
   	QueryCommand command = null;
   	Block block = null;
   	TriggerAction triggerAction = null;
+  	Token comment = null;
+  	Table.TriggerOperation op = null;
 }
 {
 	<ALTER>
 	(
-	 	(nonReserved("VIEW") target = id() <AS> command = queryExpression(info)) 
+	 	(nonReserved("VIEW") target = id() <AS> { comment = getToken(1).specialToken; } command = queryExpression(info)) 
 	 	{
+	 	    if (comment != null) {
+		 	    command.setCacheHint(getQueryCacheOption(comment.image));
+	 	    }
+	 		AlterView alterView = new AlterView();
+	 		alterView.setTarget(new GroupSymbol(target));
+	 		alterView.setDefinition(command);
+	 		return alterView;	
 	 	}
-		| (<PROCEDURE> target = id() <AS> block = block(info)) 
+		| (<PROCEDURE> target = id() <AS> { comment = getToken(1).specialToken; } block = block(info)) 
 		{
+			CreateUpdateProcedureCommand cup = new CreateUpdateProcedureCommand(block);
+			cup.setUpdateProcedure(false);
+			if (comment != null) {
+		 	    cup.setCacheHint(getQueryCacheOption(comment.image));
+	 	    }
+			AlterProcedure alterProc = new AlterProcedure();
+			alterProc.setTarget(new GroupSymbol(target));
+			alterProc.setDefinition(cup);
+			return alterProc;
 		}
-		| (<TRIGGER> <ON> target = id() nonReserved("INSTEAD") <OF> (<INSERT>|<UPDATE>|<DELETE>) <AS> triggerAction = triggerAction(info))
+		| (<TRIGGER> <ON> target = id() nonReserved("INSTEAD") <OF> 
+		  (<INSERT> {op = Table.TriggerOperation.INSERT;} |<UPDATE> {op = Table.TriggerOperation.UPDATE;}|<DELETE> {op = Table.TriggerOperation.DELETE;}) 
+		  <AS> triggerAction = triggerAction(info))
 		{
+			AlterTrigger alterTrigger = new AlterTrigger();
+			alterTrigger.setTarget(new GroupSymbol(target));
+			alterTrigger.setDefinition(triggerAction);
+			alterTrigger.setOperation(op);
+			return alterTrigger;				
 		}
 	)
-	{
-		return null;
-	} 
 }
 
 TriggerAction triggerAction(ParseInfo info) :
@@ -2733,23 +2755,11 @@
 
 QueryCommand subquery(ParseInfo info) :
 {
-	Object[] result = null;    
-}
-{
-	result = subqueryAndHint(info)
-	{
-		return (QueryCommand)result[0];
-	} 
-}
-
-Object[] subqueryAndHint(ParseInfo info) :
-{
     QueryCommand subquery = null;
     StoredProcedure proc = null;
-    Token lparen = null;
 }
 {
-	lparen = <LPAREN>
+	<LPAREN>
 	( subquery = queryExpression(info) | 
 	 (
 		proc = storedProcedure(info, new StoredProcedure()) //deprecated	  
@@ -2760,6 +2770,19 @@
 	)
 	<RPAREN>
 	{
+		return subquery;
+	}
+}
+
+Object[] subqueryAndHint(ParseInfo info) :
+{
+    QueryCommand subquery = null;
+    Token lparen = null;
+}
+{
+	{lparen = getToken(1);}
+	subquery = subquery(info)
+	{
 		return new Object[] {subquery, getSubqueryHint(lparen)};
 	}
 }

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2011-04-29 01:37:38 UTC (rev 3131)
@@ -668,6 +668,8 @@
 SimpleQueryResolver.duplicate_with=Duplicate WITH clause item name {0}
 SimpleQueryResolver.mismatched_with_columns=The number of WITH clause columns for item {0} do not match the query expression
 QueryResolver.invalid_xpath=Invalid xpath value: {0}
+QueryResolver.wrong_view_symbols=The definition for {0} does not have the correct number of projected symbols.  Expected {1}, but was {2}.
+QueryResolver.wrong_view_symbol_type=The definition for {0} has the wrong type for column {1}.  Expected {2}, but was {3}.
 ResolveVariablesVisitor.reserved_word_for_temporary_used=Cursor names cannot begin with "#" as that indicates the name of a temporary table: {0}.
 SimpleQueryResolver.materialized_table_not_used=The query against {0} did not use materialization table {1} due to the use of OPTION NOCACHE.
 SimpleQueryResolver.cache_hint_used=Loading materialized view {1} for view {0} using cache hint {2}.
@@ -907,4 +909,7 @@
 
 FunctionMethods.not_array_value=Expected a java.sql.Array, or java array type, but got: {0}
 FunctionMethods.array_index=Array index out of range: {0}
-ArrayTableNode.conversion_error=Could not convert value for column: {0}
\ No newline at end of file
+ArrayTableNode.conversion_error=Could not convert value for column: {0}
+
+AlterResolver.not_a_view={0} is not a valid view.
+ValidationVisitor.not_a_procedure={0} is not a valid virtual procedure.
\ No newline at end of file

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -64,7 +64,7 @@
 
     @Before public void setUp() throws Exception {
     	agds = new AutoGenDataService();
-        DQPWorkContext context = FakeMetadataFactory.buildWorkContext(RealMetadataFactory.exampleBQTCached());
+        DQPWorkContext context = FakeMetadataFactory.buildWorkContext(RealMetadataFactory.createTransformationMetadata(RealMetadataFactory.exampleBQTCached().getMetadataStore(), "bqt"));
         context.getVDB().getModel("BQT3").setVisible(false); //$NON-NLS-1$
         context.getVDB().getModel("VQT").setVisible(false); //$NON-NLS-1$
 

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -104,7 +104,7 @@
         MultiSourceMetadataWrapper wrapper = new MultiSourceMetadataWrapper(metadata, multiSourceModels); 
         AnalysisRecord analysis = new AnalysisRecord(false, DEBUG);
         
-        Command command = TestResolver.helpResolve(userSql, wrapper, analysis);               
+        Command command = TestResolver.helpResolve(userSql, wrapper);               
                 
         // Plan
         command = QueryRewriter.rewrite(command, wrapper, null);

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -637,13 +637,13 @@
             new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING });
         List vm1a1e = FakeMetadataFactory.createElements(vm1a1, 
             new String[] { "e1", "sum_e2" }, //$NON-NLS-1$ //$NON-NLS-2$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.LONG });
         List vm1a2e = FakeMetadataFactory.createElements(vm1a2, 
             new String[] { "e1", "sum_e2" }, //$NON-NLS-1$ //$NON-NLS-2$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.LONG });
         List vm1a3e = FakeMetadataFactory.createElements(vm1a3, 
             new String[] { "sum_e2" }, //$NON-NLS-1$
-            new String[] { DataTypeManager.DefaultDataTypes.INTEGER });
+            new String[] { DataTypeManager.DefaultDataTypes.LONG });
         List vm1a4e = FakeMetadataFactory.createElements(vm1a4, 
             new String[] { "count" }, //$NON-NLS-1$
             new String[] { DataTypeManager.DefaultDataTypes.INTEGER });

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -45,7 +45,7 @@
                           String expected, 
                           boolean aliasGroups,
                           boolean stripColumnAliases, QueryMetadataInterface metadata) throws TeiidComponentException, TeiidProcessingException {
-        Command command = TestResolver.helpResolve(sql, metadata, null);
+        Command command = TestResolver.helpResolve(sql, metadata);
         command = QueryRewriter.rewrite(command, metadata, null);
         command.acceptVisitor(new AliasGenerator(aliasGroups, stripColumnAliases));
         assertEquals(expected, command.toString());

Added: trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	                        (rev 0)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.parser;
+
+import static org.teiid.query.parser.TestParser.*;
+
+import org.junit.Test;
+import org.teiid.metadata.Table.TriggerOperation;
+import org.teiid.query.sql.lang.AlterTrigger;
+import org.teiid.query.sql.lang.AlterView;
+import org.teiid.query.sql.lang.QueryCommand;
+import org.teiid.query.sql.proc.TriggerAction;
+import org.teiid.query.sql.symbol.GroupSymbol;
+
+ at SuppressWarnings("nls")
+public class TestParseAlter {
+
+	@Test public void testAlterView() throws Exception {
+		AlterView alterView = new AlterView();
+		alterView.setTarget(new GroupSymbol("x"));
+		alterView.setDefinition((QueryCommand) QueryParser.getQueryParser().parseCommand("/*+ cache */ SELECT 1"));
+		helpTest("alter view x as /*+ cache */ select 1", "ALTER VIEW x AS\n/*+ cache */ SELECT 1", alterView);
+	}
+	
+	@Test public void testAlterProc() throws Exception {
+		AlterView alterView = new AlterView();
+		alterView.setTarget(new GroupSymbol("x"));
+		alterView.setDefinition((QueryCommand) QueryParser.getQueryParser().parseCommand("/*+ cache */ SELECT 1"));
+		helpTest("alter view x as /*+ cache */ select 1", "ALTER VIEW x AS\n/*+ cache */ SELECT 1", alterView);
+	}
+	
+	@Test public void testAlterTrigger() throws Exception {
+		AlterTrigger alterTrigger = new AlterTrigger();
+		alterTrigger.setTarget(new GroupSymbol("x"));
+		alterTrigger.setOperation(TriggerOperation.UPDATE);
+		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
+		helpTest("alter trigger on x instead of update as for each row begin end", "ALTER TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN\nEND", alterTrigger);
+	}
+	
+}


Property changes on: trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -128,8 +128,9 @@
 		} else if (command instanceof ProcedureContainer) {
 			group = ((ProcedureContainer) command).getGroup();
 		} else if ( command instanceof BatchedUpdateCommand ) {
-    		if ( command.getSubCommands().get(0) instanceof Update ) {
-    			group = ((Update)command.getSubCommands().get(0)).getGroup();
+			BatchedUpdateCommand buc = (BatchedUpdateCommand)command;
+    		if ( buc.getUpdateCommands().get(0) instanceof Update ) {
+    			group = ((Update)buc.getUpdateCommands().get(0)).getGroup();
     		}
     		if (this.recordingCommands) {
             	for ( Iterator<Command> it = ((BatchedUpdateCommand) command).getUpdateCommands().iterator(); it.hasNext(); ) {

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -6168,15 +6168,11 @@
         FakeMetadataObject v1 = FakeMetadataFactory.createVirtualModel("v1"); //$NON-NLS-1$
         QueryNode n1 = new QueryNode("SELECT convert(a, integer) as c, b FROM p1.t"); //$NON-NLS-1$ //$NON-NLS-2$
         FakeMetadataObject vt1 = FakeMetadataFactory.createVirtualGroup("v1.t1", v1, n1); //$NON-NLS-1$
-        List vte1 = FakeMetadataFactory.createElements(vt1, new String[] {"c", "b" }, new String[] { "string", "string" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+        List vte1 = FakeMetadataFactory.createElements(vt1, new String[] {"c", "b" }, new String[] { "integer", "string" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 
-        QueryNode n2 = new QueryNode("SELECT convert(a, integer) as c, b FROM p1.t"); //$NON-NLS-1$ //$NON-NLS-2$
-        FakeMetadataObject vt2 = FakeMetadataFactory.createVirtualGroup("v1.t2", v1, n2); //$NON-NLS-1$
-        List vte2 = FakeMetadataFactory.createElements(vt2, new String[] {"c", "b" }, new String[] { "string", "string" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
         QueryNode n3 = new QueryNode("SELECT c, b FROM v1.t1 UNION ALL SELECT c, b FROM v1.t1"); //$NON-NLS-1$ //$NON-NLS-2$
         FakeMetadataObject vu1 = FakeMetadataFactory.createVirtualGroup("v1.u1", v1, n3); //$NON-NLS-1$
-        List vtu1 = FakeMetadataFactory.createElements(vu1, new String[] {"c", "b" }, new String[] { "string", "string" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+        List vtu1 = FakeMetadataFactory.createElements(vu1, new String[] {"c", "b" }, new String[] { "integer", "string" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
         
         FakeMetadataStore store = new FakeMetadataStore();
         store.addObject(p1);
@@ -6185,8 +6181,6 @@
         store.addObject(v1);
         store.addObject(vt1);
         store.addObjects(vte1);
-        store.addObject(vt2);
-        store.addObjects(vte2);
         store.addObject(vu1);
         store.addObjects(vtu1);
         return new FakeMetadataFacade(store);

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -59,7 +59,7 @@
 		
 		CommandContext context = createCommandContext();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata, null), metadata, new DefaultCapabilitiesFinder(caps), context);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata), metadata, new DefaultCapabilitiesFinder(caps), context);
         List[] expected = new List[] {Arrays.asList(1)};
     	helpProcess(plan, context, dm, expected);
 	}
@@ -78,7 +78,7 @@
 		FakeDataStore.addTable("pm1.g1", dm, metadata);
 		CommandContext context = createCommandContext();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata, null), metadata, new DefaultCapabilitiesFinder(caps), context);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata), metadata, new DefaultCapabilitiesFinder(caps), context);
         List[] expected = new List[] {Arrays.asList(6)};
     	helpProcess(plan, context, dm, expected);
 	}
@@ -98,7 +98,7 @@
 		
 		CommandContext context = createCommandContext();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata, null), metadata, new DefaultCapabilitiesFinder(caps), context);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata), metadata, new DefaultCapabilitiesFinder(caps), context);
         List[] expected = new List[] {Arrays.asList(1)};
     	helpProcess(plan, context, dm, expected);
 	}
@@ -118,7 +118,7 @@
 		
 		CommandContext context = createCommandContext();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata, null), metadata, new DefaultCapabilitiesFinder(caps), context);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata), metadata, new DefaultCapabilitiesFinder(caps), context);
         List[] expected = new List[] {Arrays.asList(1)};
     	helpProcess(plan, context, dm, expected);
     	assertEquals("UPDATE pm1.g1 SET e2 = 5 WHERE e2 = 2", dm.getQueries().get(0));
@@ -139,7 +139,7 @@
 		
 		CommandContext context = createCommandContext();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata, null), metadata, new DefaultCapabilitiesFinder(caps), context);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(TestResolver.helpResolve(sql, metadata), metadata, new DefaultCapabilitiesFinder(caps), context);
         List[] expected = new List[] {Arrays.asList(1)};
     	helpProcess(plan, context, dm, expected);
     	assertEquals("UPDATE pm1.g1 SET e2 = 1 WHERE e2 = 2", dm.getQueries().get(0));

Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -74,7 +74,7 @@
     }
     
     @Test public void testOpen_Defect16059() throws Exception {
-    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5 AND ? IS NULL", FakeMetadataFactory.example1Cached(), null); //$NON-NLS-1$
+    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5 AND ? IS NULL", FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
         IsNullCriteria nullCrit = (IsNullCriteria)((CompoundCriteria)query.getCriteria()).getCriteria(1);
         nullCrit.setExpression(new Constant(null));
         
@@ -82,7 +82,7 @@
     }
     
     @Test public void testOpen_Defect16059_2() throws Exception {
-    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5 AND ? IS NOT NULL", FakeMetadataFactory.example1Cached(), null); //$NON-NLS-1$
+    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5 AND ? IS NOT NULL", FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
         IsNullCriteria nullCrit = (IsNullCriteria)((CompoundCriteria)query.getCriteria()).getCriteria(1);
         nullCrit.setExpression(new Constant(null));
         
@@ -92,7 +92,7 @@
     @Test public void testExecCount()throws Exception{
         // Setup
         AccessNode node = new AccessNode(1);
-    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5", FakeMetadataFactory.example1Cached(), null); //$NON-NLS-1$
+    	Query query = (Query)TestResolver.helpResolve("SELECT e1, e2 FROM pm1.g1 WHERE e2 = 5", FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
         node.setCommand(query);
         CommandContext context = new CommandContext();
         context.setProcessorID("processorID"); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -161,7 +161,7 @@
             	}
             } else if ( command instanceof BatchedUpdateCommand ){
                 BatchedUpdateCommand bu = (BatchedUpdateCommand)command;
-                List batch = bu.getSubCommands();
+                List<Command> batch = bu.getUpdateCommands();
   
                 batchSize = batch.size();
                 assertEquals("Unexpected batch on call " + callCount, expectedBatchSize, batchSize); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLProcessor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -260,7 +260,7 @@
 
        List rsElements12260 = FakeMetadataFactory.createElements(rs12260, 
            new String[] { "itemNum", "itemName", "itemQuantity", "itemStatus", "numSuppliers" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-           new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });        
+           new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING });        
     
 // ======================================================================================================================
 // ALTERNATE METADATA E (mapping class w/ Union)

Added: trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java	                        (rev 0)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.resolver;
+
+import static org.junit.Assert.*;
+import static org.teiid.query.resolver.TestResolver.*;
+
+import org.junit.Test;
+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.Query;
+import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.unittest.RealMetadataFactory;
+
+ at SuppressWarnings("nls")
+public class TestAlterResolving {
+
+	@Test public void testAlterView() {
+		AlterView alterView = (AlterView) helpResolve("alter view SmallA_2589 as select 2", RealMetadataFactory.exampleBQTCached());
+		assertNotNull(alterView.getTarget().getMetadataID());
+	}
+	
+	@Test public void testAlterProcedure() {
+		AlterProcedure alterProc = (AlterProcedure) helpResolve("alter procedure MMSP5 as begin select param1; end", RealMetadataFactory.exampleBQTCached());
+		assertNotNull(alterProc.getTarget().getMetadataID());
+		Query q = (Query)alterProc.getDefinition().getResultsCommand();
+		assertTrue(((ElementSymbol)q.getSelect().getSymbol(0)).isExternalReference());
+	}
+	
+	@Test public void testAlterTriggerInsert() {
+		AlterTrigger alterTrigger = (AlterTrigger) helpResolve("alter trigger on SmallA_2589 instead of insert as for each row select new.intkey;", RealMetadataFactory.exampleBQTCached());
+		assertNotNull(alterTrigger.getTarget().getMetadataID());
+	}
+	
+	@Test public void testAlterTriggerInsert_Invalid() {
+		helpResolveException("alter trigger on SmallA_2589 instead of insert as for each row select old.intkey;", RealMetadataFactory.exampleBQTCached());
+	}
+	
+	@Test public void testAlterView_Invalid() {
+		helpResolveException("alter view bqt1.SmallA as select 2", RealMetadataFactory.exampleBQTCached());
+	}
+
+}


Property changes on: trunk/engine/src/test/java/org/teiid/query/resolver/TestAlterResolving.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -51,6 +51,7 @@
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.visitor.CommandCollectorVisitor;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
 import org.teiid.query.unittest.FakeMetadataFacade;
 import org.teiid.query.unittest.FakeMetadataFactory;
@@ -66,7 +67,7 @@
         FakeMetadataObject rs2 = FakeMetadataFactory.createResultSet("pm1.rs1", pm1, new String[] { "e1" }, new String[] { DataTypeManager.DefaultDataTypes.STRING }); //$NON-NLS-1$ //$NON-NLS-2$
         FakeMetadataObject rs2p1 = FakeMetadataFactory.createParameter("ret", 1, ParameterInfo.RESULT_SET, DataTypeManager.DefaultDataTypes.OBJECT, rs2);  //$NON-NLS-1$
         FakeMetadataObject rs2p2 = FakeMetadataFactory.createParameter("in", 2, ParameterInfo.IN, DataTypeManager.DefaultDataTypes.STRING, null);  //$NON-NLS-1$
-        QueryNode sq2n1 = new QueryNode(procedure); //$NON-NLS-1$ 
+        QueryNode sq2n1 = new QueryNode(procedure); 
         FakeMetadataObject sq1 = FakeMetadataFactory.createVirtualProcedure("pm1.sq1", pm1, Arrays.asList(new FakeMetadataObject[] { rs2p1, rs2p2 }), sq2n1);  //$NON-NLS-1$
 
         metadata.getStore().addObject(rs2);
@@ -117,13 +118,13 @@
         assertNull(tempIDs.get("LOOPCURSOR")); //$NON-NLS-1$
         assertNull(tempIDs.get("LOOPCURSOR2")); //$NON-NLS-1$
         
-        Command subCommand = command.getSubCommands().get(0);
+        Command subCommand = CommandCollectorVisitor.getCommands(command).get(0);
         tempIDs = subCommand.getTemporaryMetadata();
         assertNotNull(tempIDs);
         assertNull(tempIDs.get("LOOPCURSOR")); //$NON-NLS-1$
         assertNull(tempIDs.get("LOOPCURSOR2")); //$NON-NLS-1$
 
-        subCommand = command.getSubCommands().get(1);
+        subCommand = CommandCollectorVisitor.getCommands(command).get(1);
         tempIDs = subCommand.getTemporaryMetadata();
         assertNotNull(tempIDs);
         assertNotNull(tempIDs.get("LOOPCURSOR")); //$NON-NLS-1$
@@ -1054,7 +1055,7 @@
         procedure = procedure + "VARIABLES.NLEVELS = SELECT COUNT(*) FROM (SELECT oi.e1 AS Col1, oi.e2 AS Col2, oi.e3 FROM pm1.g2 AS oi) AS TOBJ, pm2.g2 AS TModel WHERE TModel.e3 = TOBJ.e3;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
-        TestResolver.helpResolve(procedure, FakeMetadataFactory.example1Cached(), null);
+        TestResolver.helpResolve(procedure, FakeMetadataFactory.example1Cached());
     }
     
     @Test public void testIssue174102() throws Exception {
@@ -1065,7 +1066,7 @@
         procedure = procedure + "EXECUTE STRING ('SELECT e1 FROM pm1.sq2 ' || crit ) AS e1 string INTO #TTable;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
-        TestResolver.helpResolve(procedure, FakeMetadataFactory.example1Cached(), null);
+        TestResolver.helpResolve(procedure, FakeMetadataFactory.example1Cached());
     }
     
     // Address Issue 174519.
@@ -1573,7 +1574,7 @@
         .append("\n  y = '1';") //$NON-NLS-1$
         .append("\nEND"); //$NON-NLS-1$
         
-        TestResolver.helpResolve(proc.toString(), FakeMetadataFactory.example1Cached(), null); 
+        TestResolver.helpResolve(proc.toString(), FakeMetadataFactory.example1Cached()); 
     }
     
     @Test public void testVDBQualified() throws Exception {

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -87,6 +87,7 @@
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.SelectSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.visitor.CommandCollectorVisitor;
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
 import org.teiid.query.sql.visitor.FunctionCollectorVisitor;
 import org.teiid.query.sql.visitor.GroupCollectorVisitor;
@@ -157,7 +158,7 @@
 		return variables;
 	}
     
-    public static Command helpResolve(String sql, QueryMetadataInterface queryMetadata, AnalysisRecord analysis){
+    public static Command helpResolve(String sql, QueryMetadataInterface queryMetadata){
         return helpResolve(helpParse(sql), queryMetadata);
     }
     
@@ -1115,7 +1116,7 @@
             "WHERE (y.IntKey >= 10) AND (y.IntKey < 30) " + //$NON-NLS-1$
             "ORDER BY IntKey, FloatNum";  //$NON-NLS-1$
 
-        helpResolve(sql, FakeMetadataFactory.exampleBQTCached(), null);
+        helpResolve(sql, FakeMetadataFactory.exampleBQTCached());
     }
 
     @Test public void testSubQueryINClause1(){
@@ -2111,7 +2112,7 @@
         QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
         AnalysisRecord analysis = AnalysisRecord.createNonRecordingRecord();
         
-        Query query = (Query) helpResolve(userSql, metadata, analysis);
+        Query query = (Query) helpResolve(userSql, metadata);
         From from = query.getFrom();
         Collection fromClauses = from.getClauses();
         SPParameter params[] = new SPParameter[2];
@@ -2707,7 +2708,7 @@
     @Test public void testUpdateSetClauseReferenceType() {
     	String sql = "UPDATE pm1.g1 SET pm1.g1.e1 = 1, pm1.g1.e2 = ?;"; //$NON-NLS-1$
     	
-    	Update update = (Update)helpResolve(sql, FakeMetadataFactory.example1Cached(), null);
+    	Update update = (Update)helpResolve(sql, FakeMetadataFactory.example1Cached());
     	
     	Expression ref = update.getChangeList().getClauses().get(1).getValue();
     	assertTrue(ref instanceof Reference);
@@ -2722,21 +2723,21 @@
     
     @Test public void testReferenceInSelect() {
     	String sql = "select ?, e1 from pm1.g1"; //$NON-NLS-1$
-    	Query command = (Query)helpResolve(sql, FakeMetadataFactory.example1Cached(), null);
-    	assertEquals(DataTypeManager.DefaultDataClasses.STRING, ((SingleElementSymbol)command.getProjectedSymbols().get(0)).getType());
+    	Query command = (Query)helpResolve(sql, FakeMetadataFactory.example1Cached());
+    	assertEquals(DataTypeManager.DefaultDataClasses.STRING, command.getProjectedSymbols().get(0).getType());
     }
     
     @Test public void testReferenceInSelect1() {
     	String sql = "select convert(?, integer), e1 from pm1.g1"; //$NON-NLS-1$
     	
-    	Query command = (Query)helpResolve(sql, FakeMetadataFactory.example1Cached(), null);
-    	assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, ((SingleElementSymbol)command.getProjectedSymbols().get(0)).getType());
+    	Query command = (Query)helpResolve(sql, FakeMetadataFactory.example1Cached());
+    	assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, command.getProjectedSymbols().get(0).getType());
     }
     
     @Test public void testUnionWithObjectTypeConversion() {
     	String sql = "select convert(null, xml) from pm1.g1 union all select 1"; //$NON-NLS-1$
     	
-    	SetQuery query = (SetQuery)helpResolve(sql, FakeMetadataFactory.example1Cached(), null);
+    	SetQuery query = (SetQuery)helpResolve(sql, FakeMetadataFactory.example1Cached());
     	assertEquals(DataTypeManager.DefaultDataClasses.OBJECT, ((SingleElementSymbol)query.getProjectedSymbols().get(0)).getType());
     }
     
@@ -2745,7 +2746,7 @@
 
         SetQuery command = (SetQuery)helpResolve(sql);
         
-        assertEquals(1, command.getSubCommands().size());
+        assertEquals(1, CommandCollectorVisitor.getCommands(command).size());
     }
     @Test public void testOrderBy_J658a() {
         Query resolvedQuery = (Query) helpResolve("SELECT pm1.g1.e1, e2, e3 as x, (5+2) as y FROM pm1.g1 ORDER BY e3"); //$NON-NLS-1$
@@ -2779,7 +2780,7 @@
     }
     
     @Test public void testSPOutParamWithExec() {
-    	StoredProcedure proc = (StoredProcedure)helpResolve("exec pm2.spTest8(1)", FakeMetadataFactory.exampleBQTCached(), null);
+    	StoredProcedure proc = (StoredProcedure)helpResolve("exec pm2.spTest8(1)", FakeMetadataFactory.exampleBQTCached());
     	assertEquals(2, proc.getProjectedSymbols().size());
     }
 
@@ -2788,7 +2789,7 @@
      * That hack is handled by the PreparedStatementRequest
      */
     @Test public void testSPOutParamWithCallableStatement() {
-    	StoredProcedure proc = (StoredProcedure)helpResolve("{call pm2.spTest8(1)}", FakeMetadataFactory.exampleBQTCached(), null);
+    	StoredProcedure proc = (StoredProcedure)helpResolve("{call pm2.spTest8(1)}", FakeMetadataFactory.exampleBQTCached());
     	assertEquals(3, proc.getProjectedSymbols().size());
     }
     
@@ -2797,12 +2798,12 @@
     }
     
     @Test public void testProcRelationalWithOutParam() {
-    	Query proc = (Query)helpResolve("select * from pm2.spTest8 where inkey = 1", FakeMetadataFactory.exampleBQTCached(), null);
+    	Query proc = (Query)helpResolve("select * from pm2.spTest8 where inkey = 1", FakeMetadataFactory.exampleBQTCached());
     	assertEquals(3, proc.getProjectedSymbols().size());
     }
     
     @Test public void testSPReturnParamWithNoResultSet() {
-    	StoredProcedure proc = (StoredProcedure)helpResolve("exec pm4.spTest9(1)", FakeMetadataFactory.exampleBQTCached(), null);
+    	StoredProcedure proc = (StoredProcedure)helpResolve("exec pm4.spTest9(1)", FakeMetadataFactory.exampleBQTCached());
     	assertEquals(1, proc.getProjectedSymbols().size());
     }
     
@@ -2954,7 +2955,7 @@
     
     //return should be first, then out
     @Test public void testParamOrder() {
-        Query resolvedQuery = (Query)helpResolve("SELECT * FROM (exec pm4.spRetOut()) as a", RealMetadataFactory.exampleBQTCached(), null); //$NON-NLS-1$
+        Query resolvedQuery = (Query)helpResolve("SELECT * FROM (exec pm4.spRetOut()) as a", RealMetadataFactory.exampleBQTCached()); //$NON-NLS-1$
         
         assertEquals("a.ret", resolvedQuery.getProjectedSymbols().get(0).getName());
     }

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestXMLResolver.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -24,7 +24,6 @@
 
 import junit.framework.TestCase;
 
-import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.sql.lang.Command;
@@ -42,7 +41,7 @@
 public class TestXMLResolver extends TestCase {
     
     public Command helpResolve(String sql) {
-        Command cmd = TestResolver.helpResolve(sql, FakeMetadataFactory.example1Cached(), AnalysisRecord.createNonRecordingRecord());
+        Command cmd = TestResolver.helpResolve(sql, FakeMetadataFactory.example1Cached());
         ResolverUtil.fullyQualifyElements(cmd);
         return cmd;
     }

Modified: trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -200,7 +200,7 @@
     public void testProjectedSymbols() {
     	CreateUpdateProcedureCommand cupc = new CreateUpdateProcedureCommand();
     	cupc.setUpdateProcedure(false);
-    	StoredProcedure sp = (StoredProcedure)TestResolver.helpResolve("call TEIIDSP9(p1=>1, p2=>?)", RealMetadataFactory.exampleBQTCached(), null);
+    	StoredProcedure sp = (StoredProcedure)TestResolver.helpResolve("call TEIIDSP9(p1=>1, p2=>?)", RealMetadataFactory.exampleBQTCached());
     	sp.setCallableStatement(true);
     	cupc.setResultsCommand(sp);
     	assertEquals(1, cupc.getProjectedSymbols().size());

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestEvaluatableVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestEvaluatableVisitor.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestEvaluatableVisitor.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -33,7 +33,7 @@
 public class TestEvaluatableVisitor {
 
 	@Test public void testNestedNeedsEvaluation() throws Exception {
-		Query command = (Query)TestResolver.helpResolve("select * from pm1.g1 where e1 in (select e1 from pm1.g2 where e2 = ?)", FakeMetadataFactory.example1Cached(), null); //$NON-NLS-1$
+		Query command = (Query)TestResolver.helpResolve("select * from pm1.g1 where e1 in (select e1 from pm1.g2 where e2 = ?)", FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
 		assertTrue(EvaluatableVisitor.needsProcessingEvaluation(command));
 	}
 	

Modified: trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/engine/src/test/java/org/teiid/query/unittest/FakeMetadataFactory.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -492,22 +492,22 @@
             new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
         List vm1g12e = createElements(vm1g12,
             new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.DATE, DataTypeManager.DefaultDataTypes.TIME, DataTypeManager.DefaultDataTypes.TIMESTAMP });
         List vm1g13e = createElements(vm1g13,
             new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.DATE, DataTypeManager.DefaultDataTypes.TIME, DataTypeManager.DefaultDataTypes.TIMESTAMP });
         List vm1g14e = createElements(vm1g14,
             new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.DATE, DataTypeManager.DefaultDataTypes.TIME, DataTypeManager.DefaultDataTypes.TIMESTAMP });
         List vm1g15e = createElements(vm1g15,
             new String[] { "e1", "x" }, //$NON-NLS-1$ //$NON-NLS-2$
             new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING });
         List vm1g16e = createElements(vm1g16,
             new String[] { "e", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.DATE });
         List vm1g17e = createElements(vm1g17,
             new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.DATE });
         List vm1g18e = createElements(vm1g18,
             new String[] { "x" }, //$NON-NLS-1$
             new String[] { DataTypeManager.DefaultDataTypes.DOUBLE });
@@ -1083,7 +1083,7 @@
 		FakeMetadataObject vm1g35 = createVirtualGroup("vm1.g35", vm1, vm1g35n1); //$NON-NLS-1$
         FakeMetadataObject vm1g35e1 = FakeMetadataFactory.createElement("vm1.g35.e1", vm1g35, DataTypeManager.DefaultDataTypes.STRING, 1); //$NON-NLS-1$
         vm1g35e1.putProperty(FakeMetadataObject.Props.SELECT, Boolean.FALSE);
-        FakeMetadataObject vm1g35e2 = FakeMetadataFactory.createElement("vm1.g35.e2", vm1g35, DataTypeManager.DefaultDataTypes.STRING, 2); //$NON-NLS-1$
+        FakeMetadataObject vm1g35e2 = FakeMetadataFactory.createElement("vm1.g35.e2", vm1g35, DataTypeManager.DefaultDataTypes.INTEGER, 2); //$NON-NLS-1$
 		
         FakeMetadataObject vsprs36 = createResultSet("pm1.vsprs36", pm1, new String[] { "x" }, new String[] { DataTypeManager.DefaultDataTypes.INTEGER }); //$NON-NLS-1$ //$NON-NLS-2$
         FakeMetadataObject vsp36p1 = createParameter("ret", 1, ParameterInfo.RESULT_SET, null, vsprs36); //$NON-NLS-1$
@@ -2432,11 +2432,11 @@
 
         List rsOrdersElements = FakeMetadataFactory.createElements(rsOrders, 
             new String[] { "orderNum", "orderDate", "orderQty", "orderStatus", "itemFK", "supplierFK" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING});
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING});
 
         List rsEmployeesElements = FakeMetadataFactory.createElements(rsEmployees, 
             new String[] { "employeeNum", "firstName", "lastName", "supervisorNum", "specializesInItemNum", "supplierNumFK" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.STRING});
+            new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING});
 
         // MAPPING DOC ======================================================================
         MappingDocument doc = new MappingDocument(true);

Added: trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java	                        (rev 0)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.validator;
+
+import org.junit.Test;
+import org.teiid.query.unittest.RealMetadataFactory;
+
+ at SuppressWarnings("nls")
+public class TestAlterValidation {
+
+	@Test public void testValidateAlterView() {
+		TestValidator.helpValidate("alter view SmallA_2589 as select 2", new String[] {"SELECT 2"}, RealMetadataFactory.exampleBQTCached());
+		TestValidator.helpValidate("alter view Defect15355 as select 'a', 1", new String[] {"SELECT 'a', 1"}, RealMetadataFactory.exampleBQTCached());
+		
+		TestValidator.helpValidate("alter view SmallA_2589 as select * from bqt1.smalla", new String[] {}, RealMetadataFactory.exampleBQTCached());
+	}
+	
+	@Test public void testValidateAlterTrigger() {
+		TestValidator.helpValidate("alter trigger on SmallA_2589 instead of insert as for each row select 1;", new String[] {"SmallA_2589"}, RealMetadataFactory.exampleBQTCached());
+	}
+	
+	@Test public void testValidateAlterProcedure() {
+		TestValidator.helpValidate("alter procedure spTest8a as begin select 1; end", new String[] {"spTest8a"}, RealMetadataFactory.exampleBQTCached());
+		TestValidator.helpValidate("alter procedure MMSP1 as begin select 1; end", new String[] {"BEGIN\nSELECT 1;\nEND"}, RealMetadataFactory.exampleBQTCached());
+	}
+	
+}


Property changes on: trunk/engine/src/test/java/org/teiid/query/validator/TestAlterValidation.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -53,7 +53,6 @@
 import org.teiid.metadata.Schema;
 import org.teiid.metadata.Table;
 import org.teiid.metadata.TableStats;
-import org.teiid.metadata.MetadataRepository.TriggerOperation;
 import org.teiid.query.function.SystemFunctionManager;
 import org.teiid.query.metadata.TransformationMetadata.Resource;
 import org.teiid.runtime.RuntimePlugin;
@@ -133,15 +132,15 @@
 							t.setSelectTransformation(def);
 						}
 						if (t.supportsUpdate()) {
-							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, TriggerOperation.INSERT);
+							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerOperation.INSERT);
 							if (def != null) {
 								t.setInsertPlan(def);
 							}
-							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, TriggerOperation.UPDATE);
+							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerOperation.UPDATE);
 							if (def != null) {
 								t.setUpdatePlan(def);
 							}
-							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, TriggerOperation.DELETE);
+							def = metadataRepository.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerOperation.DELETE);
 							if (def != null) {
 								t.setDeletePlan(def);
 							}

Modified: trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java	2011-04-29 01:33:21 UTC (rev 3130)
+++ trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java	2011-04-29 01:37:38 UTC (rev 3131)
@@ -39,7 +39,7 @@
 import org.teiid.metadata.MetadataRepository;
 import org.teiid.metadata.Procedure;
 import org.teiid.metadata.Table;
-import org.teiid.metadata.MetadataRepository.TriggerOperation;
+import org.teiid.metadata.Table.TriggerOperation;
 
 @SuppressWarnings("nls")
 public class TestMetadataUpdates {
@@ -72,7 +72,7 @@
     			return null;
     		}
 		});
-    	Mockito.stub(repo.getInsteadOfTriggerDefinition(Mockito.anyString(), Mockito.anyInt(), (Table)Mockito.anyObject(), (TriggerOperation) Mockito.anyObject())).toAnswer(new Answer<String>() {
+    	Mockito.stub(repo.getInsteadOfTriggerDefinition(Mockito.anyString(), Mockito.anyInt(), (Table)Mockito.anyObject(), (Table.TriggerOperation) Mockito.anyObject())).toAnswer(new Answer<String>() {
     		@Override
     		public String answer(InvocationOnMock invocation) throws Throwable {
 				return "for each row select 1/0; begin end";



More information about the teiid-commits mailing list