提交 801e2304 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Convert _ROWID_ to a keyword

上级 d4b3f8f6
...@@ -480,7 +480,7 @@ CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, DISTINCT, EXCEPT, ...@@ -480,7 +480,7 @@ CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, DISTINCT, EXCEPT,
EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, HAVING, EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, HAVING,
IF, INNER, INTERSECT, INTERSECTS, INTERVAL, IS, JOIN, LIKE, IF, INNER, INTERSECT, INTERSECTS, INTERVAL, IS, JOIN, LIKE,
LIMIT, LOCALTIME, LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL, LIMIT, LOCALTIME, LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL,
OFFSET, ON, ORDER, PRIMARY, QUALIFY, ROW, ROWNUM, SELECT, OFFSET, ON, ORDER, PRIMARY, QUALIFY, ROW, _ROWID_, ROWNUM, SELECT,
SYSDATE, SYSTIME, SYSTIMESTAMP, TABLE, TODAY, TOP, TRUE, UNION, SYSDATE, SYSTIME, SYSTIMESTAMP, TABLE, TODAY, TOP, TRUE, UNION,
UNIQUE, VALUES, WHERE, WINDOW, WITH UNIQUE, VALUES, WHERE, WINDOW, WITH
</code> </code>
......
...@@ -61,6 +61,7 @@ import static org.h2.util.ParserUtil.VALUES; ...@@ -61,6 +61,7 @@ import static org.h2.util.ParserUtil.VALUES;
import static org.h2.util.ParserUtil.WHERE; import static org.h2.util.ParserUtil.WHERE;
import static org.h2.util.ParserUtil.WINDOW; import static org.h2.util.ParserUtil.WINDOW;
import static org.h2.util.ParserUtil.WITH; import static org.h2.util.ParserUtil.WITH;
import static org.h2.util.ParserUtil._ROWID_;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
...@@ -511,6 +512,8 @@ public class Parser { ...@@ -511,6 +512,8 @@ public class Parser {
"QUALIFY", "QUALIFY",
// ROW // ROW
"ROW", "ROW",
// _ROWID_
"_ROWID_",
// ROWNUM // ROWNUM
"ROWNUM", "ROWNUM",
// SELECT // SELECT
...@@ -3808,6 +3811,9 @@ public class Parser { ...@@ -3808,6 +3811,9 @@ public class Parser {
if (expr != null) { if (expr != null) {
return expr; return expr;
} }
if (readIf(_ROWID_)) {
return new ExpressionColumn(database, null, objectName, Column.ROWID);
}
String name = readColumnIdentifier(); String name = readColumnIdentifier();
Schema s = database.findSchema(objectName); Schema s = database.findSchema(objectName);
if (readIf(OPEN_PAREN)) { if (readIf(OPEN_PAREN)) {
...@@ -3819,6 +3825,9 @@ public class Parser { ...@@ -3819,6 +3825,9 @@ public class Parser {
if (expr != null) { if (expr != null) {
return expr; return expr;
} }
if (readIf(_ROWID_)) {
return new ExpressionColumn(database, schema, objectName, Column.ROWID);
}
name = readColumnIdentifier(); name = readColumnIdentifier();
if (readIf(OPEN_PAREN)) { if (readIf(OPEN_PAREN)) {
String databaseName = schema; String databaseName = schema;
...@@ -4050,6 +4059,10 @@ public class Parser { ...@@ -4050,6 +4059,10 @@ public class Parser {
read(); read();
r = ValueExpression.getNull(); r = ValueExpression.getNull();
break; break;
case _ROWID_:
read();
r = new ExpressionColumn(database, null, null, Column.ROWID);
break;
case VALUE: case VALUE:
r = ValueExpression.get(currentValue); r = ValueExpression.get(currentValue);
read(); read();
......
...@@ -1551,7 +1551,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements ...@@ -1551,7 +1551,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements
* EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, HAVING, * EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, HAVING,
* IF, INNER, INTERSECT, INTERSECTS, INTERVAL, IS, JOIN, LIKE, * IF, INNER, INTERSECT, INTERSECTS, INTERVAL, IS, JOIN, LIKE,
* LIMIT, LOCALTIME, LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL, * LIMIT, LOCALTIME, LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL,
* OFFSET, ON, ORDER, PRIMARY, QUALIFY, ROW, ROWNUM, SELECT, * OFFSET, ON, ORDER, PRIMARY, QUALIFY, ROW, _ROWID_, ROWNUM, SELECT,
* SYSDATE, SYSTIME, SYSTIMESTAMP, TABLE, TODAY, TOP, TRUE, UNION, * SYSDATE, SYSTIME, SYSTIMESTAMP, TABLE, TODAY, TOP, TRUE, UNION,
* UNIQUE, VALUES, WHERE, WINDOW, WITH * UNIQUE, VALUES, WHERE, WINDOW, WITH
* </pre> * </pre>
...@@ -1561,7 +1561,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements ...@@ -1561,7 +1561,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements
@Override @Override
public String getSQLKeywords() { public String getSQLKeywords() {
debugCodeCall("getSQLKeywords"); debugCodeCall("getSQLKeywords");
return "IF,INTERSECTS,LIMIT,MINUS,OFFSET,QUALIFY,ROWNUM,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY,TOP"; return "IF,INTERSECTS,LIMIT,MINUS,OFFSET,QUALIFY,_ROWID_,ROWNUM,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY,TOP";
} }
/** /**
......
...@@ -1640,7 +1640,7 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1640,7 +1640,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
* Add, replace or remove a key-value pair. * Add, replace or remove a key-value pair.
* *
* @param key the key (may not be null) * @param key the key (may not be null)
* @param value new value, it may be null when removal is indended * @param value new value, it may be null when removal is intended
* @param decisionMaker command object to make choices during transaction. * @param decisionMaker command object to make choices during transaction.
* @return previous value, if mapping for that key existed, or null otherwise * @return previous value, if mapping for that key existed, or null otherwise
*/ */
......
...@@ -227,10 +227,15 @@ public class ParserUtil { ...@@ -227,10 +227,15 @@ public class ParserUtil {
*/ */
public static final int ROW = QUALIFY + 1; public static final int ROW = QUALIFY + 1;
/**
* The token "_ROWID_".
*/
public static final int _ROWID_ = ROW + 1;
/** /**
* The token "ROWNUM". * The token "ROWNUM".
*/ */
public static final int ROWNUM = ROW + 1; public static final int ROWNUM = _ROWID_ + 1;
/** /**
* The token "SELECT". * The token "SELECT".
...@@ -352,10 +357,7 @@ public class ParserUtil { ...@@ -352,10 +357,7 @@ public class ParserUtil {
*/ */
char c = s.charAt(start); char c = s.charAt(start);
if (ignoreCase) { if (ignoreCase) {
/* // Convert a-z to A-Z and 0x7f to _ (need special handling).
* Convert a-z to A-Z. This method is safe, because only A-Z
* characters are considered below.
*/
c &= 0xffdf; c &= 0xffdf;
} }
switch (c) { switch (c) {
...@@ -537,6 +539,12 @@ public class ParserUtil { ...@@ -537,6 +539,12 @@ public class ParserUtil {
return WITH; return WITH;
} }
return IDENTIFIER; return IDENTIFIER;
case '_':
// Cannot use eq() because 0x7f can be converted to '_' (0x5f)
if (end - start == 7 && "_ROWID_".regionMatches(ignoreCase, 0, s, start, 7)) {
return _ROWID_;
}
//$FALL-THROUGH$
default: default:
return IDENTIFIER; return IDENTIFIER;
} }
......
...@@ -463,7 +463,7 @@ public class TestMetaData extends TestDb { ...@@ -463,7 +463,7 @@ public class TestMetaData extends TestDb {
assertEquals("schema", meta.getSchemaTerm()); assertEquals("schema", meta.getSchemaTerm());
assertEquals("\\", meta.getSearchStringEscape()); assertEquals("\\", meta.getSearchStringEscape());
assertEquals("IF,INTERSECTS,LIMIT,MINUS,OFFSET,QUALIFY,ROWNUM,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY,TOP", assertEquals("IF,INTERSECTS,LIMIT,MINUS,OFFSET,QUALIFY,_ROWID_,ROWNUM,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY,TOP",
meta.getSQLKeywords()); meta.getSQLKeywords());
assertTrue(meta.getURL().startsWith("jdbc:h2:")); assertTrue(meta.getURL().startsWith("jdbc:h2:"));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论