Unverified 提交 b9927766 authored 作者: Noel Grandin's avatar Noel Grandin 提交者: GitHub

Merge pull request #892 from katzyn/parser

Assorted minor changes in Parser
...@@ -779,7 +779,7 @@ public class Parser { ...@@ -779,7 +779,7 @@ public class Parser {
Update command = new Update(session); Update command = new Update(session);
currentPrepared = command; currentPrepared = command;
int start = lastParseIndex; int start = lastParseIndex;
TableFilter filter = readSimpleTableFilter(0); TableFilter filter = readSimpleTableFilter(0, null);
command.setTableFilter(filter); command.setTableFilter(filter);
parseUpdateSetClause(command, filter, start); parseUpdateSetClause(command, filter, start);
return command; return command;
...@@ -839,28 +839,14 @@ public class Parser { ...@@ -839,28 +839,14 @@ public class Parser {
setSQL(command, "UPDATE", start); setSQL(command, "UPDATE", start);
} }
private TableFilter readSimpleTableFilter(int orderInFrom) { private TableFilter readSimpleTableFilter(int orderInFrom, Collection<String> excludeTokens) {
Table table = readTableOrView(); Table table = readTableOrView();
String alias = null; String alias = null;
if (readIf("AS")) { if (readIf("AS")) {
alias = readAliasIdentifier(); alias = readAliasIdentifier();
} else if (currentTokenType == IDENTIFIER) { } else if (currentTokenType == IDENTIFIER) {
if (!equalsToken("SET", currentToken)) { if (!equalsTokenIgnoreCase(currentToken, "SET")
// SET is not a keyword (PostgreSQL supports it as a table name) && (excludeTokens == null || !isTokenInList(excludeTokens))) {
alias = readAliasIdentifier();
}
}
return new TableFilter(session, table, alias, rightsChecked,
currentSelect, orderInFrom, null);
}
private TableFilter readSimpleTableFilterWithAliasExcludes(int orderInFrom, Collection<String> excludeTokens) {
Table table = readTableOrView();
String alias = null;
if (readIf("AS")) {
alias = readAliasIdentifier();
} else if (currentTokenType == IDENTIFIER) {
if (!equalsTokenIgnoreCase(currentToken, "SET") && !isTokenInList(excludeTokens)) {
// SET is not a keyword (PostgreSQL supports it as a table name) // SET is not a keyword (PostgreSQL supports it as a table name)
alias = readAliasIdentifier(); alias = readAliasIdentifier();
} }
...@@ -881,7 +867,7 @@ public class Parser { ...@@ -881,7 +867,7 @@ public class Parser {
readIdentifierWithSchema(); readIdentifierWithSchema();
read("FROM"); read("FROM");
} }
TableFilter filter = readSimpleTableFilter(0); TableFilter filter = readSimpleTableFilter(0, null);
command.setTableFilter(filter); command.setTableFilter(filter);
parseDeleteGivenTable(command, limit, start); parseDeleteGivenTable(command, limit, start);
return command; return command;
...@@ -1090,7 +1076,7 @@ public class Parser { ...@@ -1090,7 +1076,7 @@ public class Parser {
int start = lastParseIndex; int start = lastParseIndex;
read("INTO"); read("INTO");
List<String> excludeIdentifiers = Arrays.asList("USING", "KEY", "VALUES"); List<String> excludeIdentifiers = Arrays.asList("USING", "KEY", "VALUES");
TableFilter targetTableFilter = readSimpleTableFilterWithAliasExcludes(0, excludeIdentifiers); TableFilter targetTableFilter = readSimpleTableFilter(0, excludeIdentifiers);
command.setTargetTableFilter(targetTableFilter); command.setTargetTableFilter(targetTableFilter);
Table table = command.getTargetTable(); Table table = command.getTargetTable();
...@@ -1160,7 +1146,7 @@ public class Parser { ...@@ -1160,7 +1146,7 @@ public class Parser {
} else { } else {
/* Its a table name, simulate a query by building a select query for the table */ /* Its a table name, simulate a query by building a select query for the table */
List<String> excludeIdentifiers = Arrays.asList("ON"); List<String> excludeIdentifiers = Arrays.asList("ON");
TableFilter sourceTableFilter = readSimpleTableFilterWithAliasExcludes(0, excludeIdentifiers); TableFilter sourceTableFilter = readSimpleTableFilter(0, excludeIdentifiers);
command.setSourceTableFilter(sourceTableFilter); command.setSourceTableFilter(sourceTableFilter);
StringBuilder buff = new StringBuilder("SELECT * FROM ") StringBuilder buff = new StringBuilder("SELECT * FROM ")
...@@ -6268,22 +6254,17 @@ public class Parser { ...@@ -6268,22 +6254,17 @@ public class Parser {
columnsToAdd.add(column); columnsToAdd.add(column);
} while (readIf(",")); } while (readIf(","));
read(")"); read(")");
if (readIf("BEFORE")) {
command.setAddBefore(readColumnIdentifier());
} else if (readIf("AFTER")) {
command.setAddAfter(readColumnIdentifier());
}
} else { } else {
boolean ifNotExists = readIfNotExists(); boolean ifNotExists = readIfNotExists();
command.setIfNotExists(ifNotExists); command.setIfNotExists(ifNotExists);
String columnName = readColumnIdentifier(); String columnName = readColumnIdentifier();
Column column = parseColumnForTable(columnName, true); Column column = parseColumnForTable(columnName, true);
columnsToAdd.add(column); columnsToAdd.add(column);
if (readIf("BEFORE")) { }
command.setAddBefore(readColumnIdentifier()); if (readIf("BEFORE")) {
} else if (readIf("AFTER")) { command.setAddBefore(readColumnIdentifier());
command.setAddAfter(readColumnIdentifier()); } else if (readIf("AFTER")) {
} command.setAddAfter(readColumnIdentifier());
} }
command.setNewColumns(columnsToAdd); command.setNewColumns(columnsToAdd);
return command; return command;
...@@ -6785,24 +6766,12 @@ public class Parser { ...@@ -6785,24 +6766,12 @@ public class Parser {
if (s == null) { if (s == null) {
return "\"\""; return "\"\"";
} }
if (isSimpleIdentifier(s, false)) { if (ParserUtil.isSimpleIdentifier(s, false)) {
return s; return s;
} }
return StringUtils.quoteIdentifier(s); return StringUtils.quoteIdentifier(s);
} }
/**
* Is this a simple identifier (in the JDBC specification sense).
*
* @param s identifier to check
* @param functionsAsKeywords treat system functions as keywords
* @return is specified identifier may be used without quotes
* @throws NullPointerException if s is {@code null}
*/
public static boolean isSimpleIdentifier(String s, boolean functionsAsKeywords) {
return ParserUtil.isSimpleIdentifier(s, functionsAsKeywords);
}
public void setLiteralsChecked(boolean literalsChecked) { public void setLiteralsChecked(boolean literalsChecked) {
this.literalsChecked = literalsChecked; this.literalsChecked = literalsChecked;
} }
......
...@@ -35,7 +35,7 @@ public class ParserUtil { ...@@ -35,7 +35,7 @@ public class ParserUtil {
/** /**
* The token "rownum". * The token "rownum".
*/ */
public static final int ROWNUM = 6; public static final int ROWNUM = 6;
private ParserUtil() { private ParserUtil() {
// utility class // utility class
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论