From 9e8f8e7228085088e209529b9c3978e0d7560a3d Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Wed, 30 Sep 2015 10:41:24 +0200
Subject: [PATCH] [ADQL] Fix ADQL to SQL translation of strings: the character
 ' was not escaped. Now, all occurences of ' are replaced by '' in the SQL
 translation.

---
 src/adql/translator/JDBCTranslator.java      |   6 +-
 test/adql/translator/TestJDBCTranslator.java | 136 +++++++++++++++++++
 2 files changed, 139 insertions(+), 3 deletions(-)
 create mode 100644 test/adql/translator/TestJDBCTranslator.java

diff --git a/src/adql/translator/JDBCTranslator.java b/src/adql/translator/JDBCTranslator.java
index 0ba1b0d..348cffe 100644
--- a/src/adql/translator/JDBCTranslator.java
+++ b/src/adql/translator/JDBCTranslator.java
@@ -167,8 +167,8 @@ import adql.query.operand.function.geometry.RegionFunction;
  * </p>
  * 
  * @author Gr&eacute;gory Mantelet (ARI)
- * @version 1.3 (05/2015)
- * @since 1.3
+ * @version 1.4 (09/2015)
+ * @since 1.4
  * 
  * @see PostgreSQLTranslator
  * @see PgSphereTranslator
@@ -677,7 +677,7 @@ public abstract class JDBCTranslator implements ADQLTranslator {
 
 	@Override
 	public String translate(StringConstant strConst) throws TranslationException{
-		return "'" + strConst.getValue() + "'";
+		return "'" + strConst.getValue().replaceAll("'", "''") + "'";
 	}
 
 	@Override
diff --git a/test/adql/translator/TestJDBCTranslator.java b/test/adql/translator/TestJDBCTranslator.java
new file mode 100644
index 0000000..577b11f
--- /dev/null
+++ b/test/adql/translator/TestJDBCTranslator.java
@@ -0,0 +1,136 @@
+package adql.translator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import adql.db.DBType;
+import adql.db.STCS.Region;
+import adql.parser.ParseException;
+import adql.query.IdentifierField;
+import adql.query.operand.StringConstant;
+import adql.query.operand.function.geometry.AreaFunction;
+import adql.query.operand.function.geometry.BoxFunction;
+import adql.query.operand.function.geometry.CentroidFunction;
+import adql.query.operand.function.geometry.CircleFunction;
+import adql.query.operand.function.geometry.ContainsFunction;
+import adql.query.operand.function.geometry.DistanceFunction;
+import adql.query.operand.function.geometry.ExtractCoord;
+import adql.query.operand.function.geometry.ExtractCoordSys;
+import adql.query.operand.function.geometry.IntersectsFunction;
+import adql.query.operand.function.geometry.PointFunction;
+import adql.query.operand.function.geometry.PolygonFunction;
+import adql.query.operand.function.geometry.RegionFunction;
+
+public class TestJDBCTranslator {
+
+	@Before
+	public void setUp() throws Exception{}
+
+	@Test
+	public void testTranslateStringConstant(){
+		JDBCTranslator tr = new AJDBCTranslator();
+
+		/* Ensure the translation from ADQL to SQL of strings is correct ;
+		 * particularly, ' should be escaped otherwise it would mean the end of a string in SQL
+		 *(the way to escape a such character is by doubling the character '): */
+		try{
+			assertEquals("'SQL''s translation'", tr.translate(new StringConstant("SQL's translation")));
+		}catch(TranslationException e){
+			e.printStackTrace(System.err);
+			fail("There should have been no problem to translate a StringConstant object into SQL.");
+		}
+	}
+
+	public final static class AJDBCTranslator extends JDBCTranslator {
+
+		@Override
+		public String translate(ExtractCoord extractCoord) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(ExtractCoordSys extractCoordSys) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(AreaFunction areaFunction) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(CentroidFunction centroidFunction) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(DistanceFunction fct) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(ContainsFunction fct) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(IntersectsFunction fct) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(PointFunction point) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(CircleFunction circle) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(BoxFunction box) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(PolygonFunction polygon) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public String translate(RegionFunction region) throws TranslationException{
+			return null;
+		}
+
+		@Override
+		public boolean isCaseSensitive(IdentifierField field){
+			return false;
+		}
+
+		@Override
+		public DBType convertTypeFromDB(int dbmsType, String rawDbmsTypeName, String dbmsTypeName, String[] typeParams){
+			return null;
+		}
+
+		@Override
+		public String convertTypeToDB(DBType type){
+			return null;
+		}
+
+		@Override
+		public Region translateGeometryFromDB(Object jdbcColValue) throws ParseException{
+			return null;
+		}
+
+		@Override
+		public Object translateGeometryToDB(Region region) throws ParseException{
+			return null;
+		}
+
+	}
+
+}
-- 
GitLab