提交 da652fde authored 作者: noelgrandin's avatar noelgrandin

Issue 274: Sybase/MSSQLServer compatibility - swap parameters of CONVERT function.

上级 6d66a72f
......@@ -30,6 +30,8 @@ Change Log
</li><li>Fix Issue 406: support "SELECT h2version()"
</li><li>Fix Issue 389: When there is a multi-column primary key, H2 does not seem to always pick the right index
</li><li>Fix Issue 305: Implement SELECT ... FOR FETCH ONLY
</li><li>Issue 274: Sybase/MSSQLServer compatibility - Add GETDATE and CHARINDEX system functions
</li><li>Issue 274: Sybase/MSSQLServer compatibility - swap parameters of CONVERT function.
</li></ul>
<h2>Version 1.3.171 (2013-03-17)</h2>
......
......@@ -2191,11 +2191,19 @@ public class Parser {
break;
}
case Function.CONVERT: {
function.setParameter(0, readExpression());
read(",");
Column type = parseColumnWithType(null);
function.setDataType(type);
read(")");
if (database.getMode().swapConvertFunctionParameters) {
Column type = parseColumnWithType(null);
function.setDataType(type);
read(",");
function.setParameter(0, readExpression());
read(")");
} else {
function.setParameter(0, readExpression());
read(",");
Column type = parseColumnWithType(null);
function.setDataType(type);
read(")");
}
break;
}
case Function.EXTRACT: {
......
......@@ -117,6 +117,11 @@ public class Mode {
* SERIAL and BIGSERIAL columns are not automatically primary keys.
*/
public boolean serialColumnIsNotPK;
/**
* Swap the parameters of the CONVERT function.
*/
public boolean swapConvertFunctionParameters;
private final String name;
......@@ -152,6 +157,7 @@ public class Mode {
mode.squareBracketQuotedNames = true;
mode.uniqueIndexSingleNull = true;
mode.allowPlusForStringConcat = true;
mode.swapConvertFunctionParameters = true;
add(mode);
mode = new Mode("MySQL");
......
......@@ -241,6 +241,7 @@ public class Function extends Expression implements FunctionCall {
addFunction("LENGTH", LENGTH, 1, Value.LONG);
// 2 or 3 arguments
addFunction("LOCATE", LOCATE, VAR_ARGS, Value.INT);
addFunction("CHARINDEX", LOCATE, VAR_ARGS, Value.INT); // alias for MSSQLServer
// same as LOCATE with 2 arguments
addFunction("POSITION", LOCATE, 2, Value.INT);
addFunction("INSTR", INSTR, VAR_ARGS, Value.INT);
......@@ -277,6 +278,7 @@ public class Function extends Expression implements FunctionCall {
// date
addFunctionNotDeterministic("CURRENT_DATE", CURRENT_DATE, 0, Value.DATE);
addFunctionNotDeterministic("CURDATE", CURDATE, 0, Value.DATE);
addFunctionNotDeterministic("GETDATE", CURDATE, 0, Value.DATE); // alias for MSSQLServer
addFunctionNotDeterministic("CURRENT_TIME", CURRENT_TIME, 0, Value.TIME);
addFunctionNotDeterministic("CURTIME", CURTIME, 0, Value.TIME);
addFunctionNotDeterministic("CURRENT_TIMESTAMP", CURRENT_TIMESTAMP, VAR_ARGS, Value.TIMESTAMP);
......
......@@ -48,7 +48,7 @@ public class TestCompatibility extends TestBase {
testMySQL();
testDB2();
testDerby();
testPlusSignAsConcatOperator();
testSybaseAndMSSQLServer();
conn.close();
deleteDb("compatibility");
......@@ -261,7 +261,7 @@ public class TestCompatibility extends TestBase {
conn = getConnection("compatibility");
}
private void testPlusSignAsConcatOperator() throws SQLException {
private void testSybaseAndMSSQLServer() throws SQLException {
Statement stat = conn.createStatement();
stat.execute("SET MODE MSSQLServer");
stat.execute("DROP TABLE IF EXISTS TEST");
......@@ -298,12 +298,17 @@ public class TestCompatibility extends TestBase {
prep = conn.prepareStatement("SELECT full_name FROM test WHERE (SUBSTRING(name, 1, 1) + SUBSTRING(surname, 2, 3)) = ?");
prep.setString(1, "Joe");
ResultSet res = prep.executeQuery();
assertTrue("Result cannot be empty", res.next());
assertEquals("John, Doe", res.getString(1));
res.close();
ResultSet rs = prep.executeQuery();
assertTrue("Result cannot be empty", rs.next());
assertEquals("John, Doe", rs.getString(1));
rs.close();
prep.close();
// CONVERT has it's parameters the other way around from the default mode
rs = stat.executeQuery("SELECT CONVERT(INT, '10')");
rs.next();
assertEquals(10, rs.getInt(1));
rs.close();
}
private void testDB2() throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论