Skip to content

Commit 8822816

Browse files
committed
HHH-19925 - Locking root(s) should be based on select-clause, not from-clause
1 parent 2e63495 commit 8822816

33 files changed

+1180
-444
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacySqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ protected void renderTableGroupJoin(TableGroupJoin tableGroupJoin, List<TableGro
118118
}
119119
appendSql( COMMA_SEPARATOR_CHAR );
120120

121-
renderJoinedTableGroup( tableGroupJoin.getJoinedGroup(), null, tableGroupJoinCollector );
121+
renderJoinedTableGroup( tableGroupJoin, null, tableGroupJoinCollector );
122122
if ( tableGroupJoin.getPredicate() != null && !tableGroupJoin.getPredicate().isEmpty() ) {
123123
addAdditionalWherePredicate( tableGroupJoin.getPredicate() );
124124
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6060
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
6161
import org.hibernate.service.ServiceRegistry;
62+
import org.hibernate.spi.NavigablePath;
6263
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
6364
import org.hibernate.sql.ast.SqlAstTranslator;
6465
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
@@ -85,6 +86,7 @@
8586
import java.sql.SQLException;
8687
import java.sql.Types;
8788
import java.util.Locale;
89+
import java.util.Set;
8890

8991
import static org.hibernate.type.SqlTypes.BINARY;
9092
import static org.hibernate.type.SqlTypes.BLOB;
@@ -564,8 +566,9 @@ public LockingSupport getLockingSupport() {
564566
protected LockingClauseStrategy buildLockingClauseStrategy(
565567
PessimisticLockKind lockKind,
566568
RowLockStrategy rowLockStrategy,
567-
LockOptions lockOptions) {
568-
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions );
569+
LockOptions lockOptions,
570+
Set<NavigablePath> rootPathsForLocking) {
571+
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions, rootPathsForLocking );
569572
}
570573

571574
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacyDialect.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
5959
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
6060
import org.hibernate.service.ServiceRegistry;
61+
import org.hibernate.spi.NavigablePath;
6162
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
6263
import org.hibernate.sql.ast.SqlAstTranslator;
6364
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
@@ -85,6 +86,7 @@
8586
import java.sql.DatabaseMetaData;
8687
import java.sql.SQLException;
8788
import java.sql.Types;
89+
import java.util.Set;
8890

8991
import static org.hibernate.type.SqlTypes.BINARY;
9092
import static org.hibernate.type.SqlTypes.BLOB;
@@ -551,8 +553,9 @@ public boolean supportsCommentOn() {
551553
protected LockingClauseStrategy buildLockingClauseStrategy(
552554
PessimisticLockKind lockKind,
553555
RowLockStrategy rowLockStrategy,
554-
LockOptions lockOptions) {
555-
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions );
556+
LockOptions lockOptions,
557+
Set<NavigablePath> rootPathsForLocking) {
558+
return new DerbyLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions, rootPathsForLocking );
556559
}
557560

558561
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLockingClauseStrategy.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
import org.hibernate.LockOptions;
88
import org.hibernate.dialect.Dialect;
99
import org.hibernate.dialect.RowLockStrategy;
10+
import org.hibernate.spi.NavigablePath;
1011
import org.hibernate.sql.ast.internal.PessimisticLockKind;
1112
import org.hibernate.sql.ast.internal.StandardLockingClauseStrategy;
1213
import org.hibernate.sql.ast.spi.SqlAppender;
1314

15+
import java.util.Set;
16+
1417
/**
1518
* StandardLockingClauseStrategy subclass, specific for Derby.
1619
*
@@ -21,8 +24,9 @@ public DerbyLockingClauseStrategy(
2124
Dialect dialect,
2225
PessimisticLockKind lockKind,
2326
RowLockStrategy rowLockStrategy,
24-
LockOptions lockOptions) {
25-
super( dialect, lockKind, rowLockStrategy, lockOptions );
27+
LockOptions lockOptions,
28+
Set<NavigablePath> rootPathsForLocking) {
29+
super( dialect, lockKind, rowLockStrategy, lockOptions, rootPathsForLocking );
2630
}
2731

2832
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLServerLegacySqlAstTranslator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,15 @@ protected void renderTableGroupJoin(TableGroupJoin tableGroupJoin, List<TableGro
166166
// We have to inject the lateral predicate into the sub-query
167167
final Predicate lateralPredicate = this.lateralPredicate;
168168
this.lateralPredicate = predicate;
169-
renderJoinedTableGroup( tableGroupJoin.getJoinedGroup(), null, tableGroupJoinCollector );
169+
renderJoinedTableGroup( tableGroupJoin, null, tableGroupJoinCollector );
170170
this.lateralPredicate = lateralPredicate;
171171
}
172172
else {
173-
renderJoinedTableGroup( tableGroupJoin.getJoinedGroup(), predicate, tableGroupJoinCollector );
173+
renderJoinedTableGroup( tableGroupJoin, predicate, tableGroupJoinCollector );
174174
}
175175
}
176176
else {
177-
renderJoinedTableGroup( tableGroupJoin.getJoinedGroup(), null, tableGroupJoinCollector );
177+
renderJoinedTableGroup( tableGroupJoin, null, tableGroupJoinCollector );
178178
}
179179
}
180180

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/TeradataDialect.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
4141
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
4242
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
43+
import org.hibernate.spi.NavigablePath;
4344
import org.hibernate.sql.ForUpdateFragment;
4445
import org.hibernate.sql.ast.SqlAstTranslator;
4546
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
@@ -65,6 +66,7 @@
6566
import java.sql.SQLException;
6667
import java.sql.Types;
6768
import java.util.Map;
69+
import java.util.Set;
6870

6971
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
7072
import static org.hibernate.type.SqlTypes.BIGINT;
@@ -529,13 +531,14 @@ public LockingSupport getLockingSupport() {
529531
protected LockingClauseStrategy buildLockingClauseStrategy(
530532
PessimisticLockKind lockKind,
531533
RowLockStrategy rowLockStrategy,
532-
LockOptions lockOptions) {
534+
LockOptions lockOptions,
535+
Set<NavigablePath> rootPathsForLocking) {
533536
if ( getVersion().isBefore( 14 ) ) {
534537
return NonLockingClauseStrategy.NON_CLAUSE_STRATEGY;
535538
}
536539
// we'll reuse the StandardLockingClauseStrategy for the collecting
537540
// aspect and just handle the special rendering in the SQL AST translator
538-
return super.buildLockingClauseStrategy( lockKind, rowLockStrategy, lockOptions );
541+
return super.buildLockingClauseStrategy( lockKind, rowLockStrategy, lockOptions, rootPathsForLocking );
539542
}
540543

541544
@Override

hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
2828
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
2929
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
30+
import org.hibernate.sql.ast.internal.TransactSQLLockingClauseStrategy;
3031
import org.hibernate.sql.ast.spi.LockingClauseStrategy;
3132
import org.hibernate.sql.ast.spi.SqlAppender;
3233
import org.hibernate.sql.ast.tree.select.QuerySpec;
@@ -40,7 +41,6 @@
4041
import java.sql.Types;
4142
import java.util.Map;
4243

43-
import static org.hibernate.sql.ast.internal.NonLockingClauseStrategy.NON_CLAUSE_STRATEGY;
4444
import static org.hibernate.type.SqlTypes.BLOB;
4545
import static org.hibernate.type.SqlTypes.BOOLEAN;
4646
import static org.hibernate.type.SqlTypes.CLOB;
@@ -200,8 +200,7 @@ public boolean qualifyIndexName() {
200200

201201
@Override
202202
public LockingClauseStrategy getLockingClauseStrategy(QuerySpec querySpec, LockOptions lockOptions) {
203-
// T-SQL uses table-based lock hints and thus does not support FOR UPDATE clause
204-
return NON_CLAUSE_STRATEGY;
203+
return new TransactSQLLockingClauseStrategy( lockOptions.getScope(), querySpec.getRootPathsForLocking() );
205204
}
206205

207206
@Override

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
115115
import org.hibernate.service.ServiceRegistry;
116116
import org.hibernate.service.spi.ServiceRegistryImplementor;
117+
import org.hibernate.spi.NavigablePath;
117118
import org.hibernate.sql.ForUpdateFragment;
118119
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
119120
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
@@ -2369,14 +2370,15 @@ public LockingClauseStrategy getLockingClauseStrategy(QuerySpec querySpec, LockO
23692370
default -> throw new IllegalStateException( "Should never happen due to checks above" );
23702371
}
23712372

2372-
return buildLockingClauseStrategy( lockKind, rowLockStrategy, lockOptions );
2373+
return buildLockingClauseStrategy( lockKind, rowLockStrategy, lockOptions, querySpec.getRootPathsForLocking() );
23732374
}
23742375

23752376
protected LockingClauseStrategy buildLockingClauseStrategy(
23762377
PessimisticLockKind lockKind,
23772378
RowLockStrategy rowLockStrategy,
2378-
LockOptions lockOptions) {
2379-
return new StandardLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions );
2379+
LockOptions lockOptions,
2380+
Set<NavigablePath> rootPathsForLocking) {
2381+
return new StandardLockingClauseStrategy( this, lockKind, rowLockStrategy, lockOptions, rootPathsForLocking );
23802382
}
23812383

23822384
/**

hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,11 @@ public void lock(
7373
lockOptions.setScope( lockScope );
7474
lockOptions.setTimeOut( timeout );
7575

76-
final var rootQuerySpec = new QuerySpec( true );
7776
final var entityPath = new NavigablePath( entityToLock.getRootPathName() );
77+
78+
final var rootQuerySpec = new QuerySpec( true );
79+
rootQuerySpec.applyRootPathForLocking( entityPath );
80+
7881
final var idMapping = entityToLock.getIdentifierMapping();
7982

8083
// NOTE: there are 2 possible ways to handle the select list for the query...

hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/DB2SqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ protected void renderTableGroupJoin(TableGroupJoin tableGroupJoin, List<TableGro
116116
}
117117
appendSql( COMMA_SEPARATOR_CHAR );
118118

119-
renderJoinedTableGroup( tableGroupJoin.getJoinedGroup(), null, tableGroupJoinCollector );
119+
renderJoinedTableGroup( tableGroupJoin, null, tableGroupJoinCollector );
120120
if ( tableGroupJoin.getPredicate() != null && !tableGroupJoin.getPredicate().isEmpty() ) {
121121
addAdditionalWherePredicate( tableGroupJoin.getPredicate() );
122122
}

0 commit comments

Comments
 (0)