Merge remote-tracking branch 'kaspersorensen/METAMODEL-1224-newer-versions-of-postgresql'
diff --git a/CHANGES.md b/CHANGES.md
index 99b8611..d843e20 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,4 +1,9 @@
+### Apache MetaModel [WIP]
+
+ * [METAMODEL-1224] - Ensured compatibility with newer versions of PostgreSQL
+
 ### Apache MetaModel 5.3.2
+
  * Upgrade to Jackson 2.10.1
  * Upgrade to Spring 5.2.2
  * [METAMODEL-82] - Detect Column Types with Excel datastores
diff --git a/core/src/main/java/org/apache/metamodel/query/FromItem.java b/core/src/main/java/org/apache/metamodel/query/FromItem.java
index 63eac69..397beba 100644
--- a/core/src/main/java/org/apache/metamodel/query/FromItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/FromItem.java
@@ -222,7 +222,8 @@
         }
         StringBuilder sb = new StringBuilder();
         if (_table != null) {
-            if (_table.getSchema() != null && _table.getSchema().getName() != null) {
+            if (_table.getSchema() != null && _table.getSchema().getName() != null
+                    && !_table.getSchema().getName().isEmpty()) {
                 sb.append(_table.getSchema().getName());
                 sb.append('.');
             }
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index 6945d4b..441cf5d 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -74,7 +74,7 @@
 		<dependency>
 			<groupId>org.postgresql</groupId>
 			<artifactId>postgresql</artifactId>
-			<version>9.3-1104-jdbc4</version>
+			<version>42.2.11</version>
 			<!-- optional instead of test-scoped because we code against it in the rewriter class -->
 			<optional>true</optional>
 		</dependency>
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
index b582930..ca6b643 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
@@ -135,7 +135,7 @@
             Schema schema = table.getSchema();
             if (schema != null) {
                 String schemaName = schema.getName();
-                if (schemaName != null) {
+                if (schemaName != null && !schemaName.isEmpty()) {
                     result = result.replaceFirst(schemaName, '\"' + schema.getName() + '\"');
                 }
             }
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java
index d7ecb3a..481e9e4 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java
@@ -18,12 +18,18 @@
  */
 package org.apache.metamodel.jdbc.dialects;
 
+import static org.junit.Assert.assertEquals;
+
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
+import org.apache.metamodel.schema.MutableSchema;
+import org.apache.metamodel.schema.MutableTable;
 import org.easymock.EasyMock;
 import org.junit.Test;
 
@@ -46,4 +52,18 @@
 
         EasyMock.verify(statementMock);
     }
+    
+    @Test
+    public void testApproximateCountQueryAndBlankSchemaName() {
+        final SelectItem selectItem = SelectItem.getCountAllItem();
+        selectItem.setFunctionApproximationAllowed(true);
+        final Query query = new Query();
+        query.select(selectItem);
+        query.from(new MutableTable("tbl").setSchema(new MutableSchema("")));
+        assertEquals("SELECT APPROXIMATE COUNT(*) FROM tbl", query.toSql());
+
+        final PostgresqlQueryRewriter queryRewriter = new PostgresqlQueryRewriter(null);
+        final String sql = queryRewriter.rewriteQuery(query);
+        assertEquals("SELECT COUNT(*) FROM tbl", sql);
+    }
 }
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
index a34be81..4132b1c 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
@@ -502,15 +502,21 @@
                 cb.insertInto(table).value("foo", "world").execute();
             }
         });
+        
+        try {
+            final Optional<Integer> insertedRows = updateSummary.getInsertedRows();
+            assertTrue(insertedRows.isPresent());
+            assertEquals(2, insertedRows.get().intValue());
 
-        final Optional<Integer> insertedRows = updateSummary.getInsertedRows();
-        assertTrue(insertedRows.isPresent());
-        assertEquals(2, insertedRows.get().intValue());
-        
-        final Optional<Iterable<Object>> generatedKeys = updateSummary.getGeneratedKeys();
-        assertTrue(generatedKeys.isPresent());
-        assertEquals("[1, 2]", generatedKeys.get().toString());
-        
+            final Optional<Iterable<Object>> generatedKeys = updateSummary.getGeneratedKeys();
+            assertTrue(generatedKeys.isPresent());
+            assertEquals("[1, 2]", generatedKeys.get().toString());
+
+        } finally {
+            if (schema.getTableByName(tableName) != null) {
+                dc.executeUpdate(new DropTable(schema, tableName));
+            }
+        }
     }
 
     public void testBlob() throws Exception {
@@ -737,7 +743,7 @@
         } catch (Exception e) {
             String message = e.getMessage().replaceAll("\n", " ");
             assertEquals(
-                    "Could not execute batch: INSERT INTO \"public\".\"my_table\" (\"person name\",age) VALUES ('John Doe','42'): Batch entry 0 INSERT INTO \"public\".\"my_table\" (\"person name\",age) VALUES ('John Doe','42') was aborted.  Call getNextException to see the cause.",
+                    "java.sql.BatchUpdateException: Batch entry 0 INSERT INTO \"public\".\"my_table\" (\"person name\",age) VALUES ('John Doe','42') was aborted: ERROR: column \"age\" is of type integer but expression is of type character varying   Hint: You will need to rewrite or cast the expression.   Position: 64  Call getNextException to see other errors in the batch.",
                     message);
         } finally {
             dc.refreshSchemas();