提交 1c3f17e2 authored 作者: Thomas Mueller's avatar Thomas Mueller

MS SQL Server compatibility: support string literals prefixed with N ("National…

MS SQL Server compatibility: support string literals prefixed with N ("National Language" strings). Issue 240.
上级 a5221c85
...@@ -2328,11 +2328,7 @@ public class Parser { ...@@ -2328,11 +2328,7 @@ public class Parser {
} }
} else { } else {
read(); read();
if (equalsToken("X", name) && currentTokenType == VALUE && currentValue.getType() == Value.STRING) { if (readIf(".")) {
read();
byte[] buffer = StringUtils.convertStringToBytes(currentValue.getString());
r = ValueExpression.get(ValueBytes.getNoCopy(buffer));
} else if (readIf(".")) {
r = readTermObjectDot(name); r = readTermObjectDot(name);
} else if (equalsToken("CASE", name)) { } else if (equalsToken("CASE", name)) {
// CASE must be processed before (, // CASE must be processed before (,
...@@ -2362,26 +2358,39 @@ public class Parser { ...@@ -2362,26 +2358,39 @@ public class Parser {
read("FOR"); read("FOR");
Sequence sequence = readSequence(); Sequence sequence = readSequence();
r = new SequenceValue(sequence); r = new SequenceValue(sequence);
} else if (equalsToken("DATE", name) && currentTokenType == VALUE && currentValue.getType() == Value.STRING) { } else if (currentTokenType == VALUE && currentValue.getType() == Value.STRING) {
String date = currentValue.getString(); if (equalsToken("DATE", name)) {
read(); String date = currentValue.getString();
r = ValueExpression.get(ValueDate.get(ValueDate.parseDate(date))); read();
} else if (equalsToken("TIME", name) && currentTokenType == VALUE && currentValue.getType() == Value.STRING) { r = ValueExpression.get(ValueDate.get(ValueDate.parseDate(date)));
String time = currentValue.getString(); } else if (equalsToken("TIME", name)) {
read(); String time = currentValue.getString();
r = ValueExpression.get(ValueTime.get(ValueTime.parseTime(time))); read();
} else if (equalsToken("TIMESTAMP", name) && currentTokenType == VALUE r = ValueExpression.get(ValueTime.get(ValueTime.parseTime(time)));
&& currentValue.getType() == Value.STRING) { } else if (equalsToken("TIMESTAMP", name)) {
String timestamp = currentValue.getString(); String timestamp = currentValue.getString();
read(); read();
r = ValueExpression.get(ValueTimestamp.getNoCopy(ValueTimestamp.parseTimestamp(timestamp))); r = ValueExpression.get(ValueTimestamp.getNoCopy(ValueTimestamp.parseTimestamp(timestamp)));
} else if (equalsToken("E", name) && currentTokenType == VALUE && currentValue.getType() == Value.STRING) { } else if (equalsToken("X", name)) {
String text = currentValue.getString(); read();
// the PostgreSQL ODBC driver uses byte[] buffer = StringUtils.convertStringToBytes(currentValue.getString());
// LIKE E'PROJECT\\_DATA' instead of LIKE 'PROJECT\_DATA' r = ValueExpression.get(ValueBytes.getNoCopy(buffer));
text = StringUtils.replaceAll(text, "\\\\", "\\"); } else if (equalsToken("E", name)) {
read(); String text = currentValue.getString();
r = ValueExpression.get(ValueString.get(text)); // the PostgreSQL ODBC driver uses
// LIKE E'PROJECT\\_DATA' instead of LIKE 'PROJECT\_DATA'
// N: SQL-92 "National Language" strings
text = StringUtils.replaceAll(text, "\\\\", "\\");
read();
r = ValueExpression.get(ValueString.get(text));
} else if (equalsToken("N", name)) {
// SQL-92 "National Language" strings
String text = currentValue.getString();
read();
r = ValueExpression.get(ValueString.get(text));
} else {
r = new ExpressionColumn(database, null, null, name);
}
} else { } else {
r = new ExpressionColumn(database, null, null, name); r = new ExpressionColumn(database, null, null, name);
} }
......
select N'test';
> test;
select cast(' 011 ' as int); select cast(' 011 ' as int);
> 11; > 11;
select E'test\\test'; select E'test\\test';
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论