Author: shawkins
Date: 2010-06-28 12:14:55 -0400 (Mon, 28 Jun 2010)
New Revision: 2310
Modified:
trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.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/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java
trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
Log:
TEIID-108 ensuring consistent (and correct) xsd type conversion.
Modified: trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java 2010-06-28
14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -252,28 +252,9 @@
values = newValues;
}
Object result = method.invoke(null, values);
- if (!ALLOW_NAN_INFINITY) {
- if (result instanceof Double) {
- Double floatVal = (Double)result;
- if (Double.isInfinite(floatVal) || Double.isNaN(floatVal)) {
- throw new FunctionExecutionException(new
ArithmeticException("Infinite or invalid result"),
ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003,
getName())); //$NON-NLS-1$
- }
- } else if (result instanceof Float) {
- Float floatVal = (Float)result;
- if (Float.isInfinite(floatVal) || Float.isNaN(floatVal)) {
- throw new FunctionExecutionException(new
ArithmeticException("Infinite or invalid result"),
ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003,
getName())); //$NON-NLS-1$
- }
- }
- }
- result = DataTypeManager.convertToRuntimeType(result);
- result = DataTypeManager.transformValue(result, getReturnType());
- if (result instanceof String) {
- String s = (String)result;
- if (s.length() > DataTypeManager.MAX_STRING_LENGTH) {
- return s.substring(0, DataTypeManager.MAX_STRING_LENGTH);
- }
- }
- return result;
+ return importValue(result, getReturnType());
+ } catch(ArithmeticException e) {
+ throw new FunctionExecutionException(e, ErrorMessageKeys.FUNCTION_0003,
QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003, getName()));
} catch(InvocationTargetException e) {
throw new FunctionExecutionException(e.getTargetException(),
ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003,
getName()));
} catch(IllegalAccessException e) {
@@ -281,5 +262,31 @@
} catch (TransformationException e) {
throw new FunctionExecutionException(e, e.getMessage());
}
+ }
+
+ public static Object importValue(Object result, Class<?> expectedType)
+ throws ArithmeticException, TransformationException {
+ if (!ALLOW_NAN_INFINITY) {
+ if (result instanceof Double) {
+ Double floatVal = (Double)result;
+ if (Double.isInfinite(floatVal) || Double.isNaN(floatVal)) {
+ throw new ArithmeticException("Infinite or invalid result");
//$NON-NLS-1$
+ }
+ } else if (result instanceof Float) {
+ Float floatVal = (Float)result;
+ if (Float.isInfinite(floatVal) || Float.isNaN(floatVal)) {
+ throw new ArithmeticException("Infinite or invalid result");
//$NON-NLS-1$
+ }
+ }
+ }
+ result = DataTypeManager.convertToRuntimeType(result);
+ result = DataTypeManager.transformValue(result, expectedType);
+ if (result instanceof String) {
+ String s = (String)result;
+ if (s.length() > DataTypeManager.MAX_STRING_LENGTH) {
+ return s.substring(0, DataTypeManager.MAX_STRING_LENGTH);
+ }
+ }
+ return result;
}
}
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-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -30,10 +30,11 @@
import java.nio.CharBuffer;
import java.sql.Blob;
import java.sql.Clob;
+import java.sql.Date;
import java.sql.SQLException;
import java.sql.SQLXML;
+import java.sql.Time;
import java.sql.Timestamp;
-import java.util.Calendar;
import java.util.Collections;
import java.util.List;
@@ -56,26 +57,28 @@
import javax.xml.transform.stream.StreamSource;
import javax.xml.xpath.XPathExpressionException;
+import net.sf.saxon.expr.JPConverter;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.Name11Checker;
import net.sf.saxon.sxpath.XPathEvaluator;
import net.sf.saxon.sxpath.XPathExpression;
import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.value.AtomicValue;
+import net.sf.saxon.value.DateTimeValue;
+import net.sf.saxon.value.DateValue;
+import net.sf.saxon.value.DayTimeDurationValue;
+import net.sf.saxon.value.TimeValue;
-import org.teiid.api.exception.query.FunctionExecutionException;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.types.ClobImpl;
import org.teiid.core.types.ClobType;
-import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.SQLXMLImpl;
-import org.teiid.core.types.TransformationException;
import org.teiid.core.types.XMLTranslator;
import org.teiid.core.types.XMLType;
import org.teiid.core.types.XMLType.Type;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.function.CharsetUtils;
-import org.teiid.query.function.FunctionMethods;
import org.teiid.query.processor.xml.XMLUtil;
import org.teiid.query.util.CommandContext;
import org.teiid.translator.WSConnection.Util;
@@ -89,21 +92,7 @@
public class XMLSystemFunctions {
private static final String P_OUTPUT_VALIDATE_STRUCTURE =
"com.ctc.wstx.outputValidateStructure"; //$NON-NLS-1$
- //YEAR 0 in the server timezone. used to determine negative years
- public static long YEAR_ZERO;
- static String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
//$NON-NLS-1$
- static String TIMESTAMP_MICROZEROS = "000000000"; //$NON-NLS-1$
-
- static {
- Calendar cal = Calendar.getInstance();
-
- for (int i = 0; i <= Calendar.MILLISECOND; i++) {
- cal.set(i, 0);
- }
- YEAR_ZERO = cal.getTimeInMillis();
- }
-
public static ClobType xslTransform(CommandContext context, Object xml, Object
styleSheet) throws Exception {
Source styleSource = null;
Source xmlSource = null;
@@ -219,7 +208,7 @@
if (attributes != null) {
for (Evaluator.NameValuePair<?> nameValuePair : attributes) {
if (nameValuePair.value != null) {
- eventWriter.add(eventFactory.createAttribute(new QName(nameValuePair.name),
getStringValue(nameValuePair.value)));
+ eventWriter.add(eventFactory.createAttribute(new QName(nameValuePair.name),
convertToAtomicValue(nameValuePair.value).getStringValue()));
}
}
}
@@ -299,19 +288,22 @@
return result;
}
- static String getStringValue(Object object) throws TransformerException {
- if (object instanceof Timestamp) {
- try {
- return timestampToDateTime((Timestamp)object);
- } catch (FunctionExecutionException e) {
- throw new TransformerException(e);
- }
- }
- try {
- return DataTypeManager.transformValue(object,
DataTypeManager.DefaultDataClasses.STRING);
- } catch (TransformationException e) {
- throw new TransformerException(e);
- }
+ public static AtomicValue convertToAtomicValue(Object value) throws TransformerException
{
+ if (value instanceof java.util.Date) { //special handling for time types
+ java.util.Date d = (java.util.Date)value;
+ DateTimeValue tdv = DateTimeValue.fromJavaDate(d);
+ if (value instanceof Date) {
+ value = new DateValue(tdv.getYear(), tdv.getMonth(), tdv.getDay(),
tdv.getTimezoneInMinutes());
+ } else if (value instanceof Time) {
+ value = new TimeValue(tdv.getHour(), tdv.getMinute(), tdv.getSecond(),
tdv.getMicrosecond(), tdv.getTimezoneInMinutes());
+ } else if (value instanceof Timestamp) {
+ Timestamp ts = (Timestamp)value;
+ value = tdv.add(DayTimeDurationValue.fromMicroseconds(ts.getNanos() / 1000));
+ }
+ return (AtomicValue)value;
+ }
+ JPConverter converter = JPConverter.allocate(value.getClass(), null);
+ return (AtomicValue)converter.convert(value, null);
}
static void convertValue(Writer writer, XMLEventWriter eventWriter, XMLEventFactory
eventFactory, Object object) throws IOException,
@@ -332,7 +324,7 @@
r = clob.getCharacterStream();
convertReader(writer, eventWriter, r, Type.TEXT);
} else {
- String val = getStringValue(object);
+ String val = convertToAtomicValue(object).getStringValue();
eventWriter.add(eventFactory.createCharacters(val));
}
} catch (SQLException e) {
@@ -391,44 +383,6 @@
return new XMLType(new SQLXMLImpl("<!--" + comment + "-->"));
//$NON-NLS-1$ //$NON-NLS-2$
}
- /**
- * Formats a timestamp to an xs:dateTime. This uses DATETIME_FORMAT
- * with a trailing string for nanoseconds (without right zeros).
- */
- public static String timestampToDateTime(Timestamp time) throws
FunctionExecutionException {
- String result = FunctionMethods.format(time, DATETIME_FORMAT);
- int nanos = time.getNanos();
- if (nanos == 0) {
- return result;
- }
-
- StringBuffer resultBuffer = new StringBuffer();
- boolean first = true;
- int i = 0;
- for (; i < 9 && nanos > 0; i++) {
- int digit = nanos%10;
- if (first) {
- if (digit > 0) {
- resultBuffer.insert(0, digit);
- first = false;
- }
- } else {
- resultBuffer.insert(0, digit);
- }
- nanos /= 10;
- }
- if (i < 9) {
- resultBuffer.insert(0, TIMESTAMP_MICROZEROS.substring(i));
- }
- resultBuffer.insert(0, "."); //$NON-NLS-1$
- resultBuffer.insert(0, result);
- if (time.getTime() < YEAR_ZERO) {
- resultBuffer.insert(0, "-"); //$NON-NLS-1$
- }
- return resultBuffer.toString();
-
- }
-
public static Source convertToSource(Object value) throws TeiidProcessingException {
if (value == null) {
return null;
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2010-06-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -24,13 +24,19 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.sxpath.XPathDynamicContext;
import net.sf.saxon.sxpath.XPathExpression;
import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.type.BuiltInAtomicType;
+import net.sf.saxon.type.ConversionResult;
+import net.sf.saxon.value.AtomicValue;
+import net.sf.saxon.value.StringValue;
import net.sf.saxon.value.Value;
import org.teiid.api.exception.query.ExpressionEvaluationException;
@@ -41,6 +47,7 @@
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.XMLType;
import org.teiid.query.execution.QueryExecPlugin;
+import org.teiid.query.function.FunctionDescriptor;
import org.teiid.query.sql.lang.XMLTable;
import org.teiid.query.sql.lang.XMLTable.XMLColumn;
@@ -49,6 +56,16 @@
*/
public class XMLTableNode extends SubqueryAwareRelationalNode {
+ private static Map<Class<?>, BuiltInAtomicType> typeMapping = new
HashMap<Class<?>, BuiltInAtomicType>();
+
+ static {
+ typeMapping.put(DataTypeManager.DefaultDataClasses.TIMESTAMP,
BuiltInAtomicType.DATE_TIME);
+ typeMapping.put(DataTypeManager.DefaultDataClasses.TIME, BuiltInAtomicType.TIME);
+ typeMapping.put(DataTypeManager.DefaultDataClasses.DATE, BuiltInAtomicType.DATE);
+ typeMapping.put(DataTypeManager.DefaultDataClasses.FLOAT, BuiltInAtomicType.FLOAT);
+ typeMapping.put(DataTypeManager.DefaultDataClasses.DOUBLE, BuiltInAtomicType.DOUBLE);
+ }
+
private XMLTable table;
private List<XMLColumn> projectedColumns;
@@ -151,10 +168,20 @@
}
Object value = Value.convertToJava(colItem);
if (value instanceof Item) {
- value = ((Item)value).getStringValue();
+ Item i = (Item)value;
+ BuiltInAtomicType bat = typeMapping.get(proColumn.getSymbol().getType());
+ if (bat != null) {
+ ConversionResult cr = StringValue.convertStringToBuiltInType(i.getStringValueCS(),
bat, null);
+ value = cr.asAtomic();
+ value = Value.convertToJava((AtomicValue)value);
+ if (value instanceof Item) {
+ value = ((Item)value).getStringValue();
+ }
+ } else {
+ value = i.getStringValue();
+ }
}
- value = DataTypeManager.convertToRuntimeType(value);
- value = DataTypeManager.transformValue(value, proColumn.getSymbol().getType());
+ value = FunctionDescriptor.importValue(value, proColumn.getSymbol().getType());
tuple.add(value);
} catch (XPathException e) {
throw new TeiidProcessingException(e,
QueryExecPlugin.Util.getString("XMLTableNode.path_error", proColumn.getName()));
//$NON-NLS-1$
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java 2010-06-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -27,6 +27,11 @@
import java.util.HashMap;
import java.util.Map;
+import javax.xml.transform.TransformerException;
+
+import net.sf.saxon.value.DateTimeValue;
+import net.sf.saxon.value.GYearMonthValue;
+
import org.teiid.api.exception.query.FunctionExecutionException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.TransformationException;
@@ -48,7 +53,6 @@
private static String GMONTHDAY_FORMAT = "--MM-dd"; //$NON-NLS-1$
private static String GYEAR_FORMAT = "0000"; //$NON-NLS-1$
- private static String GYEARMONTH_FORMAT = "yyyy-MM"; //$NON-NLS-1$
public static final String DATETIME = "dateTime"; //$NON-NLS-1$
public static final String DOUBLE = "double"; //$NON-NLS-1$
@@ -118,7 +122,11 @@
switch (type) {
case DATETIME_CODE:
- valueStr = XMLSystemFunctions.timestampToDateTime((Timestamp)value);
+ try {
+ valueStr = XMLSystemFunctions.convertToAtomicValue(value).getStringValue();
+ } catch (TransformerException e) {
+ throw new TransformationException(e, e.getMessage());
+ }
break;
case DOUBLE_CODE:
valueStr = doubleToDouble((Double)value);
@@ -139,7 +147,13 @@
valueStr = FunctionMethods.format((BigInteger)value, GYEAR_FORMAT);
break;
case GYEARMONTH_CODE:
- valueStr = timestampTogYearMonth(value);
+ DateTimeValue dtv;
+ try {
+ dtv = ((DateTimeValue)XMLSystemFunctions.convertToAtomicValue(value));
+ } catch (TransformerException e) {
+ throw new TransformationException(e, e.getMessage());
+ }
+ valueStr = new GYearMonthValue(dtv.getYear(), dtv.getMonth(),
dtv.getTimezoneInMinutes()).getStringValue();
break;
default:
valueStr = defaultTranslation(value);
@@ -156,22 +170,6 @@
return valueStr;
}
- /**
- * @param value
- * @return
- * @throws FunctionExecutionException
- * @since 4.3
- */
- private static String timestampTogYearMonth(Object value) throws
FunctionExecutionException {
- String valueStr;
- Timestamp time = (Timestamp)value;
- valueStr = FunctionMethods.format(time, GYEARMONTH_FORMAT);
- if (time.getTime() < XMLSystemFunctions.YEAR_ZERO) {
- valueStr = "-" + valueStr; //$NON-NLS-1$
- }
- return valueStr;
- }
-
/**
* Translate any non-null value to a string by using the Object toString() method.
* This works in any case where the Java string representation of an object is the
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-28
14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -1158,6 +1158,7 @@
continue;
}
validateQName(obj, dc.getAlias());
+ validateXMLContentTypes(dc.getExpression(), obj);
}
}
@@ -1200,9 +1201,18 @@
@Override
public void visit(XMLElement obj) {
+ for (Expression expression : obj.getContent()) {
+ validateXMLContentTypes(expression, obj);
+ }
validateQName(obj, obj.getName());
}
+ public void validateXMLContentTypes(Expression expression, LanguageObject parent) {
+ if (expression.getType() == DataTypeManager.DefaultDataClasses.OBJECT ||
expression.getType() == DataTypeManager.DefaultDataClasses.BLOB) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_content_type",
expression), parent); //$NON-NLS-1$
+ }
+ }
+
@Override
public void visit(QueryString obj) {
validateDerivedColumnNames(obj, obj.getArgs());
@@ -1248,8 +1258,11 @@
hadError = true;
}
context = true;
- } else if (!names.add(dc.getAlias().toUpperCase())) {
-
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_passing",
dc.getAlias()), obj); //$NON-NLS-1$
+ } else {
+ validateXMLContentTypes(dc.getExpression(), obj);
+ if (!names.add(dc.getAlias().toUpperCase())) {
+
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_passing",
dc.getAlias()), obj); //$NON-NLS-1$
+ }
}
}
if (xqe.usesContextItem() && !context) {
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-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -358,13 +358,20 @@
public SequenceIterator evaluateXQuery(Object context, Map<String, Object>
parameterValues) throws TeiidProcessingException {
DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
- for (Map.Entry<String, Object> entry : parameterValues.entrySet()) {
- Object value = entry.getValue();
- if(value instanceof SQLXML) {
- value = XMLSystemFunctions.convertToSource(value);
- }
- dynamicContext.setParameter(entry.getKey(), value);
- }
+ try {
+ for (Map.Entry<String, Object> entry : parameterValues.entrySet()) {
+ Object value = entry.getValue();
+ if(value instanceof SQLXML) {
+ value = XMLSystemFunctions.convertToSource(value);
+ } else if (value instanceof java.util.Date) {
+ java.util.Date d = (java.util.Date)value;
+ value = XMLSystemFunctions.convertToAtomicValue(value);
+ }
+ dynamicContext.setParameter(entry.getKey(), value);
+ }
+ } catch (TransformerException e) {
+ throw new TeiidProcessingException(e);
+ }
if (context != null) {
Source source = XMLSystemFunctions.convertToSource(context);
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2010-06-28 14:47:10
UTC (rev 2309)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2010-06-28 16:14:55
UTC (rev 2310)
@@ -907,6 +907,7 @@
ValidationVisitor.xml_namespaces_reserved=The namespaces xmlns and xml are reserved.
ValidationVisitor.xml_namespaces_null_uri=The null uri, or empty string, is not allowed
as the uri value.
ValidationVisitor.xml_attributes_reserved=The namespace xmlns is reserved.
+ValidationVisitor.xml_content_type=The expression "{0}" is of OBJECT or BLOB
type, which cannot be used as an XML content value.
ValidationVisitor.xml_invalid_qname=The qname "{0}" is invalid.
ValidationVisitor.context_item_type=XMLTABLE or XMLQUERY PASSING context item must be an
XML value.
ValidationVisitor.passing_requires_name=XMLTABLE or XMLQUERY PASSING clause can only
contain at most 1 unnamed item.
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-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -25,7 +25,6 @@
import static org.junit.Assert.*;
import java.io.File;
-import java.sql.Timestamp;
import java.util.TimeZone;
import net.sf.saxon.trans.XPathException;
@@ -40,6 +39,7 @@
import org.teiid.core.types.XMLType;
import org.teiid.core.util.FileUtil;
import org.teiid.core.util.UnitTestUtil;
+import org.teiid.query.unittest.TimestampUtil;
@SuppressWarnings("nls")
public class TestXMLSystemFunctions {
@@ -197,10 +197,18 @@
helpTestXpathValue(xmlFilePath,xpath, "false"); //$NON-NLS-1$
}
- @Test public void testInvokeXmlElement2() throws Exception {
- assertEquals("1969-12-31T18:00:00", XMLSystemFunctions.getStringValue(new
Timestamp(0)));
+ @Test public void testAtomicValueTimestamp() throws Exception {
+ assertEquals("1910-04-01T07:01:02.000055Z",
XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createTimestamp(10, 3, 1, 1, 1, 2,
55001)).getStringValue());
}
+ @Test public void testAtomicValueTime() throws Exception {
+ assertEquals("16:03:01Z",
XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createTime(10, 3,
1)).getStringValue());
+ }
+
+ @Test public void testAtomicValueDate() throws Exception {
+ assertEquals("1920-03-03Z",
XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createDate(20, 2,
3)).getStringValue());
+ }
+
@Test public void testNameEscaping() throws Exception {
assertEquals("_u003A_b", XMLSystemFunctions.escapeName(":b",
true));
}
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-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -25,6 +25,7 @@
import static org.teiid.query.processor.TestProcessor.*;
import java.io.FileInputStream;
+import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
@@ -38,6 +39,7 @@
import org.teiid.core.util.UnitTestUtil;
import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
import org.teiid.query.unittest.FakeMetadataFactory;
+import org.teiid.query.unittest.TimestampUtil;
@SuppressWarnings({"nls", "unchecked"})
public class TestSQLXMLProcessing {
@@ -343,6 +345,16 @@
processPreparedStatement(sql, expected, dataManager, new
DefaultCapabilitiesFinder(), FakeMetadataFactory.example1Cached(),
Arrays.asList(blobFromFile("udf.xmi")));
}
+
+ @Test public void testXmlTableTypes() throws Exception {
+ String sql = "select * from xmltable('/a' passing xmlparse(document
'<a>2000-01-01T01:01:00.2-06:00</a>') columns x timestamp path
'xs:dateTime(./text())', y timestamp path '.') as x"; //$NON-NLS-1$
+ Timestamp ts = TimestampUtil.createTimestamp(100, 0, 1, 1, 1, 0, 200000000);
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList(ts, ts),
+ };
+
+ process(sql, expected);
+ }
private static FakeDataManager dataManager = new FakeDataManager();
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java 2010-06-28
14:47:10 UTC (rev 2309)
+++
trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -22,52 +22,60 @@
package org.teiid.query.processor.xml;
+import static org.junit.Assert.*;
+
import java.math.BigInteger;
import java.sql.Timestamp;
+import java.util.TimeZone;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.teiid.core.types.DataTypeManager;
-import org.teiid.query.processor.xml.XMLValueTranslator;
+import org.teiid.core.util.TimestampWithTimezone;
import org.teiid.query.unittest.TimestampUtil;
-import junit.framework.TestCase;
+public class TestXMLValueTranslator {
-public class TestXMLValueTranslator extends TestCase {
-
- public TestXMLValueTranslator(String name) {
- super(name);
- }
+ @BeforeClass public static void setUp() {
+ TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("GMT-06:00"));
//$NON-NLS-1$
+ }
+
+ @AfterClass public static void tearDown() {
+ TimestampWithTimezone.resetCalendar(null);
+ }
- public void test24HourDateTimeTranslation() throws Exception {
- Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 14, 14, 5, 6);
+ @Test public void test24HourDateTimeTranslation() throws Exception {
+ Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 14, 14, 5, 6000);
String value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
- assertEquals("2000-01-02T14:14:05.000000006", value); //$NON-NLS-1$
+ assertEquals("2000-01-02T20:14:05.000006Z", value); //$NON-NLS-1$
}
- public void testDateTimeTranslation() throws Exception {
+ @Test public void testDateTimeTranslation() throws Exception {
Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 3, 4, 5, 6);
String value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
- assertEquals("2000-01-02T03:04:05.000000006", value); //$NON-NLS-1$
+ assertEquals("2000-01-02T09:04:05Z", value); //$NON-NLS-1$
ts.setNanos(6000);
value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
- assertEquals("2000-01-02T03:04:05.000006", value); //$NON-NLS-1$
+ assertEquals("2000-01-02T09:04:05.000006Z", value); //$NON-NLS-1$
ts.setNanos(0);
value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
- assertEquals("2000-01-02T03:04:05", value); //$NON-NLS-1$
+ assertEquals("2000-01-02T09:04:05Z", value); //$NON-NLS-1$
ts = TimestampUtil.createTimestamp(-2000, 0, 2, 3, 4, 5, 6);
value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
- assertEquals("-0101-01-02T03:04:05.000000006", value); //$NON-NLS-1$
+ assertEquals("-0102-12-30T09:04:05Z", value); //$NON-NLS-1$
}
- public void testgYearTranslation() throws Exception {
+ @Test public void testgYearTranslation() throws Exception {
String value = XMLValueTranslator.translateToXMLValue(new
BigInteger("5"), DataTypeManager.DefaultDataClasses.BIG_INTEGER,
XMLValueTranslator.GYEAR); //$NON-NLS-1$
assertEquals("0005", value); //$NON-NLS-1$
@@ -75,19 +83,19 @@
assertEquals("-10000", value); //$NON-NLS-1$
}
- public void testgYearMonthTranslation() throws Exception {
+ @Test public void testgYearMonthTranslation() throws Exception {
Timestamp ts = TimestampUtil.createTimestamp(100, 0, 4, 6, 8, 10, 12);
String value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.GYEARMONTH);
- assertEquals("2000-01", value); //$NON-NLS-1$
+ assertEquals("2000-01Z", value); //$NON-NLS-1$
ts = TimestampUtil.createTimestamp(-30000, 0, 4, 6, 8, 10, 12);
value = XMLValueTranslator.translateToXMLValue(ts,
DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.GYEARMONTH);
- assertEquals("-28101-01", value); //$NON-NLS-1$
+ assertEquals("-28102-06Z", value); //$NON-NLS-1$
}
- public void testDefaultTranslation() throws Exception {
+ @Test public void testDefaultTranslation() throws Exception {
String value = XMLValueTranslator.translateToXMLValue("",
DataTypeManager.DefaultDataClasses.STRING, XMLValueTranslator.STRING); //$NON-NLS-1$
assertNull(value);
}
Modified: trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java 2010-06-28 14:47:10
UTC (rev 2309)
+++ trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java 2010-06-28 16:14:55
UTC (rev 2310)
@@ -36,7 +36,6 @@
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipelineCoverage;
import org.jboss.netty.channel.Channels;
-import org.jboss.netty.channel.DownstreamMessageEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.stream.ChunkedInput;
import org.jboss.netty.handler.stream.ChunkedStream;
Modified:
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java 2010-06-28
14:47:10 UTC (rev 2309)
+++
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java 2010-06-28
16:14:55 UTC (rev 2310)
@@ -24,6 +24,7 @@
import java.io.FileInputStream;
import java.math.BigInteger;
+import java.sql.Timestamp;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@@ -40,7 +41,6 @@
import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
import org.teiid.query.processor.HardcodedDataManager;
-import org.teiid.query.unittest.TimestampUtil;
import org.teiid.translator.SourceSystemFunctions;
@@ -71,22 +71,25 @@
models.add("sample"); //$NON-NLS-1$
dataMgr.setValidModels(models);
+ Timestamp ts = new Timestamp(-2106305630000l);
+ ts.setNanos(3000000);
+
dataMgr.addData("SELECT g_0.\"timestamp\",
g_0.\"double\", g_0.\"float\", convert(g_0.\"double\",
biginteger), convert(g_0.\"double\", biginteger),
convert(g_0.\"date\", timestamp), convert(g_0.\"double\", biginteger),
convert(g_0.\"date\", timestamp), '1' FROM sample.RUNTIMEVALUE AS
g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] {
- TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 10, 200),
+ ts,
new Double(Double.NEGATIVE_INFINITY),
new Float(Float.POSITIVE_INFINITY),
new BigInteger("100"), //$NON-NLS-1$
new BigInteger("100"), //$NON-NLS-1$
- TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 7, 0),
+ ts,
new BigInteger("100"), //$NON-NLS-1$
- TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 7, 0),
+ ts,
"1" //$NON-NLS-1$
})});
- List[] expected = new List[] { Arrays.asList(new Object[] {"<?xml
version=\"1.0\" encoding=\"UTF-8\"?><XSDTypesNS:test
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:XSDTypesNS=\"http://www.metamatrix.com/XMLSchema/DataSets/XSDT...
})}; //$NON-NLS-1$
+ List[] expected = new List[] { Arrays.asList(new Object[] {"<?xml
version=\"1.0\" encoding=\"UTF-8\"?><XSDTypesNS:test
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:XSDTypesNS=\"http://www.metamatrix.com/XMLSchema/DataSets/XSDT...
})}; //$NON-NLS-1$
doProcess(metadata,
sql,
finder, dataMgr , expected, DEBUG);
@@ -117,5 +120,4 @@
}
-
}