From 7ca76c66b98e5f6a2bdb6fe019ca21b202922c47 Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Thu, 23 Feb 2017 15:50:42 +0100
Subject: [PATCH] [TAP] Fix unfortunate consequence of the previous
 modification of ResultSetTableIterator (i.e. functions returning unknown
 numeric values were not set with the right datatype but char* instead).

---
 src/tap/data/ResultSetTableIterator.java      |  2 +-
 test/tap/data/ResultSetTableIteratorTest.java | 38 ++++++++++++++++++-
 2 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/src/tap/data/ResultSetTableIterator.java b/src/tap/data/ResultSetTableIterator.java
index 91a8faa..d90f944 100644
--- a/src/tap/data/ResultSetTableIterator.java
+++ b/src/tap/data/ResultSetTableIterator.java
@@ -581,7 +581,7 @@ public class ResultSetTableIterator implements TableIterator {
 				if (resultMeta != null && (i - 1) < resultMeta.length && resultMeta[i - 1] != null){
 					if (resultMeta[i - 1] instanceof TAPColumn)
 						colMeta[i - 1] = (TAPColumn)resultMeta[i - 1];
-					else if (resultMeta[i - 1].getDatatype() != null){
+					else if (resultMeta[i - 1].getDatatype() != null && !resultMeta[i - 1].getDatatype().isUnknown()){
 						colMeta[i - 1] = new TAPColumn(resultMeta[i - 1].getADQLName(), resultMeta[i - 1].getDatatype());
 						colMeta[i - 1].setDBName(resultMeta[i - 1].getDBName());
 					}else{
diff --git a/test/tap/data/ResultSetTableIteratorTest.java b/test/tap/data/ResultSetTableIteratorTest.java
index 2b177f6..063cc3c 100644
--- a/test/tap/data/ResultSetTableIteratorTest.java
+++ b/test/tap/data/ResultSetTableIteratorTest.java
@@ -198,7 +198,43 @@ public class ResultSetTableIteratorTest {
 
 		}catch(Exception ex){
 			ex.printStackTrace(System.err);
-			fail("An exception occurs while formatting dates/times.");
+			fail("An exception occurs while checking geometrical functions datatypes.");
+		}finally{
+			if (rs != null){
+				try{
+					rs.close();
+				}catch(Exception ex){}
+			}
+		}
+	}
+
+	@Test
+	public void testSQLFunctions(){
+		ResultSet rs = null;
+		try{
+			ADQLQuery query = (new ADQLParser()).parseQuery("SELECT COUNT(*), MIN(vmag), AVG(plx) FROM hipparcos;");
+
+			// create a valid ResultSet:
+			rs = DBTools.select(conn, (new PgSphereTranslator()).translate(query));
+
+			// Create the iterator:
+			ResultSetTableIterator rsit = new ResultSetTableIterator(rs, query.getResultingColumns());
+			assertTrue(rsit.nextRow());
+
+			// Fetch the metadata:
+			TAPColumn[] cols = rsit.getMetadata();
+			assertEquals(3, cols.length);
+
+			// Check that the first column is a BIGINT:
+			assertEquals(DBType.DBDatatype.BIGINT, cols[0].getDatatype().type);
+
+			// Check that the two next columns are REAL:
+			for(int i = 1; i < 3; i++)
+				assertEquals(DBType.DBDatatype.REAL, cols[i].getDatatype().type);
+
+		}catch(Exception ex){
+			ex.printStackTrace(System.err);
+			fail("An exception occurs while checking SQL functions datatypes");
 		}finally{
 			if (rs != null){
 				try{
-- 
GitLab