diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaLexer.java b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaLexer.java index a4cfa7ecbf..e266d2da5c 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaLexer.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/impala/parser/ImpalaLexer.java @@ -4,11 +4,17 @@ import com.alibaba.druid.sql.dialect.hive.parser.HiveLexer; import com.alibaba.druid.sql.parser.Keywords; import com.alibaba.druid.sql.parser.SQLParserFeature; +import com.alibaba.druid.sql.parser.Token; + +import java.util.Map; public class ImpalaLexer extends HiveLexer { @Override protected Keywords loadKeywords() { - return super.loadKeywords(); + Keywords keywords = super.loadKeywords(); + Map map = keywords.getKeywords(); + map.put("UPSERT", Token.UPSERT); + return new Keywords(map); } public ImpalaLexer(String input) { diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index fa1b29974b..0c47ac64ce 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -5826,6 +5826,10 @@ public SQLStatement parseWith() { SQLInsertStatement insert = (SQLInsertStatement) this.parseInsert(); insert.setWith(with); stmt = insert; + } else if (lexer.token == Token.UPSERT) { + SQLInsertStatement insert = (SQLInsertStatement) this.parseUpsert(); + insert.setWith(with); + stmt = insert; } else if (lexer.token == Token.FROM) { HiveMultiInsertStatement insert = (HiveMultiInsertStatement) this.parseInsert(); insert.setWith(with); diff --git a/core/src/test/resources/bvt/parser/impala/5.txt b/core/src/test/resources/bvt/parser/impala/5.txt index a2b0e1defe..ca3b8a0908 100644 --- a/core/src/test/resources/bvt/parser/impala/5.txt +++ b/core/src/test/resources/bvt/parser/impala/5.txt @@ -15,4 +15,14 @@ UPSERT [SHUFFLE] INTO production_table [NOSHUFFLE] SELECT * FROM staging_table WHERE c1 IS NOT NULL - AND c2 > 0; \ No newline at end of file + AND c2 > 0; +------------------------------------------------------------------------------------------------------------------------ +with tmp as (select c,d from prj1.kudu_table2) upsert into prj1.kudu_table select * from tmp +-------------------- +WITH tmp AS ( + SELECT c, d + FROM prj1.kudu_table2 + ) +UPSERT INTO prj1.kudu_table +SELECT * +FROM tmp \ No newline at end of file