METAMODEL-204: Fixed
Fixes #66
diff --git a/core/src/main/java/org/apache/metamodel/query/SelectItem.java b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
index 287d1a6..a1e33de 100644
--- a/core/src/main/java/org/apache/metamodel/query/SelectItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
@@ -48,7 +48,7 @@
 public class SelectItem extends BaseObject implements QueryItem, Cloneable {
 
     public static final String FUNCTION_APPROXIMATION_PREFIX = "APPROXIMATE ";
-    
+
     private static final long serialVersionUID = 317475105509663973L;
     private static final Logger logger = LoggerFactory.getLogger(SelectItem.class);
 
@@ -526,6 +526,18 @@
     }
 
     /**
+     * Creates a copy of the {@link SelectItem}, with a different
+     * {@link #isFunctionApproximationAllowed()} flag set.
+     * 
+     * @param functionApproximationAllowed
+     * @return
+     */
+    public SelectItem replaceFunctionApproximationAllowed(boolean functionApproximationAllowed) {
+        return new SelectItem(_column, _fromItem, _function, _expression, _subQuerySelectItem, _alias,
+                functionApproximationAllowed);
+    }
+
+    /**
      * Investigates whether or not this SelectItem references a particular
      * column. This will search for direct references and indirect references
      * via subqueries.
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
index cf8cfd8..f4f50aa 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
@@ -280,6 +280,12 @@
     }
 
     protected String rewriteSelectItem(Query query, SelectItem item) {
+        if (item.isFunctionApproximationAllowed()) {
+            // function approximation is not included in any standard SQL
+            // constructions - will have to be overridden by subclasses if there
+            // are specialized dialects for it.
+            item = item.replaceFunctionApproximationAllowed(false);
+        }
         return item.toSql(isSchemaIncludedInColumnPaths());
     }
 }
\ No newline at end of file
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
index db969c4..12d5fe2 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
@@ -72,6 +72,14 @@
         _connection.close();
     }
     
+    public void testApproximateCount() throws Exception {
+        final JdbcDataContext dataContext = new JdbcDataContext(_connection);
+        final DataSet dataSet = dataContext.executeQuery("SELECT APPROXIMATE COUNT(*) FROM customers");
+        assertTrue(dataSet.next());
+        assertEquals(122, dataSet.getRow().getValue(0));
+        assertFalse(dataSet.next());
+    }
+    
     public void testTimestampValueInsertSelect() throws Exception {
         Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:" + getName(), USERNAME, PASSWORD);
         JdbcTestTemplates.timestampValueInsertSelect(connection, TimeUnit.NANOSECONDS);