1
1
/*
2
- * Copyright 2002-2021 the original author or authors.
2
+ * Copyright 2002-2022 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@ public abstract class NamedParameterUtils {
55
55
* Set of characters that qualify as parameter separators,
56
56
* indicating that a parameter name in an SQL String has ended.
57
57
*/
58
- private static final String PARAMETER_SEPARATORS = "\" ':&,;()|=+-*%/\\ <>^[ ]" ;
58
+ private static final String PARAMETER_SEPARATORS = "\" ':&,;()|=+-*%/\\ <>^]" ;
59
59
60
60
/**
61
61
* An index with separator flags per character code.
@@ -78,9 +78,9 @@ public abstract class NamedParameterUtils {
78
78
* Parse the SQL statement and locate any placeholders or named parameters.
79
79
* Named parameters are substituted for a JDBC placeholder.
80
80
* @param sql the SQL statement
81
- * @return the parsed statement, represented as ParsedSql instance
81
+ * @return the parsed statement, represented as {@link ParsedSql} instance
82
82
*/
83
- public static ParsedSql parseSqlStatement (final String sql ) {
83
+ public static ParsedSql parseSqlStatement (String sql ) {
84
84
Assert .notNull (sql , "SQL must not be null" );
85
85
86
86
Set <String > namedParameters = new HashSet <>();
@@ -122,17 +122,20 @@ public static ParsedSql parseSqlStatement(final String sql) {
122
122
while (statement [j ] != '}' ) {
123
123
j ++;
124
124
if (j >= statement .length ) {
125
- throw new InvalidDataAccessApiUsageException ("Non-terminated named parameter declaration " +
126
- "at position " + i + " in statement: " + sql );
125
+ throw new InvalidDataAccessApiUsageException (
126
+ "Non-terminated named parameter declaration at position " + i +
127
+ " in statement: " + sql );
127
128
}
128
129
if (statement [j ] == ':' || statement [j ] == '{' ) {
129
- throw new InvalidDataAccessApiUsageException ("Parameter name contains invalid character '" +
130
- statement [j ] + "' at position " + i + " in statement: " + sql );
130
+ throw new InvalidDataAccessApiUsageException (
131
+ "Parameter name contains invalid character '" + statement [j ] +
132
+ "' at position " + i + " in statement: " + sql );
131
133
}
132
134
}
133
135
if (j - i > 2 ) {
134
136
parameter = sql .substring (i + 2 , j );
135
- namedParameterCount = addNewNamedParameter (namedParameters , namedParameterCount , parameter );
137
+ namedParameterCount = addNewNamedParameter (
138
+ namedParameters , namedParameterCount , parameter );
136
139
totalParameterCount = addNamedParameter (
137
140
parameterList , totalParameterCount , escapes , i , j + 1 , parameter );
138
141
}
@@ -144,7 +147,11 @@ public static ParsedSql parseSqlStatement(final String sql) {
144
147
}
145
148
if (j - i > 1 ) {
146
149
parameter = sql .substring (i + 1 , j );
147
- namedParameterCount = addNewNamedParameter (namedParameters , namedParameterCount , parameter );
150
+ if (parameter .contains ("[" )) {
151
+ parameter += "]" ; // preserve end bracket for index/key
152
+ }
153
+ namedParameterCount = addNewNamedParameter (
154
+ namedParameters , namedParameterCount , parameter );
148
155
totalParameterCount = addNamedParameter (
149
156
parameterList , totalParameterCount , escapes , i , j , parameter );
150
157
}
@@ -185,8 +192,8 @@ public static ParsedSql parseSqlStatement(final String sql) {
185
192
return parsedSql ;
186
193
}
187
194
188
- private static int addNamedParameter (
189
- List < ParameterHolder > parameterList , int totalParameterCount , int escapes , int i , int j , String parameter ) {
195
+ private static int addNamedParameter (List < ParameterHolder > parameterList ,
196
+ int totalParameterCount , int escapes , int i , int j , String parameter ) {
190
197
191
198
parameterList .add (new ParameterHolder (parameter , i - escapes , j - escapes ));
192
199
totalParameterCount ++;
@@ -271,6 +278,7 @@ public static String substituteNamedParameters(ParsedSql parsedSql, @Nullable Sq
271
278
if (paramNames .isEmpty ()) {
272
279
return originalSql ;
273
280
}
281
+
274
282
StringBuilder actualSql = new StringBuilder (originalSql .length ());
275
283
int lastIndex = 0 ;
276
284
for (int i = 0 ; i < paramNames .size (); i ++) {
0 commit comments