[teiid-commits] teiid SVN: r2181 - in trunk: api/src/main/java/org/teiid/language and 49 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Fri Jun 4 17:51:32 EDT 2010


Author: shawkins
Date: 2010-06-04 17:51:29 -0400 (Fri, 04 Jun 2010)
New Revision: 2181

Added:
   trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/TableFunctionReference.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/XMLTable.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLSerialize.java
   trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java
Removed:
   trunk/engine/src/main/java/org/teiid/query/optimizer/xquery/
   trunk/engine/src/main/java/org/teiid/query/processor/xquery/
   trunk/engine/src/main/java/org/teiid/query/sql/lang/XQuery.java
   trunk/engine/src/main/java/org/teiid/query/xquery/XQueryExpression.java
   trunk/engine/src/main/java/org/teiid/query/xquery/XQuerySQLEvaluator.java
   trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocFunctionURIResolver.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParserXQuery.java
   trunk/engine/src/test/java/org/teiid/query/processor/dynamic/
   trunk/engine/src/test/java/org/teiid/query/processor/xquery/
   trunk/engine/src/test/java/org/teiid/query/xquery/HardcodedSqlEval.java
   trunk/engine/src/test/java/org/teiid/query/xquery/TestXQueryEngine.java
Modified:
   trunk/api/src/main/java/org/teiid/language/SQLReservedWords.java
   trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
   trunk/api/src/main/java/org/teiid/translator/SourceSystemFunctions.java
   trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
   trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
   trunk/common-core/src/main/java/org/teiid/core/types/basic/StringToSQLXMLTransform.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java
   trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestEscapeSyntaxModifier.java
   trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
   trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml
   trunk/documentation/reference/src/main/docbook/en-US/content/transaction_support.xml
   trunk/engine/pom.xml
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
   trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
   trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java
   trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java
   trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.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/processor/relational/GroupingNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
   trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
   trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLAttributes.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLForest.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
   trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestAggregateImpl.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
   trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java
   trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java
   trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestCapabilitiesUtil.java
   trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
   trunk/engine/src/test/java/org/teiid/query/resolver/TestFunctionResolving.java
   trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
   trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java
   trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestAggregateSymbol.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestExpressionMappingVisitor.java
   trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
   trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
   trunk/pom.xml
   trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java
Log:
TEIID-1087 TEIID-171 TEIID-1005 initial commit of xquery overhaul.  added xquery analysis based upon saxon path maps.  memory usage will be nearly as good as xom/nux, but there are far fewer restrictions on the row path expression.  also added xmlserialize and cleaned up the parser further to remove more unnecessarily reserved words.

Modified: trunk/api/src/main/java/org/teiid/language/SQLReservedWords.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLReservedWords.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/api/src/main/java/org/teiid/language/SQLReservedWords.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -46,6 +46,39 @@
 		public static final String LPAREN = "("; //$NON-NLS-1$
 		public static final String RPAREN = ")"; //$NON-NLS-1$
 	}
+	
+	public interface NonReserved {
+		public static final String SQL_TSI_FRAC_SECOND = "SQL_TSI_FRAC_SECOND"; //$NON-NLS-1$
+		public static final String SQL_TSI_SECOND = "SQL_TSI_SECOND"; //$NON-NLS-1$
+		public static final String SQL_TSI_MINUTE = "SQL_TSI_MINUTE"; //$NON-NLS-1$
+		public static final String SQL_TSI_HOUR = "SQL_TSI_HOUR"; //$NON-NLS-1$
+		public static final String SQL_TSI_DAY = "SQL_TSI_DAY"; //$NON-NLS-1$
+		public static final String SQL_TSI_WEEK = "SQL_TSI_WEEK"; //$NON-NLS-1$
+		public static final String SQL_TSI_MONTH = "SQL_TSI_MONTH"; //$NON-NLS-1$
+		public static final String SQL_TSI_QUARTER = "SQL_TSI_QUARTER"; //$NON-NLS-1$
+		public static final String SQL_TSI_YEAR = "SQL_TSI_YEAR"; //$NON-NLS-1$
+		public static final String TIMESTAMPADD = "TIMESTAMPADD"; //$NON-NLS-1$
+		public static final String TIMESTAMPDIFF = "TIMESTAMPDIFF"; //$NON-NLS-1$
+		//aggregate functions
+		public static final String MAX = "MAX"; //$NON-NLS-1$
+		public static final String MIN = "MIN"; //$NON-NLS-1$
+		public static final String COUNT = "COUNT"; //$NON-NLS-1$
+		public static final String AVG = "AVG"; //$NON-NLS-1$
+		public static final String SUM = "SUM"; //$NON-NLS-1$
+		//texttable
+		public static final String WIDTH = "WIDTH"; //$NON-NLS-1$
+		public static final String DELIMITER = "DELIMITER"; //$NON-NLS-1$
+		public static final String HEADER = "HEADER"; //$NON-NLS-1$
+		public static final String QUOTE = "QUOTE"; //$NON-NLS-1$
+		public static final String COLUMNS = "COLUMNS"; //$NON-NLS-1$
+		//xmltable
+		public static final String ORDINALITY = "ORDINALITY"; //$NON-NLS-1$
+		public static final String PASSING = "PASSING"; //$NON-NLS-1$
+		public static final String PATH = "PATH"; //$NON-NLS-1$
+		//xmlserialize
+		public static final String DOCUMENT = "DOCUMENT"; //$NON-NLS-1$
+		public static final String CONTENT = "CONTENT"; //$NON-NLS-1$
+	}
 
 	//Teiid specific
 	public static final String BIGDECIMAL = "BIGDECIMAL"; //$NON-NLS-1$
@@ -54,26 +87,13 @@
     public static final String BYTE = "BYTE"; //$NON-NLS-1$
     public static final String CRITERIA = "CRITERIA"; //$NON-NLS-1$
     public static final String ERROR = "ERROR";	 //$NON-NLS-1$
-    public static final String FN = "FN"; //$NON-NLS-1$
     public static final String LIMIT = "LIMIT"; //$NON-NLS-1$
     public static final String LONG = "LONG"; //$NON-NLS-1$
     public static final String LOOP = "LOOP"; //$NON-NLS-1$
     public static final String MAKEDEP = "MAKEDEP"; //$NON-NLS-1$
     public static final String MAKENOTDEP = "MAKENOTDEP"; //$NON-NLS-1$
 	public static final String NOCACHE = "NOCACHE"; //$NON-NLS-1$
-	public static final String OJ = "OJ"; //$NON-NLS-1$
-	public static final String SQL_TSI_FRAC_SECOND = "SQL_TSI_FRAC_SECOND"; //$NON-NLS-1$
-    public static final String SQL_TSI_SECOND = "SQL_TSI_SECOND"; //$NON-NLS-1$
-    public static final String SQL_TSI_MINUTE = "SQL_TSI_MINUTE"; //$NON-NLS-1$
-    public static final String SQL_TSI_HOUR = "SQL_TSI_HOUR"; //$NON-NLS-1$
-    public static final String SQL_TSI_DAY = "SQL_TSI_DAY"; //$NON-NLS-1$
-    public static final String SQL_TSI_WEEK = "SQL_TSI_WEEK"; //$NON-NLS-1$
-    public static final String SQL_TSI_MONTH = "SQL_TSI_MONTH"; //$NON-NLS-1$
-    public static final String SQL_TSI_QUARTER = "SQL_TSI_QUARTER"; //$NON-NLS-1$
-    public static final String SQL_TSI_YEAR = "SQL_TSI_YEAR"; //$NON-NLS-1$
-    public static final String STRING = "STRING"; //$NON-NLS-1$
-    public static final String TIMESTAMPADD = "TIMESTAMPADD"; //$NON-NLS-1$
-    public static final String TIMESTAMPDIFF = "TIMESTAMPDIFF"; //$NON-NLS-1$
+	public static final String STRING = "STRING"; //$NON-NLS-1$
     public static final String VIRTUAL = "VIRTUAL"; //$NON-NLS-1$
     public static final String WHILE = "WHILE"; //$NON-NLS-1$
     
@@ -92,8 +112,7 @@
     public static final String ASYMETRIC = "ASYMETRIC"; //$NON-NLS-1$
     public static final String ATOMIC = "ATOMIC"; //$NON-NLS-1$
     public static final String AUTHORIZATION = "AUTHORIZATION"; //$NON-NLS-1$
-	public static final String AVG = "AVG"; //$NON-NLS-1$
-    public static final String BEGIN = "BEGIN"; //$NON-NLS-1$
+	public static final String BEGIN = "BEGIN"; //$NON-NLS-1$
     public static final String BETWEEN = "BETWEEN"; //$NON-NLS-1$
     public static final String BIGINT = "BIGINT"; //$NON-NLS-1$
     public static final String BINARY = "BINARY"; //$NON-NLS-1$
@@ -117,7 +136,6 @@
     public static final String CONVERT = "CONVERT"; //$NON-NLS-1$
     public static final String CONSTRAINT = "CONSTRAINT"; //$NON-NLS-1$
     public static final String CONTINUE = "CONTINUE"; //$NON-NLS-1$
-	public static final String COUNT = "COUNT"; //$NON-NLS-1$
 	public static final String CORRESPONDING = "CORRESPONDING"; //$NON-NLS-1$
     public static final String CREATE = "CREATE"; //$NON-NLS-1$
     public static final String CROSS = "CROSS"; //$NON-NLS-1$
@@ -201,9 +219,7 @@
     public static final String LOCALTIME = "LOCALTIME"; //$NON-NLS-1$
     public static final String LOCALTIMESTAMP = "LOCALTIMESTAMP"; //$NON-NLS-1$
     public static final String MATCH = "MATCH"; //$NON-NLS-1$
-    public static final String MAX = "MAX"; //$NON-NLS-1$
-	public static final String MIN = "MIN"; //$NON-NLS-1$
-	public static final String MEMBER = "MEMBER"; //$NON-NLS-1$
+    public static final String MEMBER = "MEMBER"; //$NON-NLS-1$
 	public static final String MERGE = "MERGE"; //$NON-NLS-1$
 	public static final String METHOD = "METHOD"; //$NON-NLS-1$
 	public static final String MINUTE = "MINUTE"; //$NON-NLS-1$
@@ -280,8 +296,7 @@
     public static final String SYMETRIC = "SYMETRIC"; //$NON-NLS-1$
     public static final String SYSTEM = "SYSTEM"; //$NON-NLS-1$
     public static final String SYSTEM_USER = "SYSTEM_USER"; //$NON-NLS-1$
-	public static final String SUM = "SUM"; //$NON-NLS-1$
-    public static final String TABLE = "TABLE"; //$NON-NLS-1$
+	public static final String TABLE = "TABLE"; //$NON-NLS-1$
     public static final String TEMPORARY = "TEMPORARY"; //$NON-NLS-1$
     public static final String THEN = "THEN"; //$NON-NLS-1$
     public static final String TIME = "TIME"; //$NON-NLS-1$

Modified: trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -70,6 +70,7 @@
 import org.teiid.language.TableReference;
 import org.teiid.language.Update;
 import org.teiid.language.Argument.Direction;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.language.SQLReservedWords.Tokens;
 import org.teiid.language.SortSpecification.Ordering;
 import org.teiid.metadata.AbstractMetadataRecord;
@@ -393,7 +394,7 @@
             }
             buffer.append(Tokens.RPAREN);
 
-        } else if(name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPADD) || name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPDIFF)) {
+        } else if(name.equalsIgnoreCase(NonReserved.TIMESTAMPADD) || name.equalsIgnoreCase(NonReserved.TIMESTAMPDIFF)) {
             buffer.append(name);
             buffer.append(Tokens.LPAREN); 
 

Modified: trunk/api/src/main/java/org/teiid/translator/SourceSystemFunctions.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/SourceSystemFunctions.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/api/src/main/java/org/teiid/translator/SourceSystemFunctions.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -136,7 +136,6 @@
 	
 	//xml
 	public static final String XPATHVALUE = "xpathvalue"; //$NON-NLS-1$
-	public static final String XPATHQUERY = "xpathquery"; //$NON-NLS-1$
 	public static final String XSLTRANSFORM = "xsltransform"; //$NON-NLS-1$
 	public static final String XMLCONCAT = "xmlconcat"; //$NON-NLS-1$
 	public static final String XMLCOMMENT = "xmlcomment"; //$NON-NLS-1$

Modified: trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -70,9 +70,8 @@
     private final static String EXTRA_CHARS = ".@"; //$NON-NLS-1$
     // constant value giving the key words not in SQL-92
     final static String KEY_WORDS = "OPTION, BIGDECIMAL"+ //$NON-NLS-1$
-	", BIGDECIMAL, BIGINTEGER, BREAK, BYTE, CRITERIA, ERROR, FN, LIMIT, LONG, LOOP, MAKEDEP, MAKENOTDEP"+ //$NON-NLS-1$
-	", NOCACHE, OJ, SQL_TSI_FRAC_SECOND, SQL_TSI_SECOND, SQL_TSI_MINUTE, SQL_TSI_HOUR, SQL_TSI_DAY, SQL_TSI_WEEK, SQL_TSI_MONTH"+ //$NON-NLS-1$
-    ", SQL_TSI_QUARTER, SQL_TSI_YEAR, STRING, TIMESTAMPADD, TIMESTAMPDIFF, VIRTUAL, WHILE"; //$NON-NLS-1$
+	", BIGDECIMAL, BIGINTEGER, BREAK, BYTE, CRITERIA, ERROR, LIMIT, LONG, LOOP, MAKEDEP, MAKENOTDEP"+ //$NON-NLS-1$
+	", NOCACHE, STRING, VIRTUAL, WHILE"; //$NON-NLS-1$
     // constant value giving preferred name for a procedure
     private final static String PROCEDURE_TERM = "StoredProcedure"; //$NON-NLS-1$
     // constant value giving the names of numeric functions supported

Modified: trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -84,6 +84,9 @@
     
     @Override
     public String toString() {
+    	if (reference == null) {
+    		return super.toString();
+    	}
         return reference.toString();
     }
     

Modified: trunk/common-core/src/main/java/org/teiid/core/types/basic/StringToSQLXMLTransform.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/basic/StringToSQLXMLTransform.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/common-core/src/main/java/org/teiid/core/types/basic/StringToSQLXMLTransform.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -58,7 +58,7 @@
         return result;
 	}
 
-	static Type isXml(Reader reader) throws TransformationException {
+	public static Type isXml(Reader reader) throws TransformationException {
 		Type type = Type.FRAGMENT;
 		XMLInputFactory inputFactory = XMLInputFactory.newInstance();
         try{        

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,7 +31,7 @@
 import org.teiid.language.Function;
 import org.teiid.language.LanguageFactory;
 import org.teiid.language.Literal;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.translator.TypeFacility;
 import org.teiid.translator.jdbc.ExtractFunctionModifier;
 import org.teiid.translator.jdbc.FunctionModifier;
@@ -41,12 +41,12 @@
 	private static Map<String, String> INTERVAL_MAP = new HashMap<String, String>();
 	
 	static {
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_DAY, ExtractFunctionModifier.DAY);
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_HOUR, ExtractFunctionModifier.HOUR);
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_MINUTE, ExtractFunctionModifier.MINUTE);
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_MONTH, ExtractFunctionModifier.MONTH);
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_SECOND, ExtractFunctionModifier.SECOND);
-		INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_YEAR, ExtractFunctionModifier.YEAR);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_DAY, ExtractFunctionModifier.DAY);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_HOUR, ExtractFunctionModifier.HOUR);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_MINUTE, ExtractFunctionModifier.MINUTE);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_MONTH, ExtractFunctionModifier.MONTH);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_SECOND, ExtractFunctionModifier.SECOND);
+		INTERVAL_MAP.put(NonReserved.SQL_TSI_YEAR, ExtractFunctionModifier.YEAR);
 	}
 	
 	private boolean add;
@@ -72,11 +72,11 @@
 			return null;
 		}
 		if (add) {
-			if (interval.equals(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+			if (interval.equals(NonReserved.SQL_TSI_FRAC_SECOND)) {
 				intervalType.setValue("MILLISECOND"); //$NON-NLS-1$
 				Expression[] args = new Expression[] {function.getParameters().get(1), factory.createLiteral(1000000, TypeFacility.RUNTIME_TYPES.INTEGER)};
 				function.getParameters().set(1, factory.createFunction("/", args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
-			} else if (interval.equals(SQLReservedWords.SQL_TSI_QUARTER)) {
+			} else if (interval.equals(NonReserved.SQL_TSI_QUARTER)) {
 				intervalType.setValue(ExtractFunctionModifier.DAY);
 				Expression[] args = new Expression[] {function.getParameters().get(1), factory.createLiteral(91, TypeFacility.RUNTIME_TYPES.INTEGER)};
 				function.getParameters().set(1, factory.createFunction("*", args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
@@ -87,10 +87,10 @@
 			}
 			return null;
 		} 
-		if (interval.equals(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+		if (interval.equals(NonReserved.SQL_TSI_FRAC_SECOND)) {
 			intervalType.setValue("MILLISECOND"); //$NON-NLS-1$
 			return Arrays.asList(function, " * 1000000"); //$NON-NLS-1$
-		} else if (interval.equals(SQLReservedWords.SQL_TSI_QUARTER)) {
+		} else if (interval.equals(NonReserved.SQL_TSI_QUARTER)) {
 			intervalType.setValue(ExtractFunctionModifier.DAY);
 			return Arrays.asList(function, " / 91"); //$NON-NLS-1$  
 		} 

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -35,7 +35,7 @@
 import org.teiid.language.LanguageObject;
 import org.teiid.language.Limit;
 import org.teiid.language.Literal;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.translator.Translator;
 import org.teiid.translator.TranslatorException;
 import org.teiid.translator.ExecutionContext;
@@ -205,9 +205,9 @@
     	if (obj instanceof AggregateFunction) {
     		AggregateFunction agg = (AggregateFunction)obj;
     		if (agg.getExpression() != null && TypeFacility.RUNTIME_TYPES.BOOLEAN.equals(agg.getExpression().getType())) {
-            	if (agg.getName().equalsIgnoreCase(SQLReservedWords.MIN)) {
+            	if (agg.getName().equalsIgnoreCase(NonReserved.MIN)) {
             		agg.setName("bool_and"); //$NON-NLS-1$
-            	} else if (agg.getName().equalsIgnoreCase(SQLReservedWords.MAX)) {
+            	} else if (agg.getName().equalsIgnoreCase(NonReserved.MAX)) {
             		agg.setName("bool_or"); //$NON-NLS-1$
             	}
             }

Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestEscapeSyntaxModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestEscapeSyntaxModifier.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestEscapeSyntaxModifier.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -29,7 +29,7 @@
 import org.teiid.cdk.CommandBuilder;
 import org.teiid.language.Function;
 import org.teiid.language.Literal;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.unittest.TimestampUtil;
 import org.teiid.translator.jdbc.EscapeSyntaxModifier;
 
@@ -57,7 +57,7 @@
     }
     
     public void testTimestampAdd() {
-        Literal arg1 = CommandBuilder.getLanuageFactory().createLiteral(SQLReservedWords.SQL_TSI_HOUR, String.class); 
+        Literal arg1 = CommandBuilder.getLanuageFactory().createLiteral(NonReserved.SQL_TSI_HOUR, String.class); 
         Literal arg2 = CommandBuilder.getLanuageFactory().createLiteral(Integer.valueOf(1), Integer.class);
         Literal arg3 = CommandBuilder.getLanuageFactory().createLiteral(TimestampUtil.createTimestamp(0, 0, 0, 0, 0, 0, 0), Timestamp.class);
         Function func = CommandBuilder.getLanuageFactory().createFunction("timestampadd", Arrays.asList( arg1, arg2, arg3), Timestamp.class); //$NON-NLS-1$

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml	2010-06-04 21:51:29 UTC (rev 2181)
@@ -654,7 +654,7 @@
   <sect1 id="query_planner">
     <title>Query Planner</title>
     <para>For each sub-command in the user command an appropriate kind
-      of sub-planner is used (relational, XML, XQuery, procedure,
+      of sub-planner is used (relational, XML, procedure,
       etc).</para>
     <para>Each planner has three primary phases:</para>
     <orderedlist>
@@ -1045,10 +1045,5 @@
             of repeated fragments (each a new query) until some termination
             criteria or limit is met.</para>
     </sect2>
-    <sect2>
-      <title>XQuery Planner</title>
-      <para>XQuery planning uses the embedded Saxon XQuery
-        engine to compile the query.  There is no direct optimization by Teiid.</para>
-    </sect2>
   </sect1>
 </chapter>
\ No newline at end of file

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1932,34 +1932,20 @@
         <tbody>
           <row>
             <entry>
-              <para><code>XPATHVALUE(doc, xpath [, namepaces])</code></para>
+              <para><code>XPATHVALUE(doc, xpath)</code></para>
             </entry>
             <entry>
               <para>Applies the XPATH query to the document and returns a
                 string value for the first matching result. An attempt is made to provide a
                 meaningful result for non-text nodes.</para>
-              <para>The optional namespaces string is used to provide default and prefix to uri mappings for the given xpath. The format is the same as namespace declarations in an xml element: xmlns:foo="uri"</para>
             </entry>
             <entry>
-              <para>Doc in {string, xml} and xpath, namespaces in {string}. Return value is a string.
+              <para>Doc in {string, xml} and xpath. Return value is a string.
               </para>
             </entry>
           </row>
           <row>
             <entry>
-              <para><code>XPATHQUERY(doc, xpath [, namepaces])</code></para>
-            </entry>
-            <entry>
-              <para>Takes a document and an XPATH query and returns a SQL/XML of the result.</para>
-              <para>The optional namespaces string is used to provide default and prefix to uri mappings for the given xpath. The format is the same as namespace declarations in an xml element: xmlns:foo="uri"</para>
-            </entry>
-            <entry>
-              <para>Doc in {string, xml} and xpath, namespaces in {string}. Return value is a string.
-              </para>
-            </entry>
-          </row>
-          <row>
-            <entry>
               <para><code>XSLTRANSFORM(doc, xsl)</code></para>
             </entry>
             <entry>
@@ -2043,6 +2029,21 @@
               </para>
             </entry>
           </row>
+          <row>
+            <entry>
+              <para><code>XMLSERIALIZE((DOCUMENT|CONTENT) exp [AS datatype])</code></para>
+            </entry>
+            <entry>
+              <para>Returns a character type representation of the exp. 
+              Only a character type (string, varchar, clob) may be specified as the datatype.  
+              If DOCUMENT is specified and the xml is not a valid document or fragment, then an exception is raised. 
+              </para>
+            </entry>
+            <entry>
+              <para>Exp is xml. Return value mathces datatype.
+              </para>
+            </entry>
+          </row>
         </tbody>
       </tgroup>
     </informaltable>

Modified: trunk/documentation/reference/src/main/docbook/en-US/content/transaction_support.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/transaction_support.xml	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/transaction_support.xml	2010-06-04 21:51:29 UTC (rev 2181)
@@ -93,7 +93,7 @@
 					</para>
 				</listitem>
 				<listitem>
-					<para>If the user command is a SELECT (including XML) or an XQuery and the transaction isolation is not REPEATABLE_READ nor SERIALIABLE.
+					<para>If the user command is a SELECT (including XML) and the transaction isolation is not REPEATABLE_READ nor SERIALIABLE.
 					</para>
 				</listitem>
 				<listitem>

Modified: trunk/engine/pom.xml
===================================================================
--- trunk/engine/pom.xml	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/pom.xml	2010-06-04 21:51:29 UTC (rev 2181)
@@ -83,13 +83,14 @@
 		</dependency>
 
 		<dependency>
-			<groupId>net.sf.saxon</groupId>
+			<groupId>net.sourceforge.saxon</groupId>
 			<artifactId>saxon</artifactId>
 		</dependency>
 
 		<dependency>
-			<groupId>net.sf.saxon</groupId>
-			<artifactId>saxon-dom</artifactId>
+			<groupId>net.sourceforge.saxon</groupId>
+			<classifier>dom</classifier>
+			<artifactId>saxon</artifactId>
 		</dependency>
 
         <dependency>

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -29,6 +29,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import nux.xom.xquery.XQuery;
+
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.api.exception.query.QueryResolverException;
@@ -43,7 +45,7 @@
 import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
 import org.teiid.dqp.internal.process.multisource.MultiSourceMetadataWrapper;
 import org.teiid.dqp.message.RequestID;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.metadata.SupportConstants;
@@ -54,7 +56,6 @@
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Query;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -161,10 +162,6 @@
             case Command.TYPE_CREATE:    
             case Command.TYPE_DROP:
                 break;    
-            case Command.TYPE_XQUERY:
-                columnMetadata = new Map[1];
-                columnMetadata[0] = createXQueryColumnMetadata((XQuery)originalCommand);
-                break;
             default:
                 columnMetadata = createProjectedSymbolMetadata(originalCommand);                   
         }
@@ -322,7 +319,7 @@
         
         Expression expression = symbol.getExpression();
         String function = symbol.getAggregateFunction();
-        if(function.equals(SQLReservedWords.MIN) || function.equals(SQLReservedWords.MAX)){
+        if(function.equals(NonReserved.MIN) || function.equals(NonReserved.MAX)){
             if(expression instanceof ElementSymbol) {
                 return createColumnMetadata(shortColumnName, (ElementSymbol)expression);
             }

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -71,7 +71,6 @@
 import org.teiid.query.processor.QueryProcessor;
 import org.teiid.query.processor.TempTableDataManager;
 import org.teiid.query.processor.xml.XMLPlan;
-import org.teiid.query.processor.xquery.XQueryPlan;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.lang.BatchedUpdateCommand;
@@ -81,7 +80,6 @@
 import org.teiid.query.sql.lang.QueryCommand;
 import org.teiid.query.sql.lang.SetQuery;
 import org.teiid.query.sql.lang.StoredProcedure;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.visitor.ReferenceCollectorVisitor;
@@ -206,9 +204,6 @@
         } else if (userCommand instanceof SetQuery) {
         	returnsResultSet = true;
         	returnsUpdateCount = false;
-        } else if (userCommand instanceof XQuery) {
-        	returnsResultSet = true;
-        	returnsUpdateCount = false;
         } else if (userCommand instanceof StoredProcedure) {
         	returnsUpdateCount = false;
         	StoredProcedure proc = (StoredProcedure)userCommand;
@@ -462,23 +457,14 @@
     }
 
 	private void postProcessXML() {
-        if (requestMsg.getXMLFormat() != null) {
-	        if(processPlan instanceof XQueryPlan) {
-	            ((XQueryPlan)processPlan).setXMLFormat(requestMsg.getXMLFormat());
-	        } else if (processPlan instanceof XMLPlan) {
-	        	((XMLPlan)processPlan).setXMLFormat(requestMsg.getXMLFormat());
-	        }
+        if (requestMsg.getXMLFormat() != null && processPlan instanceof XMLPlan) {
+        	((XMLPlan)processPlan).setXMLFormat(requestMsg.getXMLFormat());
         }
         this.context.setValidateXML(requestMsg.getValidationMode());
 	}
     
 	public QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext) throws TeiidProcessingException, TeiidComponentException {
-		boolean isRootXQuery = recursionGroup == null && commandContext.getCallStackDepth() == 0 && userCommand instanceof XQuery;
-		
 		ParseInfo parseInfo = new ParseInfo();
-		if (isRootXQuery) {
-			parseInfo.ansiQuotedIdentifiers = requestMsg.isAnsiQuotedIdentifiers();
-		}
 		Command newCommand = QueryParser.getQueryParser().parseCommand(query, parseInfo);
         QueryResolver.resolveCommand(newCommand, metadata);            
         
@@ -488,10 +474,6 @@
         
         validateQuery(newCommand);
         
-        if (isRootXQuery) {
-        	validateAccess(newCommand);
-        }
-        
         CommandContext copy = (CommandContext) commandContext.clone();
         if (recursionGroup != null) {
         	copy.pushCall(recursionGroup);

Modified: trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -40,7 +40,12 @@
 import org.teiid.core.ComponentNotFoundException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.Sequencable;
+import org.teiid.core.types.TransformationException;
+import org.teiid.core.types.XMLType;
+import org.teiid.core.types.XMLType.Type;
+import org.teiid.core.types.basic.StringToSQLXMLTransform;
 import org.teiid.core.util.Assertion;
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.query.QueryPlugin;
@@ -66,10 +71,11 @@
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.lang.SubquerySetCriteria;
 import org.teiid.query.sql.symbol.AggregateSymbol;
-import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ContextReference;
+import org.teiid.query.sql.symbol.DerivedColumn;
+import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
@@ -80,6 +86,7 @@
 import org.teiid.query.sql.symbol.XMLElement;
 import org.teiid.query.sql.symbol.XMLForest;
 import org.teiid.query.sql.symbol.XMLNamespaces;
+import org.teiid.query.sql.symbol.XMLSerialize;
 import org.teiid.query.sql.symbol.XMLNamespaces.NamespaceItem;
 import org.teiid.query.sql.util.ValueIterator;
 import org.teiid.query.sql.util.ValueIteratorSource;
@@ -584,7 +591,7 @@
 		   }
 	   } else if (expression instanceof XMLForest){
 		   XMLForest function = (XMLForest)expression;
-		   List<SingleElementSymbol> args = function.getArgs();
+		   List<DerivedColumn> args = function.getArgs();
 		   NameValuePair<Object>[] nameValuePairs = getNameValuePairs(tuple, args); 
 		   
 		   try {
@@ -592,20 +599,43 @@
 		   } catch (TeiidProcessingException e) {
 			   throw new FunctionExecutionException(e, e.getMessage());
 		   }
+	   } else if (expression instanceof XMLSerialize){
+		   XMLSerialize xs = (XMLSerialize)expression;
+		   XMLType value = (XMLType) internalEvaluate(xs.getExpression(), tuple);
+		   if (value == null) {
+			   return null;
+		   }
+		   try {
+			   if (!xs.isDocument()) { 
+				   return DataTypeManager.transformValue(value, xs.getType());
+			   }
+			   if (value.getType() == Type.UNKNOWN) {
+				   Type type = StringToSQLXMLTransform.isXml(value.getCharacterStream());
+				   value.setType(type);
+			   }
+			   if (value.getType() == Type.DOCUMENT || value.getType() == Type.FRAGMENT) {
+				   return DataTypeManager.transformValue(value, xs.getType());			   
+			   }
+		   } catch (SQLException e) {
+			   throw new FunctionExecutionException(e, e.getMessage());
+		   } catch (TransformationException e) {
+			   throw new FunctionExecutionException(e, e.getMessage());
+		   }
+		   throw new FunctionExecutionException(QueryPlugin.Util.getString("Evaluator.xmlserialize")); //$NON-NLS-1$
 	   } else {
 	       throw new TeiidComponentException(ErrorMessageKeys.PROCESSOR_0016, QueryPlugin.Util.getString(ErrorMessageKeys.PROCESSOR_0016, expression.getClass().getName()));
 	   }
 	}
 
-	private NameValuePair<Object>[] getNameValuePairs(List tuple, List<SingleElementSymbol> args)
+	private NameValuePair<Object>[] getNameValuePairs(List tuple, List<DerivedColumn> args)
 			throws ExpressionEvaluationException, BlockedException, TeiidComponentException {
 		NameValuePair<Object>[] nameValuePairs = new NameValuePair[args.size()];
 		for (int i = 0; i < args.size(); i++) {
-			SingleElementSymbol symbol = args.get(i);
-			String name = symbol.getShortName();
-			Expression ex = symbol;
-			if (symbol instanceof AliasSymbol) {
-				ex = ((AliasSymbol) symbol).getSymbol();
+			DerivedColumn symbol = args.get(i);
+			String name = symbol.getAlias();
+			Expression ex = symbol.getExpression();
+			if (name == null && ex instanceof ElementSymbol) {
+				name = ((ElementSymbol)ex).getShortName();
 			}
 			nameValuePairs[i] = new NameValuePair<Object>(name, internalEvaluate(ex, tuple));
 		}

Modified: trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -41,7 +41,7 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.TransformationException;
 import org.teiid.core.util.TimestampWithTimezone;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.util.CommandContext;
 import org.teiid.query.util.ErrorMessageKeys;
@@ -450,7 +450,7 @@
 		cal.setTime(timestamp);
 
 		// case of interval = 1, fractional seconds (nanos), don't go to branches of addField()
-		if (intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+		if (intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_FRAC_SECOND)) {
 			int countValue = count.intValue();
 			nanos += countValue;
 
@@ -488,23 +488,23 @@
 	private static void addField(String interval, Integer count, Calendar cal) {
 		int countValue = count.intValue();
 
-        if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+        if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_FRAC_SECOND)) {
             //nano seconds - should never get into this branch
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_SECOND)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_SECOND)) {
             cal.add(Calendar.SECOND, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_MINUTE)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_MINUTE)) {
             cal.add(Calendar.MINUTE, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_HOUR)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_HOUR)) {
             cal.add(Calendar.HOUR_OF_DAY, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_DAY)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_DAY)) {
             cal.add(Calendar.DAY_OF_YEAR, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_WEEK)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_WEEK)) {
             cal.add(Calendar.WEEK_OF_YEAR, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_MONTH)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_MONTH)) {
             cal.add(Calendar.MONTH, countValue);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_QUARTER)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_QUARTER)) {
             cal.add(Calendar.MONTH, countValue*3);
-        } else if(interval.equalsIgnoreCase(SQLReservedWords.SQL_TSI_YEAR)) {
+        } else if(interval.equalsIgnoreCase(NonReserved.SQL_TSI_YEAR)) {
             cal.add(Calendar.YEAR, countValue);
         }
 	}
@@ -526,25 +526,25 @@
         long tsDiff = ts2 - ts1;
 
         long count = 0;
-        if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+        if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_FRAC_SECOND)) {
             count = tsDiff;
         } else { 
         	tsDiff = tsDiff / 1000000; //convert to milliseconds
-            if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_SECOND)) {
+            if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_SECOND)) {
                 count = tsDiff / 1000;
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_MINUTE)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_MINUTE)) {
                 count = (tsDiff / 1000) / 60;
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_HOUR)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_HOUR)) {
                 count = (tsDiff / 1000) / (60*60);
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_DAY)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_DAY)) {
                 count = (tsDiff / 1000) / (60*60*24);
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_WEEK)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_WEEK)) {
                 count = (tsDiff / 1000) / (60*60*24*7);
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_MONTH)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_MONTH)) {
                 count = (tsDiff / 1000) / (60*60*24*30);
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_QUARTER)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_QUARTER)) {
                 count = (tsDiff / 1000) / (60*60*24*91);
-            } else if(intervalType.equalsIgnoreCase(SQLReservedWords.SQL_TSI_YEAR)) {
+            } else if(intervalType.equalsIgnoreCase(NonReserved.SQL_TSI_YEAR)) {
                 count = (tsDiff / 1000) / (60*60*24*365);
             }    
         }

Modified: trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -166,7 +166,6 @@
 		addParseNumberFunctions();
         
         // xml functions
-        addXpathQueryFunction();
         addXpathValueFunction();
         addXslTransformFunction();
         addXmlConcat();
@@ -893,52 +892,8 @@
                                              new FunctionParameter("document", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
                                              new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2"))}, //$NON-NLS-1$ //$NON-NLS-2$ 
                                          new FunctionParameter("result", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpathvalue_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-        
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHVALUE, QueryPlugin.Util.getString("SystemSource.xpathvalue_description"), XML, XML_FUNCTION_CLASS, "xpathValue", //$NON-NLS-1$ //$NON-NLS-2$ 
-                new FunctionParameter[] { 
-                    new FunctionParameter("document", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                    new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2")), //$NON-NLS-1$ //$NON-NLS-2$
-                    new FunctionParameter("namespace", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param3"))}, //$NON-NLS-1$ //$NON-NLS-2$
-                new FunctionParameter("result", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpathvalue_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHVALUE, QueryPlugin.Util.getString("SystemSource.xpathvalue_description"), XML, XML_FUNCTION_CLASS, "xpathValue", //$NON-NLS-1$ //$NON-NLS-2$ 
-                             new FunctionParameter[] { 
-                                 new FunctionParameter("document", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                                 new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2")), //$NON-NLS-1$ //$NON-NLS-2$
-                                 new FunctionParameter("namespace", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param3"))}, //$NON-NLS-1$ //$NON-NLS-2$
-                             new FunctionParameter("result", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpathvalue_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
     }
     
-    private void addXpathQueryFunction() {
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHQUERY, QueryPlugin.Util.getString("SystemSource.xpath_description"), XML, XML_FUNCTION_CLASS, "xpathQuery", //$NON-NLS-1$ //$NON-NLS-2$ 
-                            new FunctionParameter[] { 
-                                new FunctionParameter("document", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                                new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2"))}, //$NON-NLS-1$ //$NON-NLS-2$ 
-                            new FunctionParameter("result", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHQUERY, QueryPlugin.Util.getString("SystemSource.xpath_description"), XML, XML_FUNCTION_CLASS, "xpathQuery", //$NON-NLS-1$ //$NON-NLS-2$ 
-                                         new FunctionParameter[] { 
-                                             new FunctionParameter("document", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                                             new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2"))}, //$NON-NLS-1$ //$NON-NLS-2$ 
-                                         new FunctionParameter("result", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHQUERY, QueryPlugin.Util.getString("SystemSource.xpath_description"), XML, XML_FUNCTION_CLASS, "xpathQuery", //$NON-NLS-1$ //$NON-NLS-2$ 
-                new FunctionParameter[] { 
-                    new FunctionParameter("document", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                    new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2")), //$NON-NLS-1$ //$NON-NLS-2$ 
-                    new FunctionParameter("namespaces", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param3"))}, //$NON-NLS-1$ //$NON-NLS-2$
-                new FunctionParameter("result", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
-        functions.add(new FunctionMethod(SourceSystemFunctions.XPATHQUERY, QueryPlugin.Util.getString("SystemSource.xpath_description"), XML, XML_FUNCTION_CLASS, "xpathQuery", //$NON-NLS-1$ //$NON-NLS-2$ 
-                             new FunctionParameter[] { 
-                                 new FunctionParameter("document", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
-                                 new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2")), //$NON-NLS-1$ //$NON-NLS-2$ 
-                                 new FunctionParameter("namespaces", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param3"))}, //$NON-NLS-1$ //$NON-NLS-2$
-                             new FunctionParameter("result", DataTypeManager.DefaultDataTypes.XML, QueryPlugin.Util.getString("SystemSource.xpath_result")) ) );       //$NON-NLS-1$ //$NON-NLS-2$
-
-    }
-    
     private void addXslTransformFunction() {
         functions.add(new FunctionMethod(SourceSystemFunctions.XSLTRANSFORM, QueryPlugin.Util.getString("SystemSource.xsltransform_description"), XML, XML_FUNCTION_CLASS, "xslTransform", //$NON-NLS-1$ //$NON-NLS-2$  
                             new FunctionParameter[] { 

Modified: trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -37,7 +37,6 @@
 import java.util.List;
 
 import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
 import javax.xml.stream.EventFilter;
 import javax.xml.stream.FactoryConfigurationError;
@@ -47,21 +46,20 @@
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.events.XMLEvent;
-import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
 
+import net.sf.saxon.om.Item;
+import net.sf.saxon.sxpath.XPathEvaluator;
+import net.sf.saxon.sxpath.XPathExpression;
+import net.sf.saxon.trans.XPathException;
+
 import org.teiid.api.exception.query.FunctionExecutionException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
@@ -73,13 +71,9 @@
 import org.teiid.core.types.XMLTranslator;
 import org.teiid.core.types.XMLType;
 import org.teiid.core.types.XMLType.Type;
-import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.processor.xml.XMLUtil;
 import org.teiid.query.util.CommandContext;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
 
 
 /** 
@@ -421,130 +415,52 @@
 	    
 	}
 
-    public static String xpathValue(XMLType document, String xpathStr, String namespaces) throws IOException, XPathExpressionException, SQLException, FunctionExecutionException {
-    	Reader stream = document.getCharacterStream();
-        return xpathValue(stream, xpathStr, namespaces);
+    public static String xpathValue(String document, String xpathStr) throws IOException, XPathException {
+    	return xpathValue(new StringReader(document), xpathStr);
     }
-	
-    public static String xpathValue(String document, String xpathStr, String namespaces) throws IOException, XPathExpressionException, FunctionExecutionException {
-    	return xpathValue(new StringReader(document), xpathStr, namespaces);	
-    }
     
-    public static String xpathValue(String document, String xpathStr) throws IOException, XPathExpressionException, FunctionExecutionException {
-    	return xpathValue(document, xpathStr, null);
+    public static String xpathValue(XMLType document, String xpathStr) throws IOException, SQLException, XPathException {
+    	return xpathValue(document.getCharacterStream(), xpathStr);
     }
-    
-    public static String xpathValue(XMLType document, String xpathStr) throws IOException, SQLException, XPathExpressionException, FunctionExecutionException {
-    	return xpathValue(document, xpathStr, null);
-    }
 
-    public static XMLType xpathQuery(CommandContext context, String document, String xpathStr) throws IOException, TeiidComponentException, TeiidProcessingException, XPathExpressionException {
-    	return xpathQuery(context, document, xpathStr, null);
-    }
-    
-    public static XMLType xpathQuery(CommandContext context, XMLType document, String xpathStr) throws IOException, SQLException, XPathExpressionException, TeiidComponentException, TeiidProcessingException {
-    	return xpathQuery(context, document, xpathStr, null);
-    }
-    
-    public static XMLType xpathQuery(CommandContext context, String document, String xpathStr, String namespaces) throws IOException, TeiidComponentException, TeiidProcessingException, XPathExpressionException {
-    	Reader stream = new StringReader(document);
-    	return xpathQuery(context, xpathStr, stream, namespaces);
-    }
-    
-    public static XMLType xpathQuery(CommandContext context, XMLType document, String xpathStr, String namespaces) throws IOException, SQLException, XPathExpressionException, TeiidComponentException, TeiidProcessingException {
-    	Reader stream = ((SQLXML)document).getCharacterStream();
-    	return xpathQuery(context, xpathStr, stream, namespaces);
-    }
-
-	private static XMLType xpathQuery(CommandContext context, String xpathStr,
-			Reader stream, String namespaces) throws XPathExpressionException,
-			TeiidComponentException, TeiidProcessingException,
-			IOException {
-		try {
-            XPathFactory xpathFactory = XPathFactory.newInstance();
-        	XPath xp = xpathFactory.newXPath();
-        	NamespaceContext nc = getNamespaces(namespaces);
-        	if (nc != null) {
-        		xp.setNamespaceContext(nc);
-        	}
-        	final NodeList nodes = (NodeList)xp.evaluate(xpathStr, new InputSource(stream), XPathConstants.NODESET);
-        	if (nodes.getLength() == 0) {
-        		return null;
-        	}
-        	Type type = nodes.getLength() > 1 ? Type.SIBLINGS : Type.FRAGMENT;
-        	for (int i = 0; i < nodes.getLength(); i++) {
-        		Node node = nodes.item(i);
-        		if (node.getNodeType() == Node.TEXT_NODE) {
-        			type = Type.TEXT;
-        		}
-        	}
-        	SQLXML sqlXml = XMLUtil.saveToBufferManager(context.getBufferManager(), new XMLTranslator() {
-				
-				@Override
-				public void translate(Writer writer) throws TransformerException {
-	                TransformerFactory factory = TransformerFactory.newInstance();
-	                Transformer transformer = factory.newTransformer();
-	                transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); //$NON-NLS-1$
-	                for (int i = 0; i < nodes.getLength(); i++) {
-	            		Node node = nodes.item(i);
-						transformer.transform(new DOMSource(node), new StreamResult(writer));
-	            	}
-				}
-			}, Streamable.STREAMING_BATCH_SIZE_IN_BYTES);
-        	XMLType result = new XMLType(sqlXml);
-        	result.setType(type);
-        	return result;
-        } finally {
-    		stream.close();
-        }
-	}  
-	
-    public static String xpathValue(Reader documentReader, String xpath, String namespaces) throws IOException, XPathExpressionException, FunctionExecutionException {        
+    public static String xpathValue(Reader documentReader, String xpath) throws IOException, XPathException {        
         try {
-            XPathFactory xpathFactory = XPathFactory.newInstance();
-        	XPath xp = xpathFactory.newXPath();
-        	NamespaceContext nc = getNamespaces(namespaces);
-        	if (nc != null) {
-        		xp.setNamespaceContext(nc);
-        	}
-        	Node node = (Node)xp.evaluate(xpath, new InputSource(documentReader), XPathConstants.NODE);
-        	if (node == null) {
-        		return null;
-        	}
-        	return node.getTextContent();
+        	Source s = new StreamSource(documentReader);
+            XPathEvaluator eval = new XPathEvaluator();
+            // Wrap the string() function to force a string return             
+            XPathExpression expr = eval.createExpression(xpath);
+            Object o = expr.evaluateSingle(s);
+            
+            if(o == null) {
+                return null;
+            }
+            
+            // Return string value of node type
+            if(o instanceof Item) {
+                return ((Item)o).getStringValue();
+            }  
+            
+            // Return string representation of non-node value
+            return o.toString();
         } finally {
             // Always close the reader
             documentReader.close();
         }
     }
     
-    public static NamespaceContext getNamespaces(String namespaces) throws FunctionExecutionException {
-    	if (namespaces == null) {
-    		return null;
-    	}
-		XMLInputFactory inputFactory = XMLInputFactory.newInstance();
-		try {
-			XMLStreamReader eventReader = inputFactory.createXMLStreamReader(new StringReader("<x " + namespaces + " />")); //$NON-NLS-1$ //$NON-NLS-2$
-			eventReader.next();
-        	return eventReader.getNamespaceContext();
-		} catch (XMLStreamException e) {
-			throw new FunctionExecutionException(e, QueryPlugin.Util.getString("XMLSystemFunctions.invalid_namespaces", namespaces)); //$NON-NLS-1$
-		}
-    }
-
     /**
      * Validate whether the XPath is a valid XPath.  If not valid, an XPathExpressionException will be thrown.
      * @param xpath An xpath expression, for example: a/b/c/getText()
      * @throws XPathExpressionException 
+     * @throws XPathException 
      */
-    public static void validateXpath(String xpath) throws XPathExpressionException {
+    public static void validateXpath(String xpath) throws XPathException {
         if(xpath == null) { 
             return;
         }
         
-        XPathFactory factory = XPathFactory.newInstance();
-        XPath xp = factory.newXPath();
-        xp.compile(xpath);
+        XPathEvaluator eval = new XPathEvaluator();
+        eval.createExpression(xpath);
     }
-	
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -40,7 +40,6 @@
 import org.teiid.query.optimizer.proc.ProcedurePlanner;
 import org.teiid.query.optimizer.relational.RelationalPlanner;
 import org.teiid.query.optimizer.xml.XMLPlanner;
-import org.teiid.query.optimizer.xquery.XQueryPlanner;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.sql.lang.Command;
@@ -61,7 +60,6 @@
 	
 	private static final CommandPlanner XML_PLANNER = new XMLPlanner();
 	private static final CommandPlanner PROCEDURE_PLANNER = new ProcedurePlanner();
-    private static final CommandPlanner XQUERY_PLANNER = new XQueryPlanner();
     private static final CommandPlanner BATCHED_UPDATE_PLANNER = new BatchedUpdatePlanner();
 
 	// Can't construct	
@@ -98,8 +96,6 @@
 
 		if (command.getType() == Command.TYPE_UPDATE_PROCEDURE){
 			result = PROCEDURE_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
-        } else if (command.getType() == Command.TYPE_XQUERY){
-            result = XQUERY_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
         } else if (command.getType() == Command.TYPE_BATCHED_UPDATE){
             result = BATCHED_UPDATE_PLANNER.optimize(command, idGenerator, metadata, capFinder, analysisRecord, context);
         } else {

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -81,6 +81,7 @@
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.lang.TextTable;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.SetQuery.Operation;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -367,6 +368,9 @@
                     }
 				}
 				Object source = node.getProperty(NodeConstants.Info.TABLE_FUNCTION);
+				if (source instanceof XMLTable) {
+					return null;
+				}
 				if (!(source instanceof TextTable)) {
 					return null;
 				}

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -87,6 +87,7 @@
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.lang.SubqueryFromClause;
+import org.teiid.query.sql.lang.TableFunctionReference;
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
@@ -680,8 +681,8 @@
             addNestedCommand(node, group, nestedCommand, nestedCommand, true);
             hints.hasVirtualGroups = true;
             parent.addLastChild(node);
-        } else if (clause instanceof TextTable) {
-        	TextTable tt = (TextTable)clause;
+        } else if (clause instanceof TableFunctionReference) {
+        	TableFunctionReference tt = (TableFunctionReference)clause;
             GroupSymbol group = tt.getGroupSymbol();
             node = NodeFactory.getNewNode(NodeConstants.Types.SOURCE);
             node.setProperty(NodeConstants.Info.TABLE_FUNCTION, tt);

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -30,7 +30,7 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.function.FunctionLibrary;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
@@ -145,7 +145,7 @@
 
         // Check particular function
         String func = aggregate.getAggregateFunction();
-        if(func.equals(SQLReservedWords.COUNT)) {
+        if(func.equals(NonReserved.COUNT)) {
             if(aggregate.getExpression() == null) {
                 if(! caps.supportsCapability(Capability.QUERY_AGGREGATES_COUNT_STAR)) {
                     return false;
@@ -155,19 +155,19 @@
                     return false;
                 }                
             }
-        } else if(func.equals(SQLReservedWords.SUM)) {
+        } else if(func.equals(NonReserved.SUM)) {
             if(! caps.supportsCapability(Capability.QUERY_AGGREGATES_SUM)) {
                 return false;
             }
-        } else if(func.equals(SQLReservedWords.AVG)) {
+        } else if(func.equals(NonReserved.AVG)) {
             if(! caps.supportsCapability(Capability.QUERY_AGGREGATES_AVG)) {
                 return false;
             }
-        } else if(func.equals(SQLReservedWords.MIN)) {
+        } else if(func.equals(NonReserved.MIN)) {
             if(! caps.supportsCapability(Capability.QUERY_AGGREGATES_MIN)) {
                 return false;
             }
-        } else if(func.equals(SQLReservedWords.MAX)) {
+        } else if(func.equals(NonReserved.MAX)) {
             if(! caps.supportsCapability(Capability.QUERY_AGGREGATES_MAX)) {
                 return false;
             }

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -49,7 +49,6 @@
 import org.teiid.query.optimizer.relational.plantree.PlanNode;
 import org.teiid.query.processor.relational.JoinNode.JoinStrategyType;
 import org.teiid.query.sql.lang.AbstractSetCriteria;
-import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.CompareCriteria;
 import org.teiid.query.sql.lang.CompoundCriteria;
 import org.teiid.query.sql.lang.Criteria;
@@ -72,8 +71,6 @@
 import org.teiid.query.sql.visitor.GroupsUsedByElementsVisitor;
 import org.teiid.query.util.CommandContext;
 
-
-
 /** 
  * @since 4.3
  */

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -40,7 +40,7 @@
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.function.FunctionLibrary;
 import org.teiid.query.metadata.QueryMetadataInterface;
@@ -351,7 +351,7 @@
         	if (pushdown) {
         		projectedViewSymbols.add(agg);
         	} else {
-        		if (agg.getAggregateFunction().equals(SQLReservedWords.COUNT)) {
+        		if (agg.getAggregateFunction().equals(NonReserved.COUNT)) {
         			SearchedCaseExpression count = new SearchedCaseExpression(Arrays.asList(new IsNullCriteria(agg.getExpression())), Arrays.asList(new Constant(Integer.valueOf(0))));
         			count.setElseExpression(new Constant(Integer.valueOf(1)));
         			count.setType(DataTypeManager.DefaultDataClasses.INTEGER);
@@ -501,7 +501,7 @@
 		} else {
 		    // if the source has no rows we need to insert a select node with criteria count(*)>0
 		    PlanNode selectNode = NodeFactory.getNewNode(NodeConstants.Types.SELECT);
-		    AggregateSymbol count = new AggregateSymbol("stagedAgg", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+		    AggregateSymbol count = new AggregateSymbol("stagedAgg", NonReserved.COUNT, false, null); //$NON-NLS-1$
 		    aggregates.add(count); //consider the count aggregate for the push down call below
 		    selectNode.setProperty(NodeConstants.Info.SELECT_CRITERIA, new CompareCriteria(count, CompareCriteria.GT,
 		                                                                                   new Constant(new Integer(0))));
@@ -669,9 +669,9 @@
             Expression newExpression = null;
 
             String aggFunction = partitionAgg.getAggregateFunction();
-            if (aggFunction.equals(SQLReservedWords.COUNT)) {
+            if (aggFunction.equals(NonReserved.COUNT)) {
                 //COUNT(x) -> CONVERT(SUM(COUNT(x)), INTEGER)
-                AggregateSymbol newAgg = new AggregateSymbol("stagedAgg", SQLReservedWords.SUM, false, partitionAgg); //$NON-NLS-1$
+                AggregateSymbol newAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, partitionAgg); //$NON-NLS-1$
 
                 // Build conversion function to convert SUM (which returns LONG) back to INTEGER
                 Constant convertTargetType = new Constant(DataTypeManager.getDataTypeName(partitionAgg.getType()),
@@ -681,13 +681,13 @@
 
                 newExpression = convertFunc;  
                 nestedAggregates.add(partitionAgg);
-            } else if (aggFunction.equals(SQLReservedWords.AVG)) {
+            } else if (aggFunction.equals(NonReserved.AVG)) {
                 //AVG(x) -> SUM(SUM(x)) / SUM(COUNT(x))
-                AggregateSymbol countAgg = new AggregateSymbol("stagedAgg", SQLReservedWords.COUNT, false, partitionAgg.getExpression()); //$NON-NLS-1$
-                AggregateSymbol sumAgg = new AggregateSymbol("stagedAgg", SQLReservedWords.SUM, false, partitionAgg.getExpression()); //$NON-NLS-1$
+                AggregateSymbol countAgg = new AggregateSymbol("stagedAgg", NonReserved.COUNT, false, partitionAgg.getExpression()); //$NON-NLS-1$
+                AggregateSymbol sumAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, partitionAgg.getExpression()); //$NON-NLS-1$
                 
-                AggregateSymbol sumSumAgg = new AggregateSymbol("stagedAgg", SQLReservedWords.SUM, false, sumAgg); //$NON-NLS-1$
-                AggregateSymbol sumCountAgg = new AggregateSymbol("stagedAgg", SQLReservedWords.SUM, false, countAgg); //$NON-NLS-1$
+                AggregateSymbol sumSumAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, sumAgg); //$NON-NLS-1$
+                AggregateSymbol sumCountAgg = new AggregateSymbol("stagedAgg", NonReserved.SUM, false, countAgg); //$NON-NLS-1$
 
                 Function divideFunc = new Function("/", new Expression[] {sumSumAgg, sumCountAgg}); //$NON-NLS-1$
                 ResolverVisitor.resolveLanguageObject(divideFunc, metadata);

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -42,7 +42,6 @@
 import org.teiid.query.optimizer.relational.plantree.NodeEditor;
 import org.teiid.query.optimizer.relational.plantree.NodeFactory;
 import org.teiid.query.optimizer.relational.plantree.PlanNode;
-import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.CompareCriteria;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.JoinType;

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -33,7 +33,7 @@
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.util.Assertion;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
@@ -277,8 +277,8 @@
 
 	static boolean areAggregatesCardinalityDependent(Set<AggregateSymbol> aggs) {
 		for (AggregateSymbol aggregateSymbol : aggs) {
-			if (aggregateSymbol.getAggregateFunction().equalsIgnoreCase(SQLReservedWords.COUNT) || 
-					aggregateSymbol.getAggregateFunction().equalsIgnoreCase(SQLReservedWords.AVG)) {
+			if (aggregateSymbol.getAggregateFunction().equalsIgnoreCase(NonReserved.COUNT) || 
+					aggregateSymbol.getAggregateFunction().equalsIgnoreCase(NonReserved.AVG)) {
 				return true;
 			}
 		}

Modified: trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -25,16 +25,10 @@
 import java.io.StringReader;
 
 import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.language.SQLReservedWords;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Criteria;
-import org.teiid.query.sql.lang.Option;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.symbol.Expression;
-import org.teiid.query.xquery.XQueryExpression;
-import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
 
 /**
  * <p>Converts a SQL-string to an object version of a query.  This
@@ -60,7 +54,6 @@
     
     private static final String XQUERY_DECLARE = "declare"; //$NON-NLS-1$
     private static final String XML_OPEN_BRACKET = "<"; //$NON-NLS-1$
-    private static final String XML_CLOSE_BRACKET = ">"; //$NON-NLS-1$
 
 	private SQLParser parser;
     
@@ -113,62 +106,19 @@
             throw new QueryParserException(QueryPlugin.Util.getString("QueryParser.emptysql")); //$NON-NLS-1$
         }
         
-        QueryParserException qpe = null;
         try {
 	        Command result = parseCommandWithParser(sql, parseInfo);
 	        result.setCache(parseInfo.cache);
 			return result;
         } catch (QueryParserException e) {
-        	qpe = e;
-        }
-        
-        try {
-            // Check for OPTION
-            Option option = null;
-            int closeBracket = sql.lastIndexOf(XML_CLOSE_BRACKET);
-            int optionIndex = sql.toUpperCase().lastIndexOf(SQLReservedWords.OPTION);
-            if (optionIndex != -1 && optionIndex > closeBracket){
-                String optionSQL = sql.substring(optionIndex);
-                option = getOption(optionSQL, parseInfo);
-                sql = sql.substring(0, optionIndex-1);
-            }
-            
-            XQueryExpression expr = new SaxonXQueryExpression();
-            expr.compileXQuery(sql);
-            XQuery xquery = new XQuery(sql, expr);
-            if (option != null){
-                xquery.setOption(option);
-            }
-            return xquery;        
-        } catch (TeiidProcessingException e) {
             if(sql.startsWith(XML_OPEN_BRACKET) || sql.startsWith(XQUERY_DECLARE)) {
-            	throw new QueryParserException(e, QueryPlugin.Util.getString("QueryParser.xqueryCompilation")); //$NON-NLS-1$
+            	throw new QueryParserException(e, QueryPlugin.Util.getString("QueryParser.xqueryCompilation", sql)); //$NON-NLS-1$
             }
+        	throw e;
         }
-
-        throw qpe;
 	}
 
     /**
-     * Parses Option object given option SQL fragment.
-     * @param optionSQL option SQL
-     * @return Option object
-     */
-    private Option getOption(String optionSQL, ParseInfo parseInfo) throws QueryParserException {
-    	Option result = null;
-        try{
-            result = getSqlParser(optionSQL).option(parseInfo);
-            
-        } catch(ParseException pe) {
-            throw convertParserException(pe);
-
-        } catch(TokenMgrError tme) {
-            handleTokenMgrError(tme);
-        }
-        return result;
-    }
-
-    /**
      * Parse the String sql into a Command using the MetaMatrix parser.
      * @param sql to parse
      * @return parsed Command

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -29,6 +29,7 @@
 import org.teiid.core.util.Assertion;
 import org.teiid.core.util.StringUtil;
 import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.FromClause;
@@ -40,6 +41,15 @@
 
 public class SQLParserUtil {
 	
+	String matchesAny(String arg, String ... expected) {
+		for (String string : expected) {
+			if (string.equalsIgnoreCase(arg)) {
+				return arg;
+			}
+		}
+		return null;
+	}
+	
 	String normalizeStringLiteral(String s) {
 		int start = 1;
   		if (s.charAt(0) == 'N') {
@@ -229,23 +239,23 @@
             int num = info.anonExprCount++;
             return "expr" + (num == 0 ? "" : ""+num); //$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
 
-        } else if(functionType.equals(SQLReservedWords.COUNT)) { 
+        } else if(functionType.equals(NonReserved.COUNT)) { 
             int num = info.anonCountCount++;
             return "count" + (num == 0 ? "" : ""+num);//$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
 
-        } else if(functionType.equals(SQLReservedWords.SUM)) { 
+        } else if(functionType.equals(NonReserved.SUM)) { 
             int num = info.anonSumCount++;
             return "sum" + (num == 0 ? "" : ""+num);//$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
 
-        } else if(functionType.equals(SQLReservedWords.AVG)) { 
+        } else if(functionType.equals(NonReserved.AVG)) { 
             int num = info.anonAvgCount++;
             return "avg" + (num == 0 ? "" : ""+num);//$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
 
-        } else if(functionType.equals(SQLReservedWords.MIN)) { 
+        } else if(functionType.equals(NonReserved.MIN)) { 
             int num = info.anonMinCount++;
             return "min" + (num == 0 ? "" : ""+num);//$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
 
-        } else if(functionType.equals(SQLReservedWords.MAX)) { 
+        } else if(functionType.equals(NonReserved.MAX)) { 
             int num = info.anonMaxCount++;
             return "max" + (num == 0 ? "" : ""+num);//$NON-NLS-1$   //$NON-NLS-2$   //$NON-NLS-3$
         } else if(functionType.equals(SQLReservedWords.XMLAGG)) { 

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -39,7 +39,7 @@
 import org.teiid.common.buffer.TupleSource;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.eval.Evaluator;
 import org.teiid.query.function.aggregate.AggregateFunction;
 import org.teiid.query.function.aggregate.Avg;
@@ -163,21 +163,21 @@
                 	inputType = ex.getType();
                 	int index = collectExpression(ex);
                 	String function = aggSymbol.getAggregateFunction();
-                    if(function.equals(SQLReservedWords.COUNT)) {
+                    if(function.equals(NonReserved.COUNT)) {
                         functions[i] = new Count();
-                    } else if(function.equals(SQLReservedWords.SUM)) {
+                    } else if(function.equals(NonReserved.SUM)) {
                         functions[i] = new Sum();
-                    } else if(function.equals(SQLReservedWords.AVG)) {
+                    } else if(function.equals(NonReserved.AVG)) {
                         functions[i] = new Avg();
-                    } else if(function.equals(SQLReservedWords.MIN)) {
+                    } else if(function.equals(NonReserved.MIN)) {
                         functions[i] = new Min();
-                    } else if (function.equals(SQLReservedWords.MAX)){
+                    } else if (function.equals(NonReserved.MAX)){
                         functions[i] = new Max();
                     } else {
                     	functions[i] = new XMLAgg(context);
                     }
 
-                    if(aggSymbol.isDistinct() && !function.equals(SQLReservedWords.MIN) && !function.equals(SQLReservedWords.MAX)) {
+                    if(aggSymbol.isDistinct() && !function.equals(NonReserved.MIN) && !function.equals(NonReserved.MAX)) {
                         SortingFilter filter = new SortingFilter(functions[i], getBufferManager(), getConnectionID(), true);
                         ElementSymbol element = new ElementSymbol("val"); //$NON-NLS-1$
                         element.setType(inputType);

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -69,7 +69,6 @@
 	private char quote;
 	private char delimiter;
 	private int lineWidth;
-	private List<Class<?>> types;
 	private Map elementMap;
     private int[] projectionIndexes;
 	
@@ -86,7 +85,7 @@
 	public void initialize(CommandContext context, BufferManager bufferManager,
 			ProcessorDataManager dataMgr) {
 		super.initialize(context, bufferManager, dataMgr);
-		if (types != null) {
+		if (elementMap != null) {
 			return;
 		}
 		if (table.getSkip() != null) {
@@ -113,11 +112,6 @@
 				quote = table.getQuote();
 			}
 		}
-		types = new ArrayList<Class<?>>();
-		//TODO: if all string types, then we can skip this step
-		for (TextColumn col : table.getColumns()) {
-			types.add(DataTypeManager.getDataTypeClass(col.getType()));
-		}
         this.elementMap = createLookupMap(table.getProjectedSymbols());
         this.projectionIndexes = getProjectionIndexes(elementMap, getElements());
 	}
@@ -190,7 +184,7 @@
 				}
 				val = vals.get(index);
 				try {
-					tuple.add(DataTypeManager.transformValue(val, types.get(output)));
+					tuple.add(DataTypeManager.transformValue(val, table.getColumns().get(output).getSymbol().getType()));
 				} catch (TransformationException e) {
 					throw new TeiidProcessingException(e, QueryExecPlugin.Util.getString("TextTableNode.conversion_error", col.getName(), textLine)); //$NON-NLS-1$
 				}

Added: trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,103 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.processor.relational;
+
+import java.util.Map;
+
+import net.sf.saxon.query.XQueryExpression;
+import nu.xom.Element;
+import nu.xom.Node;
+import nu.xom.NodeFactory;
+import nu.xom.Nodes;
+import nux.xom.pool.XQueryPool;
+import nux.xom.xquery.StreamingPathFilter;
+import nux.xom.xquery.StreamingTransform;
+import nux.xom.xquery.XQueryUtil;
+
+import org.teiid.common.buffer.BlockedException;
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.TupleBatch;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.lang.XMLTable;
+import org.teiid.query.util.CommandContext;
+
+/**
+ * Handles xml processing.
+ */
+public class XMLTableNode extends SubqueryAwareRelationalNode {
+
+	private XMLTable table;
+	
+	//initialized state
+	private Map elementMap;
+    private int[] projectionIndexes;
+	
+    //per file state
+	
+	public XMLTableNode(int nodeID) {
+		super(nodeID);
+	}
+	
+	@Override
+	public void initialize(CommandContext context, BufferManager bufferManager,
+			ProcessorDataManager dataMgr) {
+		super.initialize(context, bufferManager, dataMgr);
+		if (elementMap != null) {
+			return;
+		}
+        this.elementMap = createLookupMap(table.getProjectedSymbols());
+        this.projectionIndexes = getProjectionIndexes(elementMap, getElements());
+	}
+	
+	@Override
+	public void closeDirect() {
+		super.closeDirect();
+		reset();
+	}
+	
+	public void setTable(XMLTable table) {
+		this.table = table;
+	}
+
+	@Override
+	public XMLTableNode clone() {
+		XMLTableNode clone = new XMLTableNode(getID());
+		this.copy(this, clone);
+		clone.setTable(table);
+		return clone;
+	}
+
+	@Override
+	protected TupleBatch nextBatchDirect() throws BlockedException,
+			TeiidComponentException, TeiidProcessingException {
+		return null;
+	}
+	
+	public static void main(String[] args) {
+		
+
+	}
+
+}
\ No newline at end of file


Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -49,7 +49,6 @@
 import org.teiid.query.resolver.command.UpdateProcedureResolver;
 import org.teiid.query.resolver.command.UpdateResolver;
 import org.teiid.query.resolver.command.XMLQueryResolver;
-import org.teiid.query.resolver.command.XQueryResolver;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.resolver.util.ResolverVisitor;
 import org.teiid.query.sql.lang.Command;
@@ -80,7 +79,6 @@
     private static final CommandResolver UPDATE_RESOLVER = new UpdateResolver();
     private static final CommandResolver DELETE_RESOLVER = new DeleteResolver();
     private static final CommandResolver UPDATE_PROCEDURE_RESOLVER = new UpdateProcedureResolver();
-    private static final CommandResolver X_QUERY_RESOLVER = new XQueryResolver();
     private static final CommandResolver BATCHED_UPDATE_RESOLVER = new BatchedUpdateResolver();
     private static final CommandResolver DYNAMIC_COMMAND_RESOLVER = new DynamicCommandResolver();
     private static final CommandResolver TEMP_TABLE_RESOLVER = new TempTableResolver();
@@ -207,7 +205,6 @@
             case Command.TYPE_DELETE:               return DELETE_RESOLVER;
             case Command.TYPE_STORED_PROCEDURE:     return EXEC_RESOLVER;
             case Command.TYPE_UPDATE_PROCEDURE:     return UPDATE_PROCEDURE_RESOLVER;
-            case Command.TYPE_XQUERY:               return X_QUERY_RESOLVER;
             case Command.TYPE_BATCHED_UPDATE:       return BATCHED_UPDATE_RESOLVER;
             case Command.TYPE_DYNAMIC:              return DYNAMIC_COMMAND_RESOLVER;
             case Command.TYPE_CREATE:               return TEMP_TABLE_RESOLVER;

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/ExecResolver.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -54,7 +54,6 @@
 import org.teiid.query.sql.lang.SPParameter;
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.lang.SubqueryContainer;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
@@ -66,20 +65,6 @@
  */
 public class ExecResolver extends ProcedureContainerResolver implements VariableResolver {
 	
-	@Override
-	public Command expandCommand(ProcedureContainer procCommand,
-			QueryMetadataInterface metadata, AnalysisRecord analysis)
-			throws QueryMetadataException, QueryResolverException,
-			TeiidComponentException {
-		Command command = super.expandCommand(procCommand, metadata, analysis);
-		if (command instanceof XQuery) {
-			XQuery query = (XQuery)command;
-			query.setProcedureGroup(procCommand.getGroup().getCanonicalName());
-			query.setVariables(getVariableValues(procCommand, metadata));
-		}
-		return command;
-	}
-
     /**
      * @see org.teiid.query.resolver.CommandResolver#findCommandMetadata(org.teiid.query.sql.lang.Command,
      * org.teiid.query.metadata.QueryMetadataInterface)

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/SimpleQueryResolver.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -68,13 +68,16 @@
 import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.lang.SubqueryFromClause;
 import org.teiid.query.sql.lang.SubquerySetCriteria;
+import org.teiid.query.sql.lang.TableFunctionReference;
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.UnaryFromClause;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.navigator.PostOrderNavigator;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.AllInGroupSymbol;
 import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
@@ -83,7 +86,6 @@
 import org.teiid.query.sql.visitor.ElementCollectorVisitor;
 import org.teiid.query.util.ErrorMessageKeys;
 
-
 public class SimpleQueryResolver implements CommandResolver {
 
     private static final String ALL_IN_GROUP_SUFFIX = ".*"; //$NON-NLS-1$
@@ -280,21 +282,54 @@
             postVisitVisitor(obj);
         }
         
-        /**
-         * TextTables have similar resolving semantics to a nested table.
-         */
         @Override
         public void visit(TextTable obj) {
-        	LinkedHashSet<GroupSymbol> saved = new LinkedHashSet<GroupSymbol>(this.currentGroups);
-        	if (allowImplicit) {
-        		currentGroups.addAll(this.implicitGroups);
-        	}
+        	LinkedHashSet<GroupSymbol> saved = preTableFunctionReference(obj);
         	this.visitNode(obj.getFile());
         	try {
 				obj.setFile(ResolverUtil.convertExpression(obj.getFile(), DataTypeManager.DefaultDataTypes.CLOB, metadata));
 			} catch (QueryResolverException e) {
 				throw new TeiidRuntimeException(e);
 			}
+			postTableFunctionReference(obj, saved);
+            //set to fixed width if any column has width specified
+            for (TextTable.TextColumn col : obj.getColumns()) {
+				if (col.getWidth() != null) {
+					obj.setFixedWidth(true);
+					break;
+				}
+			}
+        }
+        
+        @Override
+        public void visit(XMLTable obj) {
+        	LinkedHashSet<GroupSymbol> saved = preTableFunctionReference(obj);
+        	visitNodes(obj.getPassing());
+			postTableFunctionReference(obj, saved);
+			try {
+				obj.compileXqueryExpression();
+				for (XMLTable.XMLColumn column : obj.getColumns()) {
+					if (column.getDefaultExpression() == null) {
+						continue;
+					}
+					ResolverVisitor.resolveLanguageObject(column.getDefaultExpression(), metadata);
+					Expression ex = ResolverUtil.convertExpression(column.getDefaultExpression(), DataTypeManager.getDataTypeName(column.getSymbol().getType()), metadata);
+					column.setDefaultExpression(ex);
+				}
+			} catch (TeiidException e) {
+				throw new TeiidRuntimeException(e);
+			}
+        }
+        
+        public LinkedHashSet<GroupSymbol> preTableFunctionReference(TableFunctionReference tfr) {
+        	LinkedHashSet<GroupSymbol> saved = new LinkedHashSet<GroupSymbol>(this.currentGroups);
+        	if (allowImplicit) {
+        		currentGroups.addAll(this.implicitGroups);
+        	}
+        	return saved;
+        }
+        
+        public void postTableFunctionReference(TableFunctionReference obj, LinkedHashSet<GroupSymbol> saved) {
 			//we didn't create a true external context, so we manually mark external
 			for (ElementSymbol symbol : ElementCollectorVisitor.getElements(obj, false)) {
 				if (symbol.isExternalReference()) {
@@ -325,13 +360,6 @@
 					throw new TeiidRuntimeException(e);
 				}				
 			}
-            //set to fixed width if any column has width specified
-            for (TextTable.TextColumn col : obj.getColumns()) {
-				if (col.getWidth() != null) {
-					obj.setFixedWidth(true);
-					break;
-				}
-			}
         }
         
         public void visit(SubqueryFromClause obj) {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -612,7 +612,7 @@
     public static TempMetadataID addTempGroup(TempMetadataAdapter metadata,
                                     GroupSymbol symbol,
                                     List symbols, boolean tempTable) throws QueryResolverException {
-        HashSet names = new HashSet();
+        HashSet<String> names = new HashSet<String>();
         for (Iterator i = symbols.iterator(); i.hasNext();) {
             SingleElementSymbol ses = (SingleElementSymbol)i.next();
             if (!names.add(ses.getShortCanonicalName())) {

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -64,6 +64,7 @@
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
+import org.teiid.query.sql.symbol.XMLSerialize;
 import org.teiid.query.util.ErrorMessageKeys;
 
 
@@ -274,7 +275,6 @@
         }
     }
 
-
     public void visit(SubquerySetCriteria obj) {
         try {
             obj.setExpression(ResolverUtil.resolveSubqueryPredicateCriteria(obj.getExpression(), obj, metadata));
@@ -329,6 +329,15 @@
             handleException(new QueryResolverException(e, QueryPlugin.Util.getString("SetClause.resolvingError", new Object[] {obj.getValue(), obj.getSymbol(), type}))); //$NON-NLS-1$
         } 
     }
+    
+    @Override
+    public void visit(XMLSerialize obj) {
+    	try {
+			obj.setExpression(ResolverUtil.convertExpression(obj.getExpression(), DataTypeManager.DefaultDataTypes.XML, metadata));
+		} catch (QueryResolverException e) {
+			handleException(new QueryResolverException(e, QueryPlugin.Util.getString("XMLSerialize.resolvingError", obj))); //$NON-NLS-1$
+		}
+    }
 
     public TeiidComponentException getComponentException() {
         return this.componentException;

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -53,7 +53,7 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.Assertion;
 import org.teiid.core.util.TimestampWithTimezone;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.eval.Evaluator;
 import org.teiid.query.execution.QueryExecPlugin;
 import org.teiid.query.function.FunctionDescriptor;
@@ -110,6 +110,7 @@
 import org.teiid.query.sql.lang.TranslatableProcedureContainer;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.PredicateCriteria.Negatable;
 import org.teiid.query.sql.navigator.PostOrderNavigator;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
@@ -137,6 +138,9 @@
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.XMLElement;
+import org.teiid.query.sql.symbol.XMLForest;
+import org.teiid.query.sql.symbol.XMLSerialize;
 import org.teiid.query.sql.util.SymbolMap;
 import org.teiid.query.sql.util.ValueIterator;
 import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
@@ -921,6 +925,8 @@
         } else if (clause instanceof TextTable) {
         	TextTable tt = (TextTable)clause;
         	tt.setFile(rewriteExpressionDirect(tt.getFile()));
+        } else if (clause instanceof XMLTable) {
+        	rewriteExpressions(clause);
         }
         return clause;
 	}
@@ -1895,6 +1901,12 @@
         	} else {
             	expression = rewriteExpressionDirect(((ExpressionSymbol)expression).getExpression());
         	}
+        } else if (expression instanceof XMLElement) {
+        	rewriteExpressions(expression);
+        } else if (expression instanceof XMLForest) {
+        	rewriteExpressions(expression);
+        } else if (expression instanceof XMLSerialize) {
+        	rewriteExpressions(expression);
         }
     	
         if(dataMgr == null) {
@@ -1913,8 +1925,8 @@
 	}
     
     private Expression rewriteExpression(AggregateSymbol expression) {
-    	if (!expression.getAggregateFunction().equals(SQLReservedWords.COUNT)
-				&& !expression.getAggregateFunction().equals(SQLReservedWords.SUM)
+    	if (!expression.getAggregateFunction().equals(NonReserved.COUNT)
+				&& !expression.getAggregateFunction().equals(NonReserved.SUM)
 				&& EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
 			try {
 				return new ExpressionSymbol(expression.getName(), ResolverUtil
@@ -1967,7 +1979,7 @@
 			}
 			case 1: {//from_unixtime(a) => timestampadd(SQL_TSI_SECOND, a, new Timestamp(0)) 
 				Function result = new Function(FunctionLibrary.TIMESTAMPADD,
-						new Expression[] {new Constant(SQLReservedWords.SQL_TSI_SECOND), function.getArg(0), new Constant(new Timestamp(0)) });
+						new Expression[] {new Constant(NonReserved.SQL_TSI_SECOND), function.getArg(0), new Constant(new Timestamp(0)) });
 				//resolve the function
 				FunctionDescriptor descriptor = 
 					funcLibrary.findFunction(FunctionLibrary.TIMESTAMPADD, new Class[] { DataTypeManager.DefaultDataClasses.STRING, DataTypeManager.DefaultDataClasses.INTEGER, DataTypeManager.DefaultDataClasses.TIMESTAMP });

Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -84,7 +84,6 @@
         visit((ProcedureContainer)obj);
     }
     public void visit(Into obj) {}
-    public void visit(XQuery obj) {}
     public void visit(DependentSetCriteria obj) {}
     public void visit(Create obj) {}
     public void visit(Drop obj) {}
@@ -131,4 +130,7 @@
     public void visit(XMLForest obj) {}
     public void visit(XMLNamespaces obj) {}
     public void visit(TextTable obj) {}
+    public void visit(XMLTable obj) {}
+    public void visit(DerivedColumn obj) {}
+    public void visit(XMLSerialize obj) {}
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Command.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -93,11 +93,6 @@
     public static final int TYPE_UPDATE_PROCEDURE = 7;
 
     /**
-     * Represents an XQuery
-     */
-    public static final int TYPE_XQUERY = 8;
-
-    /**
      * Represents a batched sequence of UPDATE statements
      */
     public static final int TYPE_BATCHED_UPDATE = 9;

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/TableFunctionReference.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TableFunctionReference.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TableFunctionReference.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,172 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.sql.lang;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.util.SymbolMap;
+
+public abstract class TableFunctionReference extends FromClause {
+	
+	public static class ProjectedColumn {
+		private String name;
+		private String type;
+		private ElementSymbol symbol;
+		
+		public ProjectedColumn(String name, String type) {
+			this.name = name;
+			this.type = type;
+			this.symbol = new ElementSymbol(name);
+			symbol.setType(DataTypeManager.getDataTypeClass(type));
+		}
+		
+		protected ProjectedColumn() {
+			
+		}
+		
+		public ElementSymbol getSymbol() {
+			return symbol;
+		}
+		
+		public String getName() {
+			return name;
+		}
+		
+		public String getType() {
+			return type;
+		}
+		
+		@Override
+		public boolean equals(Object obj) {
+			if (obj == this) {
+				return true;
+			}
+			if (!(obj instanceof ProjectedColumn)) {
+				return false;
+			}
+			ProjectedColumn other = (ProjectedColumn)obj;
+			return this.symbol.equals(other.symbol)
+				&& this.name.equals(other.name)
+				&& this.type.equals(other.type);
+		}
+		
+		public int hashCode() {
+			return symbol.hashCode();
+		}
+		
+		public void copy(ProjectedColumn copy) {
+			copy.name = this.name;
+			copy.type = this.type;
+			copy.symbol = (ElementSymbol)this.symbol.clone();
+		}
+		
+	}
+	
+    private GroupSymbol symbol;
+    private SymbolMap correlatedReferences;
+
+    public SymbolMap getCorrelatedReferences() {
+		return correlatedReferences;
+	}
+    
+    public void setCorrelatedReferences(SymbolMap correlatedReferences) {
+		this.correlatedReferences = correlatedReferences;
+	}
+    
+	public void copy(TableFunctionReference copy) {
+		copy.symbol = (GroupSymbol)this.symbol.clone();
+		if (correlatedReferences != null) {
+			copy.correlatedReferences = correlatedReferences.clone();
+		}
+	}
+
+	@Override
+	public void collectGroups(Collection groups) {
+		groups.add(getGroupSymbol());
+	}
+	
+    /**
+     * Get name of this clause.
+     * @return Name of clause
+     */
+    public String getName() {
+        return this.symbol.getName();   
+    }
+    
+    public String getOutputName() {
+        return this.symbol.getOutputName();
+    }
+
+    /**
+     * Get GroupSymbol representing the named subquery 
+     * @return GroupSymbol representing the subquery
+     */
+    public GroupSymbol getGroupSymbol() {
+        return this.symbol;    
+    }
+    
+    /** 
+     * Reset the alias for this subquery from clause and it's pseudo-GroupSymbol.  
+     * WARNING: this will modify the hashCode and equals semantics and will cause this object
+     * to be lost if currently in a HashMap or HashSet.
+     * @param name New name
+     * @since 4.3
+     */
+    public void setName(String name) {
+        this.symbol = new GroupSymbol(name);
+    }
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (!(obj instanceof TableFunctionReference)) {
+			return false;
+		}
+		TableFunctionReference other = (TableFunctionReference)obj;
+		return EquivalenceUtil.areEqual(symbol, other.symbol);
+	}
+	
+	@Override
+	public int hashCode() {
+		return this.symbol.hashCode();
+	}
+	
+	public abstract List<? extends ProjectedColumn> getColumns();
+	
+	public List<ElementSymbol> getProjectedSymbols() {
+		ArrayList<ElementSymbol> symbols = new ArrayList<ElementSymbol>(getColumns().size());
+		for (ProjectedColumn col : getColumns()) {
+			symbols.add(col.getSymbol());
+		}
+		return symbols;
+	}
+	
+}


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

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,47 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
 package org.teiid.query.sql.lang;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
-import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.EquivalenceUtil;
-import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
-import org.teiid.query.sql.symbol.GroupSymbol;
-import org.teiid.query.sql.util.SymbolMap;
 
-public class TextTable extends FromClause {
+/**
+ * Represents the TEXTTABLE table function.
+ */
+public class TextTable extends TableFunctionReference {
 	
-	public static class TextColumn {
-		private String name;
-		private String type;
+	public static class TextColumn extends ProjectedColumn {
 		private Integer width;
 		
 		public TextColumn(String name, String type, Integer width) {
-			this.name = name;
-			this.type = type;
+			super(name, type);
 			this.width = width;
 		}
 		
-		public void setName(String name) {
-			this.name = name;
+		protected TextColumn() {
+			
 		}
 		
-		public String getName() {
-			return name;
-		}
-		
-		public String getType() {
-			return type;
-		}
-		
-		public void setType(String type) {
-			this.type = type;
-		}
-		
 		public Integer getWidth() {
 			return width;
 		}
@@ -55,28 +59,22 @@
 			if (obj == this) {
 				return true;
 			}
-			if (!(obj instanceof TextColumn)) {
+			if (!super.equals(obj) || !(obj instanceof TextColumn)) {
 				return false;
 			}
 			TextColumn other = (TextColumn)obj;
-			return this.name.equalsIgnoreCase(other.name) && this.type.equalsIgnoreCase(other.type)
-				&& EquivalenceUtil.areEqual(width, other.width);
+			return EquivalenceUtil.areEqual(width, other.width);
 		}
 		
-		public int hashCode() {
-			return name.hashCode();
-		}
-		
 		@Override
 		public TextColumn clone() {
-			return new TextColumn(name, type, width);
+			TextColumn clone = new TextColumn();
+			clone.width = this.width;
+			this.copy(clone);
+			return clone;
 		}
 	}
 	
-    private GroupSymbol symbol;
-    private List<ElementSymbol> projectedSymbols;
-    private SymbolMap correlatedReferences;
-    
     private Expression file;
     private List<TextColumn> columns = new ArrayList<TextColumn>();
 	private Character delimiter;
@@ -95,14 +93,6 @@
 		this.quote = quote;
 	}
     
-    public SymbolMap getCorrelatedReferences() {
-		return correlatedReferences;
-	}
-    
-    public void setCorrelatedReferences(SymbolMap correlatedReferences) {
-		this.correlatedReferences = correlatedReferences;
-	}
-    
     public boolean isEscape() {
 		return escape;
 	}
@@ -167,97 +157,36 @@
 	@Override
 	public TextTable clone() {
 		TextTable clone = new TextTable();
+		this.copy(clone);
 		clone.setDelimiter(this.delimiter);
 		clone.setFile((Expression)this.file.clone());
 		clone.setHeader(this.header);
 		clone.setSkip(this.skip);
 		clone.setQuote(this.quote);
 		clone.escape = this.escape;
-		clone.symbol = (GroupSymbol)this.symbol.clone();
 		for (TextColumn column : columns) {
 			clone.getColumns().add(column.clone());
 		}
-		if (projectedSymbols != null) {
-			clone.projectedSymbols = LanguageObject.Util.deepClone(this.projectedSymbols, ElementSymbol.class);
-		}
-		if (correlatedReferences != null) {
-			clone.correlatedReferences = correlatedReferences.clone();
-		}
 		clone.fixedWidth = this.fixedWidth;
 		return clone;
 	}
 
 	@Override
-	public void collectGroups(Collection groups) {
-		groups.add(getGroupSymbol());
-	}
-	
-    /**
-     * Get name of this clause.
-     * @return Name of clause
-     */
-    public String getName() {
-        return this.symbol.getName();   
-    }
-    
-    public String getOutputName() {
-        return this.symbol.getOutputName();
-    }
-
-    /**
-     * Get GroupSymbol representing the named subquery 
-     * @return GroupSymbol representing the subquery
-     */
-    public GroupSymbol getGroupSymbol() {
-        return this.symbol;    
-    }
-    
-    /** 
-     * Reset the alias for this subquery from clause and it's pseudo-GroupSymbol.  
-     * WARNING: this will modify the hashCode and equals semantics and will cause this object
-     * to be lost if currently in a HashMap or HashSet.
-     * @param name New name
-     * @since 4.3
-     */
-    public void setName(String name) {
-        this.symbol = new GroupSymbol(name);
-    }
-	
-	@Override
 	public boolean equals(Object obj) {
 		if (obj == this) {
 			return true;
 		}
-		if (!(obj instanceof TextTable)) {
+		if (!super.equals(obj) || !(obj instanceof TextTable)) {
 			return false;
 		}
 		TextTable other = (TextTable)obj;
 		return this.columns.equals(other.columns) 
 			&& EquivalenceUtil.areEqual(file, other.file)
-			&& EquivalenceUtil.areEqual(symbol, other.symbol)
 			&& EquivalenceUtil.areEqual(delimiter, other.delimiter)
 			&& EquivalenceUtil.areEqual(escape, other.escape)
 			&& EquivalenceUtil.areEqual(quote, other.quote)
 			&& EquivalenceUtil.areEqual(header, other.header)
 			&& EquivalenceUtil.areEqual(skip, other.skip);
-			
 	}
 	
-	@Override
-	public int hashCode() {
-		return this.symbol.hashCode();
-	}
-
-	public List<ElementSymbol> getProjectedSymbols() {
-		if (projectedSymbols == null) {
-			projectedSymbols = new ArrayList<ElementSymbol>(columns.size());
-			for (TextColumn column : columns) {
-				ElementSymbol elementSymbol = new ElementSymbol(column.getName());
-				elementSymbol.setType(DataTypeManager.getDataTypeClass(column.getType()));
-				projectedSymbols.add(elementSymbol);
-			}
-		}
-		return projectedSymbols;
-	}
-	
 }

Added: trunk/engine/src/main/java/org/teiid/query/sql/lang/XMLTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/XMLTable.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/XMLTable.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,198 @@
+package org.teiid.query.sql.lang;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import net.sf.saxon.sxpath.XPathExpression;
+
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.symbol.DerivedColumn;
+import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.XMLNamespaces;
+import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
+
+public class XMLTable extends TableFunctionReference {
+	
+	public static class XMLColumn extends ProjectedColumn {
+		private boolean ordinal;
+		private String path;
+		private Expression defaultExpression;
+		
+		private XPathExpression pathExpression;
+		
+		public XMLColumn(String name) {
+			super(name, DataTypeManager.DefaultDataTypes.STRING);
+			this.ordinal = true;
+		}
+		
+		public XMLColumn(String name, String type, String path, Expression defaultExpression) {
+			super(name, type);
+			this.path = path;
+			this.defaultExpression = defaultExpression;
+		}
+		
+		protected XMLColumn() {
+			
+		}
+		
+		public Expression getDefaultExpression() {
+			return defaultExpression;
+		}
+		
+		public void setDefaultExpression(Expression defaultExpression) {
+			this.defaultExpression = defaultExpression;
+		}
+		
+		public String getPath() {
+			return path;
+		}
+		
+		public void setPath(String path) {
+			this.path = path;
+		}
+		
+		public boolean isOrdinal() {
+			return ordinal;
+		}
+		
+		public void setOrdinal(boolean ordinal) {
+			this.ordinal = ordinal;
+		}
+		
+		public void setPathExpression(XPathExpression pathExpression) {
+			this.pathExpression = pathExpression;
+		}
+		
+		public XPathExpression getPathExpression() {
+			return pathExpression;
+		}
+		
+		@Override
+		public boolean equals(Object obj) {
+			if (obj == this) {
+				return true;
+			}
+			if (!super.equals(obj) || !(obj instanceof XMLColumn)) {
+				return false;
+			}
+			XMLColumn other = (XMLColumn)obj;
+			return this.ordinal == other.ordinal 
+				&& EquivalenceUtil.areEqual(this.path, other.path)
+				&& EquivalenceUtil.areEqual(this.defaultExpression, other.defaultExpression);
+		}
+		
+		@Override
+		public XMLColumn clone() {
+			XMLColumn clone = new XMLColumn();
+			super.copy(clone);
+			clone.ordinal = this.ordinal;
+			clone.path = this.path;
+			if (this.defaultExpression != null) {
+				clone.defaultExpression = (Expression)this.defaultExpression.clone();
+			}
+			clone.pathExpression = this.pathExpression;
+			return clone;
+		}
+	}
+	
+    private List<XMLColumn> columns = new ArrayList<XMLColumn>();
+    private XMLNamespaces namespaces;
+    private String xquery;
+    private List<DerivedColumn> passing = new ArrayList<DerivedColumn>();
+    private ElementSymbol defaultColumn;
+    
+    private SaxonXQueryExpression xqueryExpression;
+    
+    public List<DerivedColumn> getPassing() {
+		return passing;
+	}
+    
+    public void compileXqueryExpression() throws TeiidProcessingException {
+    	this.xqueryExpression = new SaxonXQueryExpression(xquery, namespaces, passing, columns);
+    }
+    
+    public SaxonXQueryExpression getXqueryExpression() {
+		return xqueryExpression;
+	}
+    
+    public void setPassing(List<DerivedColumn> passing) {
+		this.passing = passing;
+	}
+    
+    public String getXquery() {
+		return xquery;
+	}
+    
+    public void setXquery(String xquery) {
+		this.xquery = xquery;
+	}
+    
+    public List<XMLColumn> getColumns() {
+		return columns;
+	}
+    
+    public void setColumns(List<XMLColumn> columns) {
+		this.columns = columns;
+	}
+    
+    public XMLNamespaces getNamespaces() {
+		return namespaces;
+	}
+    
+    public void setNamespaces(XMLNamespaces namespaces) {
+		this.namespaces = namespaces;
+	}
+    
+    @Override
+    public List<ElementSymbol> getProjectedSymbols() {
+    	if (!columns.isEmpty()) {
+        	return super.getProjectedSymbols();
+    	}
+    	if (defaultColumn == null) {
+    		defaultColumn = new ElementSymbol("COLUMN_VALUE"); //$NON-NLS-1$
+    		defaultColumn.setType(DataTypeManager.DefaultDataClasses.XML);
+    	}
+    	return Arrays.asList(defaultColumn);
+    }
+    
+	@Override
+	public void acceptVisitor(LanguageVisitor visitor) {
+		visitor.visit(this);
+	}
+
+	@Override
+	public XMLTable clone() {
+		XMLTable clone = new XMLTable();
+		for (XMLColumn column : columns) {
+			clone.getColumns().add(column.clone());
+		}
+		if (defaultColumn != null) {
+			clone.defaultColumn = this.defaultColumn;
+		}
+		return clone;
+	}
+
+	@Override
+	public void collectGroups(Collection groups) {
+		groups.add(getGroupSymbol());
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (!super.equals(obj) || !(obj instanceof XMLTable)) {
+			return false;
+		}
+		XMLTable other = (XMLTable)obj;
+		return this.columns.equals(other.columns);
+	}
+	
+}


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

Deleted: trunk/engine/src/main/java/org/teiid/query/sql/lang/XQuery.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/XQuery.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/XQuery.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,155 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.sql.lang;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.teiid.core.types.DataTypeManager;
-import org.teiid.core.util.EquivalenceUtil;
-import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.symbol.ElementSymbol;
-import org.teiid.query.sql.visitor.SQLStringVisitor;
-import org.teiid.query.xquery.XQueryExpression;
-
-
-/**
- * An XQuery command object
- */
-public class XQuery extends Command {
-    
-    private String xQuery;
-    private XQueryExpression compiledXQuery;
-    private Map variables;
-    private String procedureGroup;
-    
-    public XQuery(){
-    }
-
-    public XQuery(String xQuery, XQueryExpression compiledXQuery){
-        this.xQuery = xQuery;
-        this.compiledXQuery = compiledXQuery;
-    }
-    
-    public void setProcedureGroup(String procedureGroup) {
-		this.procedureGroup = procedureGroup;
-	}
-    
-    public void setVariables(Map variables) {
-		this.variables = variables;
-	}
-    
-    public Map getVariables() {
-		return variables;
-	}
-    
-    public String getXQuery(){
-        return xQuery;
-    }
-    
-    public XQueryExpression getCompiledXQuery(){
-        return this.compiledXQuery;        
-    }
-
-    /**
-     * @see org.teiid.query.sql.lang.Command#getType()
-     */
-    public int getType() {
-        return Command.TYPE_XQUERY;
-    }
-
-    /**
-     * @see org.teiid.query.sql.lang.Command#getProjectedSymbols()
-     */
-    public List getProjectedSymbols() {
-        List selectList = new ArrayList(1);
-        ElementSymbol xmlElement = new ElementSymbol("xml"); //$NON-NLS-1$
-        xmlElement.setType(DataTypeManager.DefaultDataClasses.XML);
-        selectList.add(xmlElement);
-        return selectList;
-    }
-
-    /**
-     * Compare two queries for equality.  Queries will only evaluate to equal if
-     * they are IDENTICAL.  
-     * @param obj Other object
-     * @return True if equal
-     */
-    public boolean equals(Object obj) {
-        // Quick same object test
-        if(this == obj) {
-            return true;
-        }
-
-        // Quick fail tests     
-        if(!(obj instanceof XQuery)) {
-            return false;
-        }
-
-        return EquivalenceUtil.areEqual(getXQuery(), ((XQuery)obj).getXQuery());
-    }
-
-    /**
-     * Get hashcode for query.  
-     * @return Hash code
-     */
-    public int hashCode() {
-        return xQuery.hashCode();
-    }
-
-    /**
-     * Return a copy of this SQLQuery.
-     * @return Deep or safe clone
-     */
-    public Object clone() {
-        XQuery copy = new XQuery(getXQuery(), this.compiledXQuery);
-        copy.variables = variables;
-        copy.procedureGroup = procedureGroup;
-        copyMetadataState(copy);
-        return copy;
-    }
-
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }
-
-    /**
-     * Returns a string representation of an instance of this class.
-     * @return String representation of object
-     */
-    public String toString() {
-        return SQLStringVisitor.getSQLString(this);
-    }
-	
-	/**
-	 * @see org.teiid.query.sql.lang.Command#areResultsCachable()
-	 */
-	public boolean areResultsCachable() {
-		return true;
-	}
-    
-	public String getProcedureGroup() {
-		return procedureGroup;
-	}
-}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -64,7 +64,7 @@
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
-import org.teiid.query.sql.lang.XQuery;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
 import org.teiid.query.sql.proc.BreakStatement;
@@ -85,6 +85,7 @@
 import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.sql.symbol.DerivedColumn;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
@@ -93,12 +94,11 @@
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.symbol.XMLAttributes;
 import org.teiid.query.sql.symbol.XMLElement;
 import org.teiid.query.sql.symbol.XMLForest;
 import org.teiid.query.sql.symbol.XMLNamespaces;
-import org.teiid.query.sql.util.SymbolMap;
+import org.teiid.query.sql.symbol.XMLSerialize;
 
 
 
@@ -479,11 +479,6 @@
         visitNode(obj.getBlock());
         postVisitVisitor(obj);
     }
-    public void visit(XQuery obj) {
-        preVisitVisitor(obj);
-        visitNode(obj.getOption());
-        postVisitVisitor(obj);
-    }
     
     /**
      * NOTE: we specifically don't need to visit the as columns or the using identifiers.
@@ -520,20 +515,14 @@
     public void visit(XMLForest obj) {
     	preVisitVisitor(obj);
     	visitNode(obj.getNamespaces());
-    	//we just want the underlying expressions, not the wrapping alias/expression symbols
-    	for (SingleElementSymbol symbol : obj.getArgs()) {
-        	visitNode(SymbolMap.getExpression(symbol));
-		}
+    	visitNodes(obj.getArgs());
         postVisitVisitor(obj);
     }
     
     @Override
     public void visit(XMLAttributes obj) {
     	preVisitVisitor(obj);
-    	//we just want the underlying expressions, not the wrapping alias/expression symbols
-    	for (SingleElementSymbol symbol : obj.getArgs()) {
-        	visitNode(SymbolMap.getExpression(symbol));
-		}
+    	visitNodes(obj.getArgs());
         postVisitVisitor(obj);
     }
     
@@ -560,6 +549,32 @@
         postVisitVisitor(obj);
     }
     
+    @Override
+    public void visit(XMLTable obj) {
+    	preVisitVisitor(obj);
+    	visitNode(obj.getNamespaces());
+    	visitNodes(obj.getPassing());
+    	for (XMLTable.XMLColumn column : obj.getColumns()) {
+			visitNode(column.getDefaultExpression());
+		}
+        visitNode(obj.getGroupSymbol());
+        postVisitVisitor(obj);
+    }
+    
+    @Override
+    public void visit(DerivedColumn obj) {
+    	preVisitVisitor(obj);
+    	visitNode(obj.getExpression());
+    	postVisitVisitor(obj);
+    }
+    
+    @Override
+    public void visit(XMLSerialize obj) {
+    	preVisitVisitor(obj);
+    	visitNode(obj.getExpression());
+    	postVisitVisitor(obj);
+    }
+    
     public static void doVisit(LanguageObject object, LanguageVisitor visitor, boolean order) {
         PreOrPostOrderNavigator nav = new PreOrPostOrderNavigator(visitor, order);
         object.acceptVisitor(nav);

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,6 +31,7 @@
 import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
 import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.lang.OrderBy;
@@ -69,11 +70,11 @@
 
 	static {
 		AGGREGATE_FUNCTIONS = new HashSet<String>();
-		AGGREGATE_FUNCTIONS.add(SQLReservedWords.COUNT);
-		AGGREGATE_FUNCTIONS.add(SQLReservedWords.SUM);
-		AGGREGATE_FUNCTIONS.add(SQLReservedWords.AVG);
-		AGGREGATE_FUNCTIONS.add(SQLReservedWords.MIN);
-		AGGREGATE_FUNCTIONS.add(SQLReservedWords.MAX);
+		AGGREGATE_FUNCTIONS.add(NonReserved.COUNT);
+		AGGREGATE_FUNCTIONS.add(NonReserved.SUM);
+		AGGREGATE_FUNCTIONS.add(NonReserved.AVG);
+		AGGREGATE_FUNCTIONS.add(NonReserved.MIN);
+		AGGREGATE_FUNCTIONS.add(NonReserved.MAX);
 		AGGREGATE_FUNCTIONS.add(SQLReservedWords.XMLAGG);
 
 		SUM_TYPES = new HashMap<Class<?>, Class<?>>();
@@ -113,7 +114,7 @@
 	/**
 	 * Construct an aggregate symbol with all given data.
 	 * @param name Name of the function
-	 * @param aggregateFunction Aggregate function type ({@link org.teiid.language.SQLReservedWords#COUNT}, etc)
+	 * @param aggregateFunction Aggregate function type ({@link org.teiid.language.SQLReservedWords.NonReserved#COUNT}, etc)
 	 * @param isDistinct True if DISTINCT flag is set
 	 * @param expression Contained expression
 	 */
@@ -128,11 +129,11 @@
 	 * Set the aggregate function.  If the aggregate function is an invalid value, an
 	 * IllegalArgumentException is thrown.
 	 * @param aggregateFunction Aggregate function type
-	 * @see org.teiid.language.SQLReservedWords#COUNT
-	 * @see org.teiid.language.SQLReservedWords#SUM
-	 * @see org.teiid.language.SQLReservedWords#AVG
-	 * @see org.teiid.language.SQLReservedWords#MIN
-	 * @see org.teiid.language.SQLReservedWords#MAX
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#COUNT
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#SUM
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#AVG
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#MIN
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#MAX
 	 */
 	private void setAggregateFunction(String aggregateFunction) {
 		// Validate aggregate
@@ -146,11 +147,11 @@
 	 * Get the aggregate function type - this will map to one of the reserved words
 	 * for the aggregate functions.
 	 * @return Aggregate function type
-	 * @see org.teiid.language.SQLReservedWords#COUNT
-	 * @see org.teiid.language.SQLReservedWords#SUM
-	 * @see org.teiid.language.SQLReservedWords#AVG
-	 * @see org.teiid.language.SQLReservedWords#MIN
-	 * @see org.teiid.language.SQLReservedWords#MAX
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#COUNT
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#SUM
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#AVG
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#MIN
+	 * @see org.teiid.language.SQLReservedWords.NonReserved#MAX
 	 */
 	public String getAggregateFunction() {
 		return this.aggregate;
@@ -171,12 +172,12 @@
 	 * @return Type of the symbol
 	 */
 	public Class<?> getType() {
-		if(this.aggregate.equals(SQLReservedWords.COUNT)) {
+		if(this.aggregate.equals(NonReserved.COUNT)) {
 			return COUNT_TYPE;
-		} else if(this.aggregate.equals(SQLReservedWords.SUM) ) {
+		} else if(this.aggregate.equals(NonReserved.SUM) ) {
 			Class<?> expressionType = this.getExpression().getType();
 			return SUM_TYPES.get(expressionType);
-        } else if (this.aggregate.equals(SQLReservedWords.AVG)) {
+        } else if (this.aggregate.equals(NonReserved.AVG)) {
             Class<?> expressionType = this.getExpression().getType();
             return AVG_TYPES.get(expressionType);
 		} else {

Added: trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.sql.symbol;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
+
+public class DerivedColumn implements LanguageObject {
+
+    private String alias;
+    private Expression expression;
+    private boolean propagateName = true;
+    
+    public DerivedColumn(String name, Expression expression) {
+        this.alias = name;
+        this.expression = expression;
+    }
+    
+    public boolean isPropagateName() {
+		return propagateName;
+	}
+    
+    public void setPropagateName(boolean propagateName) {
+		this.propagateName = propagateName;
+	}
+    
+    public String getAlias() {
+        return alias;
+    }
+
+    public Expression getExpression() {
+        return expression;
+    }
+
+    public void setAlias(String name) {
+        this.alias = name;
+    }
+    
+    public void setExpression(Expression expression) {
+        this.expression = expression;
+    }
+    
+    @Override
+    public void acceptVisitor(LanguageVisitor visitor) {
+    	visitor.visit(this);
+    }
+    
+    @Override
+    public int hashCode() {
+    	return HashCodeUtil.hashCode(0, alias, expression);
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+    	if (obj == this) {
+    		return true;
+    	}
+    	if (!(obj instanceof DerivedColumn)) {
+    		return false;
+    	}
+    	DerivedColumn other = (DerivedColumn)obj;
+    	return EquivalenceUtil.areEqual(alias, other.alias) && this.expression.equals(other.expression);
+    }
+    
+    @Override
+    public DerivedColumn clone() {
+    	DerivedColumn clone = new DerivedColumn(alias, (Expression)this.expression.clone());
+    	clone.propagateName = propagateName;
+    	return clone;
+    }
+    
+    @Override
+    public String toString() {
+    	return SQLStringVisitor.getSQLString(this);
+    }
+
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/symbol/DerivedColumn.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLAttributes.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLAttributes.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLAttributes.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -36,19 +36,19 @@
 public class XMLAttributes implements LanguageObject {
 
 	private static final long serialVersionUID = -3348922701950966494L;
-	private List<SingleElementSymbol> args;
+	private List<DerivedColumn> args;
 	
-	public XMLAttributes(List<SingleElementSymbol> args) {
+	public XMLAttributes(List<DerivedColumn> args) {
 		this.args = args;
 	}
 	
-	public List<SingleElementSymbol> getArgs() {
+	public List<DerivedColumn> getArgs() {
 		return args;
 	}
 	
 	@Override
 	public XMLAttributes clone() {
-		XMLAttributes clone = new XMLAttributes(LanguageObject.Util.deepClone(args, SingleElementSymbol.class));
+		XMLAttributes clone = new XMLAttributes(LanguageObject.Util.deepClone(args, DerivedColumn.class));
 		return clone;
 	}
 	

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLForest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLForest.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLForest.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -25,20 +25,18 @@
 import java.util.List;
 
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.core.util.EquivalenceUtil;
 import org.teiid.core.util.HashCodeUtil;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageVisitor;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
-
 public class XMLForest implements Expression {
 
 	private static final long serialVersionUID = -3348922701950966494L;
-	private List<SingleElementSymbol> args;
+	private List<DerivedColumn> args;
 	private XMLNamespaces namespaces;
 	
-	public XMLForest(List<SingleElementSymbol> args) {
+	public XMLForest(List<DerivedColumn> args) {
 		this.args = args;
 	}
 	
@@ -50,7 +48,7 @@
 		this.namespaces = namespaces;
 	}
 	
-	public List<SingleElementSymbol> getArgs() {
+	public List<DerivedColumn> getArgs() {
 		return args;
 	}
 
@@ -61,8 +59,8 @@
 
 	@Override
 	public boolean isResolved() {
-		for (SingleElementSymbol arg : args) {
-			if (!arg.isResolved()) {
+		for (DerivedColumn arg : args) {
+			if (!arg.getExpression().isResolved()) {
 				return false;
 			}
 		}
@@ -76,7 +74,7 @@
 		
 	@Override
 	public XMLForest clone() {
-		XMLForest clone = new XMLForest(LanguageObject.Util.deepClone(args, SingleElementSymbol.class));
+		XMLForest clone = new XMLForest(LanguageObject.Util.deepClone(args, DerivedColumn.class));
 		return clone;
 	}
 	

Added: trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLSerialize.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLSerialize.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLSerialize.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.sql.symbol;
+
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
+
+public class XMLSerialize implements Expression {
+
+	private static final long serialVersionUID = -6574662238317329252L;
+	
+	private boolean document;
+	private Expression expression;
+	private String typeString;
+	private Class<?> type;
+	
+	@Override
+	public Class<?> getType() {
+		if (type == null) {
+			if (typeString == null) {
+				type = DataTypeManager.DefaultDataClasses.CLOB;
+			} else {
+				type = DataTypeManager.getDataTypeClass(typeString);
+			}
+		}
+		return type;
+	}
+	
+	public Expression getExpression() {
+		return expression;
+	}
+	
+	public boolean isDocument() {
+		return document;
+	}
+	
+	public void setDocument(boolean document) {
+		this.document = document;
+	}
+	
+	public void setExpression(Expression expression) {
+		this.expression = expression;
+	}
+	
+	public void setTypeString(String typeString) {
+		this.typeString = typeString;
+	}
+	
+	public String getTypeString() {
+		return typeString;
+	}
+	
+	@Override
+	public boolean isResolved() {
+		return expression.isResolved();
+	}
+	
+	@Override
+	public void acceptVisitor(LanguageVisitor visitor) {
+		visitor.visit(this);
+	}
+		
+	@Override
+	public XMLSerialize clone() {
+		XMLSerialize clone = new XMLSerialize();
+		return clone;
+	}
+	
+	@Override
+	public int hashCode() {
+		return expression.hashCode();
+	}
+	
+	public boolean equals(Object obj) {
+		if (obj == this) {
+			return true;
+		}
+		if (!(obj instanceof XMLSerialize)) {
+			return false;
+		}
+		XMLSerialize other = (XMLSerialize)obj;
+		return document == other.document 
+			&& this.expression.equals(other.expression)
+			&& this.getType() == other.getType();
+	}
+	
+	@Override
+	public String toString() {
+		return SQLStringVisitor.getSQLString(this);
+	}
+	
+}


Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/symbol/XMLSerialize.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -49,18 +49,22 @@
 import org.teiid.query.sql.lang.StoredProcedure;
 import org.teiid.query.sql.lang.SubqueryCompareCriteria;
 import org.teiid.query.sql.lang.SubquerySetCriteria;
+import org.teiid.query.sql.lang.XMLTable;
+import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
+import org.teiid.query.sql.symbol.DerivedColumn;
+import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
-import org.teiid.query.sql.symbol.XMLAttributes;
-import org.teiid.query.sql.symbol.XMLForest;
+import org.teiid.query.sql.symbol.XMLElement;
+import org.teiid.query.sql.symbol.XMLSerialize;
 
 
 /**
@@ -88,15 +92,29 @@
     }
     
     @Override
-    public void visit(XMLForest obj) {
-    	replaceSymbols(obj.getArgs(), true);
+    public void visit(DerivedColumn obj) {
+    	Expression original = obj.getExpression();
+    	obj.setExpression(replaceExpression(original));
+    	if (obj.isPropagateName() && obj.getAlias() == null && !(obj.getExpression() instanceof ElementSymbol) && original instanceof ElementSymbol) {
+    		obj.setAlias(((ElementSymbol)original).getShortName());
+    	}
     }
     
     @Override
-    public void visit(XMLAttributes obj) {
-    	replaceSymbols(obj.getArgs(), true);
+    public void visit(XMLTable obj) {
+    	for (XMLColumn col : obj.getColumns()) {
+    		Expression exp = col.getDefaultExpression();
+    		if (exp != null) {
+    			col.setDefaultExpression(replaceExpression(exp));
+    		}
+		}
     }
-
+    
+    @Override
+    public void visit(XMLSerialize obj) {
+    	obj.setExpression(replaceExpression(obj.getExpression()));
+    }
+    
     private void replaceSymbols(List symbols, boolean alias) {
         for (int i = 0; i < symbols.size(); i++) {
             Object symbol = symbols.get(i);
@@ -359,4 +377,11 @@
         }
     }
     
+    @Override
+    public void visit(XMLElement obj) {
+    	for (int i = 0; i < obj.getContent().size(); i++) {
+    		obj.getContent().set(i, replaceExpression(obj.getContent().get(i)));
+    	}
+    }
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -32,6 +32,7 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.StringUtil;
 import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.language.SQLReservedWords.Tokens;
 import org.teiid.query.function.FunctionLibrary;
 import org.teiid.query.sql.LanguageObject;
@@ -78,8 +79,9 @@
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
-import org.teiid.query.sql.lang.XQuery;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.TextTable.TextColumn;
+import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
 import org.teiid.query.sql.proc.BreakStatement;
@@ -101,6 +103,7 @@
 import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.sql.symbol.DerivedColumn;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
@@ -115,6 +118,7 @@
 import org.teiid.query.sql.symbol.XMLElement;
 import org.teiid.query.sql.symbol.XMLForest;
 import org.teiid.query.sql.symbol.XMLNamespaces;
+import org.teiid.query.sql.symbol.XMLSerialize;
 import org.teiid.query.sql.symbol.XMLNamespaces.NamespaceItem;
 import org.teiid.translator.SourceSystemFunctions;
 
@@ -961,17 +965,6 @@
         }
     }
 
-    public void visit(XQuery obj) {
-        // XQuery string
-        parts.add(obj.getXQuery());
-
-        // Option clause
-        if(obj.getOption() != null) {
-            parts.add(SPACE);
-            parts.add(registerNode(obj.getOption()));
-        }        
-    }
-
     public void visit(StoredProcedure obj) {
     	addCacheHint(obj);
         //exec clause
@@ -1249,7 +1242,7 @@
 			}
 			parts.add(")"); //$NON-NLS-1$
 
-        } else if(name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPADD) || name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPDIFF)) {
+        } else if(name.equalsIgnoreCase(NonReserved.TIMESTAMPADD) || name.equalsIgnoreCase(NonReserved.TIMESTAMPDIFF)) {
             parts.add(name);
             parts.add("("); //$NON-NLS-1$
 
@@ -1274,11 +1267,15 @@
     }
     
     private void registerNodes(LanguageObject[] objects, int begin) {
-    	for (int i = begin; i < objects.length; i++) {
+    	registerNodes(Arrays.asList(objects), begin);
+    }
+    
+    private void registerNodes(List<? extends LanguageObject> objects, int begin) {
+    	for (int i = begin; i < objects.size(); i++) {
     		if (i > 0) {
     			parts.add(", "); //$NON-NLS-1$
     		}
-			parts.add(registerNode(objects[i]));
+			parts.add(registerNode(objects.get(i)));
 		}
     }
 
@@ -1559,7 +1556,7 @@
     public void visit(XMLAttributes obj) {
     	parts.add(FunctionLibrary.XMLATTRIBUTES);
     	parts.add("("); //$NON-NLS-1$
-    	registerNodes(obj.getArgs().toArray(new LanguageObject[obj.getArgs().size()]), 0);
+    	registerNodes(obj.getArgs(), 0);
     	parts.add(")"); //$NON-NLS-1$
     }
     
@@ -1579,7 +1576,7 @@
     	if (!obj.getContent().isEmpty()) {
     		parts.add(", "); //$NON-NLS-1$
     	}
-		registerNodes(obj.getContent().toArray(new LanguageObject[obj.getContent().size()]), 0);
+		registerNodes(obj.getContent(), 0);
     	parts.add(")"); //$NON-NLS-1$
     }
     
@@ -1591,7 +1588,7 @@
     		parts.add(registerNode(obj.getNamespaces()));
     		parts.add(", "); //$NON-NLS-1$
     	}
-    	registerNodes(obj.getArgs().toArray(new LanguageObject[obj.getArgs().size()]), 0);
+    	registerNodes(obj.getArgs(), 0);
     	parts.add(")"); //$NON-NLS-1$
     }
     
@@ -1605,9 +1602,8 @@
     			if (item.getUri() == null) {
     				parts.add("NO DEFAULT"); //$NON-NLS-1$
     			} else {
-	    			parts.add("DEFAULT '"); //$NON-NLS-1$
+	    			parts.add("DEFAULT "); //$NON-NLS-1$
 	    			parts.add(registerNode(new Constant(item.getUri())));
-	        		parts.add("'"); //$NON-NLS-1$
     			}
     		} else {
     			parts.add(registerNode(new Constant(item.getUri())));
@@ -1637,7 +1633,7 @@
     	parts.add("TEXTTABLE("); //$NON-NLS-1$
     	parts.add(registerNode(obj.getFile()));
     	parts.add(SPACE);
-    	parts.add("COLUMNS"); //$NON-NLS-1$
+    	parts.add(NonReserved.COLUMNS);
     	
     	for (Iterator<TextColumn> cols = obj.getColumns().iterator(); cols.hasNext();) {
     		TextColumn col = cols.next();
@@ -1647,7 +1643,7 @@
     		parts.add(col.getType());
     		if (col.getWidth() != null) {
         		parts.add(SPACE);
-    			parts.add("WIDTH"); //$NON-NLS-1$
+    			parts.add(NonReserved.WIDTH);
             	parts.add(SPACE);
     			parts.add(col.getWidth());
     		}
@@ -1657,7 +1653,7 @@
 		}
     	if (obj.getDelimiter() != null) {
         	parts.add(SPACE);
-    		parts.add("DELIMITER"); //$NON-NLS-1$
+    		parts.add(NonReserved.DELIMITER);
         	parts.add(SPACE);
     		parts.add(registerNode(new Constant(obj.getDelimiter())));
     	}
@@ -1666,14 +1662,14 @@
         	if (obj.isEscape()) {
         		parts.add(SQLReservedWords.ESCAPE);
         	} else {
-        		parts.add("QUOTE"); //$NON-NLS-1$
+        		parts.add(NonReserved.QUOTE);
         	}
         	parts.add(SPACE);
     		parts.add(registerNode(new Constant(obj.getQuote())));
     	}
     	if (obj.getHeader() != null) {
         	parts.add(SPACE);
-    		parts.add("HEADER"); //$NON-NLS-1$
+    		parts.add(NonReserved.HEADER);
     		if (1 != obj.getHeader()) {
 	        	parts.add(SPACE);
 	    		parts.add(obj.getHeader());
@@ -1692,6 +1688,91 @@
 		outputDisplayName(obj.getName());
     }
 
+    @Override
+    public void visit(XMLTable obj) {
+    	parts.add("XMLTABLE("); //$NON-NLS-1$
+    	if (obj.getNamespaces() != null) {
+    		parts.add(registerNode(obj.getNamespaces()));
+    		parts.add(","); //$NON-NLS-1$
+    		parts.add(SPACE);
+    	}
+    	parts.add(new Constant(obj.getXquery()));
+    	if (!obj.getPassing().isEmpty()) {
+    		parts.add(SPACE);
+        	parts.add(NonReserved.PASSING);
+        	parts.add(SPACE);
+	    	registerNodes(obj.getPassing(), 0);
+    	}
+    	if (!obj.getColumns().isEmpty()) {
+    		parts.add(SPACE);
+        	parts.add(NonReserved.COLUMNS);
+	    	for (Iterator<XMLColumn> cols = obj.getColumns().iterator(); cols.hasNext();) {
+	    		XMLColumn col = cols.next();
+	    		parts.add(SPACE);
+	    		outputDisplayName(col.getName());
+	    		parts.add(SPACE);
+	    		if (col.isOrdinal()) {
+	    			parts.add(SQLReservedWords.FOR);
+	    			parts.add(SPACE);
+	    			parts.add(NonReserved.ORDINALITY); 
+	    		} else {
+	    			parts.add(col.getType());
+		    		if (col.getPath() != null) {
+		        		parts.add(SPACE);
+		    			parts.add(NonReserved.PATH); 
+		            	parts.add(SPACE);
+		    			parts.add(new Constant(col.getPath()));
+		    		}
+		    		if (col.getDefaultExpression() != null) {
+		        		parts.add(SPACE);
+		    			parts.add(SQLReservedWords.DEFAULT);
+		            	parts.add(SPACE);
+		    			parts.add(registerNode(col.getDefaultExpression()));
+		    		}
+	    		}
+	    		if (cols.hasNext()) {
+	    			parts.add(","); //$NON-NLS-1$
+	    		}
+			}
+    	}
+    	parts.add(")");//$NON-NLS-1$
+    	parts.add(SPACE);
+    	parts.add(SQLReservedWords.AS);
+    	parts.add(SPACE);
+		outputDisplayName(obj.getName());
+    }
+    
+    @Override
+    public void visit(DerivedColumn obj) {
+    	parts.add(registerNode(obj.getExpression()));
+    	if (obj.getAlias() != null) {
+    		parts.add(SPACE);
+    		parts.add(SQLReservedWords.AS);
+    		parts.add(SPACE);
+    		outputDisplayName(obj.getAlias());
+    	}
+    }
+    
+    @Override
+    public void visit(XMLSerialize obj) {
+    	parts.add(SQLReservedWords.XMLSERIALIZE);
+    	parts.add(SQLReservedWords.Tokens.LPAREN);
+    	if (obj.isDocument()) {
+    		parts.add(SQLReservedWords.NonReserved.DOCUMENT);
+    	} else {
+    		parts.add(SQLReservedWords.NonReserved.CONTENT);
+    	}
+    	parts.add(SPACE);
+    	parts.add(registerNode(obj.getExpression()));
+    	if (obj.getTypeString() != null) {
+    		parts.add(SPACE);
+        	parts.add(SQLReservedWords.AS);
+        	parts.add(SPACE);
+        	parts.add(obj.getTypeString());
+    	}
+    	parts.add(SQLReservedWords.Tokens.RPAREN);
+    }
+
     public static String escapeSinglePart(String part) {
     	if(isReservedWord(part)) {
     	    return ID_ESCAPE_CHAR + part + ID_ESCAPE_CHAR;

Modified: trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/validator/AggregateValidationVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,6 +27,7 @@
 
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
@@ -72,12 +73,12 @@
         
         // Verify data type of aggregate expression
         String aggregateFunction = obj.getAggregateFunction();
-        if((aggregateFunction.equals(SQLReservedWords.SUM) || aggregateFunction.equals(SQLReservedWords.AVG)) && obj.getType() == null) {
+        if((aggregateFunction.equals(NonReserved.SUM) || aggregateFunction.equals(NonReserved.AVG)) && obj.getType() == null) {
             handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0041, new Object[] {aggregateFunction, obj}), obj);
         } else if (aggregateFunction.equals(SQLReservedWords.XMLAGG) && obj.getType() != DataTypeManager.DefaultDataClasses.XML) {
-        	handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj);
+        	handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
         }
-        if((obj.isDistinct() || aggregateFunction.equals(SQLReservedWords.MIN) || aggregateFunction.equals(SQLReservedWords.MAX)) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
+        if((obj.isDistinct() || aggregateFunction.equals(NonReserved.MIN) || aggregateFunction.equals(NonReserved.MAX)) && DataTypeManager.isNonComparable(DataTypeManager.getDataTypeName(aggExp.getType()))) {
     		handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_comparable", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$
         }
         validateBelow = false;

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,10 +31,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import javax.xml.xpath.XPathExpressionException;
+import net.sf.saxon.trans.XPathException;
 
 import org.teiid.api.exception.query.ExpressionEvaluationException;
-import org.teiid.api.exception.query.FunctionExecutionException;
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.core.TeiidComponentException;
@@ -81,7 +80,9 @@
 import org.teiid.query.sql.lang.SubquerySetCriteria;
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.Update;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.SetQuery.Operation;
+import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.sql.navigator.PreOrderNavigator;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
@@ -94,6 +95,7 @@
 import org.teiid.query.sql.symbol.AbstractCaseExpression;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.sql.symbol.DerivedColumn;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
@@ -103,6 +105,7 @@
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.symbol.XMLAttributes;
 import org.teiid.query.sql.symbol.XMLForest;
+import org.teiid.query.sql.symbol.XMLNamespaces;
 import org.teiid.query.sql.util.SymbolMap;
 import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
 import org.teiid.query.sql.visitor.CommandCollectorVisitor;
@@ -327,24 +330,16 @@
                 // can't use this pseudo-function in non-XML queries
                 handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.The_rowlimit_function_cannot_be_used_in_a_non-XML_command"), obj); //$NON-NLS-1$
             }
-        } else if(obj.getFunctionDescriptor().getName().equalsIgnoreCase(SourceSystemFunctions.XPATHVALUE) || obj.getFunctionDescriptor().getName().equalsIgnoreCase(SourceSystemFunctions.XPATHQUERY)) {
+        } else if(obj.getFunctionDescriptor().getName().equalsIgnoreCase(SourceSystemFunctions.XPATHVALUE)) {
 	        // Validate the xpath value is valid
 	        if(obj.getArgs()[1] instanceof Constant) {
 	            Constant xpathConst = (Constant) obj.getArgs()[1];
                 try {
                     XMLSystemFunctions.validateXpath((String)xpathConst.getValue());
-                } catch(XPathExpressionException e) {
+                } catch(XPathException e) {
                 	handleValidationError(QueryPlugin.Util.getString("QueryResolver.invalid_xpath", e.getMessage()), obj); //$NON-NLS-1$
                 }
 	        }
-	        if (obj.getArgs().length > 2 && obj.getArgs()[2] instanceof Constant) {
-	            Constant xpathConst = (Constant) obj.getArgs()[2];
-                try {
-                    XMLSystemFunctions.getNamespaces((String)xpathConst.getValue());
-                } catch(FunctionExecutionException e) {
-                	handleValidationError(e.getMessage(), obj);
-                }
-	        }
 	    }
     }
 
@@ -1071,7 +1066,7 @@
         // Validate use of 'rowlimit' and 'rowlimitexception' pseudo-functions - they cannot be nested within another
         // function, and their operands must be a nonnegative integers
 
-        // Collect all occurrances of rowlimit function
+        // Collect all occurrences of rowlimit function
         List rowLimitFunctions = new ArrayList();
         FunctionCollectorVisitor visitor = new FunctionCollectorVisitor(rowLimitFunctions, FunctionLibrary.ROWLIMIT);
         PreOrderNavigator.doVisit(obj, visitor);   
@@ -1142,24 +1137,85 @@
     }
     
     @Override
+    public void visit(XMLForest obj) {
+    	for (DerivedColumn dc : obj.getArgs()) {
+    		if (dc.getAlias() == null && !(dc.getExpression() instanceof ElementSymbol)) {
+    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.expression_requires_name"), obj); //$NON-NLS-1$
+        	}	
+		}
+    }
+    
+    @Override
     public void visit(XMLAttributes obj) {
-    	for (SingleElementSymbol arg : obj.getArgs()) {
-    		if (arg instanceof ExpressionSymbol) {
-    			handleValidationError("ValidationVisitor.expression_requires_name", arg); //$NON-NLS-1$
-    		}
+    	for (DerivedColumn dc : obj.getArgs()) {
+    		if (dc.getAlias() == null && !(dc.getExpression() instanceof ElementSymbol)) {
+    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.expression_requires_name"), obj); //$NON-NLS-1$
+        	}	
 		}
     }
     
     @Override
-    public void visit(XMLForest obj) {
-    	for (SingleElementSymbol arg : obj.getArgs()) {
-    		if (arg instanceof ExpressionSymbol) {
-    			handleValidationError("ValidationVisitor.expression_requires_name", arg); //$NON-NLS-1$
-    		}
+    public void visit(XMLTable obj) {
+    	boolean context = false;
+    	boolean hadError = false;
+    	HashSet<String> names = new HashSet<String>();
+    	for (DerivedColumn dc : obj.getPassing()) {
+    		if (dc.getAlias() == null) {
+    			Class<?> type = dc.getExpression().getType();
+    			if (type != DataTypeManager.DefaultDataClasses.STRING &&
+    				type != DataTypeManager.DefaultDataClasses.XML &&
+    				type != DataTypeManager.DefaultDataClasses.CLOB) {
+    				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.context_item_type"), obj); //$NON-NLS-1$
+    			}
+    			if (context && !hadError) {
+    				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.passing_requires_name"), obj); //$NON-NLS-1$
+    				hadError = true;
+    			}
+    			context = true;
+        	} else if (!names.add(dc.getAlias().toUpperCase())) {
+    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_passing", dc.getAlias()), obj); //$NON-NLS-1$
+        	}
 		}
+    	boolean hasOrdinal = false;
+    	for (XMLColumn xc : obj.getColumns()) {
+			if (!xc.isOrdinal()) {
+				if (xc.getDefaultExpression() != null && !EvaluatableVisitor.isFullyEvaluatable(obj, false)) {
+					handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_default", xc.getDefaultExpression()), obj); //$NON-NLS-1$
+				}
+				continue;
+			}
+			if (hasOrdinal) {
+				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.one_ordinal"), obj); //$NON-NLS-1$
+				break;
+			}
+			hasOrdinal = true;
+		}
     }
     
     @Override
+    public void visit(XMLNamespaces obj) {
+    	boolean hasDefault = false;
+    	boolean noDefault = false;
+    	for (XMLNamespaces.NamespaceItem item : obj.getNamespaceItems()) {
+			if (item.getPrefix() != null) {
+				if (item.getPrefix().equals("xml") || item.getPrefix().equals("xmlns")) { //$NON-NLS-1$ //$NON-NLS-2$
+					handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_namespaces_reserved"), obj); //$NON-NLS-1$
+				}
+				continue;
+			}
+			if (hasDefault || noDefault) {
+				handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_namespaces"), obj); //$NON-NLS-1$
+				break;
+			}
+			if (item.getUri() == null) { 
+				noDefault = true;
+			} else {
+				hasDefault = true;
+			}
+		}
+    }
+    
+    @Override
     public void visit(TextTable obj) {
     	boolean widthSet = false;
     	Character delimiter = null;

Deleted: trunk/engine/src/main/java/org/teiid/query/xquery/XQueryExpression.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/XQueryExpression.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/XQueryExpression.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,70 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.xquery;
-
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.types.XMLTranslator;
-
-/**
- * An XQueryExpression - the object representation of
- * a compiled XQuery.  Must be thread-safe and immutable.
- */
-public interface XQueryExpression {
-    
-    /**
-     * Return the compiled XQueryExpression - the result of this
-     * call should be used as a parameter to the 
-     * {@link #getDocumentNames getDocumentNames} and
-     * {@link #evaluateXQuery evaluateXQuery} methods.
-     * A null return value is interpreted to mean that XQueries
-     * are not supported by this engine at all.
-     * @param xQueryString the original XQuery String
-     * @throws TeiidProcessingException if xQueryString is
-     * invalid and fails to compile
-     */
-    public void compileXQuery(String xQueryString)
-    throws TeiidProcessingException;
-
-    
-    /**
-     * Evaluate the XQuery and return results.  A null return
-     * value is interpreted to mean that XQueries are not supported
-     * by this engine.
-     * @param compiledXQuery compiled XQueryExpression
-     * @throws TeiidProcessingException if xQueryString is
-     * invalid and fails to compile
-     */
-    public XMLTranslator evaluateXQuery(XQuerySQLEvaluator sqlEval)
-    throws TeiidProcessingException, TeiidComponentException;
-    
-    
-    /**
-     * This method sets whether the documents should be returned in compact
-     * format (no extraneous whitespace).  Non-compact format is more human-readable
-     * (and bigger).  Additional formats may be possible in future.
-     * @param xmlFormat A string giving the format in which xml results need to be returned
-     */
-    public void setXMLFormat(String xmlFormat);  
-    
-}

Deleted: trunk/engine/src/main/java/org/teiid/query/xquery/XQuerySQLEvaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/XQuerySQLEvaluator.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/XQuerySQLEvaluator.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,55 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.xquery;
-
-import javax.xml.transform.Source;
-
-import org.teiid.api.exception.query.ExpressionEvaluationException;
-import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.common.buffer.BlockedException;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-
-
-
-/** 
- * @since 4.3
- */
-public interface XQuerySQLEvaluator {
-
-    /**
-     * Execute a SQL string that returns an XML result
-     * @param sql SQL string, typically an EXEC against an xml service or virtual document
-     * @throws QueryParserException If sql parameter is not sql  
-     * @throws TeiidProcessingException If execution of the sql fails due to a bad query
-     * @throws TeiidComponentException If execution of the sql fails due to an internal failure
-     */ 
-    Source executeSQL(String sql) throws QueryParserException, TeiidProcessingException, TeiidComponentException;
-    
-    /**
-     * Closes any resources opened during the evaluation 
-     */
-    void close() throws TeiidComponentException ;
-
-	Object getParameterValue(String key) throws ExpressionEvaluationException, BlockedException, TeiidComponentException;
-}

Deleted: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocFunctionURIResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocFunctionURIResolver.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocFunctionURIResolver.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,79 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.xquery.saxon;
-
-import java.util.Map;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.URIResolver;
-import javax.xml.transform.stream.StreamSource;
-
-import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.query.xquery.XQuerySQLEvaluator;
-
-
-
-/** 
- * A URI resolver for XQuery 'doc' function. This resolver is knows
- * how to handle SQL calls from this URI, such that it can execute the 
- * SQL and return the results in the form of XML which 'doc' understands.
- */
-public class DocFunctionURIResolver implements URIResolver {
-
-    private Map virtualDocuments;
-    private XQuerySQLEvaluator sqlEval;
-    
-    public DocFunctionURIResolver(Map virtualDocuments, XQuerySQLEvaluator sqlEval) {
-        this.virtualDocuments = virtualDocuments;
-        this.sqlEval = sqlEval;
-    }
-
-    public Source resolve(String href, String base) throws TransformerException {
-        Source doc = null;
-        
-        if (this.virtualDocuments != null){
-            doc = new StreamSource((String)this.virtualDocuments.get(href.toUpperCase()));
-        }
-        
-        if(doc == null) {        
-            // Attempt to parse dynamic sql string
-            try {
-                doc = sqlEval.executeSQL(href);
-    
-            } catch(QueryParserException e) {
-                // ignore - fall through and try as URI
-            } catch(Exception e) {
-                throw new TransformerException(e.getMessage(), e);
-            }
-        }
-
-        if(doc != null) {
-            return doc;
-        }
-
-        //Will cause standard URI resolver to kick in
-        return null;
-    }
-
-}

Added: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,194 @@
+package org.teiid.query.xquery.saxon;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.sf.saxon.event.ProxyReceiver;
+import net.sf.saxon.expr.AxisExpression;
+import net.sf.saxon.expr.PathMap.PathMapArc;
+import net.sf.saxon.expr.PathMap.PathMapNode;
+import net.sf.saxon.expr.PathMap.PathMapRoot;
+import net.sf.saxon.om.Axis;
+import net.sf.saxon.om.Item;
+import net.sf.saxon.pattern.NodeTest;
+import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.type.Type;
+
+/**
+ * A filter that uses the PathMap to determine what should be included in the document
+ * 
+ * TODO: optimize filtering by not reconstructing the matchcontexts
+ * TODO: we may still need to do xom/nux style handling of large results, but 
+ *       that requires more analysis to determine subtree independence
+ */
+class PathMapFilter extends ProxyReceiver {
+	
+	static class MatchContext {
+		List<PathMapArc> elementArcs;
+		List<PathMapArc> attributeArcs;
+		boolean matchedElement;
+		boolean matchesText;
+		boolean matchesComment;
+		
+		void bulidContext(PathMapNode node) {
+			for (PathMapArc arc : node.getArcs()) {
+    			processArc(arc);
+			}
+		}
+
+		void processArc(PathMapArc arc) {
+			AxisExpression ae = arc.getStep();
+			NodeTest test = ae.getNodeTest();
+			if (test == null) {
+				addAnyNodeArc(arc);
+			} else {
+				switch (test.getPrimitiveType()) {
+				case Type.TEXT:
+					matchesText = true;
+				case Type.NODE:
+					addAnyNodeArc(arc);
+					break;
+				case Type.COMMENT:
+					matchesComment = true;
+					break;
+				case Type.ELEMENT:
+					addElementArc(arc);
+					break;
+				case Type.ATTRIBUTE:
+					addAttributeArc(arc);
+					break;
+				}
+			}
+		}
+
+		private void addAnyNodeArc(PathMapArc arc) {
+			if (arc.getStep().getAxis() == Axis.ATTRIBUTE) {
+				addAttributeArc(arc);
+				return;	
+			}
+			addElementArc(arc);
+			addAttributeArc(arc);
+			matchesText = true;
+			matchesComment = true;
+		}
+
+		private void addAttributeArc(PathMapArc arc) {
+			if (attributeArcs == null) {
+				attributeArcs = new LinkedList<PathMapArc>();
+			}
+			attributeArcs.add(arc);
+		}
+
+		private void addElementArc(PathMapArc arc) {
+			if (elementArcs == null) {
+				elementArcs = new LinkedList<PathMapArc>();
+			}
+			elementArcs.add(arc);
+		}
+	}
+
+	
+	private LinkedList<MatchContext> matchContext = new LinkedList<MatchContext>();
+	
+	public PathMapFilter(PathMapRoot root) {
+		MatchContext mc = new MatchContext();
+		mc.bulidContext(root);
+		matchContext.add(mc);
+	}
+	
+	@Override
+	public void startElement(int nameCode, int typeCode,
+			int locationId, int properties)
+			throws XPathException {
+		MatchContext mc = matchContext.getLast();
+		MatchContext newContext = new MatchContext();
+		if (mc.elementArcs != null) {
+			for (PathMapArc arc : mc.elementArcs) {
+				AxisExpression ae = arc.getStep();
+				NodeTest test = ae.getNodeTest();
+				if (test == null || test.matches(Type.ELEMENT, nameCode, typeCode)) {
+					newContext.bulidContext(arc.getTarget());
+					newContext.matchedElement = true;
+				} 
+				if (ae.getAxis() == Axis.DESCENDANT || ae.getAxis() == Axis.DESCENDANT_OR_SELF) {
+					newContext.processArc(arc);
+				}
+			}
+		}
+		matchContext.add(newContext);
+		if (newContext.matchedElement) {
+			super.startElement(nameCode, typeCode, locationId, properties);
+		}
+	}
+	
+	@Override
+	public void attribute(int nameCode, int typeCode,
+			CharSequence value, int locationId, int properties)
+			throws XPathException {
+		MatchContext mc = matchContext.getLast();
+		if (!mc.matchedElement) {
+			return;
+		}
+		if (mc.attributeArcs != null) {
+			for (PathMapArc arc : mc.attributeArcs) {
+				AxisExpression ae = arc.getStep();
+				NodeTest test = ae.getNodeTest();
+				if (test == null || test.matches(Type.ATTRIBUTE, nameCode, typeCode)) {
+					super.attribute(nameCode, typeCode, value, locationId, properties);
+					return;
+				} 
+			}
+		}
+	}
+
+	@Override
+	public void characters(CharSequence chars, int locationId,
+			int properties) throws XPathException {
+		MatchContext context = matchContext.getLast();
+		if (context.matchedElement && context.matchesText) {
+			super.characters(chars, locationId, properties);
+		}
+	}
+
+	@Override
+	public void comment(CharSequence chars, int locationId,
+			int properties) throws XPathException {
+		MatchContext context = matchContext.getLast();
+		if (context.matchedElement && context.matchesComment) {
+			super.comment(chars, locationId, properties);
+		}
+	}
+
+	@Override
+	public void processingInstruction(String target,
+			CharSequence data, int locationId, int properties)
+			throws XPathException {
+		MatchContext context = matchContext.getLast();
+		if (context.matchedElement) {
+			super.processingInstruction(target, data, locationId, properties);
+		}
+	}
+
+	@Override
+	public void namespace(int namespaceCode, int properties)
+			throws XPathException {
+		MatchContext context = matchContext.getLast();
+		if (context.matchedElement) {
+			super.namespace(namespaceCode, properties);
+		}
+	}
+
+	@Override
+	public void endElement() throws XPathException {
+		MatchContext context = matchContext.removeLast();
+		if (context.matchedElement) {
+			super.endElement();
+		}
+	}
+
+	@Override
+	public void append(Item item, int locationId,
+			int copyNamespaces) throws XPathException {
+		super.append(item, locationId, copyNamespaces);
+	}
+}
\ No newline at end of file


Property changes on: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -22,54 +22,96 @@
 
 package org.teiid.query.xquery.saxon;
 
-import java.io.Writer;
+import java.io.StringReader;
+import java.sql.Clob;
 import java.sql.SQLException;
 import java.sql.SQLXML;
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Source;
 import javax.xml.transform.TransformerException;
-import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
 
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.types.XMLTranslator;
-import org.teiid.query.QueryPlugin;
-import org.teiid.query.util.XMLFormatConstants;
-import org.teiid.query.xquery.XQueryExpression;
-import org.teiid.query.xquery.XQuerySQLEvaluator;
-
+import net.sf.saxon.AugmentedSource;
 import net.sf.saxon.Configuration;
-import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.event.ProxyReceiver;
+import net.sf.saxon.expr.AxisExpression;
+import net.sf.saxon.expr.Expression;
+import net.sf.saxon.expr.PathMap;
+import net.sf.saxon.expr.PathMap.PathMapArc;
+import net.sf.saxon.expr.PathMap.PathMapNode;
+import net.sf.saxon.expr.PathMap.PathMapNodeSet;
+import net.sf.saxon.expr.PathMap.PathMapRoot;
+import net.sf.saxon.om.Axis;
+import net.sf.saxon.om.DocumentInfo;
+import net.sf.saxon.om.SequenceIterator;
+import net.sf.saxon.om.StructuredQName;
+import net.sf.saxon.pattern.AnyNodeTest;
+import net.sf.saxon.pattern.NodeKindTest;
 import net.sf.saxon.query.DynamicQueryContext;
 import net.sf.saxon.query.QueryResult;
 import net.sf.saxon.query.StaticQueryContext;
+import net.sf.saxon.query.XQueryExpression;
+import net.sf.saxon.sxpath.IndependentContext;
+import net.sf.saxon.sxpath.XPathEvaluator;
+import net.sf.saxon.sxpath.XPathExpression;
+import net.sf.saxon.trace.ExpressionPresenter;
 import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.type.ItemType;
+import net.sf.saxon.type.TypeHierarchy;
+import net.sf.saxon.value.SequenceType;
 
+import org.teiid.api.exception.query.QueryResolverException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.types.ClobType;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.types.XMLType;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.query.QueryPlugin;
+import org.teiid.query.sql.lang.XMLTable;
+import org.teiid.query.sql.lang.XMLTable.XMLColumn;
+import org.teiid.query.sql.symbol.DerivedColumn;
+import org.teiid.query.sql.symbol.XMLNamespaces;
+import org.teiid.query.sql.symbol.XMLNamespaces.NamespaceItem;
 
-/**
- * Saxon implementation of MetaMatrix XQueryExpression
- */
-public class SaxonXQueryExpression implements XQueryExpression {
+public class SaxonXQueryExpression {
+	
+	private static final Expression DUMMY_EXPRESSION = new Expression() {
+		@Override
+		public ItemType getItemType(TypeHierarchy th) {
+			return null;
+		}
 
-    /**
-     * Regex used to match the external parameter declarations and return parameter names and types (if defined).
-     */
-    private static final Pattern EXTERNAL_VARIABLE_PATTERN = Pattern.compile("declare\\s+variable\\s+\\$(\\S+)(?:\\s+as\\s+(\\S+))?\\s+external(?:\\s+)?;");   //$NON-NLS-1$    
-    
-    private String xQueryString;
-    private net.sf.saxon.query.XQueryExpression xQuery;    
-    private Map virtualDocuments;
-    private String xmlFormat;
-    private Map<String, String> paramDeclarations;
+		@Override
+		public void explain(ExpressionPresenter out) {
+		}
 
-    // Create a default error listener to use when compiling - this prevents 
+		@Override
+		public Expression copy() {
+			return null;
+		}
+
+		@Override
+		protected int computeCardinality() {
+			return 0;
+		}
+
+		@Override
+		public PathMapNodeSet addToPathMap(PathMap pathMap,
+				PathMapNodeSet pathMapNodeSet) {
+			return pathMapNodeSet;
+		}
+	};
+
+	// Create a default error listener to use when compiling - this prevents 
     // errors from being printed to System.err.
     private static final ErrorListener ERROR_LISTENER = new ErrorListener() {
         public void warning(TransformerException arg0) throws TransformerException {
@@ -79,63 +121,178 @@
         public void fatalError(TransformerException arg0) throws TransformerException {
         }       
     };
-       
-    /**
-     * @see com.metamatrix.query.xquery.XQueryEngine#compileXQuery(java.lang.String)
-     */
-    public void compileXQuery(String xQueryString) 
-    throws TeiidProcessingException{
-        
-        this.xQueryString = xQueryString;
-        
-        Configuration config = new Configuration();
+
+	private net.sf.saxon.query.XQueryExpression xQuery;    
+	private PathMap.PathMapRoot contextRoot;
+	private Configuration config = new Configuration();
+	
+    public SaxonXQueryExpression(String xQueryString, XMLNamespaces namespaces, List<DerivedColumn> passing, List<XMLTable.XMLColumn> columns) 
+    throws TeiidProcessingException {
         config.setErrorListener(ERROR_LISTENER);
+        StaticQueryContext context = new StaticQueryContext(config);
+        IndependentContext ic = new IndependentContext(config);
         
-        StaticQueryContext context = new StaticQueryContext(config);
-
-        try {
-            this.xQuery = context.compileQuery(xQueryString);
-        }catch(XPathException e) {
-            throw new TeiidProcessingException(e);
+        if (namespaces != null) {
+        	for (NamespaceItem item : namespaces.getNamespaceItems()) {
+        		if (item.getPrefix() == null) {
+        			if (item.getUri() == null) {
+        				context.setDefaultElementNamespace(""); //$NON-NLS-1$
+        				ic.setDefaultElementNamespace(""); //$NON-NLS-1$
+        			} else {
+        				context.setDefaultElementNamespace(item.getUri());
+        				ic.setDefaultElementNamespace(item.getUri());
+        			}
+        		} else {
+    				context.declareNamespace(item.getPrefix(), item.getUri());
+    				ic.declareNamespace(item.getPrefix(), item.getUri());
+        		}
+			}
         }
+    	boolean hasContext = false;
+        for (DerivedColumn derivedColumn : passing) {
+        	if (derivedColumn.getAlias() == null) {
+        		hasContext = true; //skip the context item
+        		continue;
+        	}
+        	try {
+				context.declareGlobalVariable(StructuredQName.fromClarkName(derivedColumn.getAlias()), SequenceType.ANY_SEQUENCE, null, true);
+			} catch (XPathException e) {
+				throw new TeiidRuntimeException(e, "Could not define global variable"); //$NON-NLS-1$ 
+			}
+        	ic.declareVariable("", derivedColumn.getAlias()); //$NON-NLS-1$
+		}
         
-        // Scrape parameter names from xquery prolog
-        parseParameters();
-    }
+        XPathEvaluator eval = new XPathEvaluator(config);
+    	eval.setStaticContext(ic);
+    	
+    	processColumns(columns, eval);	    	
     
-    /**
-     *   declare variable $IN1 as xs:string external; 
-     * 
-     */
-    private void parseParameters() {
-        this.paramDeclarations = new HashMap<String, String>();
-        
-        Matcher matcher = EXTERNAL_VARIABLE_PATTERN.matcher(xQueryString);
-        while(matcher.find()) {
-            String var = matcher.group(1);
-            String type = matcher.group(2);
-            paramDeclarations.put(var, type);
+        try {
+			this.xQuery = context.compileQuery(xQueryString);
+		} catch (XPathException e) {
+			throw new QueryResolverException(e, QueryPlugin.Util.getString("SaxonXQueryExpression.compile_failed")); //$NON-NLS-1$
+		}
+        if (hasContext) {
+        	useDocumentProjection(columns);
+        } else {
+	    	LogManager.logDetail(LogConstants.CTX_QUERY_PLANNER, "Document projection will not be used, since no context item exists or there are unknown dependencies"); //$NON-NLS-1$
         }
     }
+
+	private void useDocumentProjection(List<XMLTable.XMLColumn> columns) {
+		XQueryExpression toAnalyze = this.xQuery;
+		
+		PathMap map = new PathMap(DUMMY_EXPRESSION);
+		PathMapNodeSet set = toAnalyze.getExpression().addToPathMap(map, null);
+		
+		boolean complexEndState = false;
+		if (set != null) {  
+			if (columns != null && !columns.isEmpty()) {
+				if (set.size() != 1) {
+					complexEndState = true;
+				} else {
+					for (XMLColumn xmlColumn : columns) {
+						if (xmlColumn.isOrdinal()) {
+							continue;
+						}
+				    	Expression internalExpression = xmlColumn.getPathExpression().getInternalExpression();
+				    	PathMap subMap = new PathMap(internalExpression);
+				    	PathMapRoot root = subMap.getContextRoot();
+				    	if (root == null) {
+				    		continue;
+				    	}
+				    	PathMapNodeSet finalNodes = internalExpression.addToPathMap(map, set);
+				    	if (finalNodes != null) {
+				    		for (Iterator iter = finalNodes.iterator(); iter.hasNext(); ) {
+				                PathMapNode subNode = (PathMapNode)iter.next();
+						    	if (xmlColumn.getSymbol().getType() == DataTypeManager.DefaultDataClasses.XML) {
+						    		subNode.createArc(new AxisExpression(Axis.DESCENDANT_OR_SELF, AnyNodeTest.getInstance()));
+						    		subNode.setReturnable(true);
+						    	} else {
+						    		//this may not always be needed, but it doesn't harm anything
+						    		subNode.createArc(new AxisExpression(Axis.CHILD, NodeKindTest.TEXT));
+						    		subNode.setAtomized();
+						    	}
+				            }
+				    	}
+					}
+				}
+			} else {
+				for (Iterator iter = set.iterator(); iter.hasNext(); ) {
+	                PathMapNode subNode = (PathMapNode)iter.next();
+	                subNode.createArc(new AxisExpression(Axis.DESCENDANT_OR_SELF, AnyNodeTest.getInstance()));
+	                subNode.setReturnable(true);
+	            }
+			}
+		} 
+		//PathMap map = toAnalyze.getPathMap();
+		contextRoot = map.getContextRoot();
+		if (contextRoot == null || complexEndState || contextRoot.hasUnknownDependencies()) {
+	    	LogManager.logDetail(LogConstants.CTX_QUERY_PLANNER, "Document projection will not be used, since no context item exists or there are unknown dependencies"); //$NON-NLS-1$
+			contextRoot = null;
+		} else if (LogManager.isMessageToBeRecorded(LogConstants.CTX_QUERY_PLANNER, MessageLevel.DETAIL)) {
+	    	StringBuilder sb = new StringBuilder();
+	    	showArcs(sb, contextRoot, 0);
+	    	LogManager.logDetail(LogConstants.CTX_QUERY_PLANNER, "Using path filtering for XQuery context item: \n" + sb.toString()); //$NON-NLS-1$
+		}
+/*		StringBuilder sb = new StringBuilder();
+    	showArcs(sb, contextRoot, 0);
+    	System.out.println(sb);
+*/	}
+
+	private void processColumns(List<XMLTable.XMLColumn> columns, XPathEvaluator eval)
+			throws TeiidProcessingException {
+		if (columns == null) {
+			return;
+		}
+		for (XMLColumn xmlColumn : columns) {
+        	if (xmlColumn.isOrdinal()) {
+        		continue;
+        	}
+        	String path = xmlColumn.getPath();
+        	if (path == null) {
+        		path = xmlColumn.getName();
+        	}
+        	path = path.trim();
+        	if (path.startsWith("/") && !path.startsWith("//")) {
+        		path = path.substring(1);
+        	}
+	    	XPathExpression exp;
+			try {
+				exp = eval.createExpression(path);
+			} catch (XPathException e) {
+				throw new TeiidProcessingException(e, "Invalid path expression");
+			}	
+	    	xmlColumn.setPathExpression(exp);
+		}
+	}
     
-    /**
-     * @see com.metamatrix.query.xquery.XQueryEngine#evaluateXQuery(org.teiid.query.xquery.XQueryExpression)
-     */
-    public XMLTranslator evaluateXQuery(XQuerySQLEvaluator sqlEval) 
-    throws TeiidProcessingException, TeiidComponentException {
-
-        Configuration config = new Configuration();
+    public static Source convertToSource(Object value) throws TeiidProcessingException {
+    	if (value == null) {
+    		return null;
+    	}
+    	try {
+	    	if (value instanceof XMLType) {
+				return ((SQLXML)value).getSource(null);
+	    	}
+	    	if (value instanceof String) {
+	    		return new StreamSource(new StringReader((String)value));
+	    	}
+	    	if (value instanceof ClobType) {
+	    		return new StreamSource(((Clob)value).getCharacterStream());
+	    	}
+    	} catch (SQLException e) {
+			throw new TeiidProcessingException(e);
+		}
+    	throw new AssertionError("Unknown type"); //$NON-NLS-1$
+    }
+    
+    public SequenceIterator evaluateXQuery(Object context, Map<String, Object> parameterValues) throws TeiidProcessingException {
         DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
         
-        // Set URIResolver to handle virtual doc and sql in doc() function
-        dynamicContext.setURIResolver(new DocFunctionURIResolver(this.virtualDocuments, sqlEval));
-        
-        // Set external parameter values (if used in a view with params)
-        for (Map.Entry<String, String> entry : this.paramDeclarations.entrySet()) {
-        	Object value = sqlEval.getParameterValue(entry.getKey());
-            // Check for xml and serialize
-            String type = entry.getValue();
-            if(type != null && type.equals("node()") && value != null) { //$NON-NLS-1$                    
+        for (Map.Entry<String, Object> entry : parameterValues.entrySet()) {
+            Object value = entry.getValue();
+            if(value instanceof SQLXML) {                    
                 try {
                     value = ((SQLXML)value).getSource(null);
                 } catch (SQLException e) {
@@ -145,62 +302,46 @@
             dynamicContext.setParameter(entry.getKey(), value);                
 		}
         
-        // Evaluate
-        List rawResults = null;
+        if (context != null) {
+        	Source source = convertToSource(context);
+            if (contextRoot != null) {
+            	//create our own filter as this logic is not provided in the free saxon
+                ProxyReceiver filter = new PathMapFilter(contextRoot);
+                AugmentedSource sourceInput = AugmentedSource.makeAugmentedSource(source);
+                sourceInput.addFilter(filter);
+                source = sourceInput;
+            }
+            DocumentInfo doc;
+			try {
+				doc = config.buildDocument(source);
+			} catch (XPathException e) {
+				throw new TeiidProcessingException(e);
+			}
+	        dynamicContext.setContextItem(doc);
+        }
         try {
-            rawResults = this.xQuery.evaluate(dynamicContext);
+            //return this.xQuery.iterator(dynamicContext);
+        	QueryResult.serializeSequence(xQuery.iterator(dynamicContext), config, System.out, new Properties());
+        	return null;
         } catch (TransformerException e) {
-            Throwable cause = e.getCause();
-        	while (cause instanceof TransformerException) {
-        		Throwable nestedCause = ((TransformerException)cause).getCause();
-        		if (nestedCause == cause) {
-        			break;
-        		}
-        		cause = nestedCause;
-        	}
-            if(cause instanceof TeiidProcessingException) {
-                throw (TeiidProcessingException) cause;
-            } else if(cause instanceof TeiidComponentException) {
-                throw (TeiidComponentException) cause;
-            }
-            if (cause instanceof RuntimeException) {
-            	throw new TeiidComponentException(e, QueryPlugin.Util.getString("SaxonXQueryExpression.bad_xquery")); //$NON-NLS-1$
-            }
         	throw new TeiidProcessingException(e, QueryPlugin.Util.getString("SaxonXQueryExpression.bad_xquery")); //$NON-NLS-1$
         }       
-        
-        // Read results
-        Iterator i = rawResults.iterator();
-        while (i.hasNext()) {
-            Object obj = i.next();
-            
-            // output
-            if (obj instanceof NodeInfo){
-            	final NodeInfo nodeInfo = (NodeInfo)obj;
-                final Properties props = new Properties();                
-                if (XMLFormatConstants.XML_TREE_FORMAT.equals(this.xmlFormat)) {
-                    props.setProperty("indent", "yes");//$NON-NLS-1$//$NON-NLS-2$
-                }                
-                return new XMLTranslator() {
-					
-					@Override
-					public void translate(Writer writer) throws TransformerException {
-			            QueryResult.serialize(nodeInfo, new StreamResult(writer), props, new Configuration());
-					}
-				};
-            } 
-        }        
-        throw new TeiidProcessingException(QueryPlugin.Util.getString("wrong_result_type")); //$NON-NLS-1$
     }
+    
+    public Configuration getConfig() {
+		return config;
+	}
 
-    /**
-     * This method sets whether the documents should be returned in compact
-     * format (no extraneous whitespace).  Non-compact format is more human-readable
-     * (and bigger).  Additional formats may be possible in future.
-     * @param xmlFormat A string giving the format in which xml results need to be returned
-     */
-    public void setXMLFormat(String xmlFormat) {
-        this.xmlFormat = xmlFormat;
-    }
-    
+	public static void showArcs(StringBuilder sb, PathMapNode node, int level) {
+		for (PathMapArc pathMapArc : node.getArcs()) {
+			char[] pad = new char[level*2];
+			Arrays.fill(pad, ' ');
+			sb.append(new String(pad));
+			sb.append(pathMapArc.getStep());
+			sb.append('\n');
+			node = pathMapArc.getTarget();
+			showArcs(sb, node, level + 1);
+		}
+	}
+
 }

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2010-06-04 21:51:29 UTC (rev 2181)
@@ -28,6 +28,7 @@
  * file.  <B>WARNING:</B> DO NOT MODIFY the SQLParser.java file as it will be 
  * regenerated from the .jj file and your changes will be lost!</p>
  */
+ at SuppressWarnings("nls")
 public class SQLParser extends SQLParserUtil {
 
 } // end class
@@ -89,15 +90,6 @@
 {
 	<CAST: "cast">
 |	<CONVERT: "convert">
-|   <TIMESTAMPADD: "timestampadd">
-|   <TIMESTAMPDIFF: "timestampdiff">
-
-/* aggregate */
-|	<COUNT: "count">
-|	<SUM: "sum">
-|	<AVG: "avg">
-|	<MIN: "min">
-|	<MAX: "max">
 }
 
 TOKEN : /* Reserved words */
@@ -163,7 +155,6 @@
 |   <FALSE: "false">
 |   <FETCH: "fetch">
 |   <FILTER: "filter">
-|   <FN: "fn">
 |   <FOR: "for">
 |   <FORIEGN: "foriegn">
 |   <FROM: "from">
@@ -221,7 +212,6 @@
 |   <OLD: "old">
 |   <ON: "on">
 |   <ONLY: "only">
-|   <OJ: "oj">
 |   <OPEN: "open">
 |   <OPTION: "option">
 |   <OR: "or">
@@ -359,19 +349,6 @@
 |   <IMPORT: "import">
 }
 
-TOKEN : /* Special function words */
-{
-	<SQL_TSI_FRAC_SECOND: "SQL_TSI_FRAC_SECOND"> 
-|	<SQL_TSI_SECOND: "SQL_TSI_SECOND"> 
-|	<SQL_TSI_MINUTE: "SQL_TSI_MINUTE"> 
-|	<SQL_TSI_HOUR: "SQL_TSI_HOUR"> 
-|	<SQL_TSI_DAY: "SQL_TSI_DAY"> 
-|	<SQL_TSI_WEEK: "SQL_TSI_WEEK"> 
-|	<SQL_TSI_MONTH: "SQL_TSI_MONTH"> 
-|	<SQL_TSI_QUARTER: "SQL_TSI_QUARTER"> 
-|	<SQL_TSI_YEAR: "SQL_TSI_YEAR"> 
-}
-
 TOKEN : /* User variables and literals */
 {
     < ALL_IN_GROUP: <ID> <PERIOD> <STAR> >
@@ -456,7 +433,7 @@
 	Command command = null;
 }
 {
-	 (LOOKAHEAD(2) (command = createUpdateProcedure(info)) |
+	 (LOOKAHEAD(2) command = createUpdateProcedure(info) |
 	  command = userCommand(info) |
 	  command = callableStatement(info)	  
 	)
@@ -1644,8 +1621,7 @@
 	(	
 		// Expression
 		expression=expression(info)	
-		[[<AS>] ( alias=id() )
-		]
+		[[<AS>] alias=id() ]
 	)
 	{		
 		SingleElementSymbol es = null;
@@ -1669,6 +1645,25 @@
 	}
 }
 
+DerivedColumn derivedColumn(ParseInfo info) :
+{
+	Expression expression = null;
+    String alias = null;
+}
+{
+	(	
+		// Expression
+		expression=expression(info)	
+		[<AS> alias=id() ]
+	)
+	{		
+		if(alias != null) {
+			alias = validateAlias(alias); 
+		}
+		return new DerivedColumn(alias, expression);
+	}
+}
+
 AllInGroupSymbol allInGroupSymbol() :
 {
 	Token allInGroupToken = null;
@@ -1681,54 +1676,60 @@
 	}
 }
 
+AggregateSymbol xmlAgg(ParseInfo info) :
+{
+	Expression expression = null;
+	OrderBy orderBy = null;
+}
+{
+	<XMLAGG> <LPAREN>
+	expression = expression(info)
+	[
+		orderBy = orderby(info)
+	]
+	<RPAREN>
+	{
+		if(! info.aggregatesAllowed) {
+			throw new ParseException(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level")); //$NON-NLS-1$
+		}
+		
+		String name = generateFunctionName(info, "XMLAGG");
+		AggregateSymbol	agg = new AggregateSymbol(name, "XMLAGG", false, expression);
+		agg.setOrderBy(orderBy);
+		return agg;
+	}
+}
+
 AggregateSymbol aggregateSymbol(ParseInfo info) :
 {
-	Token functionToken = null;
+	String func = null;
 	Token starToken = null;
 	AggregateSymbol agg = null;
 	boolean isDistinct = false;
 	Expression expression = null;
-	OrderBy orderBy = null;
 }
 {
-    // Things that can be aliased    
 	(
 		// COUNT(*)
 		LOOKAHEAD(3) (
-			functionToken = <COUNT>
+			func = nonReserved("COUNT")
 			<LPAREN>
 			starToken = <STAR>
 			<RPAREN> )	|
 			
 		// Remaining aggregates
-		(	(	functionToken = <COUNT> | 
-				functionToken = <SUM> | 
-				functionToken = <AVG> |
-				functionToken = <MIN> |
-				functionToken = <MAX> 
-			)
+		(	func = nonReserved("COUNT", "SUM", "AVG", "MIN", "MAX")
 			<LPAREN>
 			[ <DISTINCT> {isDistinct=true;} ]
 			expression = expression(info)
 			<RPAREN>
 		) 
-		| 
-		(
-			functionToken = <XMLAGG>
-			<LPAREN>
-			expression = expression(info)
-			[
-				orderBy = orderby(info)
-			]
-			<RPAREN>
-		)            
 	)
 	{
 		if(! info.aggregatesAllowed) {
 			throw new ParseException(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level")); //$NON-NLS-1$
 		}
-		
-		String func = functionToken.image.toUpperCase();
+		func = func.toUpperCase();
 		String name = generateFunctionName(info, func);
 		if(starToken == null) { 
 			// Aggregate
@@ -1737,7 +1738,6 @@
 			// COUNT(*)			
 			agg = new AggregateSymbol(name, func, false, null);
 		}
-		agg.setOrderBy(orderBy);
 		return agg;
 	}
 }
@@ -1791,7 +1791,7 @@
 {	
 	(
 		(	
-			<LBRACE> <OJ>
+			<LBRACE> nonReserved("OJ")
 			result=tableReferenceUnescaped(info)
 			<RBRACE>
 		) 
@@ -1882,6 +1882,8 @@
 {
 	(	LOOKAHEAD(<ID> <LPAREN>, { "texttable".equalsIgnoreCase(getToken(1).image) }) clause = textTable(info)
 	    |
+	    LOOKAHEAD(<ID> <LPAREN>, { "xmltable".equalsIgnoreCase(getToken(1).image) }) clause = xmlTable(info)
+	    |
 	    clause = unaryFromClause(info)
 		|
 		LOOKAHEAD(subqueryFromClause(info)) clause = subqueryFromClause(info) 
@@ -1901,44 +1903,69 @@
 	}
 }
 
+XMLSerialize xmlSerialize(ParseInfo info) :
+{
+	Expression expr = null;
+	String doc = null;
+	Token t = null;
+}
+{
+	<XMLSERIALIZE> <LPAREN>
+	doc = nonReserved("DOCUMENT", "CONTENT")
+	expr = expression(info)
+	[
+		<AS> (t = <STRING> | t = <VARCHAR> | t = <CLOB>)
+	]
+	<RPAREN>
+	{
+		XMLSerialize result = new XMLSerialize();
+		result.setExpression(expr);
+		result.setDocument("document".equalsIgnoreCase(doc));
+		if (t != null) {
+			result.setTypeString(t.image);
+		}
+		return result;
+	}
+}
+
+String nonReserved(String... expected) :
+{
+	Token t = null;
+}
+{
+	t = <ID> 
+	{
+		String result = matchesAny(t.image, expected);
+		if (result != null) {
+			return result;
+		}
+		throw new ParseException(QueryPlugin.Util.getString("SQLParser.expected_non_reserved", Arrays.toString(expected), t.image));
+	}
+}
+
 TextTable textTable(ParseInfo info) :
 {
 	Expression file = null;
-	String name = null;
-	Constant datatype = null;
+	TextTable.TextColumn column = null;
 	List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
-	Integer width = null;
 	Character delimiter = null;
 	boolean escape = false;
 	Character quote = null;
 	Integer header = null;
 	Integer skip = null;
-	Token columnsToken = null;
 	String aliasID = null;
 }
 {
  	<ID> <LPAREN> file = expression(info)
- 	columnsToken = <ID> { if (!"columns".equalsIgnoreCase(columnsToken.image)) throw new ParseException(QueryPlugin.Util.getString("SQLParser.expected_columns")); }
- 	name = id()
-	datatype = dataType()
-	[ 
-	  	LOOKAHEAD(<ID>, { "width".equalsIgnoreCase(getToken(1).image) }) <ID>
-	  	width = intVal() 
-	]
+ 	nonReserved("COLUMNS")
+ 	column = textColumn(info)
 	{
-		columns.add(new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width));
-		width = null;
+		columns.add(column);
 	} 
 	(<COMMA>
-		name = id()
-		datatype = dataType()
-		[ 
-		  	LOOKAHEAD(<ID>, { "width".equalsIgnoreCase(getToken(1).image) }) <ID>
-		  	width = intVal() 
-		]
+		column = textColumn(info)
 		{
-			columns.add(new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width));
-			width = null;
+			columns.add(column);
 		}
 	)* 
 	[
@@ -1982,6 +2009,109 @@
  	}
 }
 
+TextTable.TextColumn textColumn(ParseInfo info):
+{
+	String name = null;
+	Constant datatype = null;
+	Integer width = null;
+}
+{
+	name = id()
+	datatype = dataType()
+	[ 
+	  	LOOKAHEAD(<ID>, { "width".equalsIgnoreCase(getToken(1).image) }) <ID>
+	  	width = intVal() 
+	]
+	{
+		return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width);
+	}
+}
+
+XMLTable xmlTable(ParseInfo info) :
+{
+	String xquery = null;
+	XMLNamespaces xmlNamespaces = null;
+	DerivedColumn passing = null;
+	ArrayList<DerivedColumn> passingValues = new ArrayList<DerivedColumn>();
+	XMLTable.XMLColumn column = null;
+	ArrayList<XMLTable.XMLColumn> columns = new ArrayList<XMLTable.XMLColumn>();
+	String aliasID = null;
+}
+{
+ 	<ID> <LPAREN> 
+ 	[ xmlNamespaces = xmlNamespaces(info) <COMMA> ]
+ 	xquery = stringVal()
+ 	[ 
+ 	  LOOKAHEAD(<ID>, { "passing".equalsIgnoreCase(getToken(1).image) }) <ID>
+ 	  passing = derivedColumn(info)
+ 	  {
+ 	  	passingValues.add(passing);
+ 	  	passing.setPropagateName(false);
+ 	  }
+ 	  (<COMMA>
+ 	    passing = derivedColumn(info)
+ 	    {
+ 	  	  passingValues.add(passing);
+ 	  	  passing.setPropagateName(false);
+ 	    }
+ 	  )*
+ 	]
+ 	
+ 	[
+ 	  LOOKAHEAD(<ID>, { "columns".equalsIgnoreCase(getToken(1).image) }) <ID>
+ 	  column = xmlColumn(info)
+ 	  {
+ 	    columns.add(column);
+ 	  }
+ 	  (<COMMA>
+ 	    column = xmlColumn(info)
+ 	    {
+ 	      columns.add(column); 	    
+ 	    }
+ 	  )*
+ 	]
+ 	<RPAREN>
+ 	[<AS>] aliasID=id()
+ 	{
+ 		XMLTable result = new XMLTable();
+ 		result.setXquery(xquery);
+ 		result.setNamespaces(xmlNamespaces);
+ 		result.setPassing(passingValues);
+ 		result.setColumns(columns);
+ 		result.setName(validateAlias(aliasID));
+ 		return result;
+ 	}
+}
+
+XMLTable.XMLColumn xmlColumn(ParseInfo info):
+{
+	String name = null;
+	Constant datatype = null;
+	String path = null;
+	Expression defaultExpr = null;
+}
+{
+	name = id()
+	
+	((
+	  <FOR> nonReserved("ORDINALITY") 
+	  {
+	    return new XMLTable.XMLColumn(name); 
+	  }	
+	) | (
+      datatype = dataType()
+      [ 
+	    nonReserved("PATH") path = stringVal()
+	  ]
+	  [
+	    <DEFAULT_KEYWORD> defaultExpr = expression(info)
+	  ]
+	  {
+		return new XMLTable.XMLColumn(name, (String)datatype.getValue(), path, defaultExpr);
+	  }
+	))
+}
+
 int intVal() :
 {
 	Token t;
@@ -2867,14 +2997,16 @@
 		literal=literal()
 		|
 		// Escaped function
-		(	<LBRACE> <FN>
+		(	<LBRACE> nonReserved("FN")
 			expression=function(info)
 			<RBRACE>
 		)
 		|
 		// Aggregate function
-		(expression=aggregateSymbol(info))
+		LOOKAHEAD(<ID>, {matchesAny(getToken(1).image, "count", "min", "max", "sum", "avg") != null}) (expression=aggregateSymbol(info))
 		|
+		(expression=xmlAgg(info))
+		|
 		// Function
 		LOOKAHEAD(2) (expression=function(info))
 		|
@@ -3034,8 +3166,8 @@
 		<RPAREN>				
 	)		
 	|
-	(			
-		(funcToken =  <TIMESTAMPADD> | funcToken = <TIMESTAMPDIFF>)
+	LOOKAHEAD(<ID>, {matchesAny(getToken(1).image, "timestampadd", "timestampdiff") != null}) (	
+		funcName = nonReserved("TIMESTAMPADD", "TIMESTAMPDIFF")
 		<LPAREN>
 		expression = intervalType() 
 		{		
@@ -3147,6 +3279,10 @@
 		{
 			return expression;
 		}
+	|	expression = xmlSerialize(info)
+		{
+			return expression;
+		}
 	|
 	(	funcName = id()
 		{ 
@@ -3216,17 +3352,17 @@
 
 XMLAttributes xmlAttributes(ParseInfo info) :
 {
-	Expression expression = null;
-	ArrayList args = new ArrayList();
+	DerivedColumn expression = null;
+	ArrayList<DerivedColumn> args = new ArrayList<DerivedColumn>();
 }
 {
  	<XMLATTRIBUTES> <LPAREN>
-	expression = selectExpression(info)
+	expression = derivedColumn(info)
 	{
 		args.add(expression);
 		expression = null;
 	}
-	(<COMMA> expression=selectExpression(info)
+	(<COMMA> expression=derivedColumn(info)
 	 {
 		args.add(expression);
 		expression = null;
@@ -3240,21 +3376,21 @@
 
 XMLForest xmlForest(ParseInfo info) :
 {
-	Expression expression = null;
+	DerivedColumn expression = null;
 	XMLNamespaces xmlNamespaces = null;
-	ArrayList args = new ArrayList();
+	ArrayList<DerivedColumn> args = new ArrayList<DerivedColumn>();
 }
 {
  	<XMLFOREST> <LPAREN>
 	[
 		xmlNamespaces = xmlNamespaces(info) <COMMA>
 	]
-	expression = selectExpression(info)
+	expression = derivedColumn(info)
 	{
 		args.add(expression);
 		expression = null;
 	}
-	(<COMMA> expression=selectExpression(info)
+	(<COMMA> expression=derivedColumn(info)
 	 {
 		args.add(expression);
 		expression = null;
@@ -3376,23 +3512,14 @@
  */
 Constant intervalType() : 
 {
-	Token typeToken = null;
+	String type = null;
 }
 {
 	(
-		typeToken = <SQL_TSI_FRAC_SECOND> | 
-		typeToken = <SQL_TSI_SECOND> | 
-		typeToken = <SQL_TSI_MINUTE> | 
-		typeToken = <SQL_TSI_HOUR> | 
-		typeToken = <SQL_TSI_DAY> | 
-		typeToken = <SQL_TSI_WEEK> | 
-		typeToken = <SQL_TSI_MONTH> | 
-		typeToken = <SQL_TSI_QUARTER> | 
-		typeToken = <SQL_TSI_YEAR>
+		type = nonReserved("SQL_TSI_FRAC_SECOND", "SQL_TSI_SECOND", "SQL_TSI_MINUTE", "SQL_TSI_HOUR", "SQL_TSI_DAY", "SQL_TSI_WEEK", "SQL_TSI_MONTH", "SQL_TSI_QUARTER", "SQL_TSI_YEAR")
 	)
-	
 	{
-		return new Constant(typeToken.image);
+		return new Constant(type);
 	}
 }
 /**

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-06-04 21:51:29 UTC (rev 2181)
@@ -121,7 +121,7 @@
 QueryParser.nullBlock= Parser cannot parse a null block.
 QueryParser.lexicalError= Lexical error: {0}
 QueryParser.nullSqlExpr= Parser cannot parse a null sql expression.
-QueryParser.xqueryCompilation= XQuery compilation error: {0}
+QueryParser.xqueryCompilation= Direct usage of XQuery is no longer supported, use XMLQUERY instead.
 
 # processor (006)
 ERR.015.006.0010= Unknown criteria type: {0}
@@ -279,7 +279,7 @@
 ERR.015.012.0025 = Command must project at least one symbol
 ERR.015.012.0026 = Expressions of type OBJECT, CLOB, BLOB, or XML cannot be used in SELECT DISTINCT, ORDER BY, GROUP BY, or non-all set queries: [{0}]
 ERR.015.012.0027 = Expressions of type OBJECT, CLOB, BLOB, or XML cannot be used in comparison: {0}.
-ValidationVisitor.expression_requires_name = Non-column expressions require a name in XMLATTRIBUTES or XMLFOREST
+ValidationVisitor.expression_requires_name = Non-column expressions require a name in XMLATTRIBUTES, XMLFOREST, or XMLTABLE
 ValidationVisitor.invalid_lookup_key=Expressions of type OBJECT, CLOB, BLOB, or XML cannot be used as LOOKUP key columns: {0}.
 ValidationVisitor.limit_not_valid_for_xml=The limit clause cannot be used on an XML document query.
 ValidationVisitor.translated_or=Translated user criteria must not contain OR criteria
@@ -423,7 +423,7 @@
 SQLParser.Invalid_alias=Invalid alias format: [{0}]
 SQLParser.Invalid_short_name=Invalid simple identifier format: [{0}]
 SQLParser.Invalid_char={0} value must be a single character: [{1}].
-SQLParser.expected_columns=Columns non-reserved word expected in TEXTTABLE.
+SQLParser.expected_non_reserved=Expected non-reserved word {0}, but was {1}.
 SystemSource.Add_desc=Add two numbers
 SystemSource.Add_result_desc=Left operand + right operand
 SystemSource.Subtract_desc=Subtract two numbers
@@ -769,7 +769,6 @@
 SystemSource.xpath_description=Evaluate the XPath expression against a document
 SystemSource.xpath_param1=Source document
 SystemSource.xpath_param2=XPath expression
-SystemSource.xpath_param3=Namespaces
 SystemSource.xpathvalue_result=Single result
 SystemSource.xpath_result=XPath result
 SystemSource.xsltransform_description=Transform the document with the given stylesheet. 
@@ -816,6 +815,8 @@
 TempMetadataAdapter.Group_____{0}_____not_found._1=Group ''{0}'' not found.
 ExpressionEvaluator.Must_push=Function {0} is marked in the function metadata as a function that must be evaluated at the source.
 ExpressionEvaluator.Eval_failed=Unable to evaluate {0}: {1}
+XMLSerialize.data_exception=XMLSerialize: data exception - not an xml document
+XMLSerialize.resolvingError=XMLSerialize is valid only for XML expressions: {0}
 FunctionDefinitionsReader.Read_error=Error reading FunctionDefinitions.xmi: {0}
 FunctionDefinitionsSource.Read_error=Error reading {0}
 ExecResolver.Param_convert_fail=Unable to convert procedural parameter of type {0} to expected type {1}
@@ -889,6 +890,13 @@
 ValidationVisitor.text_table_negative=Text table WIDTH, HEADER, or SKIP values must not be negative. 
 ValidationVisitor.text_table_delimiter=Text table DELIMITER cannot be the same as the QUOTE or ESCAPE characters.
 ValidationVisitor.text_table_newline=Text table DELIMITER, QUOTE, and ESCAPE characters cannot be the new line character.
+ValidationVisitor.xml_namespaces=At most only one NO DEFAULT or DEFAULT namespace may be specified.
+ValidationVisitor.xml_namespaces_reserved=At most only one NO DEFAULT or DEFAULT namespace may be specified.
+ValidationVisitor.context_item_type=XMLTABLE or XMLQUERY PASSING context item must be a character type (XML, STRING, CLOB).
+ValidationVisitor.passing_requires_name=XMLTABLE or XMLQUERY PASSING clause can only contain at most 1 unnamed item.
+ValidationVisitor.duplicate_passing=XMLTABLE or XMLQUERY PASSING clause duplicate item name "{0}".
+ValidationVisitor.one_ordinal=Only one FOR ORDINALITY column is allowed for an XMLTABLE.
+ValidationVisitor.invalid_default=XMLTABLE DEFAULT expression is invalid: "{0}"
 UpdateProcedureResolver.only_variables=Element symbol "{0}" cannot be assigned a value.  Only declared VARIABLES can be assigned values.
 wrong_result_type=No results found; or non-XML result object has been produced as a result of the execution of XQuery expression. Please note that only XML type results are supported.
 MappingLoader.unknown_node_type=Unknown Node Type "{0}" being loaded by the XML mapping document.
@@ -900,6 +908,7 @@
 invalid_recurive_node= Found recursive node {0} without recursive root node.
 criteria_node_not_allowed=Criteria Nodes can be only added on the Choice nodes; Wrong type of parent found.
 SaxonXQueryExpression.bad_xquery=Failed to evaluate XQuery expression; Please check the query and correct errors in syntax or usage. 
+SaxonXQueryExpression.compile_failed=Could not compile XQuery; Please check the query for syntax or usage errors.
 SimpleQueryResolver.unknown_group_in_nocache=Unknown group "{0}" found in the Option NOCACHE hint.
 MappingLoader.invalidName=Null or blank name found in the Mapping Document, Must have valid name. Re-build the VDB
 MatchCriteria.invalid_escape=Invalid escape sequence "{0}" with escape character "{1}"

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestAggregateImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestAggregateImpl.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestAggregateImpl.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,7 +27,7 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.language.AggregateFunction;
 import org.teiid.language.Literal;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.Constant;
 
@@ -52,23 +52,23 @@
     }
 
     public void testGetName() throws Exception {
-        assertEquals(AggregateFunction.COUNT, example("testName", SQLReservedWords.COUNT, true, 42).getName()); //$NON-NLS-1$ 
+        assertEquals(AggregateFunction.COUNT, example("testName", NonReserved.COUNT, true, 42).getName()); //$NON-NLS-1$ 
     }
 
     public void testIsDistinct() throws Exception {
-        assertTrue(example("testName", SQLReservedWords.COUNT, true, 42).isDistinct()); //$NON-NLS-1$
-        assertFalse(example("testName", SQLReservedWords.COUNT, false, 42).isDistinct()); //$NON-NLS-1$
+        assertTrue(example("testName", NonReserved.COUNT, true, 42).isDistinct()); //$NON-NLS-1$
+        assertFalse(example("testName", NonReserved.COUNT, false, 42).isDistinct()); //$NON-NLS-1$
     }
 
     public void testGetExpression() throws Exception {
-        AggregateFunction agg = example("testName", SQLReservedWords.COUNT, true, 42); //$NON-NLS-1$
+        AggregateFunction agg = example("testName", NonReserved.COUNT, true, 42); //$NON-NLS-1$
         assertNotNull(agg.getExpression());
         assertTrue(agg.getExpression() instanceof Literal);
         assertEquals(new Integer(42), ((Literal)agg.getExpression()).getValue());
     }
 
     public void testGetType() throws Exception {
-        assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, example("x", SQLReservedWords.COUNT, true, 42).getType()); //$NON-NLS-1$
+        assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, example("x", NonReserved.COUNT, true, 42).getType()); //$NON-NLS-1$
     }
 
 }

Copied: trunk/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java (from rev 2171, trunk/engine/src/test/java/org/teiid/query/processor/dynamic/SimpleQueryProcessorFactory.java)
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java	                        (rev 0)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.dqp.internal.process;
+
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.id.IDGenerator;
+import org.teiid.query.analysis.AnalysisRecord;
+import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.optimizer.QueryOptimizer;
+import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
+import org.teiid.query.parser.QueryParser;
+import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.processor.ProcessorPlan;
+import org.teiid.query.processor.QueryProcessor;
+import org.teiid.query.resolver.QueryResolver;
+import org.teiid.query.rewriter.QueryRewriter;
+import org.teiid.query.sql.lang.Command;
+import org.teiid.query.util.CommandContext;
+
+
+
+public class SimpleQueryProcessorFactory implements QueryProcessor.ProcessorFactory {
+
+	private QueryMetadataInterface metadata;
+	private CapabilitiesFinder finder;
+	private IDGenerator idGenerator;
+	private BufferManager bufferMgr;
+	private ProcessorDataManager dataMgr;
+	
+	public SimpleQueryProcessorFactory(BufferManager bufferMgr,
+			ProcessorDataManager dataMgr, CapabilitiesFinder finder,
+			IDGenerator idGenerator, QueryMetadataInterface metadata) {
+		this.bufferMgr = bufferMgr;
+		this.dataMgr = dataMgr;
+		this.finder = finder;
+		this.idGenerator = idGenerator;
+		this.metadata = metadata;
+	}
+
+	@Override
+	public QueryProcessor createQueryProcessor(String sql, String recursionGroup, CommandContext commandContext)
+			throws TeiidProcessingException, TeiidComponentException {
+		Command command = QueryParser.getQueryParser().parseCommand(sql);
+		QueryResolver.resolveCommand(command, metadata);
+		command = QueryRewriter.rewrite(command, metadata, commandContext);
+		ProcessorPlan plan = QueryOptimizer.optimizePlan(command, metadata,
+				idGenerator, finder, AnalysisRecord.createNonRecordingRecord(),
+				commandContext);
+
+		CommandContext copy = (CommandContext) commandContext.clone();
+		return new QueryProcessor(plan, copy, bufferMgr, dataMgr);
+	}
+}


Property changes on: trunk/engine/src/test/java/org/teiid/dqp/internal/process/SimpleQueryProcessorFactory.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -188,17 +188,6 @@
         assertEquals("[QueryValidatorException]Group does not exist: BQT3.SmallA", results.getException().toString()); //$NON-NLS-1$
 	}
 
-	@Test public void testXQueryVisibility() throws Exception {
-        String xquery = "<Items>\r\n" + //$NON-NLS-1$
-				"{\r\n" + //$NON-NLS-1$
-				"for $x in doc(\"select * from bqt3.smalla\")//Item\r\n" + //$NON-NLS-1$
-				"return  <Item>{$x/intkey/text()}</Item>\r\n" + //$NON-NLS-1$
-				"}\r\n" + //$NON-NLS-1$
-				"</Items>\r\n"; //$NON-NLS-1$
-		
-		helpTestVisibilityFails(xquery);
-	}
-    
     ///////////////////////////Helper method///////////////////////////////////
     private ResultsMessage helpExecute(String sql, String userName) throws Exception {
     	return helpExecute(sql, userName, 1, false);

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDataTierManager.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -36,7 +36,6 @@
 import org.teiid.query.metadata.QueryMetadataInterface;
 import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
 import org.teiid.query.parser.QueryParser;
-import org.teiid.query.processor.dynamic.SimpleQueryProcessorFactory;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.unittest.FakeMetadataFactory;

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,8 +31,6 @@
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.teiid.adminapi.impl.VDBMetaData;
-import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.api.exception.query.QueryValidatorException;
 import org.teiid.client.RequestMessage;
@@ -419,17 +417,4 @@
 		helpTestProcessing(preparedSql, values, expected, dataManager, FakeMetadataFactory.example1Cached(), false, false,FakeMetadataFactory.example1VDB());
     }
     
-    @Test public void testXQueryParam() throws Exception {
-        String preparedSql = "exec m.xproc3(?)"; //$NON-NLS-1$
-        
-		List<String> values = Arrays.asList("<test1/>"); //$NON-NLS-1$
-        List[] expected = new List[] { 
-                Arrays.asList("<?xml version=\"1.0\" encoding=\"UTF-8\"?><wrap><test1/></wrap>"), //$NON-NLS-1$
-            };    
-        
-        FakeDataManager dataManager = new FakeDataManager();
-        TestProcessor.sampleData1(dataManager);
-		helpTestProcessing(preparedSql, values, expected, dataManager, FakeMetadataFactory.exampleXQueryTransformations(), false, false, FakeMetadataFactory.exampleXQueryTransformationsVDB());
-    }
-
 }

Modified: trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -34,7 +34,7 @@
 
 import org.junit.Test;
 import org.teiid.api.exception.query.FunctionExecutionException;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.unittest.TimestampUtil;
@@ -846,18 +846,18 @@
     }
 
     @Test public void testTimestampAdd2() throws Exception {
-    	assertEquals(TimestampUtil.createTimestamp(103, 11, 1, 18, 20, 30, 0), FunctionMethods.timestampAdd(SQLReservedWords.SQL_TSI_HOUR, 3, TimestampUtil.createTimestamp(103, 11, 1, 15, 20, 30, 0)));
+    	assertEquals(TimestampUtil.createTimestamp(103, 11, 1, 18, 20, 30, 0), FunctionMethods.timestampAdd(NonReserved.SQL_TSI_HOUR, 3, TimestampUtil.createTimestamp(103, 11, 1, 15, 20, 30, 0)));
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND, 
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND, 
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 3, 9, 35, 1),
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 3, 9, 35, 100000000),
                               new Long(99999999));
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_2() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               // 1 day (8.64 x 10^10 nanos) and 1 nano
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 3, 9, 35, 2),
                               TimestampUtil.createTimestamp((2001-1900), 5, 22, 3, 9, 35, 3),
@@ -865,7 +865,7 @@
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_3() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               // 1 day (8.64 x 10^10 nanos) less 1 nano
                               TimestampUtil.createTimestamp((2001-1900), 5, 22, 3, 9, 35, 2),
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 3, 9, 35, 3),
@@ -873,28 +873,28 @@
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_4() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 0, 0, 0, 1),
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 0, 0, 0, 3),
                               new Long(00000002));
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_5() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 0, 0, 0, 1),
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 0, 0, 0, 10),
                               new Long(9));
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_6() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               TimestampUtil.createTimestamp((2001-1900), 5, 22, 0, 0, 0, 2),
                               TimestampUtil.createTimestamp((2001-1900), 5, 22, 0, 0, 0, 3),
                               new Long(1));
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_7() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               // 1 nano diff
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 3, 9, 35, 2),
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 3, 9, 35, 3),
@@ -902,7 +902,7 @@
     }
 
     @Test public void testTimestampDiffTimeStamp_FracSec_8() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_FRAC_SECOND,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_FRAC_SECOND,
                               // 1 nano diff
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 3, 9, 35, 3),
                               TimestampUtil.createTimestamp((2004-1900), 5, 22, 3, 9, 35, 2),
@@ -910,98 +910,98 @@
     }
 
     @Test public void testTimestampDiffTimeStamp_Min_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MINUTE,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MINUTE,
                               TimestampUtil.createTimestamp(0, 0, 0, 2, 34, 12, 0),
                               TimestampUtil.createTimestamp(0, 0, 0, 12, 0, 0, 0),
                               new Long(565));
     }
 
     @Test public void testTimestampDiffTimeStamp_Min_2() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MINUTE,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MINUTE,
                               TimestampUtil.createTimestamp((2001-1900), 0, 0, 2, 0, 0, 0),
                               TimestampUtil.createTimestamp((2001-1900), 0, 0, 0, 33, 12, 0),
                               new Long(-86));
     }
 
     @Test public void testTimestampDiffTimeStamp_Min_3() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MINUTE,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MINUTE,
                               TimestampUtil.createTimestamp((2001-1900), 8, 26, 12, 07, 58, 65497),
                               TimestampUtil.createTimestamp((2001-1900), 8, 29, 11, 25, 42, 483219),
                               new Long(4277));
     }
 
     @Test public void testTimestampDiffTimeStamp_Min_4() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MINUTE,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MINUTE,
                               TimestampUtil.createTimestamp((2001-1900), 8, 26, 12, 07, 58, 0),
                               TimestampUtil.createTimestamp((2001-1900), 8, 29, 11, 25, 42, 0),
                               new Long(4277));
     }
 
     @Test public void testTimestampDiffTimeStamp_Min_5() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MINUTE,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MINUTE,
                               TimestampUtil.createTimestamp((2001-1900), 8, 26, 12, 0, 0, 1),
                               TimestampUtil.createTimestamp((2001-1900), 8, 26, 12, 0, 0, 0),
                               new Long(0));
     }
 
     @Test public void testTimestampDiffTimeStamp_Hour_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_HOUR,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_HOUR,
                               TimestampUtil.createTimestamp((2004-1900), 8, 26, 12, 0, 0, 0),
                               TimestampUtil.createTimestamp((2004-1900), 8, 26, 12, 59, 59, 999999999),
                               new Long(0));
     }
 
     @Test public void testTimestampDiffTimeStamp_Week_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_WEEK,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_WEEK,
                               TimestampUtil.createTimestamp((2001-1900), 5, 21, 3, 9, 35, 100),
                               TimestampUtil.createTimestamp((2001-1900), 4, 2, 5, 19, 35, 500),
                               new Long(-7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 4, 19, 0, 0, 0, 0),
                               TimestampUtil.createTimestamp((2004-1900), 11, 20, 12, 0, 0, 0),
                               new Long(7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_2() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 5, 1, 0, 0, 0, 1000000),
                               TimestampUtil.createTimestamp((2004-1900), 11, 1, 12, 0, 0, 1),
                               new Long(6));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_3() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 4, 19, 0, 0, 0, 1),
                               TimestampUtil.createTimestamp((2004-1900), 11, 18, 12, 0, 0, 1000000),
                               new Long(7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_4() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 4, 1, 0, 0, 0, 1000000),
                               TimestampUtil.createTimestamp((2004-1900), 11, 1, 0, 0, 0, 0),
                               new Long(7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_5() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 4, 1, 0, 0, 1, 0),
                               TimestampUtil.createTimestamp((2004-1900), 11, 1, 0, 0, 0, 0),
                               new Long(7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Month_6() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_MONTH,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_MONTH,
                               TimestampUtil.createTimestamp((2004-1900), 4, 1, 0, 0, 1, 0),
                               TimestampUtil.createTimestamp((2004-1900), 11, 1, 0, 0, 2, 0),
                               new Long(7));
     }
 
     @Test public void testTimestampDiffTimeStamp_Day_1() throws Exception {
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_DAY,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_DAY,
                               TimestampUtil.createTimestamp((2004-1900), 2, 1, 0, 0, 0, 0),
                               TimestampUtil.createTimestamp((2004-1900), 3, 1, 0, 0, 0, 0),
                               new Long(31));
@@ -1009,20 +1009,20 @@
 
     @Test public void testTimestampDiffTimeStamp_Day_2() throws Exception {
         // Leap year
-        helpTestTimestampDiff(SQLReservedWords.SQL_TSI_DAY,
+        helpTestTimestampDiff(NonReserved.SQL_TSI_DAY,
                               TimestampUtil.createTimestamp((2004-1900), 1, 1, 0, 0, 0, 0),
                               TimestampUtil.createTimestamp((2004-1900), 2, 1, 0, 0, 0, 0),
                               new Long(29));
     }
 
 	@Test public void testTimestampDiffTime_Hour_1() throws Exception {
-		helpTestTimestampDiff(SQLReservedWords.SQL_TSI_HOUR, new Timestamp(
+		helpTestTimestampDiff(NonReserved.SQL_TSI_HOUR, new Timestamp(
 				TimestampUtil.createTime(3, 4, 45).getTime()), new Timestamp(
 				TimestampUtil.createTime(5, 5, 36).getTime()), new Long(2));
 	}
 
 	@Test public void testTimestampDiffTime_Hour_2() throws Exception {
-		helpTestTimestampDiff(SQLReservedWords.SQL_TSI_HOUR, new Timestamp(
+		helpTestTimestampDiff(NonReserved.SQL_TSI_HOUR, new Timestamp(
 				TimestampUtil.createTime(5, 0, 30).getTime()), new Timestamp(
 				TimestampUtil.createTime(3, 0, 31).getTime()), new Long(-1));
 	}

Modified: trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -47,14 +47,7 @@
 import org.teiid.core.types.XMLType;
 import org.teiid.core.util.ObjectConverterUtil;
 import org.teiid.core.util.TimestampWithTimezone;
-import org.teiid.language.SQLReservedWords;
-import org.teiid.query.function.FunctionDescriptor;
-import org.teiid.query.function.FunctionForm;
-import org.teiid.query.function.FunctionLibrary;
-import org.teiid.query.function.FunctionMethods;
-import org.teiid.query.function.FunctionTree;
-import org.teiid.query.function.SystemFunctionManager;
-import org.teiid.query.function.UDFSource;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.function.metadata.FunctionMethod;
 import org.teiid.query.unittest.TimestampUtil;
 import org.teiid.query.util.CommandContext;
@@ -996,68 +989,68 @@
     
 	/** date + month --> count=18, inteval=month, result should be 2004-11-15 */
 	@Test public void testInvokeTimestampAddDate2() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_MONTH,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MONTH,  //$NON-NLS-1$
 			new Integer(18), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(104, 10, 15).getTime()));	
 	}
 
 	/** date + month --> count=-18, inteval=month, result should be 2001-11-15 */
 	@Test public void testInvokeTimestampAddDate2a() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_MONTH,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MONTH,  //$NON-NLS-1$
 			new Integer(-18), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(101, 10, 15).getTime()));	
 	}
 	
 	/** date + week --> count=6, inteval=week, result should be 2003-04-03 */
 	@Test public void testInvokeTimestampAddDate3() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_WEEK,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_WEEK,  //$NON-NLS-1$
 			new Integer(-6), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(103, 3, 3).getTime()));	
 	}
 
 	/** date + quarter --> count=3, inteval=quarter, result should be 2004-2-15 */
 	@Test public void testInvokeTimestampAddDate4() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_QUARTER,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_QUARTER,  //$NON-NLS-1$
 			new Integer(3), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(104, 1, 15).getTime()));	
 	}
 
 	/** date + year --> count=-1, inteval=year, result should be 2002-5-15 */
 	@Test public void testInvokeTimestampAddDate5() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_YEAR,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_YEAR,  //$NON-NLS-1$
 			new Integer(-1), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(102, 4, 15).getTime()));	
 	}
 			
 	/** time + minute --> count=23, inteval=3, result should be 03:32:12 */
 	@Test public void testInvokeTimestampAddTime1() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_MINUTE,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MINUTE,  //$NON-NLS-1$
 			new Integer(23), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, new Timestamp(TimestampUtil.createTime(3, 32, 12).getTime()));	
 	}
 
 	/** time + hour --> count=21, inteval=4, result should be 00:09:12 and overflow */
 	@Test public void testInvokeTimestampAddTime2() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_HOUR,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
 			new Integer(21), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, TimestampUtil.createTimestamp(70, 0, 2, 0, 9, 12, 0));	
 	}
 
 	/** time + hour --> count=2, inteval=4, result should be 01:12:12*/
 	@Test public void testInvokeTimestampAddTime3() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_HOUR,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
 			new Integer(2), new Timestamp(TimestampUtil.createTime(23, 12, 12).getTime())}, TimestampUtil.createTimestamp(70, 0, 2, 1, 12, 12, 0));	
 	}
 	
 	/** time + second --> count=23, inteval=2, result should be 03:10:01 */
 	@Test public void testInvokeTimestampAddTime4() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_SECOND,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_SECOND,  //$NON-NLS-1$
 			new Integer(49), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, new Timestamp(TimestampUtil.createTime(3, 10, 1).getTime()));	
 	}
 
 	/** timestamp + second --> count=23, inteval=2, result should be 2003-05-15 03:09:35.100  */
 	@Test public void testInvokeTimestampAddTimestamp1() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_SECOND,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_SECOND,  //$NON-NLS-1$
 			new Integer(23), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 100)}, 
 			TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 35, 100));	
 	}
 
 	/** timestamp + nanos --> count=1, inteval=1, result should be 2003-05-15 03:09:12.000000101  */
 	@Test public void testInvokeTimestampAddTimestamp2() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
 			new Integer(1), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 100)}, 
 			TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 101));	
 	}
@@ -1066,14 +1059,14 @@
 	 *  with increase in second and minutes, because second already at 59 sec originally
 	 */
 	@Test public void testInvokeTimestampAddTimestamp3() {
-		helpInvokeMethod("timestampAdd", new Object[] {SQLReservedWords.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
+		helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
 			new Integer(2100000000), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 59, 1)}, 
 			TimestampUtil.createTimestamp(103, 4, 15, 3, 10, 1, 100000003));	
 	}
 			
 	/** time --> interval=hour, time1 = 03:04:45, time2= 05:05:36 return = 2  */
 	@Test public void testInvokeTimestampDiffTime1() {
-		helpInvokeMethod("timestampDiff", new Object[] {SQLReservedWords.SQL_TSI_HOUR,  //$NON-NLS-1$
+		helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
 				new Timestamp(TimestampUtil.createTime(3, 4, 45).getTime()), new Timestamp(TimestampUtil.createTime(5, 5, 36).getTime()) }, 
 			new Long(2));	
 	}
@@ -1089,7 +1082,7 @@
 	 * time2= 2003-05-02 05:19:35.500 return = 45
 	 */
 	@Test public void testInvokeTimestampDiffTimestamp1() {
-		helpInvokeMethod("timestampDiff", new Object[] {SQLReservedWords.SQL_TSI_WEEK,  //$NON-NLS-1$
+		helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_WEEK,  //$NON-NLS-1$
 			TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 100), TimestampUtil.createTimestamp(103, 4, 2, 5, 19, 35, 500) }, 
 			new Long(45));	
 	}
@@ -1099,7 +1092,7 @@
      * time2= 2002-06-21 03:09:35.100000000 return = 999999999
      */
     @Test public void testInvokeTimestampDiffTimestamp2() {
-        helpInvokeMethod("timestampDiff", new Object[] {SQLReservedWords.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
+        helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
             TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 1), TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 100000000) }, 
             new Long(99999999));  
     }
@@ -1109,7 +1102,7 @@
      * time2= 2002-06-22 03:09:35.000000001 return = 
      */
     @Test public void testInvokeTimestampDiffTimestamp3() {
-        helpInvokeMethod("timestampDiff", new Object[] {SQLReservedWords.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
+        helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
             TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 2), TimestampUtil.createTimestamp(102, 5, 22, 3, 9, 35, 1) }, 
             new Long(86399999999999L));  
     }
@@ -1368,14 +1361,4 @@
         assertEquals("<!--comment-->", xml);
     }
 	
-	@Test public void testInvokeXpathQuery() throws Exception {
-        CommandContext c = new CommandContext();
-        c.setBufferManager(BufferManagerFactory.getStandaloneBufferManager());
-        XMLType result = (XMLType)helpInvokeMethod("xpathquery", new Class[] {DataTypeManager.DefaultDataClasses.STRING, DataTypeManager.DefaultDataClasses.STRING}, 
-        		new Object[] {"<foo><bar>1</bar><bar>2</bar></foo>", "/foo/bar"}, c);
-        
-        String xml = ObjectConverterUtil.convertToString(result.getCharacterStream());
-        assertEquals("<bar>1</bar><bar>2</bar>", xml);
-    }
-	
 }

Modified: trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,19 +31,17 @@
 import java.sql.Timestamp;
 import java.util.TimeZone;
 
-import javax.xml.xpath.XPathExpressionException;
+import net.sf.saxon.trans.XPathException;
 
 import org.jdom.Attribute;
 import org.jdom.Element;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.teiid.api.exception.query.FunctionExecutionException;
 import org.teiid.core.types.SQLXMLImpl;
 import org.teiid.core.types.XMLType;
 import org.teiid.core.util.FileUtil;
 import org.teiid.core.util.UnitTestUtil;
-import org.teiid.query.function.source.XMLSystemFunctions;
 
 
 @SuppressWarnings("nls")
@@ -55,17 +53,16 @@
         return util.read();
     }
     
-    public String helpTestXpathValue(final String xmlFilePath, final String xpath, 
-                                     String namespaces, final String expected) throws IOException, XPathExpressionException, FunctionExecutionException {
-        final String actual = helpGetNode(xmlFilePath,xpath, namespaces);
+    public String helpTestXpathValue(final String xmlFilePath, final String xpath, final String expected) throws IOException, XPathException {
+        final String actual = helpGetNode(xmlFilePath,xpath);
         assertEquals(expected,actual);
         return actual;
     }
 
-    public String helpGetNode(final String xmlFilePath, final String xpath, String namespaces ) throws IOException, XPathExpressionException, FunctionExecutionException {
+    public String helpGetNode(final String xmlFilePath, final String xpath ) throws IOException, XPathException {
         final String xmlContent = getContentOfTestFile(xmlFilePath);
         final Reader docReader = new StringReader(xmlContent);
-        return XMLSystemFunctions.xpathValue(docReader,xpath, namespaces);
+        return XMLSystemFunctions.xpathValue(docReader,xpath);
     }
 
     public void helpCheckElement(final Object jdomNode, final String name, final String prefix, final String namespaceUri,
@@ -148,13 +145,13 @@
         assertNull(value);
     }
     
-    @Test(expected=XPathExpressionException.class) public void testBadXPath() throws Exception {
+    @Test(expected=XPathException.class) public void testBadXPath() throws Exception {
         String doc = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b><c>test</c></b></a>"; //$NON-NLS-1$
         String xpath = ":BOGUS:"; //$NON-NLS-1$
         XMLSystemFunctions.xpathValue(doc, xpath);
     }
     
-    @Test(expected=XPathExpressionException.class) public void testValidateXpath_Defect15088() throws Exception {
+    @Test(expected=XPathException.class) public void testValidateXpath_Defect15088() throws Exception {
         // Mismatched tick and quote
         final String xpath = "//*[local-name()='bookName\"]"; //$NON-NLS-1$       
     	XMLSystemFunctions.validateXpath(xpath);
@@ -172,43 +169,36 @@
         final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
         final String xpath = "//shipTo/@country"; //$NON-NLS-1$
         final String expectedValue = "US"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,null, expectedValue);
+        helpTestXpathValue(xmlFilePath,xpath, expectedValue);
     }
 
     @Test public void testGetSingleMatch_01_002() throws Exception {
         final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
         final String xpath = "//@partNum"; //$NON-NLS-1$
         final String expectedValue = "872-AA"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,null, expectedValue);
+        helpTestXpathValue(xmlFilePath,xpath, expectedValue);
     }
 
     @Test public void testGetSingleMatch_01_003() throws Exception {
         final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
         final String xpath = "//productName"; //$NON-NLS-1$
         final String expectedValue = "Lawnmower"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,null, expectedValue);
+        helpTestXpathValue(xmlFilePath,xpath, expectedValue);
     }
 
-    @Test public void testGetSingleMatch_01_004() throws Exception {
-        final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
-        final String xpath = "/SOAP-ENV:Envelope/billTo/zip"; //$NON-NLS-1$
-        final String expectedValue = "95819"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"", expectedValue);
-    }
-
     @Test public void testGetSingleMatch_03() throws Exception {
         final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
         final String xpath = "//*[local-name()=\"ReadOnly\"]"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,null, "false"); //$NON-NLS-1$
+        helpTestXpathValue(xmlFilePath,xpath, "false"); //$NON-NLS-1$
     }
     
     /**
      * * is no longer valid to match the namespace
      */
-    @Test(expected=XPathExpressionException.class) public void testGetSingleMatch_04() throws Exception {
+    @Test public void testGetSingleMatch_04() throws Exception {
         final String xmlFilePath = "testdoc.xml"; //$NON-NLS-1$
         final String xpath = "//*:ReadOnly"; //$NON-NLS-1$
-        helpTestXpathValue(xmlFilePath,xpath,null, "false"); //$NON-NLS-1$
+        helpTestXpathValue(xmlFilePath,xpath, "false"); //$NON-NLS-1$
     }
     
 	@Test public void testInvokeXmlElement2() throws Exception {

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestCapabilitiesUtil.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestCapabilitiesUtil.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/TestCapabilitiesUtil.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,7 +27,7 @@
 
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.core.TeiidComponentException;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
 import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
@@ -192,7 +192,7 @@
         BasicSourceCapabilities caps = new BasicSourceCapabilities();
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, null); //$NON-NLS-1$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -204,7 +204,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, false);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, null); //$NON-NLS-1$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -216,7 +216,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, false);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, null); //$NON-NLS-1$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -228,7 +228,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, false);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -240,7 +240,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, null); //$NON-NLS-1$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -252,7 +252,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.COUNT, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.COUNT, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -263,7 +263,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_SUM, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.SUM, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.SUM, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -274,7 +274,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_SUM, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.SUM, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.SUM, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -285,7 +285,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_AVG, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.AVG, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.AVG, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -296,7 +296,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_AVG, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.AVG, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.AVG, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -307,7 +307,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MIN, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MIN, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MIN, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -318,7 +318,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MIN, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MIN, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MIN, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -329,7 +329,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MAX, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MAX, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -340,7 +340,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MAX, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MAX, false, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    
@@ -352,7 +352,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_DISTINCT, false);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MAX, true, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MAX, true, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, false); 
     }    
@@ -364,7 +364,7 @@
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
         caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_DISTINCT, true);
         
-        AggregateSymbol aggregate = new AggregateSymbol("expr", SQLReservedWords.MAX, true, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
+        AggregateSymbol aggregate = new AggregateSymbol("expr", NonReserved.MAX, true, new ElementSymbol("x")); //$NON-NLS-1$ //$NON-NLS-2$
         
         helpTestSupportsAggregateFunction(caps, aggregate, true); 
     }    

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,6 +27,7 @@
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.math.BigInteger;
+import java.sql.Date;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -74,6 +75,7 @@
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
+import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.SetQuery.Operation;
 import org.teiid.query.sql.lang.TextTable.TextColumn;
 import org.teiid.query.sql.proc.AssignmentStatement;
@@ -97,6 +99,7 @@
 import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.CaseExpression;
 import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.sql.symbol.DerivedColumn;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
@@ -105,13 +108,13 @@
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
-import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.symbol.TestCaseExpression;
 import org.teiid.query.sql.symbol.TestSearchedCaseExpression;
 import org.teiid.query.sql.symbol.XMLAttributes;
 import org.teiid.query.sql.symbol.XMLElement;
 import org.teiid.query.sql.symbol.XMLForest;
 import org.teiid.query.sql.symbol.XMLNamespaces;
+import org.teiid.query.sql.symbol.XMLSerialize;
 
 @SuppressWarnings("nls")
 public class TestParser {
@@ -6716,12 +6719,12 @@
     
     @Test public void testXmlElementWithAttributes() throws Exception {
     	XMLElement f = new XMLElement("y", new ArrayList<Expression>());
-    	f.setAttributes(new XMLAttributes(Arrays.asList((SingleElementSymbol)new AliasSymbol("val", new ExpressionSymbol("", new Constant("a"))))));
+    	f.setAttributes(new XMLAttributes(Arrays.asList(new DerivedColumn("val", new Constant("a")))));
     	helpTestExpression("xmlelement(y, xmlattributes('a' as val))", "XMLELEMENT(NAME y, XMLATTRIBUTES('a' AS val))", f);
     }
     
     @Test public void testXmlForest() throws Exception {
-    	XMLForest f = new XMLForest(Arrays.asList((SingleElementSymbol)new AliasSymbol("table", new ElementSymbol("a"))));
+    	XMLForest f = new XMLForest(Arrays.asList(new DerivedColumn("table", new ElementSymbol("a"))));
     	helpTestExpression("xmlforest(a as \"table\")", "XMLFOREST(a AS \"table\")", f);
     }
     
@@ -6731,7 +6734,7 @@
     }
     
     @Test public void testXmlNamespaces() throws Exception {
-    	XMLForest f = new XMLForest(Arrays.asList((SingleElementSymbol)new AliasSymbol("table", new ElementSymbol("a"))));
+    	XMLForest f = new XMLForest(Arrays.asList(new DerivedColumn("table", new ElementSymbol("a"))));
     	f.setNamespaces(new XMLNamespaces(Arrays.asList(new XMLNamespaces.NamespaceItem(), new XMLNamespaces.NamespaceItem("x", "http://foo"))));
     	helpTestExpression("xmlforest(xmlnamespaces(no default, 'http://foo' as x), a as \"table\")", "XMLFOREST(XMLNAMESPACES(NO DEFAULT, 'http://foo' AS x), a AS \"table\")", f);
     }
@@ -6784,7 +6787,31 @@
     }
     
     @Test public void testTextTableColumns() throws Exception {
-        helpException("SELECT * from texttable(foo x string)", "Parsing error: Columns non-reserved word expected in TEXTTABLE.");
+        helpException("SELECT * from texttable(foo x string)", "Parsing error: Expected non-reserved word [COLUMNS], but was x.");
     }
+    
+    @Test public void testXMLTable() throws Exception {
+    	String sql = "SELECT * from xmltable(xmlnamespaces(no default), '/' columns x for ordinality, y date path '@date' default {d'2000-01-01'}) as x"; //$NON-NLS-1$
+        Query query = new Query();
+        query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        XMLTable xt = new XMLTable();
+        xt.setName("x");
+        xt.setNamespaces(new XMLNamespaces(Arrays.asList(new XMLNamespaces.NamespaceItem())));
+        xt.setXquery("/");
+        List<XMLTable.XMLColumn> columns = new ArrayList<XMLTable.XMLColumn>();
+        columns.add(new XMLTable.XMLColumn("x"));
+        columns.add(new XMLTable.XMLColumn("y", "date", "@date", new Constant(Date.valueOf("2000-01-01"))));
+        xt.setColumns(columns);
+        query.setFrom(new From(Arrays.asList(xt)));
+        helpTest(sql, "SELECT * FROM XMLTABLE(XMLNAMESPACES(NO DEFAULT), '/' COLUMNS x FOR ORDINALITY, y date PATH '@date' DEFAULT {d'2000-01-01'}) AS x", query);
+    }
+    
+    @Test public void testXmlSerialize() throws Exception {
+    	XMLSerialize f = new XMLSerialize();
+    	f.setDocument(true);
+    	f.setExpression(new ElementSymbol("x"));
+    	f.setTypeString("CLOB");
+    	helpTestExpression("xmlserialize(document x as CLOB)", "XMLSERIALIZE(DOCUMENT x AS CLOB)", f);
+    }
 
 }

Deleted: trunk/engine/src/test/java/org/teiid/query/parser/TestParserXQuery.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParserXQuery.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParserXQuery.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,125 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.parser;
-
-import org.teiid.query.sql.lang.XQuery;
-
-import junit.framework.TestCase;
-
-
-public class TestParserXQuery extends TestCase {
-
-    /** test a typical XQuery */
-    public void testXQuery() {
-        String xQueryString = "<Items>\r\n" + //$NON-NLS-1$
-                        "{\r\n" + //$NON-NLS-1$
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                        "}\r\n" + //$NON-NLS-1$
-                        "</Items>\r\n"; //$NON-NLS-1$
-
-        XQuery xQuery = new XQuery(xQueryString, null);
-
-        TestParser.helpTest( 
-                 xQueryString,  
-                 xQueryString,  
-                 xQuery);
-    }
-
-    /** test a typical XQuery with multiple docs*/
-    public void testXQueryWithMultipleDocs() {
-        String xQueryString = "<Items><x>\r\n" + //$NON-NLS-1$
-                        "{\r\n" + //$NON-NLS-1$
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                        "}\r\n" + //$NON-NLS-1$
-                        "</x><y>\r\n" + //$NON-NLS-1$
-                        "{\r\n" + //$NON-NLS-1$
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                        "}\r\n" + //$NON-NLS-1$
-                        "</y></Items>\r\n"; //$NON-NLS-1$
-
-        XQuery xQuery = new XQuery(xQueryString, null);
-
-        TestParser.helpTest( 
-                 xQueryString,  
-                 xQueryString,  
-                 xQuery);
-    }
-
-    /** test an XQuery that doesn't begin with the open bracket < */
-    public void testXQuery2() {
-
-        String xQueryString = 
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n"; //$NON-NLS-1$
-                        
-
-        XQuery xQuery = new XQuery(xQueryString, null);
-
-        TestParser.helpTest(
-                xQueryString,  
-                xQueryString,  
-                xQuery);
-    }
-
-    /** test a typical XQuery with OPTION */
-    public void testXQueryWithOptionUppercase() {
-        String xQueryString = "<Items>\r\n" + //$NON-NLS-1$
-                        "{\r\n" + //$NON-NLS-1$
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                        "}\r\n" + //$NON-NLS-1$
-                        "</Items>"; //$NON-NLS-1$
-
-        String expectedString = xQueryString + " OPTION NOCACHE"; //$NON-NLS-1$
-
-        XQuery xQuery = new XQuery(xQueryString, null);
-
-        TestParser.helpTest( 
-                 expectedString,  
-                 expectedString,  
-                 xQuery);
-    }
-
-    /** test a typical XQuery with OPTION */
-    public void testXQueryWithOptionLowercase() {
-        String xQueryString = "<Items>\r\n" + //$NON-NLS-1$
-                        "{\r\n" + //$NON-NLS-1$
-                        "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                        "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                        "}\r\n" + //$NON-NLS-1$
-                        "</Items>"; //$NON-NLS-1$
-
-        String xQueryStringWithOption = xQueryString + " option nocache"; //$NON-NLS-1$
-        String expectedString = xQueryString + " OPTION NOCACHE"; //$NON-NLS-1$
-
-        XQuery xQuery = new XQuery(xQueryString, null);
-
-        TestParser.helpTest( 
-                 xQueryStringWithOption,  
-                 expectedString,  
-                 xQuery);
-    }
-}

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,11 +27,11 @@
 import java.util.Arrays;
 import java.util.List;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.unittest.FakeMetadataFactory;
 
-
 @SuppressWarnings("nls")
 public class TestSQLXMLProcessing {
 	
@@ -201,5 +201,36 @@
         
         helpProcess(plan, dataManager, expected);
     }
+    
+    @Test public void testXmlSerialize() {
+    	String sql = "SELECT xmlserialize(document xmlelement(parent) as string)"; //$NON-NLS-1$
+        
+        List[] expected = new List[] {
+        		Arrays.asList("<parent></parent>"), 
+        };    
+    
+        FakeDataManager dataManager = new FakeDataManager();
+        sampleData1(dataManager);
+        
+        ProcessorPlan plan = helpGetPlan(helpParse(sql), FakeMetadataFactory.example1Cached());
+        
+        helpProcess(plan, dataManager, expected);
+    }
+    
+    @Ignore
+    @Test public void testXmlTable() {
+        String sql = "select * from xmltable('/a/b' passing '<a><b>first</b><b x='attr'>second</b>' columns x string, val string path '/b')"; //$NON-NLS-1$
+        
+        List[] expected = new List[] {
+        		Arrays.asList("<parent><x e1=\"a\" e2=\"0\"></x><x e1=\"a\" e2=\"0\"></x><x e2=\"1\"></x><x e1=\"c\" e2=\"1\"></x><x e1=\"b\" e2=\"2\"></x><x e1=\"a\" e2=\"3\"></x></parent>"), 
+        };    
+    
+        FakeDataManager dataManager = new FakeDataManager();
+        sampleData1(dataManager);
+        
+        ProcessorPlan plan = helpGetPlan(helpParse(sql), FakeMetadataFactory.example1Cached());
+        
+        helpProcess(plan, dataManager, expected);
+    }
 
 }

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestFunctionResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestFunctionResolving.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestFunctionResolving.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -35,6 +35,7 @@
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.Function;
 import org.teiid.query.sql.symbol.Reference;
+import org.teiid.query.sql.symbol.XMLSerialize;
 import org.teiid.query.unittest.FakeMetadataFactory;
 
 
@@ -121,14 +122,14 @@
 
 	private Function helpResolveFunction(String sql) throws QueryParserException,
 			QueryResolverException, TeiidComponentException {
-		Function func = getFunction(sql);
+		Function func = (Function)getExpression(sql);
     	assertEquals(DataTypeManager.DefaultDataClasses.STRING, func.getType());
     	return func;
 	}
 
-	private Function getFunction(String sql) throws QueryParserException,
+	private Expression getExpression(String sql) throws QueryParserException,
 			TeiidComponentException, QueryResolverException {
-		Function func = (Function)QueryParser.getQueryParser().parseExpression(sql);
+		Expression func = QueryParser.getQueryParser().parseExpression(sql);
 		ResolverVisitor.resolveLanguageObject(func, FakeMetadataFactory.example1Cached());
 		return func;
 	}
@@ -139,8 +140,20 @@
 	 */
     @Test public void testLookupTypeConversion() throws Exception {
     	String sql = "lookup('pm1.g1', 'e2', 'e1', 1)"; //$NON-NLS-1$
-    	Function f = getFunction(sql);
+    	Function f = (Function)getExpression(sql);
     	assertEquals(DataTypeManager.DefaultDataClasses.STRING, f.getArg(3).getType());
     }
-	
+    
+    @Test public void testXMLSerialize() throws Exception {
+    	String sql = "xmlserialize(DOCUMENT '<a/>' as clob)"; //$NON-NLS-1$
+    	XMLSerialize xs = (XMLSerialize)getExpression(sql);
+    	assertEquals(DataTypeManager.DefaultDataClasses.CLOB, xs.getType());
+    }
+
+    @Test(expected=QueryResolverException.class) public void testXMLSerialize_1() throws Exception {
+    	String sql = "xmlserialize(DOCUMENT 1 as clob)"; //$NON-NLS-1$
+    	XMLSerialize xs = (XMLSerialize)getExpression(sql);
+    	assertEquals(DataTypeManager.DefaultDataClasses.CLOB, xs.getType());
+    }
+    
 }

Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -2273,4 +2273,22 @@
     	helpTestRewriteExpression(original, "'<a c=\"b\"></a>'", metadata);
     }
     
+    @Test public void testRewriteXmlElement1() throws Exception {
+    	String original = "xmlelement(name a, xmlattributes(1+1 as c), BQT1.SmallA.timevalue)"; //$NON-NLS-1$
+    	QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
+    	helpTestRewriteExpression(original, "XMLELEMENT(NAME a, XMLATTRIBUTES(2 AS c), BQT1.SmallA.timevalue)", metadata);
+    }
+    
+    @Test public void testRewriteXmlSerialize() throws Exception {
+    	String original = "xmlserialize(document xmlelement(name a, xmlattributes('b' as c)) as string)"; //$NON-NLS-1$
+    	QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
+    	helpTestRewriteExpression(original, "'<a c=\"b\"></a>'", metadata);
+    }
+    
+    @Test public void testRewriteXmlTable() throws Exception {
+    	String original = "select * from xmltable('/' passing 1 + 1 as a columns x string default curdate()) as x"; //$NON-NLS-1$
+    	QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
+    	helpTestRewriteCommand(original, "SELECT * FROM XMLTABLE('/' PASSING 2 AS a COLUMNS x string DEFAULT curdate()) AS x", metadata);
+    }
+
 }

Modified: trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/sql/proc/TestCreateUpdateProcedureCommand.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,7 +31,6 @@
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Option;
 import org.teiid.query.sql.lang.Query;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
 import org.teiid.query.sql.symbol.GroupSymbol;
 
@@ -195,10 +194,4 @@
         UnitTestUtil.helpTestEquivalence(0, s1, s2);
     }
     
-    public void testCloneMethod4() {
-    	CreateUpdateProcedureCommand s1 = new CreateUpdateProcedureCommand();
-    	s1.getSubCommands().add(new XQuery());
-        CreateUpdateProcedureCommand s2 = (CreateUpdateProcedureCommand)s1.clone();
-        UnitTestUtil.helpTestEquivalence(0, s1, s2);
-    }
 }

Modified: trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestAggregateSymbol.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestAggregateSymbol.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/sql/symbol/TestAggregateSymbol.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -25,7 +25,7 @@
 import junit.framework.TestCase;
 
 import org.teiid.core.util.UnitTestUtil;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.sql.symbol.AggregateSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -76,105 +76,105 @@
 	// ################################## ACTUAL TESTS ################################
 	
 	public void testParser1() {
-		AggregateSymbol as = new AggregateSymbol("count", SQLReservedWords.COUNT, false, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("count", NonReserved.COUNT, false, sampleElement()); //$NON-NLS-1$
 		helpParser(as, "COUNT(m.g.c)"); //$NON-NLS-1$
 	}
 
 	public void testParser2() {
-		AggregateSymbol as = new AggregateSymbol("count", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("count", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		helpParser(as, "COUNT(DISTINCT m.g.c)"); //$NON-NLS-1$
 	}
 
 	public void testParser3() {
-		AggregateSymbol as = new AggregateSymbol("x", SQLReservedWords.MIN, false, sampleConstant()); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("x", NonReserved.MIN, false, sampleConstant()); //$NON-NLS-1$
 		helpParser(as, "MIN(5)"); //$NON-NLS-1$
 	}
 
 	public void testParser4() {
-		AggregateSymbol as = new AggregateSymbol("x", SQLReservedWords.MAX, false, sampleFunction()); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("x", NonReserved.MAX, false, sampleFunction()); //$NON-NLS-1$
 		helpParser(as, "MAX((m.g.c + 5))"); //$NON-NLS-1$
 	}
 
 	public void testParser5() {
-		AggregateSymbol as = new AggregateSymbol("x", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("x", NonReserved.COUNT, false, null); //$NON-NLS-1$
 		helpParser(as, "COUNT(*)"); //$NON-NLS-1$
 	}
 		
 	public void testEquals1() { 
-		AggregateSymbol as = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		helpEquals(as, as, true);		
 	}
 
 	public void testEquals2() { 
-		AggregateSymbol as1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		AggregateSymbol as2 = (AggregateSymbol) as1.clone();
 		helpEquals(as1, as2, true);		
 	}
 
     //just changing the name of an aggregatesymbol doesn't matter
 	public void testEquals3() { 
-		AggregateSymbol as1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
-		AggregateSymbol as2 = new AggregateSymbol("y", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol as2 = new AggregateSymbol("y", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		helpEquals(as1, as2, true);		
 	}
 	
 	public void testEquals4() { 
-		AggregateSymbol as1 = new AggregateSymbol("count", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+		AggregateSymbol as1 = new AggregateSymbol("count", NonReserved.COUNT, false, null); //$NON-NLS-1$
 		AggregateSymbol as2 = (AggregateSymbol) as1.clone();
 		helpEquals(as1, as2, true);		
 	}
 
 	public void testSelfEquivalence(){
-		AggregateSymbol test = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		int equals = 0;
 		UnitTestUtil.helpTestEquivalence(equals, test, test);
 	}
 
 	public void testEquivalence(){
-		AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
-		AggregateSymbol test2 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test2 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		int equals = 0;
 		UnitTestUtil.helpTestEquivalence(equals, test1, test2);
 	}
     
     public void testEquivalenceCountStar(){
-        AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
-        AggregateSymbol test2 = new AggregateSymbol("x", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, false, null); //$NON-NLS-1$
+        AggregateSymbol test2 = new AggregateSymbol("x", NonReserved.COUNT, false, null); //$NON-NLS-1$
         int equals = 0;
         UnitTestUtil.helpTestEquivalence(equals, test1, test2);
     }
 
 	public void testEquivalenceCaseInsens(){
-		AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
-		AggregateSymbol test2 = new AggregateSymbol("X", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test2 = new AggregateSymbol("X", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
 		int equals = 0;
 		UnitTestUtil.helpTestEquivalence(equals, test1, test2);
 	}
     
     public void testNonEquivalenceUsingDiffElements(){ 
-        AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$ 
-        AggregateSymbol test2 = new AggregateSymbol("X", SQLReservedWords.COUNT, true, sampleElement2()); //$NON-NLS-1$ 
+        AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$ 
+        AggregateSymbol test2 = new AggregateSymbol("X", NonReserved.COUNT, true, sampleElement2()); //$NON-NLS-1$ 
         int equals = -1; 
         UnitTestUtil.helpTestEquivalence(equals, test1, test2); 
     } 
 	
 	public void testNonEquivalence(){
-		AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
-		AggregateSymbol test2 = new AggregateSymbol("y", SQLReservedWords.COUNT, true, sampleElement2()); //$NON-NLS-1$
+		AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
+		AggregateSymbol test2 = new AggregateSymbol("y", NonReserved.COUNT, true, sampleElement2()); //$NON-NLS-1$
 		int equals = -1;
 		UnitTestUtil.helpTestEquivalence(equals, test1, test2);
 	}
     
     public void testNonEquivalence1(){
-        AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement()); //$NON-NLS-1$
-        AggregateSymbol test2 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement2()); //$NON-NLS-1$
+        AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement()); //$NON-NLS-1$
+        AggregateSymbol test2 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement2()); //$NON-NLS-1$
         int equals = -1;
         UnitTestUtil.helpTestEquivalence(equals, test1, test2);
     }
     
     public void testNonEquivalence2(){
-        AggregateSymbol test1 = new AggregateSymbol("x", SQLReservedWords.MAX, true, sampleElement()); //$NON-NLS-1$
-        AggregateSymbol test2 = new AggregateSymbol("x", SQLReservedWords.COUNT, true, sampleElement2()); //$NON-NLS-1$
+        AggregateSymbol test1 = new AggregateSymbol("x", NonReserved.MAX, true, sampleElement()); //$NON-NLS-1$
+        AggregateSymbol test2 = new AggregateSymbol("x", NonReserved.COUNT, true, sampleElement2()); //$NON-NLS-1$
         int equals = -1;
         UnitTestUtil.helpTestEquivalence(equals, test1, test2);
     }

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestExpressionMappingVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestExpressionMappingVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestExpressionMappingVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -31,7 +31,7 @@
 import java.util.Map;
 
 import org.junit.Test;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.CompareCriteria;
 import org.teiid.query.sql.lang.Select;
@@ -197,10 +197,10 @@
      */
     @Test public void testRecursionDetection() {
     	ElementSymbol e1 = new ElementSymbol("e1"); //$NON-NLS-1$
-    	AggregateSymbol a1 = new AggregateSymbol("x", SQLReservedWords.SUM, false, e1); //$NON-NLS-1$
+    	AggregateSymbol a1 = new AggregateSymbol("x", NonReserved.SUM, false, e1); //$NON-NLS-1$
     	Function f = new Function(SourceSystemFunctions.ADD_OP, new Expression[] {a1, a1});
     	HashMap<AggregateSymbol, AggregateSymbol> map = new HashMap<AggregateSymbol, AggregateSymbol>();
-    	map.put(a1, new AggregateSymbol("x", SQLReservedWords.SUM, false, a1)); //$NON-NLS-1$
+    	map.put(a1, new AggregateSymbol("x", NonReserved.SUM, false, a1)); //$NON-NLS-1$
     	ExpressionMappingVisitor.mapExpressions(f, map);
         assertEquals("(SUM(SUM(e1)) + SUM(SUM(e1)))", f.toString()); //$NON-NLS-1$
     }

Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -27,9 +27,11 @@
 import java.util.Arrays;
 import java.util.List;
 
+import junit.framework.TestCase;
+
 import org.teiid.client.metadata.ParameterInfo;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.language.SQLReservedWords;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.sql.LanguageObject;
@@ -63,7 +65,6 @@
 import org.teiid.query.sql.lang.SubquerySetCriteria;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.lang.Update;
-import org.teiid.query.sql.lang.XQuery;
 import org.teiid.query.sql.lang.SetQuery.Operation;
 import org.teiid.query.sql.proc.AssignmentStatement;
 import org.teiid.query.sql.proc.Block;
@@ -90,12 +91,9 @@
 import org.teiid.query.sql.symbol.SearchedCaseExpression;
 import org.teiid.query.sql.symbol.TestCaseExpression;
 import org.teiid.query.sql.symbol.TestSearchedCaseExpression;
-import org.teiid.query.sql.visitor.SQLStringVisitor;
 import org.teiid.query.unittest.FakeMetadataFactory;
 
-import junit.framework.TestCase;
 
-
 public class TestSQLStringVisitor extends TestCase {
 
 	// ################################## FRAMEWORK ################################
@@ -998,37 +996,37 @@
 	}
 	
 	public void testAggregateSymbol1() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.COUNT, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.COUNT, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "COUNT('abc')"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol2() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.COUNT, true, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.COUNT, true, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "COUNT(DISTINCT 'abc')"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol3() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.COUNT, false, null); //$NON-NLS-1$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.COUNT, false, null); //$NON-NLS-1$
 		helpTest(agg, "COUNT(*)"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol4() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.AVG, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.AVG, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "AVG('abc')"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol5() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.SUM, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.SUM, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "SUM('abc')"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol6() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.MIN, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.MIN, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "MIN('abc')"); //$NON-NLS-1$
 	}
 	
 	public void testAggregateSymbol7() {
-		AggregateSymbol agg = new AggregateSymbol("abc", SQLReservedWords.MAX, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
+		AggregateSymbol agg = new AggregateSymbol("abc", NonReserved.MAX, false, new Constant("abc")); //$NON-NLS-1$ //$NON-NLS-2$
 		helpTest(agg, "MAX('abc')"); //$NON-NLS-1$
 	}
 	
@@ -1821,45 +1819,6 @@
         
     }
     
-    public void testXQuery(){
-        
-        String xquerystring = 
-                "XQUERY <Items>\r\n" + //$NON-NLS-1$
-                "{\r\n" + //$NON-NLS-1$
-                "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                "}\r\n" + //$NON-NLS-1$
-                "</Items>\r\n"; //$NON-NLS-1$
-        
-        XQuery xquery = new XQuery(xquerystring, null); 
-        helpTest(xquery, xquerystring); 
-    }
-
-    public void testXQueryWithOption(){
-        
-        String xquerystring = 
-                "XQUERY <Items>\r\n" + //$NON-NLS-1$
-                "{\r\n" + //$NON-NLS-1$
-                "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                "}\r\n" + //$NON-NLS-1$
-                "</Items>"; //$NON-NLS-1$
-
-        String expectedString = 
-                "XQUERY <Items>\r\n" + //$NON-NLS-1$
-                "{\r\n" + //$NON-NLS-1$
-                "for $x in doc(\"xmltest.doc9893\")//ItemName\r\n" + //$NON-NLS-1$
-                "return  <Item>{$x/text()}</Item>\r\n" + //$NON-NLS-1$
-                "}\r\n" + //$NON-NLS-1$
-                "</Items> OPTION NOCACHE"; //$NON-NLS-1$
-        
-        XQuery xquery = new XQuery(xquerystring, null); 
-        Option option = new Option();
-        option.setNoCache(true);
-        xquery.setOption(option);
-        helpTest(xquery, expectedString); 
-    }
-    
     /**  
      * For some reason this test was outputting
      * SELECT 'A' AS FOO UNION SELECT 'A' AS FOO

Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -35,6 +35,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
@@ -64,10 +65,7 @@
 import org.teiid.query.unittest.FakeMetadataObject;
 import org.teiid.query.unittest.FakeMetadataStore;
 import org.teiid.query.unittest.RealMetadataFactory;
-import org.teiid.query.validator.Validator;
-import org.teiid.query.validator.ValidatorReport;
 
-
 @SuppressWarnings("nls")
 public class TestValidator {
 
@@ -1963,11 +1961,11 @@
 	}
 	
 	@Test public void testValidateNoExpressionName() {        
-        helpValidate("SELECT xmlelement(name a, xmlattributes('1'))", new String[] {"'1'"}, exampleMetadata2()); //$NON-NLS-1$ //$NON-NLS-2$
+        helpValidate("SELECT xmlelement(name a, xmlattributes('1'))", new String[] {"XMLATTRIBUTES('1')"}, exampleMetadata2()); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	
 	@Test public void testValidateNoExpressionName1() {        
-        helpValidate("SELECT xmlforest('1')", new String[] {"'1'"}, exampleMetadata2()); //$NON-NLS-1$ //$NON-NLS-2$
+        helpValidate("SELECT xmlforest('1')", new String[] {"XMLFOREST('1')"}, exampleMetadata2()); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	
     @Test public void testXpathValueValid_defect15088() {
@@ -1980,11 +1978,6 @@
         helpValidate(userSql, new String[] {"xpathValue('<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b><c>test</c></b></a>', '//*[local-name()=''bookName\"]')"}, FakeMetadataFactory.exampleBQTCached());
     }
     
-    @Test public void testXpathValueInvalidNamespaces() throws Exception {
-        String userSql = "SELECT xpathValue('<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b><c>test</c></b></a>', '//*[local-name()=\"bookName\"]', 'xmlns==')"; //$NON-NLS-1$
-        helpValidate(userSql, new String[] {"xpathValue('<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b><c>test</c></b></a>', '//*[local-name()=\"bookName\"]', 'xmlns==')"}, FakeMetadataFactory.exampleBQTCached());
-    }
-    
     @Test public void testTextTableNegativeWidth() {        
         helpValidate("SELECT * from texttable(null columns x string width -1) as x", new String[] {"TEXTTABLE(null COLUMNS x string WIDTH -1) AS x"}, RealMetadataFactory.exampleBQTCached()); 
 	}
@@ -1997,4 +1990,29 @@
         helpValidate("SELECT * from texttable(null columns x string width 1 DELIMITER 'z') as x", new String[] {"TEXTTABLE(null COLUMNS x string WIDTH 1 DELIMITER 'z') AS x"}, RealMetadataFactory.exampleBQTCached()); 
 	}
     
+    @Test public void testXMLNamespaces() {
+    	helpValidate("select xmlforest(xmlnamespaces(no default, default 'http://foo'), e1 as \"table\") from pm1.g1", new String[] {"XMLNAMESPACES(NO DEFAULT, DEFAULT 'http://foo')"}, FakeMetadataFactory.example1Cached());
+    }
+
+    @Test public void testXMLNamespacesReserved() {
+    	helpValidate("select xmlforest(xmlnamespaces('http://foo' as xmlns), e1 as \"table\") from pm1.g1", new String[] {"XMLNAMESPACES('http://foo' AS xmlns)"}, FakeMetadataFactory.example1Cached());
+    }
+    
+    @Test public void testXMLTablePassingMultipleContext() {
+    	helpValidate("select * from pm1.g1, xmltable('/' passing '<a/>', '<b/>') as x", new String[] {"XMLTABLE('/' PASSING '<a/>', '<b/>') AS x"}, FakeMetadataFactory.example1Cached());
+    }
+
+    @Ignore("this is actually handled by saxon and will show up during resolving")
+    @Test public void testXMLTablePassingSameName() {
+    	helpValidate("select * from pm1.g1, xmltable('/' passing '<a/>' as a, '<b/>' as a) as x", new String[] {"xmltable('/' passing e1, e1 || 'x') as x"}, FakeMetadataFactory.example1Cached());
+    }
+
+    @Test public void testXMLTablePassingContextType() {
+    	helpValidate("select * from pm1.g1, xmltable('/' passing 2) as x", new String[] {"XMLTABLE('/' PASSING 2) AS x"}, FakeMetadataFactory.example1Cached());
+    }
+
+    @Test public void testXMLTableMultipleOrdinals() {
+    	helpValidate("select * from pm1.g1, xmltable('/' passing '<a/>' columns x for ordinality, y for ordinality) as x", new String[] {"XMLTABLE('/' PASSING '<a/>' COLUMNS x FOR ORDINALITY, y FOR ORDINALITY) AS x"}, FakeMetadataFactory.example1Cached());
+    }
+
 }

Deleted: trunk/engine/src/test/java/org/teiid/query/xquery/HardcodedSqlEval.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/xquery/HardcodedSqlEval.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/xquery/HardcodedSqlEval.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,71 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.xquery;
-
-import java.io.StringReader;
-import java.util.Map;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-
-import org.teiid.api.exception.query.ExpressionEvaluationException;
-import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.common.buffer.BlockedException;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.query.xquery.XQuerySQLEvaluator;
-
-
-
-/** 
- */
-public class HardcodedSqlEval implements XQuerySQLEvaluator {
-
-    String result;
-    Map<String, Object> params;
-    public HardcodedSqlEval(String result) {
-        this.result = result;
-    }
-
-    public Source executeSQL(String sql) 
-        throws QueryParserException, TeiidProcessingException, TeiidComponentException {
-        if (this.result != null) {
-            return new StreamSource(new StringReader(result));
-        }
-        return null;
-    }
-
-    /** 
-     * @see org.teiid.query.xquery.XQuerySQLEvaluator#close()
-     */
-    public void close() throws TeiidComponentException {
-    }
-
-	@Override
-	public Object getParameterValue(String key)
-			throws ExpressionEvaluationException, BlockedException,
-			TeiidComponentException {
-		return params.get(key);
-	}
-
-}

Deleted: trunk/engine/src/test/java/org/teiid/query/xquery/TestXQueryEngine.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/xquery/TestXQueryEngine.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/engine/src/test/java/org/teiid/query/xquery/TestXQueryEngine.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -1,211 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.xquery;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.sql.SQLXML;
-import java.util.HashMap;
-
-import junit.framework.TestCase;
-
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.types.SQLXMLImpl;
-import org.teiid.core.types.XMLTranslator;
-import org.teiid.core.util.FileUtil;
-import org.teiid.core.util.UnitTestUtil;
-import org.teiid.query.xquery.XQueryExpression;
-import org.teiid.query.xquery.XQuerySQLEvaluator;
-import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
-
-
-/**
- * Test XQueryEngine and XQueryExpression implementations
- */
-public class TestXQueryEngine extends TestCase {
-
-    /**
-     * @param name
-     */
-    public TestXQueryEngine(String name) {
-        super(name);
-    }
-
-// =========================================================================
-// HELPERS
-// =========================================================================
-    private void helpTestEngine(String xQuery, SQLXML expected, XQuerySQLEvaluator sqlEval) throws Exception{
-        XQueryExpression expr = new SaxonXQueryExpression();
-        helpTestEngine(expr, xQuery, expected, sqlEval);
-    }
-    
-    private void helpTestEngine(XQueryExpression expr, String xQuery, SQLXML expected, XQuerySQLEvaluator sqlEval) throws Exception{
-        expr.compileXQuery(xQuery);        
-        XMLTranslator actualResults = expr.evaluateXQuery(sqlEval);
-        String result = actualResults.getString();
-        assertEquals(expected.getString(), result);        
-    }
-
-    private void helpTestEngineFails(String xQuery, Class<?> expectedFailure, XQuerySQLEvaluator sqlEval) throws Exception{
-        XQueryExpression expr = new SaxonXQueryExpression();
-        expr.compileXQuery(xQuery);
-        
-        try {
-            expr.evaluateXQuery(sqlEval);
-            fail("expected failure");  //$NON-NLS-1$
-        } catch (TeiidProcessingException e) {
-            assertEquals(expectedFailure, e.getClass());
-        }
-    }
-
-    
-// =========================================================================
-// TESTS
-// =========================================================================
-
-    /** simple test */
-    public void test1() throws Exception {
-        
-        // Construct a JDOM tree, like we use in the server
-        Element element = new Element("test");//$NON-NLS-1$
-        Element element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Tim");//$NON-NLS-1$
-        element.addContent(element2);
-        element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Tom");//$NON-NLS-1$
-        element.addContent(element2);
-        element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Bill");//$NON-NLS-1$
-        element.addContent(element2);
-        Document doc = new Document(element);
-        XMLOutputter xmlOutputter = new XMLOutputter();
-
-        String xquery = "<friends>\n" +  //$NON-NLS-1$
-                        "{\n" +  //$NON-NLS-1$
-//                        "let $y := doc(\"goo\")//names\n" +  //$NON-NLS-1$
-                        "for $x in doc(\"foo\")//name\n" +  //$NON-NLS-1$
-                        "return  <friend>{$x/text()}</friend>\n" +  //$NON-NLS-1$
-                        "}\n" +  //$NON-NLS-1$
-                        "</friends>"; //$NON-NLS-1$   
-                        
-        String output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +  //$NON-NLS-1$
-                        "<friends>" +  //$NON-NLS-1$
-                        "<friend>Tim</friend>" +   //$NON-NLS-1$
-                        "<friend>Tom</friend>" +  //$NON-NLS-1$
-                        "<friend>Bill</friend>" +  //$NON-NLS-1$
-                        "</friends>"; //$NON-NLS-1$                        
-        
-        helpTestEngine(xquery, new SQLXMLImpl(output), new HardcodedSqlEval(xmlOutputter.outputString(doc)));
-    }
-
-    /** defect 12387 */
-    public void testDefect12387() throws Exception {
-        
-        // Construct a JDOM tree, like we use in the server
-        Element element = new Element("test");//$NON-NLS-1$
-        Element element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Tim");//$NON-NLS-1$
-        element.addContent(element2);
-        element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Tom");//$NON-NLS-1$
-        element.addContent(element2);
-        element2 = new Element("name");//$NON-NLS-1$
-        element2.addContent("Bill");//$NON-NLS-1$
-        element.addContent(element2);
-        Document doc = new Document(element);
-        XMLOutputter xmlOutputter = new XMLOutputter();
-        
-        String xquery = "<friends>\n" +  //$NON-NLS-1$
-                        "{\n" +  //$NON-NLS-1$
-                        "for $x in doc(foo)//name\n" +  //$NON-NLS-1$
-                        "return  <friend>{$x/text()}</friend>\n" +  //$NON-NLS-1$
-                        "}\n" +  //$NON-NLS-1$
-                        "</friends>"; //$NON-NLS-1$   
-        
-        helpTestEngineFails(xquery, TeiidProcessingException.class, new HardcodedSqlEval(xmlOutputter.outputString(doc)));
-    }
-    
-    public void testDocArgReadingFileURI() throws Exception {
-        File f = UnitTestUtil.getTestDataFile("testExample.xml"); //$NON-NLS-1$
-        URI uri = f.toURI();
-        String xquery = "doc(\"" + uri.toString() + "\")"; //$NON-NLS-1$ //$NON-NLS-2$
-        
-        FileUtil util = new FileUtil(f.getCanonicalPath());
-        String expectedStr = util.read().replaceAll("[ \t\r\n]", ""); //$NON-NLS-1$ //$NON-NLS-2$
-        
-        XQueryExpression expr = new SaxonXQueryExpression();
-        expr.compileXQuery(xquery);
-        XMLTranslator actualResults = expr.evaluateXQuery(new HardcodedSqlEval(null));
-        
-        assertEquals(expectedStr, actualResults.getString().replaceAll("[ \t\r\n]", "")); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    public void testInputParams() throws Exception {
-        String sql = "SELECT * FROM xmltest.doc1"; //$NON-NLS-1$
-        String xquery = "declare variable $itemid as xs:string external;" + //$NON-NLS-1$
-                        "<set>\n" +  //$NON-NLS-1$
-                        "{\n" +  //$NON-NLS-1$                        
-                        "for $x in doc(\""+sql+"\")/Catalogs/Catalog/Items\n" +  //$NON-NLS-1$ //$NON-NLS-2$
-                        "return  <Name>{$x/Item[@ItemID=$itemid]/Name/text()}</Name>\n" +  //$NON-NLS-1$
-                        "}\n" +  //$NON-NLS-1$
-                        "</set>"; //$NON-NLS-1$   
- 
-      String inputdoc = 
-          "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +  //$NON-NLS-1$
-          "<Catalogs xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + //$NON-NLS-1$
-          "   <Catalog>\n" +  //$NON-NLS-1$
-          "      <Items>\n" +  //$NON-NLS-1$
-          "         <Item ItemID=\"001\">\n" +  //$NON-NLS-1$
-          "            <Name>Lamp</Name>\n" +  //$NON-NLS-1$
-          "            <Quantity>5</Quantity>\n" +  //$NON-NLS-1$
-          "         </Item>\n" +  //$NON-NLS-1$
-          "         <Item ItemID=\"002\">\n" +  //$NON-NLS-1$
-          "            <Name>Screwdriver</Name>\n" +  //$NON-NLS-1$
-          "            <Quantity>100</Quantity>\n" +  //$NON-NLS-1$
-          "         </Item>\n" +  //$NON-NLS-1$
-          "         <Item ItemID=\"003\">\n" +  //$NON-NLS-1$
-          "            <Name>Goat</Name>\n" +  //$NON-NLS-1$
-          "            <Quantity>4</Quantity>\n" +  //$NON-NLS-1$
-          "         </Item>\n" +  //$NON-NLS-1$
-          "      </Items>\n" +  //$NON-NLS-1$
-          "   </Catalog>\n" +  //$NON-NLS-1$
-          "</Catalogs>"; //$NON-NLS-1$
-      
-        String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +  //$NON-NLS-1$
-                        "<set>" +  //$NON-NLS-1$
-                        "<Name>Lamp</Name>" +   //$NON-NLS-1$
-                        "</set>"; //$NON-NLS-1$                        
-        XQueryExpression expr = new SaxonXQueryExpression();
-        HardcodedSqlEval eval = new HardcodedSqlEval(inputdoc);
-        eval.params = new HashMap<String, Object>();
-        eval.params.put("itemid", "001"); //$NON-NLS-1$ //$NON-NLS-2$
-        helpTestEngine(expr, xquery, new SQLXMLImpl(expected), eval);        
-    }     
-
-}

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/pom.xml	2010-06-04 21:51:29 UTC (rev 2181)
@@ -453,14 +453,15 @@
 				<version>2.0b4</version>
 			</dependency>
 			<dependency>
-				<groupId>net.sf.saxon</groupId>
+				<groupId>net.sourceforge.saxon</groupId>
 				<artifactId>saxon</artifactId>
-				<version>8.7</version>
+				<version>9.1.0.8</version>
 			</dependency>
 			<dependency>
-				<groupId>net.sf.saxon</groupId>
-				<artifactId>saxon-dom</artifactId>
-				<version>8.7</version>
+				<groupId>net.sourceforge.saxon</groupId>
+				<artifactId>saxon</artifactId>
+				<classifier>dom</classifier>
+				<version>9.1.0.8</version>
 			</dependency>
 			<dependency>
 				<groupId>org.jboss.netty</groupId>

Modified: trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java	2010-06-04 21:35:06 UTC (rev 2180)
+++ trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java	2010-06-04 21:51:29 UTC (rev 2181)
@@ -65,8 +65,8 @@
 import org.teiid.language.Insert;
 import org.teiid.language.LanguageObject;
 import org.teiid.language.Literal;
-import org.teiid.language.SQLReservedWords;
 import org.teiid.language.Select;
+import org.teiid.language.SQLReservedWords.NonReserved;
 import org.teiid.language.visitor.SQLStringVisitor;
 import org.teiid.metadata.RuntimeMetadata;
 import org.teiid.query.sql.lang.CompareCriteria;
@@ -87,7 +87,7 @@
      */
     @Test public void testVisitIAggregate() throws Exception {
         String expected = "COUNT(42)"; //$NON-NLS-1$
-        assertEquals(expected, getString(TestAggregateImpl.example("COUNT", SQLReservedWords.COUNT, false, 42))); //$NON-NLS-1$
+        assertEquals(expected, getString(TestAggregateImpl.example("COUNT", NonReserved.COUNT, false, 42))); //$NON-NLS-1$
     }
 
     @Test public void testVisitIAggregateDistinct() throws Exception {
@@ -382,7 +382,7 @@
     }
     
     @Test public void testTimestampAddFunction() throws Exception {
-    	String sql = "select timestampadd(" +SQLReservedWords.SQL_TSI_DAY+ ", 2, timestampvalue) from bqt1.smalla"; //$NON-NLS-1$ //$NON-NLS-2$
+    	String sql = "select timestampadd(" +NonReserved.SQL_TSI_DAY+ ", 2, timestampvalue) from bqt1.smalla"; //$NON-NLS-1$ //$NON-NLS-2$
     	
     	Command command = FakeTranslationFactory.getInstance().getBQTTranslationUtility().parseCommand(sql);
     	assertEquals("SELECT timestampadd(SQL_TSI_DAY, 2, SmallA.TimestampValue) FROM SmallA", command.toString()); //$NON-NLS-1$



More information about the teiid-commits mailing list