From 3b836afe0c6a7d935e187de2ebcbeccbc98050b2 Mon Sep 17 00:00:00 2001 From: shawkins Date: Fri, 17 Apr 2015 07:47:14 -0400 Subject: [PATCH] TEIID-3441 allowing varbinary for xmlparse --- .../java/org/teiid/query/eval/Evaluator.java | 8 +++++++ .../query/validator/ValidationVisitor.java | 3 ++- .../resources/org/teiid/query/i18n.properties | 2 +- .../query/processor/TestSQLXMLProcessing.java | 21 +++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) 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$