Skip to content

spring-jdbc don't set out parameter name from metadata for Postgresql function after issue#25399 #25588

@ddrko22

Description

@ddrko22

Affects: 5.2.8.RELEASE

When using PostgreSQL driver 42.2.11 and higher and spring-jdbc version 5.2.8.RELEASE and calling Postgresql function then CallMetaDataContext.actualFunctionReturnName from function metadata is not set.
Related to issue # 25399 there was a split in GenericCallMetaDataProvider:

function?
databaseMetaData.getFunctionColumns (metaDataCatalogName, metaDataSchemaName, metaDataProcedureName, null):
databaseMetaData.getProcedureColumns (metaDataCatalogName, metaDataSchemaName, metaDataProcedureName, null)

And for functions it returns columnType = 4, previously it returned columnType = 5.

Because of this, the condition is not met in CallMetaDataContext.reconcileParameters:

if (meta.isReturnParameter()) {
        // DatabaseMetaData.procedureColumnReturn or possibly procedureColumnResult
        if (!isFunction() && !isReturnValueRequired() && paramName != null &&
                provider.byPassReturnParameter(paramName)) {
            if (logger.isDebugEnabled()) {
                logger.debug("Bypassing meta-data return parameter for '" + paramName + "'");
            }
        }
        else {
            String returnNameToUse =
                    (StringUtils.hasLength(paramNameToUse) ? paramNameToUse : getFunctionReturnName());
            workParams.add(provider.createDefaultOutParameter(returnNameToUse, meta));
            if (isFunction()) {
                setFunctionReturnName(returnNameToUse);
                outParamNames.add(returnNameToUse);
            }
            if (logger.isDebugEnabled()) {
                logger.debug("Added meta-data return parameter for '" + returnNameToUse + "'");
            }
        }
    }

and setFunctionReturnName is not called. It is not executed because isReturnParameter looks like:

public boolean isReturnParameter() {
		return (this.parameterType == DatabaseMetaData.procedureColumnReturn ||
				this.parameterType == DatabaseMetaData.procedureColumnResult);
	}

Only the type of parameters for the procedure are checked.

Because of this, the output parameter for the function is passed in the metadata as returnValue, setFunctionReturnName is not called, and spring uses the default name return, and does not find such a parameter in the results.

Metadata

Metadata

Assignees

Labels

in: dataIssues in data modules (jdbc, orm, oxm, tx)type: bugA general bug

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions