提交 05db33de authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

ARRAY, INTERSECTS, and INTERVAL should be keywords too

上级 5ae94953
...@@ -475,11 +475,13 @@ There is a list of keywords that can't be used as identifiers (table names, colu ...@@ -475,11 +475,13 @@ There is a list of keywords that can't be used as identifiers (table names, colu
unless they are quoted (surrounded with double quotes). The list is currently: unless they are quoted (surrounded with double quotes). The list is currently:
</p><p> </p><p>
<code> <code>
ALL, CHECK, CONSTRAINT, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, DISTINCT, EXCEPT, ALL, ARRAY, CHECK, CONSTRAINT, CROSS, CURRENT_DATE, CURRENT_TIME,
EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, HAVING, INNER, INTERSECT, INTERSECTS, CURRENT_TIMESTAMP, DISTINCT, EXCEPT, EXISTS, FALSE, FETCH, FOR,
IS, JOIN, LIKE, LIMIT, LOCALTIME, LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL, OFFSET, ON, ORDER, FOREIGN, FROM, FULL, GROUP, HAVING, INNER, INTERSECT, INTERSECTS,
PRIMARY, ROW, ROWNUM, SELECT, SYSDATE, SYSTIME, SYSTIMESTAMP, TODAY, TOP, TRUE, UNION, UNIQUE, WHERE, INTERVAL, IS, JOIN, LIKE, LIMIT, LOCALTIME, LOCALTIMESTAMP,
WINDOW, WITH MINUS, NATURAL, NOT, NULL, OFFSET, ON, ORDER, PRIMARY, ROW,
ROWNUM, SELECT, SYSDATE, SYSTIME, SYSTIMESTAMP, TODAY, TOP, TRUE,
UNION, UNIQUE, WHERE, WINDOW, WITH
</code> </code>
</p><p> </p><p>
Certain words of this list are keywords because they are functions that can be used without '()', Certain words of this list are keywords because they are functions that can be used without '()',
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
package org.h2.command; package org.h2.command;
import static org.h2.util.ParserUtil.ALL; import static org.h2.util.ParserUtil.ALL;
import static org.h2.util.ParserUtil.ARRAY;
import static org.h2.util.ParserUtil.CHECK; import static org.h2.util.ParserUtil.CHECK;
import static org.h2.util.ParserUtil.CONSTRAINT; import static org.h2.util.ParserUtil.CONSTRAINT;
import static org.h2.util.ParserUtil.CROSS; import static org.h2.util.ParserUtil.CROSS;
...@@ -29,6 +30,8 @@ import static org.h2.util.ParserUtil.HAVING; ...@@ -29,6 +30,8 @@ import static org.h2.util.ParserUtil.HAVING;
import static org.h2.util.ParserUtil.IDENTIFIER; import static org.h2.util.ParserUtil.IDENTIFIER;
import static org.h2.util.ParserUtil.INNER; import static org.h2.util.ParserUtil.INNER;
import static org.h2.util.ParserUtil.INTERSECT; import static org.h2.util.ParserUtil.INTERSECT;
import static org.h2.util.ParserUtil.INTERSECTS;
import static org.h2.util.ParserUtil.INTERVAL;
import static org.h2.util.ParserUtil.IS; import static org.h2.util.ParserUtil.IS;
import static org.h2.util.ParserUtil.JOIN; import static org.h2.util.ParserUtil.JOIN;
import static org.h2.util.ParserUtil.LIKE; import static org.h2.util.ParserUtil.LIKE;
...@@ -417,6 +420,8 @@ public class Parser { ...@@ -417,6 +420,8 @@ public class Parser {
null, null,
// ALL // ALL
"ALL", "ALL",
// ARRAY
"ARRAY",
// CHECK // CHECK
"CHECK", "CHECK",
// CONSTRAINT // CONSTRAINT
...@@ -455,6 +460,10 @@ public class Parser { ...@@ -455,6 +460,10 @@ public class Parser {
"INNER", "INNER",
// INTERSECT // INTERSECT
"INTERSECT", "INTERSECT",
// INTERSECTS
"INTERSECTS",
// INTERVAL
"INTERVAL",
// IS // IS
"IS", "IS",
// JOIN // JOIN
...@@ -2747,7 +2756,7 @@ public class Parser { ...@@ -2747,7 +2756,7 @@ public class Parser {
read(CLOSE_PAREN); read(CLOSE_PAREN);
return new ConditionExists(query); return new ConditionExists(query);
} }
if (readIf("INTERSECTS")) { if (readIf(INTERSECTS)) {
read(OPEN_PAREN); read(OPEN_PAREN);
Expression r1 = readConcat(); Expression r1 = readConcat();
read(COMMA); read(COMMA);
...@@ -3808,6 +3817,22 @@ public class Parser { ...@@ -3808,6 +3817,22 @@ public class Parser {
} }
} }
break; break;
case ARRAY: {
read();
read(OPEN_BRACKET);
ArrayList<Expression> list = Utils.newSmallArrayList();
if (!readIf(CLOSE_BRACKET)) {
list.add(readExpression());
while (readIf(COMMA)) {
list.add(readExpression());
}
read(CLOSE_BRACKET);
}
return new ExpressionList(list.toArray(new Expression[0]), true);
}
case INTERVAL:
read();
return readInterval();
case ROW: { case ROW: {
read(); read();
read(OPEN_PAREN); read(OPEN_PAREN);
...@@ -3915,20 +3940,6 @@ public class Parser { ...@@ -3915,20 +3940,6 @@ public class Parser {
ch &= 0xffdf; ch &= 0xffdf;
} }
switch (ch) { switch (ch) {
case 'A':
if (equalsToken("ARRAY", name)) {
read(OPEN_BRACKET);
ArrayList<Expression> list = Utils.newSmallArrayList();
if (!readIf(CLOSE_BRACKET)) {
list.add(readExpression());
while (readIf(COMMA)) {
list.add(readExpression());
}
read(CLOSE_BRACKET);
}
return new ExpressionList(list.toArray(new Expression[0]), true);
}
break;
case 'C': case 'C':
if (equalsToken("CURRENT_USER", name)) { if (equalsToken("CURRENT_USER", name)) {
return readFunctionWithoutParameters("USER"); return readFunctionWithoutParameters("USER");
...@@ -3956,11 +3967,6 @@ public class Parser { ...@@ -3956,11 +3967,6 @@ public class Parser {
return ValueExpression.get(ValueString.get(text)); return ValueExpression.get(ValueString.get(text));
} }
break; break;
case 'I':
if (equalsToken("INTERVAL", name)) {
return readInterval();
}
break;
case 'N': case 'N':
if (equalsToken("NEXT", name) && readIf("VALUE")) { if (equalsToken("NEXT", name) && readIf("VALUE")) {
read(FOR); read(FOR);
...@@ -5171,7 +5177,7 @@ public class Parser { ...@@ -5171,7 +5177,7 @@ public class Parser {
read("ZONE"); read("ZONE");
original = "TIMESTAMP WITHOUT TIME ZONE"; original = "TIMESTAMP WITHOUT TIME ZONE";
} }
} else if (readIf("INTERVAL")) { } else if (readIf(INTERVAL)) {
if (readIf("YEAR")) { if (readIf("YEAR")) {
if (readIf(OPEN_PAREN)) { if (readIf(OPEN_PAREN)) {
originalPrecision = readNonNegativeInt(); originalPrecision = readNonNegativeInt();
......
...@@ -1547,12 +1547,13 @@ public class JdbcDatabaseMetaData extends TraceObject implements ...@@ -1547,12 +1547,13 @@ public class JdbcDatabaseMetaData extends TraceObject implements
* </pre> * </pre>
* The complete list of keywords (including SQL-2003 keywords) is: * The complete list of keywords (including SQL-2003 keywords) is:
* <pre> * <pre>
* ALL, CHECK, CONSTRAINT, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, * ALL, ARRAY, CHECK, CONSTRAINT, CROSS, CURRENT_DATE, CURRENT_TIME,
* DISTINCT, EXCEPT, EXISTS, FALSE, FETCH, FOR, FOREIGN, FROM, FULL, GROUP, * CURRENT_TIMESTAMP, DISTINCT, EXCEPT, EXISTS, FALSE, FETCH, FOR,
* HAVING, INNER, INTERSECT, INTERSECTS, IS, JOIN, LIKE, LIMIT, LOCALTIME, * FOREIGN, FROM, FULL, GROUP, HAVING, INNER, INTERSECT, INTERSECTS,
* LOCALTIMESTAMP, MINUS, NATURAL, NOT, NULL, OFFSET, ON, ORDER, PRIMARY, ROW, ROWNUM, * INTERVAL, IS, JOIN, LIKE, LIMIT, LOCALTIME, LOCALTIMESTAMP,
* SELECT, SYSDATE, SYSTIME, SYSTIMESTAMP, TODAY, TOP, TRUE, UNION, UNIQUE, WHERE, * MINUS, NATURAL, NOT, NULL, OFFSET, ON, ORDER, PRIMARY, ROW,
* WINDOW, WITH * ROWNUM, SELECT, SYSDATE, SYSTIME, SYSTIMESTAMP, TODAY, TOP, TRUE,
* UNION, UNIQUE, WHERE, WINDOW, WITH
* </pre> * </pre>
* *
* @return a list of additional the keywords * @return a list of additional the keywords
......
...@@ -22,10 +22,15 @@ public class ParserUtil { ...@@ -22,10 +22,15 @@ public class ParserUtil {
*/ */
public static final int ALL = IDENTIFIER + 1; public static final int ALL = IDENTIFIER + 1;
/**
* The token "ARRAY".
*/
public static final int ARRAY = ALL + 1;
/** /**
* The token "CHECK". * The token "CHECK".
*/ */
public static final int CHECK = ALL + 1; public static final int CHECK = ARRAY + 1;
/** /**
* The token "CONSTRAINT". * The token "CONSTRAINT".
...@@ -117,10 +122,20 @@ public class ParserUtil { ...@@ -117,10 +122,20 @@ public class ParserUtil {
*/ */
public static final int INTERSECT = INNER + 1; public static final int INTERSECT = INNER + 1;
/**
* The token "INTERSECTS".
*/
public static final int INTERSECTS = INTERSECT + 1;
/**
* The token "INTERVAL".
*/
public static final int INTERVAL = INTERSECTS + 1;
/** /**
* The token "IS". * The token "IS".
*/ */
public static final int IS = INTERSECT + 1; public static final int IS = INTERVAL + 1;
/** /**
* The token "JOIN". * The token "JOIN".
...@@ -317,6 +332,8 @@ public class ParserUtil { ...@@ -317,6 +332,8 @@ public class ParserUtil {
case 'A': case 'A':
if (eq("ALL", s, ignoreCase, start, end)) { if (eq("ALL", s, ignoreCase, start, end)) {
return ALL; return ALL;
} else if (eq("ARRAY", s, ignoreCase, start, end)) {
return ARRAY;
} }
return IDENTIFIER; return IDENTIFIER;
case 'C': case 'C':
...@@ -376,14 +393,13 @@ public class ParserUtil { ...@@ -376,14 +393,13 @@ public class ParserUtil {
return INNER; return INNER;
} else if (eq("INTERSECT", s, ignoreCase, start, end)) { } else if (eq("INTERSECT", s, ignoreCase, start, end)) {
return INTERSECT; return INTERSECT;
} else if (eq("INTERSECTS", s, ignoreCase, start, end)) {
return INTERSECTS;
} else if (eq("INTERVAL", s, ignoreCase, start, end)) {
return INTERVAL;
} else if (eq("IS", s, ignoreCase, start, end)) { } else if (eq("IS", s, ignoreCase, start, end)) {
return IS; return IS;
} }
if (additionalKeywords) {
if (eq("INTERSECTS", s, ignoreCase, start, end)) {
return KEYWORD;
}
}
return IDENTIFIER; return IDENTIFIER;
case 'J': case 'J':
if (eq("JOIN", s, ignoreCase, start, end)) { if (eq("JOIN", s, ignoreCase, start, end)) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论