Skip to content
Snippets Groups Projects
Commit c3f69763 authored by Grégory Mantelet's avatar Grégory Mantelet
Browse files

[ADQL] Fix MOD, RAND, ROUND and TRUNCATE (see ADQL-2.1 and ADQL-2.0 Erratum 2).

parent 85b1c4e2
Branches
Tags
No related merge requests found
...@@ -33,6 +33,7 @@ import adql.query.operand.ADQLOperand; ...@@ -33,6 +33,7 @@ import adql.query.operand.ADQLOperand;
import adql.query.operand.Concatenation; import adql.query.operand.Concatenation;
import adql.query.operand.Operation; import adql.query.operand.Operation;
import adql.query.operand.function.InUnitFunction; import adql.query.operand.function.InUnitFunction;
import adql.query.operand.function.MathFunction;
import adql.query.operand.function.geometry.AreaFunction; import adql.query.operand.function.geometry.AreaFunction;
import adql.query.operand.function.geometry.BoxFunction; import adql.query.operand.function.geometry.BoxFunction;
import adql.query.operand.function.geometry.CentroidFunction; import adql.query.operand.function.geometry.CentroidFunction;
...@@ -205,6 +206,20 @@ public class MySQLTranslator extends JDBCTranslator { ...@@ -205,6 +206,20 @@ public class MySQLTranslator extends JDBCTranslator {
} }
} }
@Override
public String translate(MathFunction fct) throws TranslationException {
switch(fct.getType()) {
case TRUNCATE:
if (fct.getNbParameters() >= 2)
return "truncate(" + translate(fct.getParameter(0)) + ", " + translate(fct.getParameter(1)) + ")";
else
return "truncate(" + translate(fct.getParameter(0)) + ", 0)";
default:
return getDefaultADQLFunction(fct);
}
}
@Override @Override
public String translate(Comparison comp) throws TranslationException { public String translate(Comparison comp) throws TranslationException {
switch(comp.getOperator()) { switch(comp.getOperator()) {
......
...@@ -204,17 +204,13 @@ public class PostgreSQLTranslator extends JDBCTranslator { ...@@ -204,17 +204,13 @@ public class PostgreSQLTranslator extends JDBCTranslator {
case TRUNCATE: case TRUNCATE:
if (fct.getNbParameters() >= 2) if (fct.getNbParameters() >= 2)
return "trunc(CAST(" + translate(fct.getParameter(0)) + " AS numeric), " + translate(fct.getParameter(1)) + ")"; return "trunc(CAST(" + translate(fct.getParameter(0)) + " AS numeric), " + translate(fct.getParameter(1)) + ")";
else if (fct.getNbParameters() >= 1)
return "trunc(CAST(" + translate(fct.getParameter(0)) + " AS numeric)" + ")";
else else
return "trunc()"; return "trunc(CAST(" + translate(fct.getParameter(0)) + " AS numeric)" + ")";
case ROUND: case ROUND:
if (fct.getNbParameters() >= 2) if (fct.getNbParameters() >= 2)
return "round(CAST(" + translate(fct.getParameter(0)) + " AS numeric), " + translate(fct.getParameter(1)) + ")"; return "round(CAST(" + translate(fct.getParameter(0)) + " AS numeric), " + translate(fct.getParameter(1)) + ")";
else if (fct.getNbParameters() >= 1)
return "round(CAST(" + translate(fct.getParameter(0)) + " AS numeric))";
else else
return "round()"; return "round(CAST(" + translate(fct.getParameter(0)) + " AS numeric))";
case PI: case PI:
return getDefaultADQLFunction(fct); return getDefaultADQLFunction(fct);
default: default:
......
...@@ -456,7 +456,10 @@ public class SQLServerTranslator extends JDBCTranslator { ...@@ -456,7 +456,10 @@ public class SQLServerTranslator extends JDBCTranslator {
switch(fct.getType()) { switch(fct.getType()) {
case TRUNCATE: case TRUNCATE:
// third argument to round nonzero means do a truncate // third argument to round nonzero means do a truncate
return "round(convert(float, " + ((fct.getNbParameters() >= 2) ? (translate(fct.getParameter(0)) + ", " + translate(fct.getParameter(1))) : "") + "),1)"; if (fct.getNbParameters() >= 2)
return "round(convert(float, " + translate(fct.getParameter(0)) + "), convert(float, " + translate(fct.getParameter(1)) + "), 1)";
else
return "round(convert(float, " + translate(fct.getParameter(0)) + "), 0, 1)";
case MOD: case MOD:
return ((fct.getNbParameters() >= 2) ? ("convert(float, " + translate(fct.getParameter(0)) + ") % convert(float, " + translate(fct.getParameter(1)) + ")") : ""); return ((fct.getNbParameters() >= 2) ? ("convert(float, " + translate(fct.getParameter(0)) + ") % convert(float, " + translate(fct.getParameter(1)) + ")") : "");
case ATAN2: case ATAN2:
...@@ -478,7 +481,10 @@ public class SQLServerTranslator extends JDBCTranslator { ...@@ -478,7 +481,10 @@ public class SQLServerTranslator extends JDBCTranslator {
case RADIANS: case RADIANS:
return "radians(convert(float, " + translate(fct.getParameter(0)) + "))"; return "radians(convert(float, " + translate(fct.getParameter(0)) + "))";
case ROUND: case ROUND:
if (fct.getNbParameters() >= 2)
return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", " + translate(fct.getParameter(1)) + ")"; return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", " + translate(fct.getParameter(1)) + ")";
else
return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", 0)";
default: default:
return getDefaultADQLFunction(fct); return getDefaultADQLFunction(fct);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment