parser.java
来自「非常棒的java数据库」· Java 代码 · 共 1,699 行 · 第 1/5 页
JAVA
1,699 行
c = parseExplain();
} else if (readIf("EXECUTE")) {
c = parseExecute();
}
break;
case 'F':
if (isToken("FROM")) {
c = parseSelect();
}
break;
case 'G':
if (readIf("GRANT")) {
c = parseGrantRevoke(GrantRevoke.GRANT);
}
break;
case 'H':
if (readIf("HELP")) {
c = parseHelp();
}
break;
case 'I':
if (readIf("INSERT")) {
c = parseInsert();
}
break;
case 'M':
if (readIf("MERGE")) {
c = parseMerge();
}
break;
case 'P':
if (readIf("PREPARE")) {
c = parsePrepare();
}
break;
case 'R':
if (readIf("ROLLBACK")) {
c = parseRollback();
} else if (readIf("REVOKE")) {
c = parseGrantRevoke(GrantRevoke.REVOKE);
} else if (readIf("RUNSCRIPT")) {
c = parseRunScript();
} else if (readIf("RELEASE")) {
c = parseReleaseSavepoint();
}
break;
case 'S':
if (isToken("SELECT")) {
c = parseSelect();
} else if (readIf("SET")) {
c = parseSet();
} else if (readIf("SAVEPOINT")) {
c = parseSavepoint();
} else if (readIf("SCRIPT")) {
c = parseScript();
} else if (readIf("SHUTDOWN")) {
c = parseShutdown();
}
break;
case 'T':
if (readIf("TRUNCATE")) {
c = parseTruncate();
}
break;
case 'U':
if (readIf("UPDATE")) {
c = parseUpdate();
}
break;
case 'V':
if (readIf("VALUES")) {
c = parserCall();
}
break;
case 'W':
if (readIf("WITH")) {
c = parserWith();
}
break;
default:
throw getSyntaxError();
}
if (indexedParameterList != null) {
for (int i = 0; i < indexedParameterList.size(); i++) {
if (indexedParameterList.get(i) == null) {
indexedParameterList.set(i, new Parameter(i));
}
}
parameters = indexedParameterList;
}
if (readIf("{")) {
do {
int index = (int) readLong() - 1;
if (index < 0 || index >= parameters.size()) {
throw getSyntaxError();
}
Parameter p = (Parameter) parameters.get(index);
if (p == null) {
throw getSyntaxError();
}
read(":");
Expression expr = readExpression();
expr = expr.optimize(session);
p.setValue(expr.getValue(session));
index++;
} while (readIf(","));
read("}");
int len = parameters.size();
for (int i = 0; i < len; i++) {
Parameter p = (Parameter) parameters.get(i);
p.checkSet();
}
parameters.clear();
}
}
if (c == null) {
throw getSyntaxError();
}
setSQL(c, null, start);
return c;
}
private SQLException getSyntaxError() {
if (expected == null || expected.size() == 0) {
return Message.getSyntaxError(sqlCommand, parseIndex);
} else {
StringBuffer buff = new StringBuffer();
for (int i = 0; i < expected.size(); i++) {
if (i > 0) {
buff.append(", ");
}
buff.append(expected.get(i));
}
return Message.getSyntaxError(sqlCommand, parseIndex, buff.toString());
}
}
private Prepared parseBackup() throws SQLException {
BackupCommand command = new BackupCommand(session);
read("TO");
command.setFileName(readString());
return command;
}
private Prepared parseAnalyze() throws SQLException {
Analyze command = new Analyze(session);
if (readIf("SAMPLE_SIZE")) {
command.setTop(getPositiveInt());
}
return command;
}
private TransactionCommand parseBegin() throws SQLException {
TransactionCommand command;
if (!readIf("WORK")) {
readIf("TRANSACTION");
}
command = new TransactionCommand(session, TransactionCommand.BEGIN);
return command;
}
private TransactionCommand parseCommit() throws SQLException {
TransactionCommand command;
if (readIf("TRANSACTION")) {
command = new TransactionCommand(session, TransactionCommand.COMMIT_TRANSACTION);
command.setTransactionName(readUniqueIdentifier());
return command;
}
command = new TransactionCommand(session, TransactionCommand.COMMIT);
readIf("WORK");
return command;
}
private TransactionCommand parseShutdown() throws SQLException {
int type = TransactionCommand.SHUTDOWN;
if (readIf("IMMEDIATELY")) {
type = TransactionCommand.SHUTDOWN_IMMEDIATELY;
} else {
if (!readIf("COMPACT")) {
readIf("SCRIPT");
}
}
return new TransactionCommand(session, type);
}
private TransactionCommand parseRollback() throws SQLException {
TransactionCommand command;
if (readIf("TRANSACTION")) {
command = new TransactionCommand(session, TransactionCommand.ROLLBACK_TRANSACTION);
command.setTransactionName(readUniqueIdentifier());
return command;
}
if (readIf("TO")) {
read("SAVEPOINT");
command = new TransactionCommand(session, TransactionCommand.ROLLBACK_TO_SAVEPOINT);
command.setSavepointName(readUniqueIdentifier());
} else {
readIf("WORK");
command = new TransactionCommand(session, TransactionCommand.ROLLBACK);
}
return command;
}
private Prepared parsePrepare() throws SQLException {
if (readIf("COMMIT")) {
TransactionCommand command = new TransactionCommand(session, TransactionCommand.PREPARE_COMMIT);
command.setTransactionName(readUniqueIdentifier());
return command;
}
String procedureName = readAliasIdentifier();
if (readIf("(")) {
ObjectArray list = new ObjectArray();
for (int i = 0;; i++) {
Column column = parseColumnForTable("C" + i);
list.add(column);
if (readIf(")")) {
break;
}
read(",");
}
}
read("AS");
Prepared prep = parsePrepared();
PrepareProcedure command = new PrepareProcedure(session);
command.setProcedureName(procedureName);
command.setPrepared(prep);
return command;
}
private TransactionCommand parseSavepoint() throws SQLException {
TransactionCommand command = new TransactionCommand(session, TransactionCommand.SAVEPOINT);
command.setSavepointName(readUniqueIdentifier());
return command;
}
private Prepared parseReleaseSavepoint() throws SQLException {
Prepared command = new NoOperation(session);
readIf("SAVEPOINT");
readUniqueIdentifier();
return command;
}
private Schema getSchema() throws SQLException {
if (schemaName == null) {
return null;
}
Schema schema = database.findSchema(schemaName);
if (schema == null) {
if ("SESSION".equals(schemaName)) {
// for local temporary tables
schema = database.getSchema(session.getCurrentSchemaName());
} else {
throw Message.getSQLException(ErrorCode.SCHEMA_NOT_FOUND_1, schemaName);
}
}
return schema;
}
private Column readTableColumn(TableFilter filter) throws SQLException {
String tableAlias = null;
String columnName = readColumnIdentifier();
if (readIf(".")) {
tableAlias = columnName;
columnName = readColumnIdentifier();
if (readIf(".")) {
String schemaName = tableAlias;
tableAlias = columnName;
columnName = readColumnIdentifier();
if (readIf(".")) {
String catalogName = schemaName;
schemaName = tableAlias;
tableAlias = columnName;
columnName = readColumnIdentifier();
if (!catalogName.equals(database.getShortName())) {
throw Message.getSQLException(ErrorCode.DATABASE_NOT_FOUND_1, catalogName);
}
}
if (!schemaName.equals(filter.getTable().getSchema().getName())) {
throw Message.getSQLException(ErrorCode.SCHEMA_NOT_FOUND_1, schemaName);
}
}
if (!tableAlias.equals(filter.getTableAlias())) {
throw Message.getSQLException(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, tableAlias);
}
}
return filter.getTable().getColumn(columnName);
}
private Update parseUpdate() throws SQLException {
Update command = new Update(session);
currentPrepared = command;
int start = lastParseIndex;
TableFilter filter = readSimpleTableFilter();
command.setTableFilter(filter);
read("SET");
if (readIf("(")) {
ObjectArray columns = new ObjectArray();
do {
Column column = readTableColumn(filter);
columns.add(column);
} while (readIf(","));
read(")");
read("=");
Expression expression = readExpression();
for (int i = 0; i < columns.size(); i++) {
Column column = (Column) columns.get(i);
Function f = Function.getFunction(database, "ARRAY_GET");
f.setParameter(0, expression);
f.setParameter(1, ValueExpression.get(ValueInt.get(i + 1)));
f.doneWithParameters();
command.setAssignment(column, f);
}
} else {
do {
Column column = readTableColumn(filter);
read("=");
Expression expression;
if (readIf("DEFAULT")) {
expression = ValueExpression.DEFAULT;
} else {
expression = readExpression();
}
command.setAssignment(column, expression);
} while (readIf(","));
}
if (readIf("WHERE")) {
Expression condition = readExpression();
command.setCondition(condition);
}
setSQL(command, "UPDATE", start);
return command;
}
private TableFilter readSimpleTableFilter() throws SQLException {
Table table = readTableOrView();
String alias = null;
if (readIf("AS")) {
alias = readAliasIdentifier();
} else if (currentTokenType == IDENTIFIER) {
if (!"SET".equals(currentToken)) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?