Skip to content

By default R2DBC uses quoted identifiers #2066

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

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

schauder
Copy link
Contributor

@schauder schauder commented Jun 2, 2025

Most are test more or less obvious test fixes.

Interesting things that became obvious:

  • SpEL expressions get the transformed (e.g. upper case) and quoted table name!? See TableNameQueryPreoprocessorUnitTests
  • The RenderContextFactor has a NamingStrategy!? That sounds all wrong to me. See PostgresDialectRenderingUnitTests

Removed IdentifierProcessing from PostgresLockClause since it was cause circular dependencies between class constructions.

Closes #1993

Supersedes #2047

if (sqlName == null || sqlName.processing != processing) {

this.sqlName = sqlName = new CachedSqlName(processing, quoted ? processing.quote(name) : name);
String normalized = processing.standardizeLetterCase(name);
Copy link
Member

Choose a reason for hiding this comment

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

This change breaks PartTreeJdbcQueryUnitTests and many more.

Copy link
Member

@mp911de mp911de left a comment

Choose a reason for hiding this comment

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

Several tests in JDBC are broken by this change

[ERROR]   PartTreeJdbcQueryUnitTests.wrapsLikeOperatorParameterWithPercentSymbolsForNotContainingQuery:478 
expected: "SELECT "users"."ID" AS "ID", "users"."AGE" AS "AGE", "users"."ACTIVE" AS "ACTIVE", "users"."LAST_NAME" AS "LAST_NAME", "users"."FIRST_NAME" AS "FIRST_NAME", "users"."DATE_OF_BIRTH" AS "DATE_OF_BIRTH", "users"."HOBBY_REFERENCE" AS "HOBBY_REFERENCE", "hated"."NAME" AS "HATED_NAME", "users"."USER_CITY" AS "USER_CITY", "users"."USER_STREET" AS "USER_STREET" FROM "users" LEFT OUTER JOIN "HOBBY" "hated" ON "hated"."USERS" = "users"."ID" WHERE "users"."FIRST_NAME" NOT LIKE :first_name"
 but was: "SELECT "USERS"."ID" AS "ID", "USERS"."AGE" AS "AGE", "USERS"."ACTIVE" AS "ACTIVE", "USERS"."LAST_NAME" AS "LAST_NAME", "USERS"."FIRST_NAME" AS "FIRST_NAME", "USERS"."DATE_OF_BIRTH" AS "DATE_OF_BIRTH", "USERS"."HOBBY_REFERENCE" AS "HOBBY_REFERENCE", "HATED"."NAME" AS "HATED_NAME", "USERS"."USER_CITY" AS "USER_CITY", "USERS"."USER_STREET" AS "USER_STREET" FROM "USERS" LEFT OUTER JOIN "HOBBY" "HATED" ON "HATED"."USERS" = "USERS"."ID" WHERE "USERS"."FIRST_NAME" NOT LIKE :FIRST_NAME"
[ERROR] Errors: 
[ERROR]   JdbcRepositoryCreateIfNotFoundLookUpStrategyTests.derivedQueryShouldWork:50->AbstractJdbcRepositoryLookUpStrategyTests.callDerivedQuery:72 » InvalidDataAccessApiUsage No value supplied for the SQL parameter 'NAME': No value registered for key 'NAME'
[ERROR]   JdbcRepositoryCreateLookUpStrategyTests.declaredQueryShouldWork:45->AbstractJdbcRepositoryLookUpStrategyTests.callDeclaredQuery:60 » InvalidDataAccessApiUsage No value supplied for the SQL parameter 'NAME': No value registered for key 'NAME'
[ERROR]   JdbcRepositoryCreateLookUpStrategyTests.derivedQueryShouldWork:51->AbstractJdbcRepositoryLookUpStrategyTests.callDerivedQuery:72 » InvalidDataAccessApiUsage No value supplied for the SQL parameter 'NAME': No value registered for key 'NAME'

schauder added 2 commits June 23, 2025 10:46
Most are test more or less obvious test fixes.

Interesting things that became obvious:

- SpEL expressions get the transformed (e.g. upper case) and quoted table name!? See TableNameQueryPreprocessorUnitTests and
SqlInspectingR2dbcRepositoryUnitTests

Closes #1993
Original pull request #2066
@schauder schauder force-pushed the issue/1993-force-quoting branch from 2b4b8fe to f0a0031 Compare June 24, 2025 11:21
Copy link
Member

@mp911de mp911de left a comment

Choose a reason for hiding this comment

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

I generally wonder about our testing approach. Enabling quoting requires downstream changes to every test we have where we interact with tables or verify SQL. The way table and column names are represented in the tests is a function of quoting and identifier processing.

How about having a set of test (like the dialect-specific ones in r2dbc.convert and the Template tests) that make use of quoted identifiers. For all other cases, we could disable quoting and keep tests as they are.

Quoting introduces another level of complexity while the verifications we run have a different semantic subject.

*/
public class R2dbcMappingContext extends RelationalMappingContext {

/**
* Create a new {@link R2dbcMappingContext}.
*/
public R2dbcMappingContext() {
setForceQuote(false);
setForceQuote(true);
Copy link
Member

Choose a reason for hiding this comment

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

setForceQuote(…) could be removed entirely as it sets the value to its default value, see JdbcMappingContext.

super(namingStrategy);
setForceQuote(false);

setForceQuote(true);
Copy link
Member

Choose a reason for hiding this comment

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

setForceQuote(…) could be removed entirely as it sets the value to its default value, see JdbcMappingContext.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Use force-quoting in R2dbcMappingContext by default
2 participants