From f13ab15c7f6b6d5670d9c136d37457d75c05c884 Mon Sep 17 00:00:00 2001 From: Mark Grobaker <5614366+mgrobaker@users.noreply.github.com> Date: Mon, 5 Jul 2021 20:23:24 -0400 Subject: [PATCH 1/8] test: add and drop a materialized view Add to TestUtil and also to DatabaseMetaData setup and teardown fixes #2060 --- .../java/org/postgresql/test/TestUtil.java | 25 +++++++++++++++++++ .../test/jdbc2/DatabaseMetaDataTest.java | 4 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java index 67fa08cac9..699615ed87 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java +++ b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java @@ -525,6 +525,24 @@ public static void createView(Connection con, String viewName, String query) } } + /* + * Helper - creates a materialized view + */ + public static void createMaterializedView(Connection con, String matViewName, String query) + throws SQLException { + Statement st = con.createStatement(); + try { + // Drop the view + dropView(con, matViewName); + + String sql = "CREATE MATERIALIZED VIEW " + matViewName + " AS " + query; + + st.executeUpdate(sql); + } finally { + closeQuietly(st); + } + } + /** * Helper creates an enum type. * @@ -628,6 +646,13 @@ public static void dropView(Connection con, String view) throws SQLException { dropObject(con, "VIEW", view); } + /* + * Helper - drops a materialized view + */ + public static void dropMaterializedView(Connection con, String matView) throws SQLException { + dropObject(con, "MATERIALIZED VIEW", matView); + } + /* * Helper - drops a type */ diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 5503d69001..66d73a351f 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -81,6 +81,7 @@ public void setUp() throws Exception { TestUtil.createTable(con, "arraytable", "a numeric(5,2)[], b varchar(100)[]"); TestUtil.createTable(con, "intarraytable", "a int4[], b int4[][]"); TestUtil.createView(con, "viewtest", "SELECT id, quest FROM metadatatest"); + TestUtil.createMaterializedView(con, "matViewtest", "SELECT id, quest FROM metadatatest"); TestUtil.dropType(con, "custom"); TestUtil.dropType(con, "_custom"); TestUtil.createCompositeType(con, "custom", "i int", false); @@ -126,6 +127,7 @@ public void tearDown() throws Exception { stmt.execute("DROP FUNCTION f4(int)"); TestUtil.dropView(con, "viewtest"); + TestUtil.dropMaterializedView(con, "matViewtest"); TestUtil.dropTable(con, "metadatatest"); TestUtil.dropTable(con, "sercoltest"); TestUtil.dropSequence(con, "sercoltest_b_seq"); @@ -208,7 +210,7 @@ public void testTables() throws Exception { DatabaseMetaData dbmd = con.getMetaData(); assertNotNull(dbmd); - ResultSet rs = dbmd.getTables(null, null, "metadatates%", new String[]{"TABLE"}); + ResultSet rs = dbmd.getTables(null, null, "metadatatest", new String[]{"TABLE"}); assertTrue(rs.next()); String tableName = rs.getString("TABLE_NAME"); assertEquals("metadatatest", tableName); From eefbe027f44df752c26f3aff598ccc0ca65efe4f Mon Sep 17 00:00:00 2001 From: Mark Grobaker <5614366+mgrobaker@users.noreply.github.com> Date: Tue, 6 Jul 2021 10:10:17 -0400 Subject: [PATCH 2/8] test: materialized view privileges make "matviewtest" all lowercase so it can be found in pg catalog, which lowercases all names fixes #2060 --- .../test/jdbc2/DatabaseMetaDataTest.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 66d73a351f..5bf0e72cc6 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -81,7 +81,7 @@ public void setUp() throws Exception { TestUtil.createTable(con, "arraytable", "a numeric(5,2)[], b varchar(100)[]"); TestUtil.createTable(con, "intarraytable", "a int4[], b int4[][]"); TestUtil.createView(con, "viewtest", "SELECT id, quest FROM metadatatest"); - TestUtil.createMaterializedView(con, "matViewtest", "SELECT id, quest FROM metadatatest"); + TestUtil.createMaterializedView(con, "matviewtest", "SELECT id, quest FROM metadatatest"); TestUtil.dropType(con, "custom"); TestUtil.dropType(con, "_custom"); TestUtil.createCompositeType(con, "custom", "i int", false); @@ -127,7 +127,7 @@ public void tearDown() throws Exception { stmt.execute("DROP FUNCTION f4(int)"); TestUtil.dropView(con, "viewtest"); - TestUtil.dropMaterializedView(con, "matViewtest"); + TestUtil.dropMaterializedView(con, "matviewtest"); TestUtil.dropTable(con, "metadatatest"); TestUtil.dropTable(con, "sercoltest"); TestUtil.dropSequence(con, "sercoltest_b_seq"); @@ -648,6 +648,24 @@ public void testViewPrivileges() throws SQLException { foundSelect); } + @Test + public void testMaterializedViewPrivileges() throws SQLException { + DatabaseMetaData dbmd = con.getMetaData(); + assertNotNull(dbmd); + ResultSet rs = dbmd.getTablePrivileges(null, null, "matviewtest"); + boolean foundSelect = false; + while (rs.next()) { + if (rs.getString("GRANTEE").equals(TestUtil.getUser()) + && rs.getString("PRIVILEGE").equals("SELECT")) { + foundSelect = true; + } + } + rs.close(); + // Test that the view owner has select priv + assertTrue("Couldn't find SELECT priv on table metadatatest for " + TestUtil.getUser(), + foundSelect); + } + @Test public void testPrimaryKeys() throws SQLException { // At the moment just test that no exceptions are thrown KJ From b7def350591d743ab6e878714a105d6264e6b3d1 Mon Sep 17 00:00:00 2001 From: Mark Grobaker <5614366+mgrobaker@users.noreply.github.com> Date: Tue, 6 Jul 2021 10:51:23 -0400 Subject: [PATCH 3/8] refactor: add #relationPrivilegesHelper Remove reused code Add comments --- .../test/jdbc2/DatabaseMetaDataTest.java | 71 ++++++++----------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 5bf0e72cc6..22377404c0 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -602,68 +602,55 @@ public void testColumnPrivileges() throws SQLException { rs.close(); } - @Test - public void testTablePrivileges() throws SQLException { + /* + * Helper function - this logic is used several times to test relation privileges + */ + public void relationPrivilegesHelper(String relationName) throws SQLException { + // Query PG catalog for privileges DatabaseMetaData dbmd = con.getMetaData(); assertNotNull(dbmd); - ResultSet rs = dbmd.getTablePrivileges(null, null, "metadatatest"); + ResultSet rs = dbmd.getTablePrivileges(null, null, relationName); + + // Parse result to check if table/view owner has select privileges boolean foundSelect = false; while (rs.next()) { if (rs.getString("GRANTEE").equals(TestUtil.getUser()) - && rs.getString("PRIVILEGE").equals("SELECT")) { - foundSelect = true; + && rs.getString("PRIVILEGE").equals("SELECT")) + { + foundSelect = true; } } rs.close(); - // Test that the table owner has select priv - assertTrue("Couldn't find SELECT priv on table metadatatest for " + TestUtil.getUser(), - foundSelect); + + // Check test condition + assertTrue("Couldn't find SELECT priv on relation " + + relationName + " for " + TestUtil.getUser(), + foundSelect); } @Test - public void testNoTablePrivileges() throws SQLException { - Statement stmt = con.createStatement(); - stmt.execute("REVOKE ALL ON metadatatest FROM PUBLIC"); - stmt.execute("REVOKE ALL ON metadatatest FROM " + TestUtil.getUser()); - DatabaseMetaData dbmd = con.getMetaData(); - ResultSet rs = dbmd.getTablePrivileges(null, null, "metadatatest"); - assertTrue(!rs.next()); + public void testTablePrivileges() throws SQLException { + relationPrivilegesHelper("metadatatest"); } @Test public void testViewPrivileges() throws SQLException { - DatabaseMetaData dbmd = con.getMetaData(); - assertNotNull(dbmd); - ResultSet rs = dbmd.getTablePrivileges(null, null, "viewtest"); - boolean foundSelect = false; - while (rs.next()) { - if (rs.getString("GRANTEE").equals(TestUtil.getUser()) - && rs.getString("PRIVILEGE").equals("SELECT")) { - foundSelect = true; - } - } - rs.close(); - // Test that the view owner has select priv - assertTrue("Couldn't find SELECT priv on table metadatatest for " + TestUtil.getUser(), - foundSelect); + relationPrivilegesHelper("viewtest"); } @Test public void testMaterializedViewPrivileges() throws SQLException { + relationPrivilegesHelper("matviewtest"); + } + + @Test + public void testNoTablePrivileges() throws SQLException { + Statement stmt = con.createStatement(); + stmt.execute("REVOKE ALL ON metadatatest FROM PUBLIC"); + stmt.execute("REVOKE ALL ON metadatatest FROM " + TestUtil.getUser()); DatabaseMetaData dbmd = con.getMetaData(); - assertNotNull(dbmd); - ResultSet rs = dbmd.getTablePrivileges(null, null, "matviewtest"); - boolean foundSelect = false; - while (rs.next()) { - if (rs.getString("GRANTEE").equals(TestUtil.getUser()) - && rs.getString("PRIVILEGE").equals("SELECT")) { - foundSelect = true; - } - } - rs.close(); - // Test that the view owner has select priv - assertTrue("Couldn't find SELECT priv on table metadatatest for " + TestUtil.getUser(), - foundSelect); + ResultSet rs = dbmd.getTablePrivileges(null, null, "metadatatest"); + assertTrue(!rs.next()); } @Test From 22bc1552176dda61277fc39e1b040261adcb26bb Mon Sep 17 00:00:00 2001 From: Mark Grobaker <5614366+mgrobaker@users.noreply.github.com> Date: Tue, 6 Jul 2021 10:58:39 -0400 Subject: [PATCH 4/8] refactor: fix style/indentation --- .../test/jdbc2/DatabaseMetaDataTest.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 3fc29ccb7a..18f2b99b5e 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -73,7 +73,6 @@ public void setUp() throws Exception { } TestUtil.createTable(con, "metadatatest", "id int4, name text, updated timestamptz, colour text, quest text"); - TestUtil.createTable(con, "precision_test", "implicit_precision numeric"); TestUtil.dropSequence(con, "sercoltest_b_seq"); TestUtil.dropSequence(con, "sercoltest_c_seq"); TestUtil.createTable(con, "sercoltest", "a int, b serial, c bigserial"); @@ -133,7 +132,6 @@ public void tearDown() throws Exception { TestUtil.dropTable(con, "sercoltest"); TestUtil.dropSequence(con, "sercoltest_b_seq"); TestUtil.dropSequence(con, "sercoltest_c_seq"); - TestUtil.dropTable(con, "precision_test"); TestUtil.dropTable(con, "\"a\\\""); TestUtil.dropTable(con, "\"a'\""); TestUtil.dropTable(con, "arraytable"); @@ -499,16 +497,6 @@ public void testForeignKeys() throws Exception { TestUtil.closeDB(con1); } - @Test - public void testNumericPrecision() throws SQLException { - DatabaseMetaData dbmd = con.getMetaData(); - assertNotNull(dbmd); - ResultSet rs = dbmd.getColumns(null, "public", "precision_test", "%"); - assertTrue("It should have a row for the first column", rs.next()); - assertEquals("The column size should be zero", 0, rs.getInt("COLUMN_SIZE")); - assertFalse("It should have a single column", rs.next()); - } - @Test public void testColumns() throws SQLException { // At the moment just test that no exceptions are thrown KJ @@ -627,9 +615,8 @@ public void relationPrivilegesHelper(String relationName) throws SQLException { boolean foundSelect = false; while (rs.next()) { if (rs.getString("GRANTEE").equals(TestUtil.getUser()) - && rs.getString("PRIVILEGE").equals("SELECT")) - { - foundSelect = true; + && rs.getString("PRIVILEGE").equals("SELECT")) { + foundSelect = true; } } rs.close(); From 383bd17b52b3c21723bf0649ce885fa3f2fefb3b Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Fri, 12 Nov 2021 09:40:07 -0500 Subject: [PATCH 5/8] address issues in review --- .../java/org/postgresql/test/TestUtil.java | 19 +++++++------------ .../test/jdbc2/DatabaseMetaDataTest.java | 2 +- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java index 699615ed87..67103bb482 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java +++ b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.lang.Thread.State; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -511,18 +512,15 @@ public static void createUnloggedTable(Connection con, String table, String colu * Helper - creates a view */ public static void createView(Connection con, String viewName, String query) - throws SQLException { - Statement st = con.createStatement(); - try { + throws SQLException { + try (Statement st = con.createStatement()){ // Drop the view dropView(con, viewName); String sql = "CREATE VIEW " + viewName + " AS " + query; st.executeUpdate(sql); - } finally { - closeQuietly(st); - } + } } /* @@ -530,17 +528,14 @@ public static void createView(Connection con, String viewName, String query) */ public static void createMaterializedView(Connection con, String matViewName, String query) throws SQLException { - Statement st = con.createStatement(); - try { + try (Statement st = con.createStatement()){ // Drop the view - dropView(con, matViewName); + dropMaterializedView(con, matViewName); String sql = "CREATE MATERIALIZED VIEW " + matViewName + " AS " + query; st.executeUpdate(sql); - } finally { - closeQuietly(st); - } + } } /** diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 18f2b99b5e..3c9f51b9bd 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -210,7 +210,7 @@ public void testTables() throws Exception { DatabaseMetaData dbmd = con.getMetaData(); assertNotNull(dbmd); - ResultSet rs = dbmd.getTables(null, null, "metadatatest", new String[]{"TABLE"}); + ResultSet rs = dbmd.getTables(null, null, "metadatates%", new String[]{"TABLE"}); assertTrue(rs.next()); String tableName = rs.getString("TABLE_NAME"); assertEquals("metadatatest", tableName); From e0c0efa3f98b89b6d95a6a07fa13e1c34f92e6f5 Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Fri, 12 Nov 2021 09:50:48 -0500 Subject: [PATCH 6/8] checkstyle --- pgjdbc/src/test/java/org/postgresql/test/TestUtil.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java index 67103bb482..67b4491afc 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java +++ b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java @@ -23,7 +23,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.lang.Thread.State; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -512,7 +511,7 @@ public static void createUnloggedTable(Connection con, String table, String colu * Helper - creates a view */ public static void createView(Connection con, String viewName, String query) - throws SQLException { + throws SQLException { try (Statement st = con.createStatement()){ // Drop the view dropView(con, viewName); @@ -520,7 +519,7 @@ public static void createView(Connection con, String viewName, String query) String sql = "CREATE VIEW " + viewName + " AS " + query; st.executeUpdate(sql); - } + } } /* @@ -535,7 +534,7 @@ public static void createMaterializedView(Connection con, String matViewName, St String sql = "CREATE MATERIALIZED VIEW " + matViewName + " AS " + query; st.executeUpdate(sql); - } + } } /** From 3bdc0d5675dabd555a77e73057dbb1bfa67486e3 Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Fri, 12 Nov 2021 09:55:38 -0500 Subject: [PATCH 7/8] checkstyle --- pgjdbc/src/test/java/org/postgresql/test/TestUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java index 67b4491afc..bb7591d629 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java +++ b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java @@ -512,7 +512,7 @@ public static void createUnloggedTable(Connection con, String table, String colu */ public static void createView(Connection con, String viewName, String query) throws SQLException { - try (Statement st = con.createStatement()){ + try ( Statement st = con.createStatement() ) { // Drop the view dropView(con, viewName); @@ -527,7 +527,7 @@ public static void createView(Connection con, String viewName, String query) */ public static void createMaterializedView(Connection con, String matViewName, String query) throws SQLException { - try (Statement st = con.createStatement()){ + try ( Statement st = con.createStatement() ) { // Drop the view dropMaterializedView(con, matViewName); From b9c6eeed96102f023b59805425c04a78173b9577 Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Fri, 12 Nov 2021 10:32:49 -0500 Subject: [PATCH 8/8] do not remove numeric precision test --- .../postgresql/test/jdbc2/DatabaseMetaDataTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java index 3c9f51b9bd..ad2cbcf12d 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java @@ -73,6 +73,7 @@ public void setUp() throws Exception { } TestUtil.createTable(con, "metadatatest", "id int4, name text, updated timestamptz, colour text, quest text"); + TestUtil.createTable(con, "precision_test", "implicit_precision numeric"); TestUtil.dropSequence(con, "sercoltest_b_seq"); TestUtil.dropSequence(con, "sercoltest_c_seq"); TestUtil.createTable(con, "sercoltest", "a int, b serial, c bigserial"); @@ -132,6 +133,7 @@ public void tearDown() throws Exception { TestUtil.dropTable(con, "sercoltest"); TestUtil.dropSequence(con, "sercoltest_b_seq"); TestUtil.dropSequence(con, "sercoltest_c_seq"); + TestUtil.dropTable(con, "precision_test"); TestUtil.dropTable(con, "\"a\\\""); TestUtil.dropTable(con, "\"a'\""); TestUtil.dropTable(con, "arraytable"); @@ -497,6 +499,16 @@ public void testForeignKeys() throws Exception { TestUtil.closeDB(con1); } + @Test + public void testNumericPrecision() throws SQLException { + DatabaseMetaData dbmd = con.getMetaData(); + assertNotNull(dbmd); + ResultSet rs = dbmd.getColumns(null, "public", "precision_test", "%"); + assertTrue("It should have a row for the first column", rs.next()); + assertEquals("The column size should be zero", 0, rs.getInt("COLUMN_SIZE")); + assertFalse("It should have a single column", rs.next()); + } + @Test public void testColumns() throws SQLException { // At the moment just test that no exceptions are thrown KJ