godfreyhe commented on a change in pull request #12188:
URL: https://github.com/apache/flink/pull/12188#discussion_r426428163
##########
File path:
flink-table/flink-sql-client/src/main/java/org/apache/flink/table/client/cli/SqlCommandParser.java
##########
@@ -34,24 +61,130 @@ private SqlCommandParser() {
// private
}
- public static Optional<SqlCommandCall> parse(String stmt) {
+ public static Optional<SqlCommandCall> parse(Parser sqlParser, String
stmt) {
// normalize
stmt = stmt.trim();
// remove ';' at the end
if (stmt.endsWith(";")) {
stmt = stmt.substring(0, stmt.length() - 1).trim();
}
- // parse
+ // parse statement via sql parser first
+ Optional<SqlCommandCall> callOpt = parseBySqlParser(sqlParser,
stmt);
+ if (callOpt.isPresent()) {
+ return callOpt;
+ } else {
+ return parseByRegexMatching(stmt);
+ }
+ }
+
+ private static Optional<SqlCommandCall> parseBySqlParser(Parser
sqlParser, String stmt) {
+ List<Operation> operations;
+ try {
+ operations = sqlParser.parse(stmt);
+ } catch (Throwable e) {
+ if (e instanceof ValidationException) {
+ // can be parsed via sql parser, but is not
validated.
+ // throw exception directly
+ throw new SqlExecutionException("Invalidate SQL
statement.", e);
+ }
+ return Optional.empty();
+ }
+ if (operations.size() != 1) {
+ throw new SqlExecutionException("Only single statement
is supported now.");
+ }
+
+ final SqlCommand cmd;
+ String[] operands = new String[0];
+ Operation operation = operations.get(0);
+ if (operation instanceof CatalogSinkModifyOperation) {
+ boolean overwrite = ((CatalogSinkModifyOperation)
operation).isOverwrite();
+ cmd = overwrite ? SqlCommand.INSERT_OVERWRITE :
SqlCommand.INSERT_INTO;
+ operands = new String[] { stmt };
+ } else if (operation instanceof CreateTableOperation) {
+ cmd = SqlCommand.CREATE_TABLE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof DropTableOperation) {
+ cmd = SqlCommand.DROP_TABLE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof AlterTableOperation) {
+ cmd = SqlCommand.ALTER_TABLE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof CreateViewOperation) {
+ cmd = SqlCommand.CREATE_VIEW;
+ CreateViewOperation op = (CreateViewOperation)
operation;
+ operands = new String[] {
op.getViewIdentifier().asSerializableString(),
+ op.getCatalogView().getOriginalQuery()
};
+ } else if (operation instanceof DropViewOperation) {
+ cmd = SqlCommand.DROP_VIEW;
+ operands = new String[] { ((DropViewOperation)
operation).getViewIdentifier().asSerializableString() };
+ } else if (operation instanceof CreateDatabaseOperation) {
+ cmd = SqlCommand.CREATE_DATABASE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof DropDatabaseOperation) {
+ cmd = SqlCommand.DROP_DATABASE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof AlterDatabaseOperation) {
+ cmd = SqlCommand.ALTER_DATABASE;
+ operands = new String[] { stmt };
+ } else if (operation instanceof CreateCatalogOperation) {
+ cmd = SqlCommand.CREATE_CATALOG;
+ operands = new String[] { stmt };
+ } else if (operation instanceof UseCatalogOperation) {
+ cmd = SqlCommand.USE_CATALOG;
+ operands = new String[] { String.format("`%s`",
((UseCatalogOperation) operation).getCatalogName()) };
+ } else if (operation instanceof UseDatabaseOperation) {
+ cmd = SqlCommand.USE;
+ UseDatabaseOperation op = ((UseDatabaseOperation)
operation);
+ operands = new String[] { String.format("`%s`.`%s`",
op.getCatalogName(), op.getDatabaseName()) };
+ } else if (operation instanceof ShowCatalogsOperation) {
+ cmd = SqlCommand.SHOW_CATALOGS;
+ } else if (operation instanceof ShowDatabasesOperation) {
+ cmd = SqlCommand.SHOW_DATABASES;
+ } else if (operation instanceof ShowTablesOperation) {
+ cmd = SqlCommand.SHOW_TABLES;
+ } else if (operation instanceof ShowFunctionsOperation) {
+ cmd = SqlCommand.SHOW_FUNCTIONS;
+ } else if (operation instanceof ExplainOperation) {
+ cmd = SqlCommand.EXPLAIN;
+ operands = new String[] { stmt };
+ } else if (operation instanceof DescribeTableOperation) {
Review comment:
we can change the default value from `new String[0]` to `new String[] {
stmt }`
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]