]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-13849 handle multi-schema during database upgrade & data migration
authorZipeng WU <zipeng.wu@sonarsource.com>
Mon, 19 Apr 2021 16:18:33 +0000 (18:18 +0200)
committersonartech <sonartech@sonarsource.com>
Tue, 20 Apr 2021 20:03:47 +0000 (20:03 +0000)
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinder.java
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/sql/DbPrimaryKeyConstraintFinderTest.java

index 7c307dc5decc88c81ca04ee40b2d00a59b66b658..833db36471f1a345fbc657361bf3f0a3493d6b2a 100644 (file)
@@ -82,13 +82,16 @@ public class DbPrimaryKeyConstraintFinder {
     }
   }
 
-  private static String getPostgresSqlConstraintQuery(String tableName) {
-    return format("SELECT conname " +
-      "FROM pg_constraint " +
-      "WHERE conrelid = " +
-      "    (SELECT oid " +
-      "    FROM pg_class " +
-      "    WHERE relname LIKE '%s')", tableName);
+  private String getPostgresSqlConstraintQuery(String tableName) {
+    try (Connection connection = db.getDataSource().getConnection()) {
+      return format("SELECT conname " +
+        "FROM pg_constraint c " +
+        "JOIN pg_namespace n on c.connamespace = n.oid " +
+        "JOIN pg_class cls on c.conrelid = cls.oid " +
+        "WHERE cls.relname = '%s' AND n.nspname = '%s'", tableName, connection.getSchema());
+    } catch (SQLException throwables) {
+      throw new IllegalStateException("Can not get database connection");
+    }
   }
 
   private static String getMssqlConstraintQuery(String tableName) {
index 647a4a33a583d225471cc852736de6317f0c80a6..faf94bea5c9cf7a3201028af7edf6669744ded2a 100644 (file)
@@ -19,7 +19,9 @@
  */
 package org.sonar.server.platform.db.migration.sql;
 
+import java.sql.Connection;
 import java.sql.SQLException;
+import javax.sql.DataSource;
 import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.db.CoreDbTester;
@@ -71,11 +73,16 @@ public class DbPrimaryKeyConstraintFinderTest {
   }
 
   @Test
-  public void getDbVendorSpecificQuery_postgresql() {
+  public void getDbVendorSpecificQuery_postgresql() throws SQLException {
+    DataSource dataSource = mock(DataSource.class);
+    Connection connection = mock(Connection.class);
+    when(dataSource.getConnection()).thenReturn(connection);
+    when(connection.getSchema()).thenReturn("SonarQube");
     when(dbMock.getDialect()).thenReturn(POSTGRESQL);
+    when(dbMock.getDataSource()).thenReturn(dataSource);
 
     assertThat(underTest.getDbVendorSpecificQuery("my_table"))
-      .isEqualTo("SELECT conname FROM pg_constraint WHERE conrelid =     (SELECT oid     FROM pg_class     WHERE relname LIKE 'my_table')");
+      .isEqualTo("SELECT conname FROM pg_constraint c JOIN pg_namespace n on c.connamespace = n.oid JOIN pg_class cls on c.conrelid = cls.oid WHERE cls.relname = 'my_table' AND n.nspname = 'SonarQube'");
   }
 
   @Test