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

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Jul 16 21:01:02 EDT 2012


Author: shawkins
Date: 2012-07-16 21:00:58 -0400 (Mon, 16 Jul 2012)
New Revision: 4242

Modified:
   trunk/api/src/main/java/org/teiid/language/SQLConstants.java
   trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java
   trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
   trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
   trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java
   trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java
   trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java
   trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
   trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java
   trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java
   trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.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/query/function/metadata/TestSystemSource.java
   trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
   trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
   trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
   trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java
   trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java
Log:
TEIID-2103 various metadata updates and additional validations

Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -118,6 +118,7 @@
 		public static final String DISABLED = "DISABLED"; //$NON-NLS-1$
 		
 		public static final String TRIM = "TRIM"; //$NON-NLS-1$
+		public static final String RESULT = "RESULT"; //$NON-NLS-1$
 	}
 	
 	public interface Reserved {
@@ -293,6 +294,7 @@
 	    public static final String OUTER = "OUTER"; //$NON-NLS-1$
 		public static final String OUTPUT = "OUTPUT"; //$NON-NLS-1$
 		public static final String OPTION = "OPTION"; //$NON-NLS-1$
+		public static final String OPTIONS = "OPTIONS"; //$NON-NLS-1$
 	    public static final String OVER = "OVER"; //$NON-NLS-1$
 	    public static final String OVERLAPS = "OVERLAPS"; //$NON-NLS-1$
 	    public static final String PARAMETER = "PARAMETER"; //$NON-NLS-1$

Modified: trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -23,17 +23,15 @@
 package org.teiid.metadata;
 
 /**
- * ProcedureParameterRecordImpl
+ * Represents a procedure parameter
  */
 public class ProcedureParameter extends BaseColumn {
 
 	private static final long serialVersionUID = 3484281155208939073L;
 
 	public enum Type {
-		Unknown,
 		In,
 		InOut,
-		Result,
 		Out,
 		ReturnValue
 	}

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -43,15 +43,15 @@
 import org.teiid.logging.LogManager;
 import org.teiid.metadata.AbstractMetadataRecord;
 import org.teiid.metadata.BaseColumn;
-import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.metadata.Column;
 import org.teiid.metadata.DuplicateRecordException;
 import org.teiid.metadata.ForeignKey;
 import org.teiid.metadata.KeyRecord;
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.Procedure;
+import org.teiid.metadata.Table;
+import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.metadata.ProcedureParameter.Type;
-import org.teiid.metadata.Table;
 import org.teiid.translator.TranslatorException;
 import org.teiid.translator.TypeFacility;
 
@@ -175,12 +175,26 @@
 				BaseColumn record = null;
 				int precision = columns.getInt(8);
 				String runtimeType = getRuntimeType(sqlType, typeName, precision);
-				if (columnType == DatabaseMetaData.procedureColumnResult) {
+				switch (columnType) {
+				case DatabaseMetaData.procedureColumnResult:
 					Column column = metadataFactory.addProcedureResultSetColumn(columnName, runtimeType, procedure);
 					record = column;
 					column.setNativeType(typeName);
-				} else {
-					record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.values()[columnType], procedure);
+					break;
+				case DatabaseMetaData.procedureColumnIn:
+					record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.In, procedure);
+					break;
+				case DatabaseMetaData.procedureColumnInOut:
+					record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.InOut, procedure);
+					break;
+				case DatabaseMetaData.procedureColumnOut:
+					record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.Out, procedure);
+					break;
+				case DatabaseMetaData.procedureColumnReturn:
+					record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.ReturnValue, procedure);
+					break;
+				default:
+					continue; //shouldn't happen
 				}
 				record.setPrecision(columns.getInt(8));
 				record.setLength(columns.getInt(9));

Modified: trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -526,5 +526,7 @@
     	TEIID31103, 
     	TEIID31104, //recursion limit hit
     	TEIID31105, //warning
+    	TEIID31106, //duplicate param name
+    	TEIID31107, //too many result params
 	}
 }

Modified: trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -27,7 +27,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.metadata.FunctionMetadataValidator;
 import org.teiid.query.function.source.SystemSource;
-import org.teiid.query.report.ActivityReport;
+import org.teiid.query.validator.ValidatorReport;
 
 
 public class SystemFunctionManager {
@@ -42,7 +42,7 @@
 	    	SystemSource systemSource = new SystemSource(this.allowEnvFunction);
 	
 			// Validate the system source - should never fail
-	        ActivityReport report = new ActivityReport("Function Validation"); //$NON-NLS-1$
+	    	ValidatorReport report = new ValidatorReport("Function Validation"); //$NON-NLS-1$
 	        Collection functionMethods = systemSource.getFunctionMethods();
 	    	FunctionMetadataValidator.validateFunctionMethods(functionMethods,report);
 			if(report.hasItems()) {

Modified: trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -31,7 +31,7 @@
 import org.teiid.metadata.FunctionParameter;
 import org.teiid.metadata.FunctionMethod.PushDown;
 import org.teiid.query.QueryPlugin;
-import org.teiid.query.report.ActivityReport;
+import org.teiid.query.validator.ValidatorReport;
 
 
 /**
@@ -56,7 +56,7 @@
 	 * @param methods Collection of {@link FunctionMethod} objects
 	 * @param report Report to store validation errors
 	 */
-	public static final void validateFunctionMethods(Collection<FunctionMethod> methods, ActivityReport report) {
+	public static final void validateFunctionMethods(Collection<FunctionMethod> methods, ValidatorReport report) {
 	    if(methods != null) {
 	    	for (FunctionMethod method : methods) {
 	    		validateFunctionMethod(method, report);
@@ -77,7 +77,7 @@
      * @param method The method to validate
      * @param report The report to update during validation
      */
-    public static final void validateFunctionMethod(FunctionMethod method, ActivityReport report) {
+    public static final void validateFunctionMethod(FunctionMethod method, ValidatorReport report) {
         if(method == null) {
             updateReport(report, method, QueryPlugin.Util.getString("ERR.015.001.0052", "FunctionMethod")); //$NON-NLS-1$ //$NON-NLS-2$
             return;  // can't validate
@@ -111,7 +111,7 @@
 	 * @param method The function method
 	 * @param message The message about the validation failure
 	 */
-	private static final void updateReport(ActivityReport report, FunctionMethod method, String message) {
+	private static final void updateReport(ValidatorReport report, FunctionMethod method, String message) {
 	    report.addItem(new InvalidFunctionItem(method, message));
 	}
 

Modified: trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -23,14 +23,16 @@
 package org.teiid.query.function.metadata;
 
 import org.teiid.metadata.FunctionMethod;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorFailure;
 
 /**
  * This is a specialized report item for reporting invalid function methods during
  * function metadata validation.  It is overrides ReportItem and adds an additional
  * attribute with the method reference for the invalid method.
  */
-public class InvalidFunctionItem extends ReportItem {
+public class InvalidFunctionItem extends ValidatorFailure {
+	
+	private static final long serialVersionUID = 5679334286895174700L;
 
 	/**
 	 * Report item type

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -26,15 +26,7 @@
 	public static final String JAVA_CLASS = "JAVA_CLASS";//$NON-NLS-1$
 	public static final String DETERMINISM = "DETERMINISM";//$NON-NLS-1$
 	public static final String CATEGORY = "CATEGORY";//$NON-NLS-1$
-	public static final String FUNCTION2 = "FUNCTION";//$NON-NLS-1$
-	public static final String OUT = "OUT";//$NON-NLS-1$
-	public static final String INOUT = "INOUT";//$NON-NLS-1$
-	public static final String IN = "IN";//$NON-NLS-1$
 	public static final String UPDATECOUNT = "UPDATECOUNT";//$NON-NLS-1$
-	public static final String RETURNS = "RETURNS";//$NON-NLS-1$
-	public static final String PROCEDURE2 = "PROCEDURE";//$NON-NLS-1$
-	public static final String FOREIGN = "FOREIGN";//$NON-NLS-1$
-	public static final String VIRTUAL = "VIRTUAL";//$NON-NLS-1$
 	public static final String DISTINCT_VALUES = "DISTINCT_VALUES";//$NON-NLS-1$
 	public static final String NULL_VALUE_COUNT = "NULL_VALUE_COUNT";//$NON-NLS-1$
 	public static final String RADIX = "RADIX";//$NON-NLS-1$
@@ -48,13 +40,10 @@
 	public static final String SIGNED = "SIGNED";//$NON-NLS-1$
 	public static final String SELECTABLE = "SELECTABLE";//$NON-NLS-1$
 	public static final String CASE_SENSITIVE = "CASE_SENSITIVE";//$NON-NLS-1$
-	public static final String DEFAULT = "DEFAULT";//$NON-NLS-1$
 	public static final String AUTO_INCREMENT = "AUTO_INCREMENT";//$NON-NLS-1$
 	public static final String NOT_NULL = "NOT NULL";//$NON-NLS-1$
-	public static final String REFERENCES = "REFERENCES";//$NON-NLS-1$
 	public static final String FOREIGN_KEY = "FOREIGN KEY";//$NON-NLS-1$
 	public static final String INDEX = "INDEX";//$NON-NLS-1$
-	public static final String UNIQUE = "UNIQUE";//$NON-NLS-1$
 	public static final String PRIMARY_KEY = "PRIMARY KEY";//$NON-NLS-1$
 	public static final String ACCESSPATTERN = "ACCESSPATTERN";//$NON-NLS-1$
 	public static final String NAMEINSOURCE = "NAMEINSOURCE";//$NON-NLS-1$
@@ -66,12 +55,5 @@
 	public static final String MATERIALIZED = "MATERIALIZED";//$NON-NLS-1$
 	public static final String INSTEAD_OF = "INSTEAD OF";//$NON-NLS-1$
 	public static final String CREATE_TRIGGER_ON = "CREATE TRIGGER ON";//$NON-NLS-1$
-	public static final String DELETE = "DELETE";//$NON-NLS-1$
-	public static final String UPDATE = "UPDATE";//$NON-NLS-1$
-	public static final String INSERT = "INSERT";//$NON-NLS-1$
-	public static final String OPTIONS2 = "OPTIONS";//$NON-NLS-1$
-	public static final String CONSTRAINT = "CONSTRAINT";//$NON-NLS-1$
-	public static final String VIEW = "VIEW";//$NON-NLS-1$
 	public static final String FOREIGN_TABLE = "FOREIGN TABLE";//$NON-NLS-1$
-	public static final String CREATE = "CREATE";//$NON-NLS-1$
 }

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -21,32 +21,22 @@
  */
 package org.teiid.query.metadata;
 
-import static org.teiid.language.SQLConstants.Tokens.COMMA;
-import static org.teiid.language.SQLConstants.Tokens.LPAREN;
-import static org.teiid.language.SQLConstants.Tokens.RPAREN;
-import static org.teiid.language.SQLConstants.Tokens.SPACE;
-import static org.teiid.language.SQLConstants.Tokens.TICK;
+import static org.teiid.language.SQLConstants.NonReserved.*;
+import static org.teiid.language.SQLConstants.Reserved.*;
+import static org.teiid.language.SQLConstants.Tokens.*;
 import static org.teiid.query.metadata.DDLConstants.*;
 
 import java.util.EnumSet;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.teiid.adminapi.Admin.SchemaObjectType;
 import org.teiid.language.SQLConstants;
-import org.teiid.metadata.AbstractMetadataRecord;
+import org.teiid.language.SQLConstants.NonReserved;
+import org.teiid.metadata.*;
 import org.teiid.metadata.BaseColumn.NullType;
-import org.teiid.metadata.Column;
-import org.teiid.metadata.ColumnSet;
-import org.teiid.metadata.ForeignKey;
-import org.teiid.metadata.FunctionMethod;
 import org.teiid.metadata.FunctionMethod.Determinism;
-import org.teiid.metadata.FunctionParameter;
-import org.teiid.metadata.KeyRecord;
-import org.teiid.metadata.Procedure;
-import org.teiid.metadata.ProcedureParameter;
 import org.teiid.metadata.ProcedureParameter.Type;
-import org.teiid.metadata.Schema;
-import org.teiid.metadata.Table;
 
 public class DDLStringVisitor {
 	private static final String TAB = "\t"; //$NON-NLS-1$
@@ -56,7 +46,7 @@
 	private boolean includeTables = true;
 	private boolean includeProcedures = true;
 	private boolean includeFunctions = true;
-	private String filter;
+	private Pattern filter;
 	
     public static String getDDLString(Schema schema, EnumSet<SchemaObjectType> types, String regexPattern) {
     	DDLStringVisitor visitor = new DDLStringVisitor(types, regexPattern);
@@ -70,7 +60,9 @@
     		this.includeProcedures = types.contains(SchemaObjectType.PROCEDURES);
     		this.includeFunctions = types.contains(SchemaObjectType.FUNCTIONS);
     	}
-    	this.filter = regexPattern;
+    	if (regexPattern != null) {
+    		this.filter = Pattern.compile(regexPattern);
+    	}
     }
     
 	private void visit(Schema schema) {
@@ -117,7 +109,7 @@
 	}
 
 	private void visit(Table table) {
-		if (this.filter != null && !table.getName().matches(this.filter)) {
+		if (this.filter != null && !filter.matcher(table.getName()).matches()) {
 			return;
 		}
 		
@@ -159,7 +151,7 @@
 		// options
 		String options = buildTableOptions(table);		
 		if (!options.isEmpty()) {
-			buffer.append(SPACE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+			buffer.append(SPACE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
 		}
 		
 		if (table.isVirtual()) {
@@ -194,13 +186,13 @@
 		addCommonOptions(options, table);
 		
 		if (table.isMaterialized()) {
-			addOption(options, MATERIALIZED, String.valueOf(table.isMaterialized()));
+			addOption(options, MATERIALIZED, table.isMaterialized());
 			if (table.getMaterializedTable() != null) {
 				addOption(options, MATERIALIZED_TABLE, table.getMaterializedTable().getName());
 			}
 		}
 		if (table.supportsUpdate()) {
-			addOption(options, UPDATABLE, String.valueOf(table.supportsUpdate()));
+			addOption(options, UPDATABLE, table.supportsUpdate());
 		}
 		if (table.getCardinality() != -1) {
 			addOption(options, CARDINALITY, table.getCardinality());
@@ -299,58 +291,44 @@
 		return options.toString();
 	}
 
-	private void addColumns(StringBuilder options, List<Column> columns, boolean includeType) {
-		options.append(LPAREN);
+	private void addColumns(StringBuilder builder, List<Column> columns, boolean includeType) {
+		builder.append(LPAREN);
 		boolean first = true;
 		for (Column c:columns) {
 			if (first) {
 				first = false;
 			}
 			else {
-				options.append(COMMA).append(SPACE);
+				builder.append(COMMA).append(SPACE);
 			}
-			options.append(c.getName());
+			appendColumn(builder, c, true, includeType);
 			if (includeType) {
-				options.append(SPACE).append(c.getDatatype().getName());
+				appendColumnOptions(builder, c);
 			}
 		}
-		options.append(RPAREN);
+		builder.append(RPAREN);
 	}
-	
-	private void addNames(StringBuilder options, List<String> columns) {
+
+	private void addNames(StringBuilder builder, List<String> columns) {
 		if (columns != null) {
-			options.append(LPAREN);
+			builder.append(LPAREN);
 			boolean first = true;
 			for (String c:columns) {
 				if (first) {
 					first = false;
 				}
 				else {
-					options.append(COMMA).append(SPACE);
+					builder.append(COMMA).append(SPACE);
 				}
-				options.append(c);
+				builder.append(c);
 			}
-			options.append(RPAREN);
+			builder.append(RPAREN);
 		}
 	}	
 	
 	private void visit(Column column, Table table) {
-		buffer.append(NEWLINE).append(TAB).append(column.getName()).append(SPACE).append(column.getDatatype().getName());
-		if (column.getLength() != 0) {
-			buffer.append(LPAREN).append(column.getLength()).append(RPAREN);
-		}
-		else if (column.getPrecision() != 0){
-			buffer.append(LPAREN).append(column.getPrecision());
-			if (column.getScale() != 0) {
-				buffer.append(COMMA).append(column.getScale());
-			}
-			buffer.append(RPAREN);
-		}
-		if (column.getNullType() != null) {
-			if (column.getNullType() == NullType.No_Nulls) {
-				buffer.append(SPACE).append(NOT_NULL);
-			}
-		}
+		buffer.append(NEWLINE).append(TAB);
+		appendColumn(buffer, column, true, true);
 		
 		if (column.isAutoIncremented()) {
 			buffer.append(SPACE).append(AUTO_INCREMENT);
@@ -387,32 +365,63 @@
 		}
 		
 		// options
-		String options = buildColumnOptions(column, table);		
-		if (!options.isEmpty()) {
-			buffer.append(SPACE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+		appendColumnOptions(buffer, column);
+	}
+
+	private void appendColumn(StringBuilder builder, BaseColumn column, boolean includeName, boolean includeType) {
+		if (includeName) {
+			builder.append(column.getName());
 		}
+		if (includeType) {
+			builder.append(SPACE).append(column.getDatatype().getName());
+			if (column.getLength() != 0) {
+				builder.append(LPAREN).append(column.getLength()).append(RPAREN);
+			}
+			else if (column.getPrecision() != 0){
+				builder.append(LPAREN).append(column.getPrecision());
+				if (column.getScale() != 0) {
+					builder.append(COMMA).append(column.getScale());
+				}
+				builder.append(RPAREN);
+			}
+			if (column.getNullType() == NullType.No_Nulls) {
+				builder.append(SPACE).append(NOT_NULL);
+			}
+		}
 	}	
 	
-	private String buildColumnOptions(Column column, Table table) {
+	private void appendColumnOptions(StringBuilder builder, BaseColumn column) {
 		StringBuilder options = new StringBuilder();
 		addCommonOptions(options, column);
 		
+		// 10 is default assumed
+		if (column.getRadix() != column.getDatatype().getRadix()) {
+			addOption(options, RADIX, column.getRadix());
+		}
+		
+		if (column instanceof Column) {
+			buildColumnOptions((Column)column, options);
+		}
+		if (options.length() != 0) {
+			builder.append(SPACE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+		}
+	}
+
+	private void buildColumnOptions(Column column, 
+			StringBuilder options) {
 		if (!column.isSelectable()) {
-			addOption(options, SELECTABLE, String.valueOf(column.isSelectable()));
+			addOption(options, SELECTABLE, column.isSelectable());
 		}		
 
 		// if table is already updatable, then columns are implicitly updatable.
-		if (table.supportsUpdate() && !column.isUpdatable()) {
-			addOption(options, UPDATABLE, String.valueOf(column.isUpdatable()));
+		if (!column.isUpdatable() && column.getParent() instanceof Table && ((Table)column.getParent()).supportsUpdate()) {
+			addOption(options, UPDATABLE, column.isUpdatable());
 		}
 		
-
-		
 		if (column.isCurrency()) {
-			addOption(options, CURRENCY, String.valueOf(column.isCurrency()));
+			addOption(options, CURRENCY, column.isCurrency());
 		}
 			
-		/* - designer uses this on all non-numeric just verbose, commenting for now
 		// only record if not default
 		if (column.isCaseSensitive() && !column.getDatatype().isCaseSensitive()) {
 			addOption(options, CASE_SENSITIVE, String.valueOf(column.isCaseSensitive()));
@@ -420,7 +429,7 @@
 		
 		if (column.isSigned() && !column.getDatatype().isSigned()) {
 			addOption(options, SIGNED, String.valueOf(column.isSigned()));
-		}		 * 
+		}		  
 		if (column.isFixedLength()) {
 			addOption(options, FIXED_LENGTH, String.valueOf(column.isFixedLength()));
 		}
@@ -428,11 +437,6 @@
 		if (column.getCharOctetLength() != 0 && column.getLength() != column.getCharOctetLength()) {
 			addOption(options, CHAR_OCTET_LENGTH, column.getCharOctetLength());
 		}	
-		// 10 is default assumed
-		if (column.getRadix() != 0 && column.getRadix() != 10) {
-			addOption(options, RADIX, column.getRadix());
-		}
-		*/
 		
 		// by default the search type is default data type search, so avoid it.
 		if (column.getSearchType() != null && !column.getSearchType().equals(column.getDatatype().getSearchType())) {
@@ -447,8 +451,7 @@
 			addOption(options, MAX_VALUE, column.getMaximumValue());
 		}
 		
-		// only set native type on the foreign tables, on view the data type is type
-		if (table.isPhysical() && column.getNativeType() != null) {
+		if (column.getNativeType() != null) {
 			addOption(options, NATIVE_TYPE, column.getNativeType());
 		}
 		
@@ -465,10 +468,9 @@
 				addOption(options, key, column.getProperty(key, false));
 			}
 		}
-		return options.toString();
 	}	
 	
-	private void addOption(StringBuilder sb, String key, String value) {
+	private void addOption(StringBuilder sb, String key, Object value) {
 		if (sb.length() != 0) {
 			sb.append(COMMA).append(SPACE);
 		}
@@ -483,7 +485,7 @@
 	}	
 
 	private void visit(Procedure procedure) {
-		if (this.filter != null && !procedure.getName().matches(this.filter)) {
+		if (this.filter != null && !filter.matcher(procedure.getName()).matches()) {
 			return;
 		}
 		
@@ -494,7 +496,7 @@
 		else {
 			buffer.append(FOREIGN);
 		}
-		buffer.append(SPACE).append(PROCEDURE2).append(SPACE).append(procedure.getName());
+		buffer.append(SPACE).append(PROCEDURE).append(SPACE).append(procedure.getName());
 		buffer.append(LPAREN);
 		
 		boolean first = true;
@@ -512,19 +514,28 @@
 		}
 		buffer.append(RPAREN);
 		
-		buffer.append(SPACE).append(RETURNS).append(SPACE);
-		buildProcedureReturn(procedure.getResultSet(), procedure.getParameters());
+		if (procedure.getResultSet() != null) {
+			buffer.append(SPACE).append(RETURNS).append(SPACE).append(TABLE).append(SPACE);
+			addColumns(buffer, procedure.getResultSet().getColumns(), true);
+		}
+		for (ProcedureParameter pp: procedure.getParameters()) {
+			if (pp.getType().equals(Type.ReturnValue)) {
+				buffer.append(SPACE).append(RETURNS).append(SPACE);
+				appendColumn(buffer, pp, false, true);
+				break;
+			}
+		}
 		
 		//options
 		String options = buildProcedureOptions(procedure);		
 		if (!options.isEmpty()) {
-			buffer.append(NEWLINE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+			buffer.append(NEWLINE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
 		}		
 		//block
 		if (procedure.isVirtual()) {
 			buffer.append(NEWLINE).append(SQLConstants.Reserved.AS).append(NEWLINE);
 			String plan = procedure.getQueryPlan();
-			buffer.append(plan.substring("CREATE VIRTUAL PROCEDURE BEGIN ".length(), plan.length()-"END".length())); //$NON-NLS-1$ //$NON-NLS-2$
+			buffer.append(plan);
 		}
 	}
 	
@@ -546,35 +557,22 @@
 		return options.toString();
 	}
 
-	private void buildProcedureReturn(ColumnSet<Procedure> resultSet, List<ProcedureParameter> parameters) {
-		if (resultSet != null) {
-			addColumns(buffer, resultSet.getColumns(), true);
-		}
-		else {
-			if (parameters != null) {
-				for (ProcedureParameter pp: parameters) {
-					if (pp.getType().equals(Type.ReturnValue)) {
-						buffer.append(pp.getDatatype().getName());
-					}
-				}
-			}
-		}
-		
-	}
-	
 	private void visit(ProcedureParameter param) {
 		Type type = param.getType();
-		if (type == Type.In || type == Type.InOut || type == Type.Out) {
-			String typeStr = null;
-			if (type == Type.In) typeStr = IN;
-			if (type == Type.InOut) typeStr = INOUT;
-			if (type == Type.Out) typeStr = OUT;
-			buffer.append(typeStr).append(SPACE).append(param.getName()).append(SPACE).append(param.getDatatype().getName());
+		String typeStr = type.name().toUpperCase();
+		if (type == Type.ReturnValue) {
+			typeStr = Type.Out.name().toUpperCase();
 		}
+		buffer.append(typeStr).append(SPACE);
+		appendColumn(buffer, param, true, true);
+		if (type == Type.ReturnValue) {
+			buffer.append(SPACE).append(NonReserved.RESULT);
+		}
+		appendColumnOptions(buffer, param);
 	}	
 
 	private void visit(FunctionMethod function) {
-		if (this.filter != null && !function.getName().matches(this.filter)) {
+		if (this.filter != null && !filter.matcher(function.getName()).matches()) {
 			return;
 		}		
 		buffer.append(CREATE).append(SPACE);
@@ -584,7 +582,7 @@
 		else {
 			buffer.append(VIRTUAL);
 		}
-		buffer.append(SPACE).append(FUNCTION2).append(SPACE).append(function.getName());
+		buffer.append(SPACE).append(FUNCTION).append(SPACE).append(function.getName());
 		buffer.append(LPAREN);
 		
 		boolean first = true;
@@ -605,7 +603,7 @@
 		//options
 		String options = buildFunctionOptions(function);		
 		if (!options.isEmpty()) {
-			buffer.append(NEWLINE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+			buffer.append(NEWLINE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
 		}		
 		buffer.append(SQLConstants.Tokens.SEMICOLON);		
 	}

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -22,7 +22,9 @@
 package org.teiid.query.metadata;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 
 import org.teiid.adminapi.impl.ModelMetaData;
@@ -115,7 +117,21 @@
 					}
 				}
 				
+				Set<String> names = new HashSet<String>();
 				for (Procedure p:schema.getProcedures().values()) {
+					boolean hasReturn = false;
+					names.clear();
+					for (ProcedureParameter param : p.getParameters()) {
+						if (param.getType() == ProcedureParameter.Type.ReturnValue) {
+							if (hasReturn) {
+								metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31107, p.getFullName()));
+							}
+							hasReturn = true;
+						}
+						if (!names.add(param.getName())) {
+							metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31106, p.getFullName(), param.getName()));
+						}
+					}
 					if (p.isVirtual() && model.isSource()) {
 						metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31076, p.getName(), model.getName()));
 					}
@@ -186,7 +202,7 @@
     	try {
     		if (record instanceof Procedure) {
     			Procedure p = (Procedure)record;
-    			Command command = QueryParser.getQueryParser().parseCommand(p.getQueryPlan());
+    			Command command = QueryParser.getQueryParser().parseProcedure(p.getQueryPlan(), false);
     			QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata);
     			resolverReport =  Validator.validate(command, metadata);
     		} else if (record instanceof Table) {

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -28,8 +28,7 @@
 import org.teiid.metadata.Table;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.report.ActivityReport;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorReport;
 import org.teiid.resource.spi.WrappedConnection;
 import org.teiid.translator.ExecutionFactory;
 import org.teiid.translator.TranslatorException;
@@ -74,7 +73,7 @@
 				throw new TranslatorException(QueryPlugin.Event.TEIID30580, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30580, t.getFullName())); 
 			}
 		}
-    	ActivityReport<ReportItem> report = new ActivityReport<ReportItem>("Translator metadata load " + schema.getName()); //$NON-NLS-1$
+    	ValidatorReport report = new ValidatorReport("Translator metadata load " + schema.getName()); //$NON-NLS-1$
 		FunctionMetadataValidator.validateFunctionMethods(schema.getFunctions().values(),report);
 		if(report.hasItems()) {
 		    throw new TranslatorException(QueryPlugin.Util.getString("ERR.015.001.0005", report)); //$NON-NLS-1$

Modified: trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -102,9 +102,12 @@
 	    return parseCommand(sql, new ParseInfo());
 	}
 	
-	public Command parseUpdateProcedure(String sql) throws QueryParserException {
+	public Command parseProcedure(String sql, boolean update) throws QueryParserException {
 		try{
-            Command result = getSqlParser(sql).updateProcedure(new ParseInfo());
+			if (update) {
+				return getSqlParser(sql).forEachRowTriggerAction(new ParseInfo());
+			}
+			Command result = getSqlParser(sql).procedureBodyCommand(new ParseInfo());
             result.setCacheHint(SQLParserUtil.getQueryCacheOption(sql));
             return result;
         } catch(ParseException pe) {

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -35,6 +35,7 @@
 import org.teiid.core.util.StringUtil;
 import org.teiid.language.SQLConstants.Reserved;
 import org.teiid.metadata.AbstractMetadataRecord;
+import org.teiid.metadata.BaseColumn;
 import org.teiid.metadata.Column;
 import org.teiid.metadata.FunctionMethod;
 import org.teiid.metadata.FunctionParameter;
@@ -43,8 +44,10 @@
 import org.teiid.metadata.ProcedureParameter;
 import org.teiid.metadata.Table;
 import org.teiid.metadata.Column.SearchType;
+import org.teiid.metadata.ProcedureParameter.Type;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.FunctionMethods;
+import org.teiid.query.metadata.DDLConstants;
 import org.teiid.query.sql.lang.*;
 import org.teiid.query.sql.lang.ExistsCriteria.SubqueryHint;
 import org.teiid.query.sql.proc.Block;
@@ -354,93 +357,99 @@
     	return new Block(stmt);
     }
     
-    void setColumnOptions(Column c){
+    void setColumnOptions(BaseColumn c){
     	Map<String, String> props = c.getProperties();
 		setCommonProperties(c, props);
+		
+    	String v = props.remove(DDLConstants.RADIX); 
+    	if (v != null) {
+    		c.setRadix(Integer.parseInt(v));
+    	}
     	
-        String v = props.remove("CASE_SENSITIVE"); //$NON-NLS-1$
+    	if (c instanceof Column) {
+    		setColumnOptions((Column)c, props);
+    	}
+    }
+
+	private void setColumnOptions(Column c, Map<String, String> props) {
+		String v = props.remove(DDLConstants.CASE_SENSITIVE); 
         if (v != null) {
         	c.setCaseSensitive(isTrue(v));
         }
     	
-    	v = props.remove("SELECTABLE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.SELECTABLE);
     	if (v != null) {
     		c.setSelectable(isTrue(v));
     	}
     	
-    	v = props.remove("UPDATABLE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.UPDATABLE); 
     	if (v != null) {
     		c.setUpdatable(isTrue(v));
     	}
     	
-    	v = props.remove("SIGNED"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.SIGNED);
     	if (v != null) {
     		c.setSigned(isTrue(v));
     	}
     	
-    	v = props.remove("CURRENCY"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.CURRENCY);
     	if (v != null) {
     		c.setSigned(isTrue(v));
     	}
 
-    	v = props.remove("FIXED_LENGTH"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.FIXED_LENGTH);
     	if (v != null) {
     		c.setFixedLength(isTrue(v));
     	}
     	
-    	v = props.remove("SEARCHABLE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.SEARCHABLE);
     	if (v != null) {
     		c.setSearchType(SearchType.valueOf(v.toUpperCase()));
     	}
     	
-    	v = props.remove("MIN_VALUE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.MIN_VALUE);
     	if (v != null) {
     		c.setMinimumValue(v);
     	}
     	
-    	v = props.remove("MAX_VALUE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.MAX_VALUE);
     	if (v != null) {
     		c.setMaximumValue(v);
     	}
     	
-    	v = props.remove("CHAR_OCTET_LENGTH"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.CHAR_OCTET_LENGTH);
     	if (v != null) {
     		c.setCharOctetLength(Integer.parseInt(v));
     	}
         
-    	v = props.remove("NATIVE_TYPE"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.NATIVE_TYPE);
     	if (v != null) {
     		c.setNativeType(v);
     	}
 
-    	v = props.remove("RADIX"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.NULL_VALUE_COUNT); 
     	if (v != null) {
-    		c.setRadix(Integer.parseInt(v));
-    	}
-
-    	v = props.remove("NULL_VALUE_COUNT"); //$NON-NLS-1$
-    	if (v != null) {
     		c.setNullValues(Integer.parseInt(v));
     	}
     	
-    	v = props.remove("DISTINCT_VALUES"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.DISTINCT_VALUES); 
     	if (v != null) {
     		c.setDistinctValues(Integer.parseInt(v));
     	}
     }
 
 	void setCommonProperties(AbstractMetadataRecord c, Map<String, String> props) {
-		String v = props.remove("UUID"); //$NON-NLS-1$
+		String v = props.remove(DDLConstants.UUID); 
 		if (v != null) {
 			c.setUUID(v);
 		}
 		
-    	v = props.remove("ANNOTATION"); //$NON-NLS-1$
+    	v = props.remove(DDLConstants.ANNOTATION); 
     	if (v != null) {
     		c.setAnnotation(v);
     	}
 		
-		v = props.remove("NAMEINSOURCE"); //$NON-NLS-1$
+		v = props.remove(DDLConstants.NAMEINSOURCE); 
 		if (v != null) {
 			c.setNameInSource(v);
 		}
@@ -450,24 +459,24 @@
     	Map<String, String> props = table.getProperties();
     	setCommonProperties(table, props);
     	
-    	String value = props.remove("MATERIALIZED"); //$NON-NLS-1$
+    	String value = props.remove(DDLConstants.MATERIALIZED); 
     	if (value != null) {
     		table.setMaterialized(isTrue(value));
     	}
 		
-		value = props.remove("MATERIALIZED_TABLE"); //$NON-NLS-1$
+		value = props.remove(DDLConstants.MATERIALIZED_TABLE); 
 		if (value != null) {
     		Table mattable = new Table();
     		mattable.setName(value);
     		table.setMaterializedTable(mattable);
     	}
 		
-		value = props.remove("UPDATABLE"); //$NON-NLS-1$
+		value = props.remove(DDLConstants.UPDATABLE); 
 		if (value != null) {
 			table.setSupportsUpdate(isTrue(value));
 		}
 		
-    	value = props.remove("CARDINALITY"); //$NON-NLS-1$
+    	value = props.remove(DDLConstants.CARDINALITY); 
     	if (value != null) {
     		table.setCardinality(Integer.parseInt(value));
     	}
@@ -481,24 +490,22 @@
 		
 		ArrayList<FunctionParameter> ins = new ArrayList<FunctionParameter>();
 		for (ProcedureParameter pp:proc.getParameters()) {
-			if (pp.getType() != ProcedureParameter.Type.In) {
+			if (pp.getType() == ProcedureParameter.Type.InOut || pp.getType() == ProcedureParameter.Type.Out) {
 				throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_in", proc.getName())); //$NON-NLS-1$
 			}
 			
-			FunctionParameter fp = new FunctionParameter(pp.getName(), pp.getDatatype().getName());
-			fp.setVarArg(pp.isVarArg());
-			ins.add(fp);
+			FunctionParameter fp = new FunctionParameter(pp.getName(), pp.getDatatype().getName(), pp.getAnnotation());
+			if (pp.getType() == ProcedureParameter.Type.In) {
+				fp.setVarArg(pp.isVarArg());
+				ins.add(fp);
+			} else {
+				method.setOutputParameter(fp);
+			}
 		}
 		method.setInputParameters(ins);
 		
-		List<Column> returnCols = proc.getResultSet().getColumns();
-		if (returnCols != null && !returnCols.isEmpty()) {
-			if (returnCols.size() > 1) {
-				throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_return", proc.getName())); //$NON-NLS-1$
-			}
-			Column c = returnCols.get(0);
-			FunctionParameter fp = new FunctionParameter(c.getName(), c.getDatatype().getName());
-			method.setOutputParameter(fp);
+		if (proc.getResultSet() != null || method.getOutputParameter() == null) {
+			throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_return", proc.getName())); //$NON-NLS-1$
 		}
 		
 		method.setAnnotation(proc.getAnnotation());
@@ -507,18 +514,18 @@
 		
 		Map<String, String> props = proc.getProperties();
 
-		String value = props.remove("CATEGORY"); //$NON-NLS-1$
+		String value = props.remove(DDLConstants.CATEGORY); 
 		method.setCategory(value);
 		
-		value = props.remove("DETERMINISM"); //$NON-NLS-1$
+		value = props.remove(DDLConstants.DETERMINISM); 
 		if (value != null) {
 			method.setDeterminism(FunctionMethod.Determinism.valueOf(value.toUpperCase()));
 		}
 		
-		value = props.remove("JAVA_CLASS"); //$NON-NLS-1$
+		value = props.remove(DDLConstants.JAVA_CLASS); 
 		method.setInvocationClass(value);
 		
-		value = props.remove("JAVA_METHOD"); //$NON-NLS-1$
+		value = props.remove(DDLConstants.JAVA_METHOD); 
 		method.setInvocationMethod(value);
 		
 		for (String key:props.keySet()) {
@@ -568,21 +575,43 @@
 		}
 	}
 	
-	void addProcReturnColumn(MetadataFactory factory, Procedure proc, String name, ParsedDataType type) throws ParseException{
+	BaseColumn addProcColumn(MetadataFactory factory, Procedure proc, String name, ParsedDataType type, boolean rs) throws ParseException{
 		try {
-			Column column = factory.addProcedureResultSetColumn(name, type.type, proc);
-			if (type.length != null){
-				column.setLength(type.length);
+			name = validateElementName(name);
+			BaseColumn column = null;
+			if (rs) {
+				column = factory.addProcedureResultSetColumn(name, type.type, proc);
+			} else {
+				boolean added = false;
+				for (ProcedureParameter pp : proc.getParameters()) {
+					if (pp.getType() == Type.ReturnValue) {
+						added = true;
+						if (pp.getDatatype() != factory.getDataTypes().get(type.type)) {
+							throw new ParseException(QueryPlugin.Util.getString("SQLParser.proc_type_conflict", proc.getName(), pp.getDatatype(), type.type)); //$NON-NLS-1$
+						}
+					}
+				}
+				if (!added) {
+					column = factory.addProcedureParameter(name, type.type, ProcedureParameter.Type.ReturnValue, proc);
+				}
 			}
-			if (type.scale != null){
-				column.setScale(type.scale);
-			}	
-			if (type.precision != null){
-				column.setPrecision(type.precision);
-			}							
+			setTypeInfo(type, column);
+			return column;
 		} catch (TranslatorException e){
 			throw new ParseException(e.getMessage());
 		}	
+	}
+
+	void setTypeInfo(ParsedDataType type, BaseColumn column) {
+		if (type.length != null){
+			column.setLength(type.length);
+		}
+		if (type.scale != null){
+			column.setScale(type.scale);
+		}	
+		if (type.precision != null){
+			column.setPrecision(type.precision);
+		}
 	}	
 	
 	static String resolvePropertyKey(MetadataFactory factory, String key) {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -49,6 +49,7 @@
 import org.teiid.query.sql.lang.GroupContext;
 import org.teiid.query.sql.lang.ProcedureContainer;
 import org.teiid.query.sql.lang.SPParameter;
+import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.proc.CreateProcedureCommand;
 import org.teiid.query.sql.proc.TriggerAction;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -93,7 +94,7 @@
         
         QueryParser parser = QueryParser.getQueryParser();
         try {
-            subCommand = parser.parseUpdateProcedure(plan);
+            subCommand = parser.parseProcedure(plan, !(procCommand instanceof StoredProcedure));
         } catch(QueryParserException e) {
              throw new QueryResolverException(QueryPlugin.Event.TEIID30060, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30060, group, procCommand.getClass().getSimpleName()));
         }

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -38,6 +38,10 @@
     public ValidatorReport() {
         super(VALIDATOR_REPORT);
     }
+    
+    public ValidatorReport(String name) {
+    	super(name);
+    }
 
     public void collectInvalidObjects(Collection<LanguageObject> invalidObjects) {
     	for (ValidatorFailure failure : getItems()) {

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-07-17 01:00:58 UTC (rev 4242)
@@ -487,8 +487,9 @@
 	Command command = null;
 }
 {
-	 (LOOKAHEAD(2) command = updateProcedure(info) |
-	  command = userCommand(info)	  
+	(LOOKAHEAD (2) command = createProcedure(info) |
+	 command = forEachRowTriggerAction(info) |
+	 command = userCommand(info)	  
 	)
 	[<SEMICOLON>]
 	<EOF>
@@ -497,19 +498,6 @@
 	}
 }
 
-Command updateProcedure(ParseInfo info) :
-{
-	Command command = null;
-}
-{
-	(command = createProcedure(info) |
-	 command = forEachRowTriggerAction(info))
-	<EOF>
-	{
-		return command;
-	}
-}
-
 Command createTrigger(ParseInfo info) :
 {
   	String target = null;
@@ -1079,6 +1067,21 @@
     }    
 }   
 
+CreateProcedureCommand  procedureBodyCommand(ParseInfo info) :
+{
+    CreateProcedureCommand procCmd = 
+        new CreateProcedureCommand();
+    Statement stmt = null;  
+}
+{ 
+    [LOOKAHEAD(2) <CREATE> [<VIRTUAL>] <PROCEDURE>]
+    stmt = statement(info)
+    {        
+        procCmd.setBlock(asBlock(stmt));
+        return procCmd;        
+    }    
+} 
+
 /**
  * Parse error statement
  * @throws ParseException if parsing failed
@@ -4116,7 +4119,8 @@
 	String procName = null;
     CreateProcedureCommand procCmd = new CreateProcedureCommand();
     Statement stmt = null; 	
-    ParsedDataType returnDataType = null;    
+    ParsedDataType returnDataType = null;
+    Token comment = null;    
 }
 {
 	<CREATE> [<VIRTUAL> | <FOREIGN> {virtual = false;}] (<PROCEDURE> | <FUNCTION> {function = true;})
@@ -4135,35 +4139,32 @@
 		(<COMMA> procedureParameter(factory, proc))*	
 		<RPAREN>
 		
-		<RETURNS> (procedureReturn(factory, proc) | returnDataType = parseDataType())
-		
+		[<RETURNS> (([<TABLE>] <LPAREN>
+	        procedureRsColumn(factory, proc)
+	        (<COMMA> procedureRsColumn(factory, proc))*
+	    <RPAREN>)
+	     |
+	     returnDataType = parseDataType())
+	    ]
 	    [ optionsClause(proc, factory)
 		   {
 		      setProcedureOptions(proc);
 		   }
 		]
-		[<AS>
+		[<AS> { comment = getToken(1).specialToken; } 
 		stmt = statement(info)])
 		{
 			proc.setVirtual(virtual);
 			proc.setFunction(function);
 			if (stmt != null){
-				proc.setQueryPlan("CREATE VIRTUAL PROCEDURE "+asBlock(stmt).toString());
+			    if (function || !virtual) {
+			         throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_def", procName));
+			    }
+				proc.setQueryPlan((comment != null?comment.image+" ":"") + stmt.toString());
 			}
 			
-			if (!function) {
-				if (virtual && stmt == null){
-					throw new ParseException(QueryPlugin.Util.getString("SQLParser.virtual_proc_def", procName));
-				}
-				if (!virtual && stmt != null){
-					throw new ParseException(QueryPlugin.Util.getString("SQLParser.foreign_proc_def", procName));
-				}
-			} else if (stmt != null) {
-				throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_def", procName));
-			}
-			
 	        if (returnDataType != null){
-				addProcReturnColumn(factory, proc, "return", returnDataType);
+				addProcColumn(factory, proc, "return", returnDataType, false);
 	        }
 	        if (function) {
 	        	replaceProcedureWithFunction(factory, proc);
@@ -4185,44 +4186,55 @@
 	 |(<INOUT> {ppType = ProcedureParameter.Type.InOut;}))]
 	name = id()
 	type = parseDataType()
+	[nonReserved("RESULT")
+	  {
+	    if (ppType != ProcedureParameter.Type.Out) {
+	    	throw new ParseException(QueryPlugin.Util.getString("SQLParser.param_out", proc.getName(), name));
+	    }
+	    ppType = ProcedureParameter.Type.ReturnValue;
+	  }
+	]
 	{
 		try {
-			param = factory.addProcedureParameter(name, type.type, ppType, proc);
-			if (type.length != null){
-			   param.setLength(type.length);
-			}
-			if (type.scale != null){
-			   param.setScale(type.scale);
-			}
-			if (type.precision != null){
-				param.setPrecision(type.precision);
-			}			
+			param = factory.addProcedureParameter(validateElementName(name), type.type, ppType, proc);
+			setTypeInfo(type, param);
 		} catch (TranslatorException e){
 			throw new ParseException(e.getMessage());
 		}
-	}	
+	}
+	[optionsClause(param, factory)
+	   {
+	      setColumnOptions(param);
+	   }
+	]	
 }
 
-void procedureReturn(MetadataFactory factory, Procedure proc) :
+void procedureRsColumn(MetadataFactory factory, Procedure proc) :
 {
 	String name = null;
+}
+{
+	name = id()
+	procedureColumn(factory, proc, name, true)
+}
+
+void procedureColumn(MetadataFactory factory, Procedure proc, String name, boolean rs) :
+{
 	ParsedDataType type = null;
+	boolean notNull = false;
+	BaseColumn column = null; 
 }
 {
-	<LPAREN>
-	  name = id()
 	  type = parseDataType()
 	  {
-		addProcReturnColumn(factory, proc, name, type);	  	
+	  	column = addProcColumn(factory, proc, name, type, rs);
 	  }
-	  (<COMMA> 
-	  	name = id()
-	    type = parseDataType()
-		{
-			addProcReturnColumn(factory, proc, name, type);		
-		}
-	  )*
-	 <RPAREN> 
+	  [<NOT> <NULL> { notNull = true; }]	  
+	  [optionsClause(column, factory)
+	   {
+	      setColumnOptions(column);
+	   }
+	  ]
 }
 
 void createTable(MetadataFactory factory) :
@@ -4231,6 +4243,7 @@
 	String tableName = null;
 	boolean view = false;
 	Command query = null;
+	Token comment = null;
 }
 {
 	<CREATE> (<FOREIGN> <TABLE> | [<VIRTUAL>] nonReserved("VIEW") {view = true;}) 
@@ -4259,14 +4272,14 @@
 	      setTableOptions(table);
 	   }
 	]
-	[<AS> query = queryExpression(new ParseInfo())]
+	[<AS> { comment = getToken(1).specialToken; } query = queryExpression(new ParseInfo())]
 	{
-		if (view){
-		   if (query == null) {
-		      throw new ParseException(QueryPlugin.Util.getString("SQLParser.view_def", tableName));
+		if (query != null){
+		   if (!view) {
+     		   throw new ParseException(QueryPlugin.Util.getString("SQLParser.view_def", tableName));
 		   }
-		   table.setSelectTransformation(query.toString());	
-		}		
+		   table.setSelectTransformation((comment != null?comment.image+" ":"") + query.toString());	
+		}
 		if (!table.supportsUpdate() && table.getColumns() != null) {
 			for (Column c : table.getColumns()) {
 				c.setUpdatable(false);
@@ -4419,15 +4432,7 @@
 	  	try{
     		column = factory.addColumn(validateElementName(element), type.type, table);
     		column.setUpdatable(true);
-		    if (type.length != null){
-		    	column.setLength(type.length);
-		    }
-		    if (type.scale != null){
-		    	column.setScale(type.scale);
-		    }    	
-			if (type.precision != null){
-				column.setPrecision(type.precision);
-			}		    	
+		    setTypeInfo(type, column);		    	
     		columnName.add(element);
     	}catch(TranslatorException e){
     		throw new ParseException(e.getMessage());

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-07-17 01:00:58 UTC (rev 4242)
@@ -257,14 +257,12 @@
 SQLParser.Invalid_short_name=Invalid simple identifier format: [{0}]
 SQLParser.expected_non_reserved=Expected non-reserved word {0}, but was {1}.
 SQLParser.invalid_window=Cannot window a non-aggregate expression {0}.
-SQLParser.virtual_proc_def=Virtual procedure {0} must define the procedure after an ''AS'' keyword.
-SQLParser.foreign_proc_def=Foreign procedure {0} must not define a procedure body.
-SQLParser.function_def=Function {0} must not define a function body.
-SQLParser.view_def=Virtual view {0} must be defined with a query expression.
+SQLParser.function_def=Function or foreign procedure {0} cannot define a body.
+SQLParser.view_def=Foreign table {0} cannot be defined by a query expression.
 SQLParser.pk_exists=Primary Key is already defined on {0}
 SQLParser.no_column=Column name {0} not found on table {1}
-SQLParser.function_return=Function {0} is not valid.  Functions can only return a single parameter.
-SQLParser.function_in=Functions {0} is not valid.  Functions can only support 'In' parameters.
+SQLParser.function_return=Function {0} is not valid.  Functions can not support result set return parameters, and must have a scalar return parameter.
+SQLParser.function_in=Functions {0} is not valid.  Functions can only support 'In/RESULT' parameters.
 SystemSource.array_length_desc=Get the length of the given array value
 SystemSource.array_param1=Array
 SystemSource.array_length_result=The array length
@@ -993,7 +991,7 @@
 TEIID31076=Virtual procedure {0} is only allowed to be defined on VIRTUAL model; {1} is defined as PHYSICAL model.
 TEIID31077=Source Stored procedure {0} is only allowed to be defined on PHYSICAL model; {1} is defined as VIRTUAL model.
 TEIID31078=Pushdown function {0} must be defined on PHYSICAL model; {1} is VIRTUAL model. 
-TEIID31079=View {0} did not define transformation after "AS select ..."
+TEIID31079=View {0} is not defined by a query expression.
 TEIID31080=View {0} validation error: {1}
 TEIID31081=Virtual Procedure {0} did not specify any statements as procedure block in model {0}
 TEIID31082={0}.{1} is now "incomplete", because model "{2}" can not retrieve metadata. Please deploy the necessary DataSources.
@@ -1025,4 +1023,9 @@
 TEIID31103=There are different sources with the name {0} in {1}.{2}
 
 TEIID31104=Recursion limit of {0} reached.
-TEIID31105=Returing warning to client: {0}
\ No newline at end of file
+TEIID31105=Returing warning to client: {0}
+TEIID31106=Duplicate parameter {1} defined on {0}
+TEIID31107=Procedure {0} can only have 1 RESULT/return value
+
+SQLParser.proc_type_conflict=Result type {1} conflicts with return type {2} for procedure {0}
+SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
\ No newline at end of file

Modified: trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -22,29 +22,17 @@
 
 package org.teiid.query.function.metadata;
 
-import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.function.source.*;
-import org.teiid.query.report.*;
+import static org.junit.Assert.*;
 
-import junit.framework.*;
+import org.junit.Test;
+import org.teiid.query.function.source.SystemSource;
+import org.teiid.query.validator.ValidatorReport;
 
-public class TestSystemSource extends TestCase {
+public class TestSystemSource {
 
-	// ################################## FRAMEWORK ################################
-	
-	public TestSystemSource(String name) { 
-		super(name);
-	}	
-	
-	// ################################## TEST HELPERS ################################
-	
-
-	
-	// ################################## ACTUAL TESTS ################################
-	
-	public void testValidate() {
+	@Test public void testValidate() {
 	    SystemSource source = new SystemSource(false);
-	    ActivityReport report = new ActivityReport("Test Report");	    	     //$NON-NLS-1$
+	    ValidatorReport report = new ValidatorReport("Test Report");	    	     //$NON-NLS-1$
 		FunctionMetadataValidator.validateFunctionMethods(source.getFunctionMethods(), report);
 
 		if(report.hasItems()) { 		    

Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -21,7 +21,7 @@
  */
 package org.teiid.query.metadata;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -29,11 +29,11 @@
 import java.util.Properties;
 
 import org.junit.Test;
-import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.metadata.Column;
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.Schema;
 import org.teiid.metadata.Table;
+import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.query.parser.ParseException;
 import org.teiid.query.parser.TestDDLParser;
 
@@ -168,9 +168,9 @@
 				"AS\n" + 
 				"SELECT * FROM PM1.G1;\n" + 
 				"\n" + 
-				"CREATE VIRTUAL PROCEDURE FOO(IN P1 integer) RETURNS (e1 integer, e2 string)\n" + 
+				"CREATE VIRTUAL PROCEDURE FOO(IN P1 integer) RETURNS TABLE (e1 integer, e2 string)\n" + 
 				"AS\n" + 
-				"SELECT * FROM PM1.G1;\n";
+				"SELECT * FROM PM1.G1;";
 		helpTest(ddl, expected);
 		
 	}	
@@ -217,7 +217,7 @@
 				"RETURNS (r1 varchar, r2 decimal)" +
 				"OPTIONS(RANDOM 'any', UUID 'uuid', NAMEINSOURCE 'nis', ANNOTATION 'desc', UPDATECOUNT '2');";
 		
-		String expected = "CREATE FOREIGN PROCEDURE myProc(OUT p1 boolean, IN p2 string, INOUT p3 bigdecimal) RETURNS (r1 string, r2 bigdecimal)\n" + 
+		String expected = "CREATE FOREIGN PROCEDURE myProc(OUT p1 boolean, IN p2 string, INOUT p3 bigdecimal) RETURNS TABLE (r1 string, r2 bigdecimal)\n" + 
 				"OPTIONS (UUID 'uuid', ANNOTATION 'desc', NAMEINSOURCE 'nis', UPDATECOUNT 2, RANDOM 'any')";
 		helpTest(ddl, expected);		
 	}	

Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -56,7 +56,7 @@
 		this.vdb.addAttchment(TransformationMetadata.class, metadata);
 	}
 
-	private ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData vdb, MetadataStore store, String ddl) throws Exception {
+	private static ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData vdb, MetadataStore store, String ddl) throws Exception {
 		ModelMetaData model = new ModelMetaData();
 		model.setName(modelName); 	
 		model.setModelType(physical?Model.Type.PHYSICAL:Model.Type.VIRTUAL);
@@ -130,6 +130,22 @@
 		assertTrue(printError(report), report.hasItems());			
 	}
 	
+	@Test public void testProcWithMultipleReturn() throws Exception {
+		String ddl = "create foreign procedure x (out param1 string result, out param2 string result); ";
+		buildModel("pm1", true, this.vdb, this.store,ddl);
+		buildTransformationMetadata();
+		ValidatorReport report = new MetadataValidator().validate(vdb, store);
+		assertTrue(printError(report), report.hasItems());			
+	}
+	
+	@Test public void testProcWithDuplicateParam() throws Exception {
+		String ddl = "create foreign procedure x (out param1 string, out param1 string); ";
+		buildModel("pm1", true, this.vdb, this.store,ddl);
+		buildTransformationMetadata();
+		ValidatorReport report = new MetadataValidator().validate(vdb, store);
+		assertTrue(printError(report), report.hasItems());			
+	}
+	
 	@Test public void testProcMetadata() throws Exception {
 		String ddl = "create virtual procedure proc1(IN e1 varchar) RETURNS (e1 integer, e2 varchar(12)) AS begin create local temporary table x (e1 integer, e2 varchar); select * from x; end;" +
 		"create virtual procedure proc2(IN e1 varchar) RETURNS (e1 integer, e2 varchar(12)) AS select x.* from (exec proc1('a')) as X; ";

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -317,8 +317,8 @@
 	}	
 	
 	@Test(expected=ParseException.class)
-	public void testViewWithoutPlan() throws Exception {
-		String ddl = "CREATE View G1( e1 integer, e2 varchar)";
+	public void testTableWithPlan() throws Exception {
+		String ddl = "CREATE foreign table G1 as select 1";
 		MetadataStore mds = new MetadataStore();
 		MetadataFactory mf = new MetadataFactory(null, 1, "model", getDataTypes(), new Properties(), null); 
 		parser.parseDDL(mf,ddl);
@@ -347,7 +347,7 @@
 		Map<String, Procedure> procedureMap = s.getProcedures();
 		Procedure p = procedureMap.get("FOO");
 		assertNotNull(p);
-		assertEquals("CREATE VIRTUAL PROCEDURE BEGIN\nSELECT * FROM PM1.G1;\nEND", p.getQueryPlan());
+		assertEquals("SELECT * FROM PM1.G1;", p.getQueryPlan());
 		
 	}		
 	
@@ -490,7 +490,7 @@
 		assertTrue( fm.getInputParameters().get(0).isVarArg());
 	}
 	
-	@Test(expected=ParseException.class) public void testInvalidProcedurenBody() throws Exception {
+	@Test(expected=ParseException.class) public void testInvalidProcedureBody() throws Exception {
 		String ddl = "CREATE FOREIGN PROCEDURE SourceFunc(flag boolean) RETURNS varchar AS SELECT 'a';";
 
 		Schema s = helpParse(ddl, "model").getSchema();
@@ -504,7 +504,7 @@
 		String ddl = "CREATE VIRTUAL PROCEDURE myProc(OUT p1 boolean, p2 varchar, INOUT p3 decimal) " +
 				"RETURNS (r1 varchar, r2 decimal) " +
 				"OPTIONS(RANDOM 'any', UUID 'uuid', NAMEINSOURCE 'nis', ANNOTATION 'desc', UPDATECOUNT '2') " +
-				"AS BEGIN select * from foo; END";
+				"AS /*+ cache */ BEGIN select * from foo; END";
 
 		Schema s = helpParse(ddl, "model").getSchema();
 		
@@ -541,7 +541,7 @@
 		assertEquals(2, proc.getUpdateCount());
 		assertEquals("any", proc.getProperties().get("RANDOM"));	
 		
-		assertEquals("CREATE VIRTUAL PROCEDURE BEGIN\nSELECT * FROM foo;\nEND", proc.getQueryPlan());	
+		assertEquals("/*+ cache */ BEGIN\nSELECT * FROM foo;\nEND", proc.getQueryPlan());	
 		
 	}	
 	

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -53,7 +53,7 @@
 		AlterTrigger alterTrigger = new AlterTrigger();
 		alterTrigger.setTarget(new GroupSymbol("x"));
 		alterTrigger.setEvent(TriggerEvent.UPDATE);
-		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
+		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseProcedure("for each row begin end", true));
 		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 ATOMIC\nEND", alterTrigger);
 	}
 	
@@ -70,7 +70,7 @@
 		alterTrigger.setCreate(true);
 		alterTrigger.setTarget(new GroupSymbol("x"));
 		alterTrigger.setEvent(TriggerEvent.UPDATE);
-		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
+		alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseProcedure("for each row begin end", true));
 		helpTest("create trigger on x instead of update as for each row begin end", "CREATE TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN ATOMIC\nEND", alterTrigger);
 	}
 	

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -46,6 +46,7 @@
 import org.teiid.query.sql.proc.CommandStatement;
 import org.teiid.query.sql.proc.CreateProcedureCommand;
 import org.teiid.query.sql.proc.LoopStatement;
+import org.teiid.query.sql.proc.TriggerAction;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.visitor.CommandCollectorVisitor;
@@ -75,7 +76,7 @@
 	}	
 	
     @Test public void testDefect13029_CorrectlySetUpdateProcedureTempGroupIDs() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
             .append("\nBEGIN") //$NON-NLS-1$
             .append("\nDECLARE string var1;") //$NON-NLS-1$
             .append("\nvar1 = '';") //$NON-NLS-1$
@@ -109,19 +110,19 @@
         assertNull(tempIDs.get("LOOPCURSOR2")); //$NON-NLS-1$
     }
     
-	private CreateProcedureCommand helpResolveUpdateProcedure(String procedure, String userUpdateStr, Table.TriggerEvent procedureType) throws QueryParserException, QueryResolverException, TeiidComponentException {
+	private TriggerAction helpResolveUpdateProcedure(String procedure, String userUpdateStr, Table.TriggerEvent procedureType) throws QueryParserException, QueryResolverException, TeiidComponentException {
         QueryMetadataInterface metadata = RealMetadataFactory.exampleUpdateProc(procedureType, procedure);
-		return resolveProcedure(userUpdateStr, metadata);
+		return (TriggerAction) resolveProcedure(userUpdateStr, metadata);
 	}
 
-	private CreateProcedureCommand resolveProcedure(String userUpdateStr,
+	private Command resolveProcedure(String userUpdateStr,
 			QueryMetadataInterface metadata) throws QueryParserException,
 			QueryResolverException, TeiidComponentException,
 			QueryMetadataException {
 		ProcedureContainer userCommand = (ProcedureContainer)QueryParser.getQueryParser().parseCommand(userUpdateStr); 
         QueryResolver.resolveCommand(userCommand, metadata);
         metadata = new TempMetadataAdapter(metadata, userCommand.getTemporaryMetadata());
-        return (CreateProcedureCommand)QueryResolver.expandCommand(userCommand, metadata, null);
+        return QueryResolver.expandCommand(userCommand, metadata, null);
 	}
 
 	private void helpResolveException(String userUpdateStr, QueryMetadataInterface metadata, String msg) throws QueryParserException, TeiidComponentException {
@@ -133,7 +134,7 @@
 		}
 	}
 
-	private CreateProcedureCommand helpResolve(String userUpdateStr, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
+	private Command helpResolve(String userUpdateStr, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
 		return resolveProcedure(userUpdateStr, metadata);
 	}
     
@@ -141,7 +142,7 @@
      *  Constants will now auto resolve if they are consistently representable in the target type
      */
     @Test public void testDefect23257() throws Exception{
-    	CreateProcedureCommand command = helpResolve("EXEC pm6.vsp59()", RealMetadataFactory.example1Cached()); //$NON-NLS-1$
+    	CreateProcedureCommand command = (CreateProcedureCommand) helpResolve("EXEC pm6.vsp59()", RealMetadataFactory.example1Cached()); //$NON-NLS-1$
         
         CommandStatement cs = (CommandStatement)command.getBlock().getStatements().get(1);
         
@@ -151,7 +152,7 @@
     } 
     
     @Test public void testProcedureScoping() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         //note that this declare takes presedense over the proc INPUTS.e1 and CHANGING.e1 variables
         .append("\n  declare integer e1 = 1;") //$NON-NLS-1$
@@ -165,7 +166,7 @@
         
         String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
         
-        CreateProcedureCommand command = helpResolveUpdateProcedure(proc.toString(), userUpdateStr,
+        TriggerAction command = helpResolveUpdateProcedure(proc.toString(), userUpdateStr,
                                      Table.TriggerEvent.UPDATE);
         
         Block block = command.getBlock();
@@ -186,7 +187,7 @@
 	// variable resolution, variable used in if statement, variable compared against
 	// different datatype element
     @Test public void testCreateUpdateProcedure4() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1);\n"; //$NON-NLS-1$
@@ -201,7 +202,7 @@
     
 	// variable resolution, variable used in if statement, invalid operation on variable
     @Test public void testCreateUpdateProcedure5() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = var1 + var1;\n"; //$NON-NLS-1$
@@ -217,7 +218,7 @@
 	// variable resolution, variables declared in different blocks local variables
 	// should not override
     @Test public void testCreateUpdateProcedure6() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -236,7 +237,7 @@
 	// variable resolution, variables declared in different blocks local variables
 	// inner block using outer block variables
     @Test public void testCreateUpdateProcedure7() throws Exception {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -255,7 +256,7 @@
 	// variable resolution, variables declared in different blocks local variables
 	// outer block cannot use inner block variables
     @Test public void testCreateUpdateProcedure8() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -275,7 +276,7 @@
 	// variable resolution, variables declared in different blocks local variables
 	// should override, outer block variables still valid afetr inner block is declared
     @Test public void testCreateUpdateProcedure9() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -294,7 +295,7 @@
     
 	// using declare variable that has parts
     @Test public void testCreateUpdateProcedure24() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var2.var1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -307,7 +308,7 @@
     
 	// using declare variable is qualified
     @Test public void testCreateUpdateProcedure26() throws Exception {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer VARIABLES.var1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -320,7 +321,7 @@
     
 	// using declare variable is qualified but has more parts
     @Test public void testCreateUpdateProcedure27() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer VARIABLES.var1.var2;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -333,7 +334,7 @@
     
 	// using a variable that has not been declared in an assignment stmt
     @Test public void testCreateUpdateProcedure28() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = Select pm1.g1.e2 from pm1.g1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -346,7 +347,7 @@
     
 	// using a variable that has not been declared in an assignment stmt
     @Test public void testCreateUpdateProcedure29() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = 1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -359,7 +360,7 @@
     
 	// using invalid function in assignment expr
     @Test public void testCreateUpdateProcedure30() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "Declare integer var1;\n";         //$NON-NLS-1$
         procedure = procedure + "var1 = 'x' + ROWS_UPDATED;\n"; //$NON-NLS-1$
@@ -373,7 +374,7 @@
     
 	// using invalid function in assignment expr
     @Test public void testCreateUpdateProcedure31() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "Declare integer var1;\n";         //$NON-NLS-1$
         procedure = procedure + "var1 = 'x' + ROWS_UPDATED;\n"; //$NON-NLS-1$
@@ -387,7 +388,7 @@
     
 	// using a variable being used inside a subcomand
     @Test public void testCreateUpdateProcedure32() throws Exception {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "Declare integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "Select var1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -403,7 +404,7 @@
 	// should override, outer block variables still valid afetr inner block is declared
 	// fails as variable being compared against incorrect type
     @Test public void testCreateUpdateProcedure33() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -422,7 +423,7 @@
     
 	// physical elements used on criteria of the if statement
     @Test public void testCreateUpdateProcedure34() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -439,7 +440,7 @@
     
 	// physical elements used on criteria of the if statement
     @Test public void testCreateUpdateProcedure36() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -456,7 +457,7 @@
     
 	// physical elements used on criteria of the if statement
     @Test public void testCreateUpdateProcedure39() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -474,7 +475,7 @@
 	// resolving AssignmentStatement, variable type and assigned type 
 	// do not match and no implicit conversion available
 	@Test public void testCreateUpdateProcedure53() {
-		String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+		String procedure = "FOR EACH ROW "; //$NON-NLS-1$
 		procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
 		procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
 		procedure = procedure + "var1 = INPUTS.e4;"; //$NON-NLS-1$
@@ -490,7 +491,7 @@
 	// resolving AssignmentStatement, variable type and assigned type 
 	// do not match, but implicit conversion available
 	@Test public void testCreateUpdateProcedure54() throws Exception {
-		String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+		String procedure = "FOR EACH ROW "; //$NON-NLS-1$
 		procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
 		procedure = procedure + "DECLARE string var1;\n"; //$NON-NLS-1$
 		procedure = procedure + "var1 = 1+1;"; //$NON-NLS-1$
@@ -504,7 +505,7 @@
     
     @Test public void testDefect14912_CreateUpdateProcedure57_FunctionWithElementParamInAssignmentStatement() {
         // Tests that the function params are resolved before the function for assignment statements
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE string var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = badFunction(badElement);"; //$NON-NLS-1$
@@ -519,7 +520,7 @@
 	// addresses Cases 4624.  Before change to UpdateProcedureResolver,
     // this case failed with assertion exception.
     @Test public void testCase4624() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = {b'false'};\n"; //$NON-NLS-1$
@@ -581,7 +582,7 @@
 
     //baseline test to ensure that a declare assignment cannot contain the declared variable
     @Test public void testDeclareStatement() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer VARIABLES.var1 = VARIABLES.var1;\n"; //$NON-NLS-1$
         procedure = procedure + "ROWS_UPDATED =0;\n"; //$NON-NLS-1$
@@ -595,7 +596,7 @@
     @Test public void testDynamicIntoInProc() throws Exception {
         String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
 
-        StringBuffer procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                 .append("BEGIN\n") //$NON-NLS-1$
                                 .append("execute string 'SELECT e1, e2, e3, e4 FROM pm1.g2' as e1 string, e2 string, e3 string, e4 string INTO #myTempTable;\n") //$NON-NLS-1$
                                 .append("select e1 from #myTempTable;\n") //$NON-NLS-1$
@@ -607,7 +608,7 @@
     @Test public void testDynamicStatement() throws Exception {
         String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
 
-        StringBuffer procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                 .append("BEGIN\n") //$NON-NLS-1$
                                 .append("execute string 'SELECT e1, e2, e3, e4 FROM pm1.g2';\n") //$NON-NLS-1$
                                 .append("END\n"); //$NON-NLS-1$
@@ -618,7 +619,7 @@
     @Test public void testDynamicStatementType() {
         String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
 
-        StringBuffer procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                 .append("BEGIN\n") //$NON-NLS-1$
                                 .append("DECLARE object VARIABLES.X = null;\n") //$NON-NLS-1$
                                 .append("execute string VARIABLES.X;\n") //$NON-NLS-1$
@@ -629,7 +630,7 @@
 
 	// variable resolution
     @Test public void testCreateUpdateProcedure1() throws Exception {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = Select pm1.g1.e2 from pm1.g1;\n"; //$NON-NLS-1$
@@ -644,7 +645,7 @@
     
 	// variable resolution, variable used in if statement
     @Test public void testCreateUpdateProcedure3() throws Exception {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -659,7 +660,7 @@
     }
 
     @Test public void testSelectIntoInProc() throws Exception {
-        StringBuffer procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                             .append("BEGIN\n") //$NON-NLS-1$
                                             .append("SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2;\n") //$NON-NLS-1$
                                             .append("END\n"); //$NON-NLS-1$
@@ -669,7 +670,7 @@
         helpResolveUpdateProcedure(procedure.toString(), userUpdateStr,
                                      Table.TriggerEvent.UPDATE);
         
-        procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                 .append("BEGIN\n") //$NON-NLS-1$
                                 .append("SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n") //$NON-NLS-1$
                                 .append("END\n"); //$NON-NLS-1$
@@ -678,7 +679,7 @@
     }
 
     @Test public void testSelectIntoInProcNoFrom() throws Exception {
-        StringBuffer procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                             .append("BEGIN\n") //$NON-NLS-1$
                                             .append("SELECT 'a', 19, {b'true'}, 13.999 INTO pm1.g1;\n") //$NON-NLS-1$
                                             .append("END\n"); //$NON-NLS-1$
@@ -688,7 +689,7 @@
         helpResolveUpdateProcedure(procedure.toString(), userUpdateStr,
                                      Table.TriggerEvent.UPDATE);
         
-        procedure = new StringBuffer("CREATE PROCEDURE  ") //$NON-NLS-1$
+        procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
                                 .append("BEGIN\n") //$NON-NLS-1$
                                 .append("SELECT 'a', 19, {b'true'}, 13.999 INTO #myTempTable;\n") //$NON-NLS-1$
                                 .append("END\n"); //$NON-NLS-1$
@@ -698,7 +699,7 @@
     
     // validating INPUT element assigned
     @Test public void testAssignInput() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "INPUTS.e1 = Select pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -713,7 +714,7 @@
     
     // validating CHANGING element assigned
     @Test public void testAssignChanging() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "CHANGING.e1 = Select pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -728,7 +729,7 @@
     
     // variables cannot be used among insert elements
     @Test public void testVariableInInsert() {
-        String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "Insert into pm1.g1 (pm1.g1.e2, var1) values (1, 2);\n"; //$NON-NLS-1$
@@ -743,7 +744,7 @@
     
     // variables cannot be used among insert elements
     @Test public void testVariableInInsert2() {
-        String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "Insert into pm1.g1 (pm1.g1.e2, INPUTS.x) values (1, 2);\n"; //$NON-NLS-1$
@@ -758,7 +759,7 @@
     
     //should resolve first to the table's column
     @Test public void testVariableInInsert3() throws Exception {
-        String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW  "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer e2;\n"; //$NON-NLS-1$
         procedure = procedure + "Insert into pm1.g1 (e2) values (1);\n"; //$NON-NLS-1$
@@ -783,7 +784,7 @@
     }
     
     @Test public void testLoopRedefinition() {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  declare string var1;") //$NON-NLS-1$
         .append("\n  LOOP ON (SELECT pm1.g1.e1 FROM pm1.g1) AS loopCursor") //$NON-NLS-1$
@@ -802,7 +803,7 @@
     }
     
     @Test public void testTempGroupElementShouldNotBeResolable() {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  select 1 as a into #temp;") //$NON-NLS-1$
         .append("\n  select #temp.a from pm1.g1;") //$NON-NLS-1$
@@ -815,7 +816,7 @@
     }
     
     @Test public void testTempGroupElementShouldNotBeResolable1() {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  select 1 as a into #temp;") //$NON-NLS-1$
         .append("\n  insert into #temp (a) values (#temp.a);") //$NON-NLS-1$
@@ -828,7 +829,7 @@
     }
     
     @Test public void testProcedureCreate() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  create local temporary table t1 (e1 string);") //$NON-NLS-1$
         .append("\n  select e1 from t1;") //$NON-NLS-1$
@@ -845,7 +846,7 @@
      * it is not ok to redefine the loopCursor 
      */
     @Test public void testProcedureCreate1() {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  LOOP ON (SELECT pm1.g1.e1 FROM pm1.g1) AS loopCursor") //$NON-NLS-1$
         .append("\n  BEGIN") //$NON-NLS-1$
@@ -859,7 +860,7 @@
     }
     
     @Test public void testProcedureCreateDrop() {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n drop table t1;") //$NON-NLS-1$
         .append("\n  create local temporary table t1 (e1 string);") //$NON-NLS-1$
@@ -871,7 +872,7 @@
     }
     
     @Test public void testProcedureCreateDrop1() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  create local temporary table t1 (e1 string);") //$NON-NLS-1$
         .append("\n  drop table t1;") //$NON-NLS-1$
@@ -883,7 +884,7 @@
     }
     
     @Test public void testCreateAfterImplicitTempTable() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  select e1 into #temp from pm1.g1;") //$NON-NLS-1$
         .append("\n  create local temporary table #temp (e1 string);") //$NON-NLS-1$
@@ -895,7 +896,7 @@
     }
     
     @Test public void testInsertAfterCreate() throws Exception {
-        StringBuffer proc = new StringBuffer("CREATE PROCEDURE") //$NON-NLS-1$
+        StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
         .append("\nBEGIN") //$NON-NLS-1$
         .append("\n  create local temporary table #temp (e1 string, e2 string);") //$NON-NLS-1$
         .append("\n  insert into #temp (e1) values ('a');") //$NON-NLS-1$
@@ -928,7 +929,7 @@
     // variable resolution, variable compared against
     // different datatype element for which there is no implicit transformation)
     @Test public void testCreateUpdateProcedure2() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure += "BEGIN\n"; //$NON-NLS-1$
         procedure += "DECLARE boolean var1;\n"; //$NON-NLS-1$
         procedure += "ROWS_UPDATED = UPDATE pm1.g1 SET pm1.g1.e4 = convert(var1, string), pm1.g1.e1 = var1;\n"; //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -1104,7 +1104,7 @@
     
     @Test public void testRewriteWhile() throws Exception {
         
-        String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n";       //$NON-NLS-1$
         procedure = procedure + "while (1 = 1)\n"; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1124,7 +1124,7 @@
     
     @Test public void testRewriteWhile1() throws Exception {
         
-        String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n";       //$NON-NLS-1$
         procedure = procedure + "while (1 = 0)\n"; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1134,8 +1134,8 @@
         
         String userQuery = "Insert into vm1.g1 (e1, e2) values ('String', 1)"; //$NON-NLS-1$
         
-        String rewritProc = "CREATE VIRTUAL PROCEDURE\n"; //$NON-NLS-1$
-        rewritProc = rewritProc + "BEGIN\n";         //$NON-NLS-1$
+        String rewritProc = "FOR EACH ROW\n"; //$NON-NLS-1$
+        rewritProc = rewritProc + "BEGIN ATOMIC\n";         //$NON-NLS-1$
         rewritProc = rewritProc + "END"; //$NON-NLS-1$
         
         String procReturned = this.getRewritenProcedure(procedure, userQuery, 
@@ -1149,15 +1149,15 @@
      */
     @Test public void testRewriteProcedureWithCount() throws Exception {
         
-        String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n";         //$NON-NLS-1$
         procedure = procedure + "Select count(*) from pm1.g1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
         
         String userQuery = "Insert into vm1.g1 (e1, e2) values ('String', 1)"; //$NON-NLS-1$
         
-        String rewritProc = "CREATE VIRTUAL PROCEDURE\n"; //$NON-NLS-1$
-        rewritProc = rewritProc + "BEGIN\n";         //$NON-NLS-1$
+        String rewritProc = "FOR EACH ROW\n"; //$NON-NLS-1$
+        rewritProc = rewritProc + "BEGIN ATOMIC\n";         //$NON-NLS-1$
         rewritProc = rewritProc + "SELECT COUNT(*) FROM pm1.g1;\n";         //$NON-NLS-1$
         rewritProc = rewritProc + "END"; //$NON-NLS-1$
         

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -910,7 +910,7 @@
     
 	// valid variable declared
     @Test public void testCreateUpdateProcedure4() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -924,7 +924,7 @@
 	// validating AssignmentStatement, more than one project symbol on the
 	// command
     @Test public void testCreateUpdateProcedure11() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -939,7 +939,7 @@
 	// validating AssignmentStatement, more than one project symbol on the
 	// command
     @Test public void testCreateUpdateProcedure12() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -953,7 +953,7 @@
     
     // using aggregate function within a procedure - defect #8394
     @Test public void testCreateUpdateProcedure31() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE string MaxTran;\n"; //$NON-NLS-1$
         procedure = procedure + "MaxTran = SELECT MAX(e1) FROM pm1.g1;\n";         //$NON-NLS-1$
@@ -967,7 +967,7 @@
     
 	// assigning null values to known datatype variable
 	@Test public void testCreateUpdateProcedure32() {
-		String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+		String procedure = "FOR EACH ROW "; //$NON-NLS-1$
 		procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
 		procedure = procedure + "DECLARE string var;\n"; //$NON-NLS-1$
 		procedure = procedure + "var = null;\n";         //$NON-NLS-1$
@@ -980,7 +980,7 @@
 	}
     
     @Test public void testDefect13643() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
         procedure = procedure + "LOOP ON (SELECT * FROM pm1.g1) AS myCursor\n"; //$NON-NLS-1$
@@ -1019,7 +1019,7 @@
     }
     
     @Test public void testSelectIntoTempGroup() {
-        String procedure = "CREATE VIRTUAL PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "SELECT COUNT(*) FROM #myTempTable;\n"; //$NON-NLS-1$
@@ -1035,7 +1035,7 @@
      * Defect 24346
      */
     @Test public void testInvalidSelectIntoTempGroup() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3 INTO #myTempTable FROM pm1.g2;\n";         //$NON-NLS-1$
@@ -1049,7 +1049,7 @@
     }
     
     @Test public void testInvalidSelectIntoTempGroup1() {
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "create local temporary table #myTempTable (e1 integer);\n";         //$NON-NLS-1$
         procedure = procedure + "SELECT e1 INTO #myTempTable FROM pm1.g2;\n";         //$NON-NLS-1$
@@ -1066,7 +1066,7 @@
     @Test public void testSelectIntoPhysicalGroup() {
         helpValidate("SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] { }, RealMetadataFactory.example1Cached()); //$NON-NLS-1$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1088,7 +1088,7 @@
     @Test public void testInvalidSelectIntoTooManyElements() {
     	helpValidate("SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1102,7 +1102,7 @@
     @Test public void testInvalidSelectIntoTooFewElements() {
     	helpValidate("SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1116,7 +1116,7 @@
     @Test public void testInvalidSelectIntoIncorrectTypes() {
         helpValidate("SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1134,7 +1134,7 @@
     @Test public void testInvalidSelectIntoWithStar() {
         helpValidate("SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1", new String[] {"SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1148,7 +1148,7 @@
     @Test public void testSelectIntoVirtualGroup() {
         helpValidate("SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2", new String[] {}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$
         
-        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        String procedure = "FOR EACH ROW "; //$NON-NLS-1$
         procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
         procedure = procedure + "SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2;\n";         //$NON-NLS-1$
         procedure = procedure + "END\n"; //$NON-NLS-1$

Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -34,8 +34,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.metadata.FunctionMetadataReader;
 import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.report.ActivityReport;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorReport;
 import org.teiid.runtime.RuntimePlugin;
 
 public class FileUDFMetaData extends UDFMetaData {
@@ -59,7 +58,7 @@
 			throw new IOException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40075, name));
 		}
 		List<FunctionMethod> udfMethods = FunctionMetadataReader.loadFunctionMethods(file.openStream());
-		ActivityReport<ReportItem> report = new ActivityReport<ReportItem>("UDF load"); //$NON-NLS-1$
+		ValidatorReport report = new ValidatorReport("UDF load"); //$NON-NLS-1$
 		FunctionMetadataValidator.validateFunctionMethods(udfMethods,report);
 		if(report.hasItems()) {
 		    throw new IOException(QueryPlugin.Util.getString("ERR.015.001.0005", report)); //$NON-NLS-1$

Modified: trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java	2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java	2012-07-17 01:00:58 UTC (rev 4242)
@@ -57,76 +57,61 @@
    
 	@Test public void test_Pg_Proc_alltypes() throws Exception {
 		execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='bigProcedure'"); //$NON-NLS-1$
-		if (this.internalResultSet.next()) {
-			assertEquals(1, this.internalResultSet.getInt(1)); //oid
-			assertEquals("bigProcedure", this.internalResultSet.getString(2)); //proname
-			assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
-			assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
-			assertEquals(14, this.internalResultSet.getInt(5)); //pronargs
-			assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
-			assertArrayEquals(new Object[] {"intNum","stringNum","floatNum","longNum","doubleNum","byteNum","dateValue","timeValue","timestampValue","booValue","charValue","shortNum","bigIntNum","bigdecimalNum","col","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
-			assertArrayEquals(new Object[] {"i","i","i","i","i","i","i","i","i","i","i","i","i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
-			assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700,1043,1700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
-			assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
-		}
-		else {
-			fail("no results");
-		}
+		assertTrue(this.internalResultSet.next());
+		assertEquals(1, this.internalResultSet.getInt(1)); //oid
+		assertEquals("bigProcedure", this.internalResultSet.getString(2)); //proname
+		assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
+		assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
+		assertEquals(14, this.internalResultSet.getInt(5)); //pronargs
+		assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+		assertArrayEquals(new Object[] {"intNum","stringNum","floatNum","longNum","doubleNum","byteNum","dateValue","timeValue","timestampValue","booValue","charValue","shortNum","bigIntNum","bigdecimalNum","col","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+		assertArrayEquals(new Object[] {"i","i","i","i","i","i","i","i","i","i","i","i","i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+		assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700,1043,1700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+		assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
 	}
 	
 	@Test public void test_Pg_Proc_void() throws Exception {
 		execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='VoidProcedure'"); //$NON-NLS-1$
-		if (this.internalResultSet.next()) {
-			assertEquals(4, this.internalResultSet.getInt(1)); //oid
-			assertEquals("VoidProcedure", this.internalResultSet.getString(2)); //proname
-			assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
-			assertEquals(2278, this.internalResultSet.getInt(4)); //prorettype
-			assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
-			assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
-			assertArrayEquals(new Object[] {"intNum","stringNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
-			assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
-			assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
-			assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
-		}
-		else {
-			fail("no results");
-		}
+		assertTrue(this.internalResultSet.next());
+		assertEquals(4, this.internalResultSet.getInt(1)); //oid
+		assertEquals("VoidProcedure", this.internalResultSet.getString(2)); //proname
+		assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
+		assertEquals(2278, this.internalResultSet.getInt(4)); //prorettype
+		assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
+		assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+		assertArrayEquals(new Object[] {"intNum","stringNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+		assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+		assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+		assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
 	}
 	
 	@Test public void test_Pg_Proc_with_return() throws Exception {
 		execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='ProcedureWithReturn'"); //$NON-NLS-1$
-		if (this.internalResultSet.next()) {
-			assertEquals(3, this.internalResultSet.getInt(1)); //oid
-			assertEquals("ProcedureWithReturn", this.internalResultSet.getString(2)); //proname
-			assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
-			assertEquals(20, this.internalResultSet.getInt(4)); //prorettype
-			assertEquals(3, this.internalResultSet.getInt(5)); //pronargs
-			assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
-			assertArrayEquals(new Object[] {"intNum","stringNum","floatNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
-			assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
-			assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
-			assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
-		}
-		else {
-			fail("no results");
-		}
+		assertTrue(this.internalResultSet.next());
+		assertEquals(3, this.internalResultSet.getInt(1)); //oid
+		assertEquals("ProcedureWithReturn", this.internalResultSet.getString(2)); //proname
+		assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
+		assertEquals(20, this.internalResultSet.getInt(4)); //prorettype
+		assertEquals(3, this.internalResultSet.getInt(5)); //pronargs
+		assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+		assertArrayEquals(new Object[] {"intNum","stringNum","floatNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+		assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+		assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+		assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
 	}
+	
 	@Test public void test_Pg_Proc_with_return_table() throws Exception {
 		execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='ProcedureReturnTable'"); //$NON-NLS-1$
-		if (this.internalResultSet.next()) {
-			assertEquals(2, this.internalResultSet.getInt(1)); //oid
-			assertEquals("ProcedureReturnTable", this.internalResultSet.getString(2)); //proname
-			assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
-			assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
-			assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
-			assertArrayEquals(new Object[] {1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
-			assertArrayEquals(new Object[] {"intNum","bigDecimalNum","col1","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
-			assertArrayEquals(new Object[] {"i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
-			assertArrayEquals(new Object[] {1700,1700,1043,1114}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
-			assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
-		}
-		else {
-			fail("no results");
-		}
+		assertTrue(this.internalResultSet.next());
+		assertEquals(2, this.internalResultSet.getInt(1)); //oid
+		assertEquals("ProcedureReturnTable", this.internalResultSet.getString(2)); //proname
+		assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
+		assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
+		assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
+		assertArrayEquals(new Object[] {1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+		assertArrayEquals(new Object[] {"intNum","bigDecimalNum","col1","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+		assertArrayEquals(new Object[] {"i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+		assertArrayEquals(new Object[] {1700,1700,1043,1114}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+		assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
 	}	
 }



More information about the teiid-commits mailing list