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

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

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