diff --git a/src/tap/data/ResultSetTableIterator.java b/src/tap/data/ResultSetTableIterator.java
index ef5790448f8333f38ce75e99dc62d9c1591758a9..91d554589c2c24fd57fe7428a33a0fd4489b2baf 100644
--- a/src/tap/data/ResultSetTableIterator.java
+++ b/src/tap/data/ResultSetTableIterator.java
@@ -455,7 +455,7 @@ public class ResultSetTableIterator implements TableIterator {
 	 * @since 2.1
 	 */
 	public ResultSetTableIterator(final DBConnection dbConn, final ResultSet dataSet, final DBColumn[] metadata) throws NullPointerException, DataReadException{
-		this(dbConn, dataSet, null, null, null);
+		this(dbConn, dataSet, metadata, null, null);
 	}
 
 	/**
@@ -579,9 +579,12 @@ public class ResultSetTableIterator implements TableIterator {
 			colMeta = new TAPColumn[nbColumns];
 			for(int i = 1; i <= nbColumns; i++){
 				if (resultMeta != null && (i - 1) < resultMeta.length && resultMeta[i - 1] != null){
-					try{
+					if (resultMeta[i - 1] instanceof TAPColumn)
 						colMeta[i - 1] = (TAPColumn)resultMeta[i - 1];
-					}catch(ClassCastException cce){
+					else if (resultMeta[i - 1].getDatatype() != null){
+						colMeta[i - 1] = new TAPColumn(resultMeta[i - 1].getADQLName(), resultMeta[i - 1].getDatatype());
+						colMeta[i - 1].setDBName(resultMeta[i - 1].getDBName());
+					}else{
 						DBType datatype = convertType(metadata.getColumnType(i), metadata.getColumnTypeName(i), dbms);
 						colMeta[i - 1] = new TAPColumn(resultMeta[i - 1].getADQLName(), datatype);
 					}
diff --git a/test/tap/data/ResultSetTableIteratorTest.java b/test/tap/data/ResultSetTableIteratorTest.java
index 65019ccd119156367a7c75f3426c2847efa0b813..2b177f61508a76a87313a83aefe55c09066c6388 100644
--- a/test/tap/data/ResultSetTableIteratorTest.java
+++ b/test/tap/data/ResultSetTableIteratorTest.java
@@ -12,6 +12,11 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import adql.db.DBType;
+import adql.parser.ADQLParser;
+import adql.query.ADQLQuery;
+import adql.translator.PgSphereTranslator;
+import tap.metadata.TAPColumn;
 import testtools.DBTools;
 
 public class ResultSetTableIteratorTest {
@@ -165,4 +170,41 @@ public class ResultSetTableIteratorTest {
 			}
 		}
 	}
+
+	@Test
+	public void testGeometryColumns(){
+		ResultSet rs = null;
+		try{
+			ADQLQuery query = (new ADQLParser()).parseQuery("SELECT TOP 1 POINT('', ra, deg), CENTROID(CIRCLE('', ra, deg, 2)), BOX('', ra-10, deg-2, ra+10, deg+2), CIRCLE('', ra, deg, 2) FROM gums;");
+
+			// 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(4, cols.length);
+
+			// Check that the two first columns are POINTs:
+			for(int i = 0; i < 2; i++)
+				assertEquals(DBType.DBDatatype.POINT, cols[i].getDatatype().type);
+
+			// Check that the next columns are REGIONs:
+			for(int i = 2; i < 3; i++)
+				assertEquals(DBType.DBDatatype.REGION, cols[i].getDatatype().type);
+
+		}catch(Exception ex){
+			ex.printStackTrace(System.err);
+			fail("An exception occurs while formatting dates/times.");
+		}finally{
+			if (rs != null){
+				try{
+					rs.close();
+				}catch(Exception ex){}
+			}
+		}
+	}
 }