NamedParameterUtils.java (spring-framework-5.3.23) | : | NamedParameterUtils.java (spring-framework-5.3.24) | ||
---|---|---|---|---|
/* | /* | |||
* Copyright 2002-2021 the original author or authors. | * Copyright 2002-2022 the original author or authors. | |||
* | * | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | * Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | * you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | * You may obtain a copy of the License at | |||
* | * | |||
* https://www.apache.org/licenses/LICENSE-2.0 | * https://www.apache.org/licenses/LICENSE-2.0 | |||
* | * | |||
* Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
skipping to change at line 80 | skipping to change at line 80 | |||
} | } | |||
//----------------------------------------------------------------------- -- | //----------------------------------------------------------------------- -- | |||
// Core methods used by NamedParameterJdbcTemplate and SqlQuery/SqlUpdate | // Core methods used by NamedParameterJdbcTemplate and SqlQuery/SqlUpdate | |||
//----------------------------------------------------------------------- -- | //----------------------------------------------------------------------- -- | |||
/** | /** | |||
* Parse the SQL statement and locate any placeholders or named parameter s. | * Parse the SQL statement and locate any placeholders or named parameter s. | |||
* Named parameters are substituted for a JDBC placeholder. | * Named parameters are substituted for a JDBC placeholder. | |||
* @param sql the SQL statement | * @param sql the SQL statement | |||
* @return the parsed statement, represented as ParsedSql instance | * @return the parsed statement, represented as {@link ParsedSql} instanc e | |||
*/ | */ | |||
public static ParsedSql parseSqlStatement(final String sql) { | public static ParsedSql parseSqlStatement(String sql) { | |||
Assert.notNull(sql, "SQL must not be null"); | Assert.notNull(sql, "SQL must not be null"); | |||
Set<String> namedParameters = new HashSet<>(); | Set<String> namedParameters = new HashSet<>(); | |||
StringBuilder sqlToUse = new StringBuilder(sql); | StringBuilder sqlToUse = new StringBuilder(sql); | |||
List<ParameterHolder> parameterList = new ArrayList<>(); | List<ParameterHolder> parameterList = new ArrayList<>(); | |||
char[] statement = sql.toCharArray(); | char[] statement = sql.toCharArray(); | |||
int namedParameterCount = 0; | int namedParameterCount = 0; | |||
int unnamedParameterCount = 0; | int unnamedParameterCount = 0; | |||
int totalParameterCount = 0; | int totalParameterCount = 0; | |||
skipping to change at line 124 | skipping to change at line 124 | |||
// Postgres-style "::" casting operator s hould be skipped | // Postgres-style "::" casting operator s hould be skipped | |||
i = i + 2; | i = i + 2; | |||
continue; | continue; | |||
} | } | |||
String parameter = null; | String parameter = null; | |||
if (c == ':' && j < statement.length && statement [j] == '{') { | if (c == ':' && j < statement.length && statement [j] == '{') { | |||
// :{x} style parameter | // :{x} style parameter | |||
while (statement[j] != '}') { | while (statement[j] != '}') { | |||
j++; | j++; | |||
if (j >= statement.length) { | if (j >= statement.length) { | |||
throw new InvalidDataAcce | throw new InvalidDataAcce | |||
ssApiUsageException("Non-terminated named parameter declaration " + | ssApiUsageException( | |||
"at posit | "Non-term | |||
ion " + i + " in statement: " + sql); | inated named parameter declaration at position " + i + | |||
" in stat | ||||
ement: " + sql); | ||||
} | } | |||
if (statement[j] == ':' || statem ent[j] == '{') { | if (statement[j] == ':' || statem ent[j] == '{') { | |||
throw new InvalidDataAcce | throw new InvalidDataAcce | |||
ssApiUsageException("Parameter name contains invalid character '" + | ssApiUsageException( | |||
statement | "Paramete | |||
[j] + "' at position " + i + " in statement: " + sql); | r name contains invalid character '" + statement[j] + | |||
"' at pos | ||||
ition " + i + " in statement: " + sql); | ||||
} | } | |||
} | } | |||
if (j - i > 2) { | if (j - i > 2) { | |||
parameter = sql.substring(i + 2, j); | parameter = sql.substring(i + 2, j); | |||
namedParameterCount = addNewNamed | namedParameterCount = addNewNamed | |||
Parameter(namedParameters, namedParameterCount, parameter); | Parameter( | |||
namedParameters, | ||||
namedParameterCount, parameter); | ||||
totalParameterCount = addNamedPar ameter( | totalParameterCount = addNamedPar ameter( | |||
parameterList, to talParameterCount, escapes, i, j + 1, parameter); | parameterList, to talParameterCount, escapes, i, j + 1, parameter); | |||
} | } | |||
j++; | j++; | |||
} | } | |||
else { | else { | |||
while (j < statement.length && !isParamet erSeparator(statement[j])) { | while (j < statement.length && !isParamet erSeparator(statement[j])) { | |||
j++; | j++; | |||
} | } | |||
if (j - i > 1) { | if (j - i > 1) { | |||
parameter = sql.substring(i + 1, j); | parameter = sql.substring(i + 1, j); | |||
namedParameterCount = addNewNamed | namedParameterCount = addNewNamed | |||
Parameter(namedParameters, namedParameterCount, parameter); | Parameter( | |||
namedParameters, | ||||
namedParameterCount, parameter); | ||||
totalParameterCount = addNamedPar ameter( | totalParameterCount = addNamedPar ameter( | |||
parameterList, to talParameterCount, escapes, i, j, parameter); | parameterList, to talParameterCount, escapes, i, j, parameter); | |||
} | } | |||
} | } | |||
i = j - 1; | i = j - 1; | |||
} | } | |||
else { | else { | |||
if (c == '\\') { | if (c == '\\') { | |||
int j = i + 1; | int j = i + 1; | |||
if (j < statement.length && statement[j] == ':') { | if (j < statement.length && statement[j] == ':') { | |||
skipping to change at line 187 | skipping to change at line 191 | |||
ParsedSql parsedSql = new ParsedSql(sqlToUse.toString()); | ParsedSql parsedSql = new ParsedSql(sqlToUse.toString()); | |||
for (ParameterHolder ph : parameterList) { | for (ParameterHolder ph : parameterList) { | |||
parsedSql.addNamedParameter(ph.getParameterName(), ph.get StartIndex(), ph.getEndIndex()); | parsedSql.addNamedParameter(ph.getParameterName(), ph.get StartIndex(), ph.getEndIndex()); | |||
} | } | |||
parsedSql.setNamedParameterCount(namedParameterCount); | parsedSql.setNamedParameterCount(namedParameterCount); | |||
parsedSql.setUnnamedParameterCount(unnamedParameterCount); | parsedSql.setUnnamedParameterCount(unnamedParameterCount); | |||
parsedSql.setTotalParameterCount(totalParameterCount); | parsedSql.setTotalParameterCount(totalParameterCount); | |||
return parsedSql; | return parsedSql; | |||
} | } | |||
private static int addNamedParameter( | private static int addNamedParameter(List<ParameterHolder> parameterList, | |||
List<ParameterHolder> parameterList, int totalParameterCo | int totalParameterCount, int escapes, int i, int j, Strin | |||
unt, int escapes, int i, int j, String parameter) { | g parameter) { | |||
parameterList.add(new ParameterHolder(parameter, i - escapes, j - escapes)); | parameterList.add(new ParameterHolder(parameter, i - escapes, j - escapes)); | |||
totalParameterCount++; | totalParameterCount++; | |||
return totalParameterCount; | return totalParameterCount; | |||
} | } | |||
private static int addNewNamedParameter(Set<String> namedParameters, int namedParameterCount, String parameter) { | private static int addNewNamedParameter(Set<String> namedParameters, int namedParameterCount, String parameter) { | |||
if (!namedParameters.contains(parameter)) { | if (!namedParameters.contains(parameter)) { | |||
namedParameters.add(parameter); | namedParameters.add(parameter); | |||
namedParameterCount++; | namedParameterCount++; | |||
skipping to change at line 273 | skipping to change at line 277 | |||
* @param paramSource the source for named parameters | * @param paramSource the source for named parameters | |||
* @return the SQL statement with substituted parameters | * @return the SQL statement with substituted parameters | |||
* @see #parseSqlStatement | * @see #parseSqlStatement | |||
*/ | */ | |||
public static String substituteNamedParameters(ParsedSql parsedSql, @Null able SqlParameterSource paramSource) { | public static String substituteNamedParameters(ParsedSql parsedSql, @Null able SqlParameterSource paramSource) { | |||
String originalSql = parsedSql.getOriginalSql(); | String originalSql = parsedSql.getOriginalSql(); | |||
List<String> paramNames = parsedSql.getParameterNames(); | List<String> paramNames = parsedSql.getParameterNames(); | |||
if (paramNames.isEmpty()) { | if (paramNames.isEmpty()) { | |||
return originalSql; | return originalSql; | |||
} | } | |||
StringBuilder actualSql = new StringBuilder(originalSql.length()) ; | StringBuilder actualSql = new StringBuilder(originalSql.length()) ; | |||
int lastIndex = 0; | int lastIndex = 0; | |||
for (int i = 0; i < paramNames.size(); i++) { | for (int i = 0; i < paramNames.size(); i++) { | |||
String paramName = paramNames.get(i); | String paramName = paramNames.get(i); | |||
int[] indexes = parsedSql.getParameterIndexes(i); | int[] indexes = parsedSql.getParameterIndexes(i); | |||
int startIndex = indexes[0]; | int startIndex = indexes[0]; | |||
int endIndex = indexes[1]; | int endIndex = indexes[1]; | |||
actualSql.append(originalSql, lastIndex, startIndex); | actualSql.append(originalSql, lastIndex, startIndex); | |||
if (paramSource != null && paramSource.hasValue(paramName )) { | if (paramSource != null && paramSource.hasValue(paramName )) { | |||
Object value = paramSource.getValue(paramName); | Object value = paramSource.getValue(paramName); | |||
End of changes. 9 change blocks. | ||||
18 lines changed or deleted | 27 lines changed or added |