Author: shawkins
Date: 2012-08-01 16:03:42 -0400 (Wed, 01 Aug 2012)
New Revision: 4287
Modified:
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5ExecutionFactory.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql/TestMySQL5Translator.java
Log:
TEIID-2128 fix for frac_second handling in mysql
Modified:
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5ExecutionFactory.java
===================================================================
---
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5ExecutionFactory.java 2012-08-01
17:58:07 UTC (rev 4286)
+++
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5ExecutionFactory.java 2012-08-01
20:03:42 UTC (rev 4287)
@@ -30,7 +30,10 @@
import java.util.Arrays;
import java.util.List;
+import org.teiid.language.Expression;
import org.teiid.language.Function;
+import org.teiid.language.Literal;
+import org.teiid.language.SQLConstants.NonReserved;
import org.teiid.translator.SourceSystemFunctions;
import org.teiid.translator.Translator;
import org.teiid.translator.TranslatorException;
@@ -50,6 +53,34 @@
return Arrays.asList("char(", function.getParameters().get(0), " USING
ASCII)"); //$NON-NLS-1$ //$NON-NLS-2$
}
});
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new FunctionModifier() {
+
+ @Override
+ public List<?> translate(Function function) {
+ Literal intervalType = (Literal)function.getParameters().get(0);
+ String interval = ((String)intervalType.getValue()).toUpperCase();
+ if (interval.equals(NonReserved.SQL_TSI_FRAC_SECOND)) {
+ intervalType.setValue("MICROSECOND"); //$NON-NLS-1$
+ Expression[] args = new Expression[] {function.getParameters().get(1),
getLanguageFactory().createLiteral(1000, TypeFacility.RUNTIME_TYPES.INTEGER)};
+ function.getParameters().set(1, getLanguageFactory().createFunction("/",
args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
+ }
+ return null;
+ }
+ });
+
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new FunctionModifier() {
+
+ @Override
+ public List<?> translate(Function function) {
+ Literal intervalType = (Literal)function.getParameters().get(0);
+ String interval = ((String)intervalType.getValue()).toUpperCase();
+ if (interval.equals(NonReserved.SQL_TSI_FRAC_SECOND)) {
+ intervalType.setValue("MICROSECOND"); //$NON-NLS-1$
+ return Arrays.asList(function, " * 1000"); //$NON-NLS-1$
+ }
+ return null;
+ }
+ });
}
@Override
Modified:
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql/TestMySQL5Translator.java
===================================================================
---
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql/TestMySQL5Translator.java 2012-08-01
17:58:07 UTC (rev 4286)
+++
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql/TestMySQL5Translator.java 2012-08-01
20:03:42 UTC (rev 4287)
@@ -47,4 +47,15 @@
output, TRANSLATOR);
}
+
+ @Test public void testTimestampFunctions() throws Exception {
+ String input = "SELECT timestampdiff(SQL_TSI_FRAC_SECOND, timestampvalue, {d
'1970-01-01'}), timestampdiff(SQL_TSI_HOUR, timestampvalue, {d
'1970-01-01'}), timestampadd(SQL_TSI_FRAC_SECOND, 2000, MediumA.TimestampValue)
FROM BQT1.MediumA"; //$NON-NLS-1$
+ String output = "SELECT timestampdiff(MICROSECOND, MediumA.TimestampValue,
{ts '1970-01-01 00:00:00.0'}) * 1000, timestampdiff(SQL_TSI_HOUR,
MediumA.TimestampValue, {ts '1970-01-01 00:00:00.0'}), timestampadd(MICROSECOND,
(2000 / 1000), MediumA.TimestampValue) FROM MediumA"; //$NON-NLS-1$
+
+ TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB,
+ input,
+ output, TRANSLATOR);
+ }
+
+
}