Skip to content

Commit b7c4238

Browse files
committed
CallMetaDataContext handles 'procedureColumnResult' as return parameter
Issue: SPR-16611
1 parent 3c1adf7 commit b7c4238

File tree

2 files changed

+42
-26
lines changed

2 files changed

+42
-26
lines changed

Diff for: spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallMetaDataContext.java

+26-24
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
import org.springframework.util.StringUtils;
4545

4646
/**
47-
* Class to manage context metadata used for the configuration and execution of the call.
47+
* Class to manage context meta-data used for the configuration
48+
* and execution of a stored procedure call.
4849
*
4950
* @author Thomas Risberg
5051
* @author Juergen Hoeller
@@ -87,13 +88,13 @@ public class CallMetaDataContext {
8788
// Indicates whether this procedure's return value should be included
8889
private boolean returnValueRequired = false;
8990

90-
// Should we access call parameter meta data info or not
91+
// Should we access call parameter meta-data info or not
9192
private boolean accessCallParameterMetaData = true;
9293

9394
// Should we bind parameter by name
9495
private boolean namedBinding;
9596

96-
// The provider of call meta data
97+
// The provider of call meta-data
9798
@Nullable
9899
private CallMetaDataProvider metaDataProvider;
99100

@@ -214,14 +215,14 @@ public boolean isReturnValueRequired() {
214215
}
215216

216217
/**
217-
* Specify whether call parameter metadata should be accessed.
218+
* Specify whether call parameter meta-data should be accessed.
218219
*/
219220
public void setAccessCallParameterMetaData(boolean accessCallParameterMetaData) {
220221
this.accessCallParameterMetaData = accessCallParameterMetaData;
221222
}
222223

223224
/**
224-
* Check whether call parameter metadata should be accessed.
225+
* Check whether call parameter meta-data should be accessed.
225226
*/
226227
public boolean isAccessCallParameterMetaData() {
227228
return this.accessCallParameterMetaData;
@@ -245,8 +246,8 @@ public boolean isNamedBinding() {
245246

246247

247248
/**
248-
* Initialize this class with metadata from the database.
249-
* @param dataSource the DataSource used to retrieve metadata
249+
* Initialize this class with meta-data from the database.
250+
* @param dataSource the DataSource used to retrieve meta-data
250251
*/
251252
public void initializeMetaData(DataSource dataSource) {
252253
this.metaDataProvider = CallMetaDataProviderFactory.createMetaDataProvider(dataSource, this);
@@ -305,8 +306,8 @@ public List<SqlParameter> getCallParameters() {
305306
}
306307

307308
/**
308-
* Process the list of parameters provided, and if procedure column metadata is used,
309-
* the parameters will be matched against the metadata information and any missing
309+
* Process the list of parameters provided, and if procedure column meta-data is used,
310+
* the parameters will be matched against the meta-data information and any missing
310311
* ones will be automatically included.
311312
* @param parameters the list of parameters to use as a base
312313
*/
@@ -315,7 +316,7 @@ public void processParameters(List<SqlParameter> parameters) {
315316
}
316317

317318
/**
318-
* Reconcile the provided parameters with available metadata and add new ones where appropriate.
319+
* Reconcile the provided parameters with available meta-data and add new ones where appropriate.
319320
*/
320321
protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters) {
321322
CallMetaDataProvider provider = obtainMetaDataProvider();
@@ -326,9 +327,9 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
326327
List<String> outParamNames = new ArrayList<>();
327328
List<String> metaDataParamNames = new ArrayList<>();
328329

329-
// Get the names of the meta data parameters
330+
// Get the names of the meta-data parameters
330331
for (CallParameterMetaData meta : provider.getCallParameterMetaData()) {
331-
if (meta.getParameterType() != DatabaseMetaData.procedureColumnReturn) {
332+
if (!meta.isReturnParameter()) {
332333
metaDataParamNames.add(lowerCase(meta.getParameterName()));
333334
}
334335
}
@@ -380,10 +381,9 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
380381
paramNameToCheck = lowerCase(provider.parameterNameToUse(paramName));
381382
}
382383
String paramNameToUse = provider.parameterNameToUse(paramName);
383-
if (declaredParams.containsKey(paramNameToCheck) ||
384-
(meta.getParameterType() == DatabaseMetaData.procedureColumnReturn && returnDeclared)) {
384+
if (declaredParams.containsKey(paramNameToCheck) || (meta.isReturnParameter() && returnDeclared)) {
385385
SqlParameter param;
386-
if (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn) {
386+
if (meta.isReturnParameter()) {
387387
param = declaredParams.get(getFunctionReturnName());
388388
if (param == null && !getOutParameterNames().isEmpty()) {
389389
param = declaredParams.get(getOutParameterNames().get(0).toLowerCase());
@@ -409,11 +409,12 @@ else if (paramName != null) {
409409
}
410410
}
411411
else {
412-
if (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn) {
412+
if (meta.isReturnParameter()) {
413+
// DatabaseMetaData.procedureColumnReturn or possibly procedureColumnResult
413414
if (!isFunction() && !isReturnValueRequired() && paramName != null &&
414415
provider.byPassReturnParameter(paramName)) {
415416
if (logger.isDebugEnabled()) {
416-
logger.debug("Bypassing metadata return parameter for '" + paramName + "'");
417+
logger.debug("Bypassing meta-data return parameter for '" + paramName + "'");
417418
}
418419
}
419420
else {
@@ -425,7 +426,7 @@ else if (paramName != null) {
425426
outParamNames.add(returnNameToUse);
426427
}
427428
if (logger.isDebugEnabled()) {
428-
logger.debug("Added metadata return parameter for '" + returnNameToUse + "'");
429+
logger.debug("Added meta-data return parameter for '" + returnNameToUse + "'");
429430
}
430431
}
431432
}
@@ -437,22 +438,23 @@ else if (paramName != null) {
437438
workParams.add(provider.createDefaultOutParameter(paramNameToUse, meta));
438439
outParamNames.add(paramNameToUse);
439440
if (logger.isDebugEnabled()) {
440-
logger.debug("Added metadata out parameter for '" + paramNameToUse + "'");
441+
logger.debug("Added meta-data out parameter for '" + paramNameToUse + "'");
441442
}
442443
}
443444
else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
444445
workParams.add(provider.createDefaultInOutParameter(paramNameToUse, meta));
445446
outParamNames.add(paramNameToUse);
446447
if (logger.isDebugEnabled()) {
447-
logger.debug("Added metadata in out parameter for '" + paramNameToUse + "'");
448+
logger.debug("Added meta-data in-out parameter for '" + paramNameToUse + "'");
448449
}
449450
}
450451
else {
452+
// DatabaseMetaData.procedureColumnIn or possibly procedureColumnUnknown
451453
if (this.limitedInParameterNames.isEmpty() ||
452454
limitedInParamNamesMap.containsKey(lowerCase(paramNameToUse))) {
453455
workParams.add(provider.createDefaultInParameter(paramNameToUse, meta));
454456
if (logger.isDebugEnabled()) {
455-
logger.debug("Added metadata in parameter for '" + paramNameToUse + "'");
457+
logger.debug("Added meta-data in parameter for '" + paramNameToUse + "'");
456458
}
457459
}
458460
else {
@@ -476,7 +478,7 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
476478
*/
477479
public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameterSource parameterSource) {
478480
// For parameter source lookups we need to provide case-insensitive lookup support
479-
// since the database metadata is not necessarily providing case sensitive parameter names.
481+
// since the database meta-data is not necessarily providing case sensitive parameter names.
480482
Map<String, String> caseInsensitiveParameterNames =
481483
SqlParameterSourceUtils.extractCaseInsensitiveParameterNames(parameterSource);
482484

@@ -612,7 +614,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
612614
}
613615

614616
/**
615-
* Build the call string based on configuration and metadata information.
617+
* Build the call string based on configuration and meta-data information.
616618
* @return the call string to be used
617619
*/
618620
public String createCallString() {
@@ -651,7 +653,7 @@ public String createCallString() {
651653
}
652654

653655
for (SqlParameter parameter : this.callParameters) {
654-
if (!(parameter.isResultsParameter())) {
656+
if (!parameter.isResultsParameter()) {
655657
if (parameterCount > 0) {
656658
callString.append(", ");
657659
}

Diff for: spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallParameterMetaData.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,12 +16,15 @@
1616

1717
package org.springframework.jdbc.core.metadata;
1818

19+
import java.sql.DatabaseMetaData;
20+
1921
import org.springframework.lang.Nullable;
2022

2123
/**
22-
* Holder of metadata for a specific parameter that is used for call processing.
24+
* Holder of meta-data for a specific parameter that is used for call processing.
2325
*
2426
* @author Thomas Risberg
27+
* @author Juergen Hoeller
2528
* @since 2.5
2629
* @see GenericCallMetaDataProvider
2730
*/
@@ -69,6 +72,17 @@ public int getParameterType() {
6972
return this.parameterType;
7073
}
7174

75+
/**
76+
* Determine whether the declared parameter qualifies as a 'return' parameter
77+
* for our purposes: type {@link DatabaseMetaData#procedureColumnReturn} or
78+
* {@link DatabaseMetaData#procedureColumnResult}.
79+
* @since 4.3.15
80+
*/
81+
public boolean isReturnParameter() {
82+
return (this.parameterType == DatabaseMetaData.procedureColumnReturn ||
83+
this.parameterType == DatabaseMetaData.procedureColumnResult);
84+
}
85+
7286
/**
7387
* Get the parameter SQL type.
7488
*/

0 commit comments

Comments
 (0)