From c3f69763bcc878feb20ca804b17a9fd40e79b6e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gr=C3=A9gory=20Mantelet?=
 <gregory.mantelet@astro.unistra.fr>
Date: Tue, 27 Aug 2019 10:53:26 +0200
Subject: [PATCH] [ADQL] Fix MOD, RAND, ROUND and TRUNCATE (see ADQL-2.1 and
 ADQL-2.0 Erratum 2).

---
 src/adql/translator/MySQLTranslator.java      | 15 +++++++++++++++
 src/adql/translator/PostgreSQLTranslator.java |  8 ++------
 src/adql/translator/SQLServerTranslator.java  | 10 ++++++++--
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/adql/translator/MySQLTranslator.java b/src/adql/translator/MySQLTranslator.java
index ac80f45..ba81c6a 100644
--- a/src/adql/translator/MySQLTranslator.java
+++ b/src/adql/translator/MySQLTranslator.java
@@ -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()) {
diff --git a/src/adql/translator/PostgreSQLTranslator.java b/src/adql/translator/PostgreSQLTranslator.java
index 46d7a1a..fc34b03 100644
--- a/src/adql/translator/PostgreSQLTranslator.java
+++ b/src/adql/translator/PostgreSQLTranslator.java
@@ -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:
diff --git a/src/adql/translator/SQLServerTranslator.java b/src/adql/translator/SQLServerTranslator.java
index 677e671..5707817 100644
--- a/src/adql/translator/SQLServerTranslator.java
+++ b/src/adql/translator/SQLServerTranslator.java
@@ -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:
-				return "round(convert(float, " + translate(fct.getParameter(0)) + ")" + ", " + translate(fct.getParameter(1)) + ")";
+				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);
-- 
GitLab