Skip to content

Databases that support embedded and non-embedded modes are always detected as embedded #23693

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Original file line number Diff line number Diff line change
Expand Up @@ -322,13 +322,13 @@ public void setUsername(String username) {
* @since 1.4.0
*/
public String determineUsername() {
if (StringUtils.hasText(this.username)) {
return this.username;
}
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
&& !StringUtils.hasText(this.username)) {
return "sa";
}
return null;
else {
return this.username;
}
}

/**
Expand All @@ -350,13 +350,13 @@ public void setPassword(String password) {
* @since 1.4.0
*/
public String determinePassword() {
if (StringUtils.hasText(this.password)) {
return this.password;
}
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
&& !StringUtils.hasText(this.password)) {
return "";
}
return null;
else {
return this.password;
}
}

public String getJndiName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ void createDataSourceFallbackToEmbeddedProperties() {
assertThat(context).hasSingleBean(Flyway.class);
DataSource dataSource = context.getBean(Flyway.class).getConfiguration().getDataSource();
assertThat(dataSource).isNotNull();
assertThat(dataSource).hasFieldOrPropertyWithValue("user", "sa");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was this removed? It's configuring an embedded database.

assertThat(dataSource).hasFieldOrPropertyWithValue("password", "");
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,32 @@ void determineUrlWithExplicitConfig() throws Exception {
assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb");
}

@Test
void determineIsEmbeddedWithExplicitConfigforH2() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setUrl("jdbc:h2:~/test");
properties.setUsername("");
properties.setPassword("");
properties.afterPropertiesSet();
assertThat(properties.getUrl()).isEqualTo("jdbc:h2:~/test");
assertThat(properties.determineUrl()).isEqualTo("jdbc:h2:~/test");
assertThat(properties.determineUsername()).isEqualTo("");
assertThat(properties.determinePassword()).isEqualTo("");
}

@Test
void determineWithExplicitConfigforH2WithCustomJdbcUrl() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setUrl("jdbc:h2:~/test");
properties.setUsername("as");
properties.setPassword("as");
properties.afterPropertiesSet();
assertThat(properties.getUrl()).isEqualTo("jdbc:h2:~/test");
assertThat(properties.determineUrl()).isEqualTo("jdbc:h2:~/test");
assertThat(properties.determineUsername()).isEqualTo("as");
assertThat(properties.determinePassword()).isEqualTo("as");
}

@Test
void determineUrlWithGenerateUniqueName() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
Expand All @@ -98,6 +124,24 @@ void determineUsername() throws Exception {
assertThat(properties.determineUsername()).isEqualTo("sa");
}

@Test
void determineUsernameWhenEmpty() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setUsername("");
properties.afterPropertiesSet();
assertThat(properties.getUsername());
assertThat(properties.determineUsername()).isEqualTo("sa");
}

@Test
void determineUsernameWhenNull() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setUsername(null);
properties.afterPropertiesSet();
assertThat(properties.getUsername());
assertThat(properties.determineUsername()).isEqualTo("sa");
}

@Test
void determineUsernameWithExplicitConfig() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
Expand All @@ -112,7 +156,6 @@ void determinePassword() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.afterPropertiesSet();
assertThat(properties.getPassword()).isNull();
assertThat(properties.determinePassword()).isEqualTo("");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,6 @@ void overrideDataSourceAndFallbackToEmbeddedProperties() {
.run(assertLiquibase((liquibase) -> {
DataSource dataSource = liquibase.getDataSource();
assertThat(((HikariDataSource) dataSource).isClosed()).isTrue();
assertThat(((HikariDataSource) dataSource).getUsername()).isEqualTo("sa");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was this removed? It's configuring an embedded database.

assertThat(((HikariDataSource) dataSource).getPassword()).isEqualTo("");
}));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ private void process(BeanDefinitionRegistry registry, ConfigurableListableBeanFa

private BeanDefinition createEmbeddedBeanDefinition(boolean primary) {
BeanDefinition beanDefinition = new RootBeanDefinition(EmbeddedDataSourceFactoryBean.class);
beanDefinition.setPrimary(primary);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That doesn't look right and seems unrelated. Please revert this.

beanDefinition.setPrimary(true);
return beanDefinition;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,26 @@ public String getUrl(String databaseName) {
* @param driverClass the driver class
* @return true if the driver class is one of the embedded types
*/
@Deprecated
public static boolean isEmbedded(String driverClass) {
return driverClass != null && (matches(HSQL, driverClass) || matches(H2, driverClass)
|| matches(DERBY, driverClass) || matches(HSQLDB, driverClass));
}

/**
* Convenience method to determine if a given driver class name and url represents an
* embedded database type.The exception is made for the H2 database for embedded
* types.
* @param driverClass the driver class
* @param url the jdbc url
* @return true if the driver class is one of the embedded types
*/
public static boolean isEmbedded(String driverClass, String url) {
return (driverClass != null
&& (matches(HSQL, driverClass) || (matches(H2, driverClass) && url.contains(":h2:mem"))
|| matches(DERBY, driverClass) || matches(HSQLDB, driverClass)));
}

private static boolean matches(EmbeddedDatabaseConnection candidate, String driverClass) {
return driverClass.equals(candidate.driverClass) || driverClass.equals(candidate.alternativeDriverClass);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,15 @@ void getUrlWithEmptyDatabaseNameForHsqldb() {
.withMessageContaining("DatabaseName must not be empty");
}

@Test
void isEmbeddedForh2CustomDatabaseName() {
assertThat(EmbeddedDatabaseConnection.isEmbedded("org.h2.Driver", "jdbc:h2:~/test")).isFalse();
}

@Test
void isEmbeddedForh2EmbeddedDatabaseName() {
assertThat(EmbeddedDatabaseConnection.isEmbedded("org.h2.Driver",
"jdbc:h2:mem:b3c7d078-1362-4be7-a088-e25dcc3aee32;DB_CLOSE_DELAY=-1")).isTrue();
}

}