diff --git a/engine/src/main/java/org/teiid/query/eval/Evaluator.java b/engine/src/main/java/org/teiid/query/eval/Evaluator.java
index 185e7c450d..248afe17e7 100644
--- a/engine/src/main/java/org/teiid/query/eval/Evaluator.java
+++ b/engine/src/main/java/org/teiid/query/eval/Evaluator.java
@@ -806,6 +806,14 @@ private Object evaluateXMLParse(List> tuple, final XMLParse xp) throws Express
Reader r = new StringReader(string);
type = validate(xp, r);
}
+ } else if (value instanceof BinaryType) {
+ BinaryType string = (BinaryType)value;
+ result = new SQLXMLImpl(string.getBytesDirect());
+ result.setCharset(Streamable.CHARSET);
+ if (!xp.isWellFormed()) {
+ Reader r = result.getCharacterStream();
+ type = validate(xp, r);
+ }
} else {
InputStreamFactory isf = null;
Streamable> s = (Streamable>)value;
diff --git a/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java b/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
index 92ab17e5b9..b09fd39bf7 100644
--- a/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
+++ b/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
@@ -1484,7 +1484,8 @@ private void validateTextOptions(LanguageObject obj, Character delimiter,
public void visit(XMLParse obj) {
if (obj.getExpression().getType() != DataTypeManager.DefaultDataClasses.STRING &&
obj.getExpression().getType() != DataTypeManager.DefaultDataClasses.CLOB &&
- obj.getExpression().getType() != DataTypeManager.DefaultDataClasses.BLOB) {
+ obj.getExpression().getType() != DataTypeManager.DefaultDataClasses.BLOB &&
+ obj.getExpression().getType() != DataTypeManager.DefaultDataClasses.VARBINARY) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xmlparse_type"), obj); //$NON-NLS-1$
}
}
diff --git a/engine/src/main/resources/org/teiid/query/i18n.properties b/engine/src/main/resources/org/teiid/query/i18n.properties
index 55128dfd78..6b7196043e 100644
--- a/engine/src/main/resources/org/teiid/query/i18n.properties
+++ b/engine/src/main/resources/org/teiid/query/i18n.properties
@@ -861,7 +861,7 @@ ValidationVisitor.ValidationVisitor.context_item_not_allowed=OBJECTTABLE does no
ValidationVisitor.one_ordinal=Only one FOR ORDINALITY column is allowed for an XMLTABLE.
ValidationVisitor.invalid_default=XMLTABLE or OBJECTTABLE DEFAULT expression is invalid: "{0}"
ValidationVisitor.context_required=The XQuery requires a context item, but none exists in the PASSING clause.
-ValidationVisitor.xmlparse_type=XMLPARSE expects a STRING, CLOB, or BLOB value.
+ValidationVisitor.xmlparse_type=XMLPARSE expects a STRING, CLOB, VARBINARY, or BLOB value.
ValidationVisitor.invalid_encoding=Encoding {0} is not valid.
ValidationVisitor.subquery_insert=SELECT INTO should not be used in a subquery.
ValidationVisitor.xmlcast_types=XMLCAST can only be used to cast to and from XML types {0}
diff --git a/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java b/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
index 664bc084e9..ddfc34b768 100644
--- a/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
+++ b/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
@@ -52,6 +52,7 @@
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.InputStreamFactory;
import org.teiid.core.util.ObjectConverterUtil;
+import org.teiid.core.util.PropertiesUtils;
import org.teiid.core.util.TimestampWithTimezone;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.metadata.MetadataStore;
@@ -312,6 +313,16 @@ public class TestSQLXMLProcessing {
process(sql, expected);
}
+ @Test public void testXmlTableBOM() throws Exception {
+ String sql = "select * from xmltable('/a' passing xmlparse(document X'EFBBBF" + PropertiesUtils.toHex("".getBytes("UTF-8")) + "' wellformed)) as x"; //$NON-NLS-1$
+
+ List>[] expected = new List>[] {
+ Arrays.asList(""),
+ };
+
+ process(sql, expected);
+ }
+
@Test public void testXsiNil() throws Exception {
String sql = "select * from xmltable('/a/b' passing convert('1', xml) columns val integer path '.') as x"; //$NON-NLS-1$
@@ -653,6 +664,16 @@ public void run() {
process(sql, expected);
}
+ @Test public void testXmlParseBOM() throws Exception {
+ String sql = "select xmlparse(content X'EFBBBF" + PropertiesUtils.toHex("".getBytes("UTF-8")) + "')"; //$NON-NLS-1$
+
+ List>[] expected = new List>[] {
+ Arrays.asList("")
+ };
+
+ process(sql, expected);
+ }
+
@Test(expected=ExpressionEvaluationException.class) public void testXmlParseContentException() throws Exception {
String sql = "select xmlparse(content 'a<')"; //$NON-NLS-1$