提交 92fae177 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Do not quote already quoted identifiers in JdbcStatement.enquoteIdentifier()

上级 06b00eda
......@@ -1383,18 +1383,36 @@ public class JdbcStatement extends TraceObject implements Statement, JdbcStateme
/**
* @param identifier
* identifier to quote if required
* identifier to quote if required, may be quoted or unquoted
* @param alwaysQuote
* if {@code true} identifier will be quoted unconditionally
* @return specified identifier quoted if required or explicitly requested
* @return specified identifier quoted if required, explicitly requested, or
* if it was already quoted
* @throws SQLException
* if identifier is not a valid identifier
*/
@Override
public String enquoteIdentifier(String identifier, boolean alwaysQuote) throws SQLException {
if (alwaysQuote || !isSimpleIdentifier(identifier)) {
return StringUtils.quoteIdentifier(identifier);
if (isSimpleIdentifier(identifier)) {
return alwaysQuote ? '"' + identifier + '"': identifier;
}
int length = identifier.length();
if (length > 0 && identifier.charAt(0) == '"') {
boolean quoted = true;
for (int i = 1; i < length; i++) {
if (identifier.charAt(i) == '"') {
quoted = !quoted;
} else if (!quoted) {
throw new SQLException();
}
}
if (quoted) {
throw new SQLException();
}
return identifier;
}
return StringUtils.quoteIdentifier(identifier);
}
/**
* @param identifier
......
......@@ -484,6 +484,15 @@ public class TestStatement extends TestDb {
assertEquals("\"Test\"", stat.enquoteIdentifier("Test", false));
assertEquals("\"test\"", stat.enquoteIdentifier("test", false));
assertEquals("\"TODAY\"", stat.enquoteIdentifier("TODAY", false));
assertEquals("\"Test\"", stat.enquoteIdentifier("\"Test\"", false));
assertEquals("\"Test\"", stat.enquoteIdentifier("\"Test\"", true));
assertEquals("\"\"\"Test\"", stat.enquoteIdentifier("\"\"\"Test\"", true));
try {
stat.enquoteIdentifier("\"Test", true);
fail();
} catch (SQLException ex) {
// OK
}
// Other lower case characters don't have upper case mappings
assertEquals("\u02B0", stat.enquoteIdentifier("\u02B0", false));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论