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
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import adql.query.operand.ADQLOperand;
import adql.query.operand.Concatenation;
import adql.query.operand.Operation;
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.BoxFunction;
import adql.query.operand.function.geometry.CentroidFunction;
@@ -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
	public String translate(Comparison comp) throws TranslationException {
		switch(comp.getOperator()) {
+2 −6
Original line number Diff line number Diff line
@@ -204,17 +204,13 @@ public class PostgreSQLTranslator extends JDBCTranslator {
			case TRUNCATE:
				if (fct.getNbParameters() >= 2)
					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
					return "trunc()";
					return "trunc(CAST(" + translate(fct.getParameter(0)) + " AS numeric)" + ")";
			case ROUND:
				if (fct.getNbParameters() >= 2)
					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
					return "round()";
					return "round(CAST(" + translate(fct.getParameter(0)) + " AS numeric))";
			case PI:
				return getDefaultADQLFunction(fct);
			default:
+8 −2
Original line number Diff line number Diff line
@@ -456,7 +456,10 @@ public class SQLServerTranslator extends JDBCTranslator {
		switch(fct.getType()) {
			case 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:
				return ((fct.getNbParameters() >= 2) ? ("convert(float, " + translate(fct.getParameter(0)) + ") % convert(float, " + translate(fct.getParameter(1)) + ")") : "");
			case ATAN2:
@@ -478,7 +481,10 @@ public class SQLServerTranslator extends JDBCTranslator {
			case RADIANS:
				return "radians(convert(float, " + translate(fct.getParameter(0)) + "))";
			case ROUND:
				if (fct.getNbParameters() >= 2)
					return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", " + translate(fct.getParameter(1)) + ")";
				else
					return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", 0)";

			default:
				return getDefaultADQLFunction(fct);