diff -r eb30ad93ca8b -r 53020d0bd2e4 java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java --- a/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java Tue Dec 24 14:23:22 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java Tue Dec 24 14:36:14 2013 +0100 @@ -74,8 +74,8 @@ private void buildPattern() { StringBuilder patternString = new StringBuilder(); - patternString.append(Pattern.quote(namePrefix)); - patternString.append("("); + patternString.append(namePrefix); + patternString.append("(?"); for (int i = 0; i < parameters.size(); i++) { patternString.append(Pattern.quote(parameters.get(i).getName())); if (i < parameters.size() - 1) { @@ -83,7 +83,7 @@ } } patternString.append(")"); - patternString.append(Pattern.quote(nameSuffix)); + patternString.append(nameSuffix); pattern = Pattern.compile(patternString.toString()); } @@ -94,7 +94,7 @@ int lastPosition = 0; while (m.find(lastPosition)) { - String name = m.group(1); + String name = m.group("paramName"); updatedQuery.append(originalQuery.substring(lastPosition, m.start())); updatedQuery.append("?"); @@ -107,18 +107,25 @@ for (NamedParameter definedParameter : parameters) { if (findByName(parametersUsed, definedParameter.getName()) == null) { - throw new SQLException("Parameter „" + definedParameter.getName() + "“ is defined but not used in the query: „" + originalQuery + "“"); + /** + * User can have predefined set of parameters and use them with different SQL + * queries that use only subset of these parameters → just warning, not exception. + */ + log.log(Level.WARNING, "Parameter „{0}“ is defined but not used in the query: „{1}“", new Object[]{definedParameter.getName(), originalQuery}); } } } private void logPossiblyMissingParameters() { - Pattern p = Pattern.compile(Pattern.quote(namePrefix) + ".*?" + Pattern.quote(nameSuffix)); + Pattern p = Pattern.compile(namePrefix + "(?.*?)" + nameSuffix); Matcher m = p.matcher(updatedQuery); int lastPosition = 0; while (m.find(lastPosition)) { - - log.log(Level.WARNING, "Possibly missing parameter: {0}", m.group()); + /** + * We have not parsed and understood the SQL query; the parameter-like looking string + * could be inside a literal part of the query → just warning, not exception. + */ + log.log(Level.WARNING, "Possibly missing parameter „{0}“ in the query: „{1}“", new Object[]{m.group("paramName"), getQuery()}); lastPosition = m.end(); } }