提交 1281690a authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Parse DB2's special registers only in DB2 mode

上级 19f5f2de
......@@ -3377,16 +3377,8 @@ public class Parser {
r = readFunctionWithoutParameters("LOCALTIME");
} else if (equalsToken("SYSTIME", name)) {
r = readFunctionWithoutParameters("CURRENT_TIME");
} else if (equalsToken("CURRENT", name)) {
if (readIf("TIMESTAMP")) {
r = readFunctionWithoutParameters("CURRENT_TIMESTAMP");
} else if (readIf("TIME")) {
r = readFunctionWithoutParameters("CURRENT_TIME");
} else if (readIf("DATE")) {
r = readFunctionWithoutParameters("CURRENT_DATE");
} else {
r = new ExpressionColumn(database, null, null, name);
}
} else if (database.getMode().getEnum() == ModeEnum.DB2 && equalsToken("CURRENT", name)) {
r = parseDB2SpecialRegisters(name);
} else if (equalsToken("NEXT", name) && readIf("VALUE")) {
read(FOR);
Sequence sequence = readSequence();
......@@ -3588,6 +3580,24 @@ public class Parser {
return r;
}
private Expression parseDB2SpecialRegisters(String name) {
// Only "CURRENT" name is supported
if (readIf("TIMESTAMP")) {
if (readIf(WITH)) {
read("TIME");
read("ZONE");
return readFunctionWithoutParameters("CURRENT_TIMESTAMP");
}
return readFunctionWithoutParameters("LOCALTIMESTAMP");
} else if (readIf("TIME")) {
return readFunctionWithoutParameters("CURRENT_TIME");
} else if (readIf("DATE")) {
return readFunctionWithoutParameters("CURRENT_DATE");
}
// No match, parse CURRENT as a column
return new ExpressionColumn(database, null, null, name);
}
private Expression readCase() {
if (readIf("END")) {
readIf("CASE");
......
......@@ -561,6 +561,19 @@ public class TestCompatibility extends TestDb {
"select date from test where date = '2014-04-05-09.48.28.020005'");
assertResult("2014-04-05 09:48:28.020005", stat,
"select date from test where date = '2014-04-05 09:48:28.020005'");
// Test limited support for DB2's special registers
// Standard SQL functions like LOCALTIMESTAMP, CURRENT_TIMESTAMP and
// others are used to compare values, their implementation in H2 is
// compatible with standard, but may be not really compatible with DB2.
assertResult("TRUE", stat, "SELECT LOCALTIMESTAMP = CURRENT TIMESTAMP");
assertResult("TRUE", stat, "SELECT CAST(LOCALTIMESTAMP AS VARCHAR) = CAST(CURRENT TIMESTAMP AS VARCHAR)");
assertResult("TRUE", stat, "SELECT CURRENT_TIMESTAMP = CURRENT TIMESTAMP WITH TIME ZONE");
assertResult("TRUE", stat,
"SELECT CAST(CURRENT_TIMESTAMP AS VARCHAR) = CAST(CURRENT TIMESTAMP WITH TIME ZONE AS VARCHAR)");
assertResult("TRUE", stat, "SELECT CURRENT_TIME = CURRENT TIME");
assertResult("TRUE", stat, "SELECT CURRENT_DATE = CURRENT DATE");
}
private void testDerby() throws SQLException {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论