Skip to content

Commit 363a3b2

Browse files
committed
HHH-8312 - named parameters binding are not correct when used within subquery
1 parent 0ee13cf commit 363a3b2

25 files changed

+462
-236
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ public String appendLockHint(LockOptions lockOptions, String tableName) {
162162
return lockOptions.getLockMode().greaterThan( LockMode.READ ) ? tableName + " holdlock" : tableName;
163163
}
164164

165-
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map keyColumnNames) {
165+
@Override
166+
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map<String, String[]> keyColumnNames) {
166167
// TODO: merge additional lockoptions support in Dialect.applyLocksToSql
167168
Iterator itr = aliasedLockOptions.getAliasLockIterator();
168169
StringBuilder buffer = new StringBuilder( sql );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ public String appendLockHint(LockOptions lockOptions, String tableName){
13721372
* @param keyColumnNames a map of key columns indexed by aliased table names.
13731373
* @return the modified SQL string.
13741374
*/
1375-
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map keyColumnNames) {
1375+
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map<String, String[]> keyColumnNames) {
13761376
return sql + new ForUpdateFragment( this, aliasedLockOptions, keyColumnNames ).toFragmentString();
13771377
}
13781378

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public String appendLockHint(LockOptions mode, String tableName) {
9595
return tableName;
9696
}
9797
@Override
98-
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map keyColumnNames) {
98+
public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map<String, String[]> keyColumnNames) {
9999
return sql + new ForUpdateFragment( this, aliasedLockOptions, keyColumnNames ).toFragmentString();
100100
}
101101

hibernate-core/src/main/java/org/hibernate/engine/jdbc/ColumnNameCache.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public class ColumnNameCache {
3636
public static final float LOAD_FACTOR = .75f;
3737

38-
private final Map<String, Integer> columnNameToIndexCache;
38+
private final ConcurrentHashMap<String, Integer> columnNameToIndexCache;
3939

4040
public ColumnNameCache(int columnCount) {
4141
// should *not* need to grow beyond the size of the total number of columns in the rs
@@ -53,4 +53,4 @@ public int getIndexForColumnName(String columnName, ResultSet rs) throws SQLExce
5353
return index;
5454
}
5555
}
56-
}
56+
}

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/QueryTranslatorImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.hibernate.internal.util.StringHelper;
6969
import org.hibernate.internal.util.collections.IdentitySet;
7070
import org.hibernate.loader.hql.QueryLoader;
71+
import org.hibernate.param.ParameterSpecification;
7172
import org.hibernate.persister.entity.Queryable;
7273
import org.hibernate.type.Type;
7374

@@ -97,7 +98,7 @@ public class QueryTranslatorImpl implements FilterTranslator {
9798
private String sql;
9899

99100
private ParameterTranslations paramTranslations;
100-
private List collectedParameterSpecifications;
101+
private List<ParameterSpecification> collectedParameterSpecifications;
101102

102103

103104
/**
@@ -557,12 +558,11 @@ else if ( walker.getStatementType() == HqlSqlTokenTypes.INSERT ) {
557558
public ParameterTranslations getParameterTranslations() {
558559
if ( paramTranslations == null ) {
559560
paramTranslations = new ParameterTranslationsImpl( getWalker().getParameters() );
560-
// paramTranslations = new ParameterTranslationsImpl( collectedParameterSpecifications );
561561
}
562562
return paramTranslations;
563563
}
564564

565-
public List getCollectedParameterSpecifications() {
565+
public List<ParameterSpecification> getCollectedParameterSpecifications() {
566566
return collectedParameterSpecifications;
567567
}
568568

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/SqlGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public class SqlGenerator extends SqlGeneratorBase implements ErrorReporter {
7676
private SessionFactoryImplementor sessionFactory;
7777
private LinkedList<SqlWriter> outputStack = new LinkedList<SqlWriter>();
7878
private final ASTPrinter printer = new ASTPrinter( SqlTokenTypes.class );
79-
private List collectedParameters = new ArrayList();
79+
private List<ParameterSpecification> collectedParameters = new ArrayList<ParameterSpecification>();
8080

8181

8282
// handle trace logging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -106,7 +106,7 @@ public void traceOut(String ruleName, AST tree) {
106106
LOG.trace( prefix + ruleName );
107107
}
108108

109-
public List getCollectedParameters() {
109+
public List<ParameterSpecification> getCollectedParameters() {
110110
return collectedParameters;
111111
}
112112

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/tree/FromElement.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -452,16 +452,12 @@ private TypeDiscriminatorMetadataImpl(
452452
this.alias = alias;
453453
}
454454

455-
/**
456-
* {@inheritDoc}
457-
*/
455+
@Override
458456
public String getSqlFragment() {
459457
return persisterDiscriminatorMetadata.getSqlFragment( alias );
460458
}
461459

462-
/**
463-
* {@inheritDoc}
464-
*/
460+
@Override
465461
public Type getResolutionType() {
466462
return persisterDiscriminatorMetadata.getResolutionType();
467463
}
@@ -660,21 +656,24 @@ public boolean isDereferencedBySubclassProperty() {
660656

661657

662658
// ParameterContainer impl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
663-
private List embeddedParameters;
659+
private List<ParameterSpecification> embeddedParameters;
664660

661+
@Override
665662
public void addEmbeddedParameter(ParameterSpecification specification) {
666663
if ( embeddedParameters == null ) {
667-
embeddedParameters = new ArrayList();
664+
embeddedParameters = new ArrayList<ParameterSpecification>();
668665
}
669666
embeddedParameters.add( specification );
670667
}
671668

669+
@Override
672670
public boolean hasEmbeddedParameters() {
673671
return embeddedParameters != null && ! embeddedParameters.isEmpty();
674672
}
675673

674+
@Override
676675
public ParameterSpecification[] getEmbeddedParameters() {
677-
return ( ParameterSpecification[] ) embeddedParameters.toArray( new ParameterSpecification[ embeddedParameters.size() ] );
676+
return embeddedParameters.toArray( new ParameterSpecification[ embeddedParameters.size() ] );
678677
}
679678

680679
public ParameterSpecification getIndexCollectionSelectorParamSpec() {

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/tree/IndexNode.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,14 @@ public void resolve(boolean generateJoin, boolean implicitJoin, String classAlia
147147
}
148148
String selectorExpression = gen.getSQL();
149149
joinSequence.addCondition( collectionTableAlias + '.' + indexCols[0] + " = " + selectorExpression );
150-
List paramSpecs = gen.getCollectedParameters();
150+
List<ParameterSpecification> paramSpecs = gen.getCollectedParameters();
151151
if ( paramSpecs != null ) {
152152
switch ( paramSpecs.size() ) {
153153
case 0 :
154154
// nothing to do
155155
break;
156156
case 1 :
157-
ParameterSpecification paramSpec = ( ParameterSpecification ) paramSpecs.get( 0 );
157+
ParameterSpecification paramSpec = paramSpecs.get( 0 );
158158
paramSpec.setExpectedType( queryableCollection.getIndexType() );
159159
fromElement.setIndexCollectionSelectorParamSpec( paramSpec );
160160
break;
@@ -176,39 +176,40 @@ public void resolve(boolean generateJoin, boolean implicitJoin, String classAlia
176176
* In the (rare?) case where the index selector contains multiple parameters...
177177
*/
178178
private static class AggregatedIndexCollectionSelectorParameterSpecifications implements ParameterSpecification {
179-
private final List paramSpecs;
179+
private final List<ParameterSpecification> paramSpecs;
180180

181-
public AggregatedIndexCollectionSelectorParameterSpecifications(List paramSpecs) {
181+
public AggregatedIndexCollectionSelectorParameterSpecifications(List<ParameterSpecification> paramSpecs) {
182182
this.paramSpecs = paramSpecs;
183183
}
184184

185+
@Override
185186
public int bind(PreparedStatement statement, QueryParameters qp, SessionImplementor session, int position)
186187
throws SQLException {
187188
int bindCount = 0;
188-
Iterator itr = paramSpecs.iterator();
189-
while ( itr.hasNext() ) {
190-
final ParameterSpecification paramSpec = ( ParameterSpecification ) itr.next();
189+
for ( ParameterSpecification paramSpec : paramSpecs ) {
191190
bindCount += paramSpec.bind( statement, qp, session, position + bindCount );
192191
}
193192
return bindCount;
194193
}
195194

195+
@Override
196196
public Type getExpectedType() {
197197
return null;
198198
}
199199

200+
@Override
200201
public void setExpectedType(Type expectedType) {
201202
}
202203

204+
@Override
203205
public String renderDisplayInfo() {
204206
return "index-selector [" + collectDisplayInfo() + "]" ;
205207
}
206208

207209
private String collectDisplayInfo() {
208210
StringBuilder buffer = new StringBuilder();
209-
Iterator itr = paramSpecs.iterator();
210-
while ( itr.hasNext() ) {
211-
buffer.append( ( ( ParameterSpecification ) itr.next() ).renderDisplayInfo() );
211+
for ( ParameterSpecification paramSpec : paramSpecs ) {
212+
buffer.append( ( paramSpec ).renderDisplayInfo() );
212213
}
213214
return buffer.toString();
214215
}

0 commit comments

Comments
 (0)