Skip to content

Commit 39d46a4

Browse files
authoredNov 8, 2024
[Feature]Trino dialect supports insert into syntax (StarRocks#52712)
Signed-off-by: zhiminr.ren <1240388654@qq.com>
1 parent f73f983 commit 39d46a4

File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed
 

‎fe/fe-core/src/main/java/com/starrocks/connector/parser/trino/AstBuilder.java

+13
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import com.starrocks.sql.ast.CreateTableAsSelectStmt;
7272
import com.starrocks.sql.ast.CreateTableStmt;
7373
import com.starrocks.sql.ast.ExceptRelation;
74+
import com.starrocks.sql.ast.InsertStmt;
7475
import com.starrocks.sql.ast.IntersectRelation;
7576
import com.starrocks.sql.ast.JoinRelation;
7677
import com.starrocks.sql.ast.LambdaArgument;
@@ -92,6 +93,7 @@
9293
import com.starrocks.sql.ast.UnitIdentifier;
9394
import com.starrocks.sql.ast.ValueList;
9495
import com.starrocks.sql.ast.ValuesRelation;
96+
import com.starrocks.sql.parser.NodePosition;
9597
import com.starrocks.sql.parser.ParsingException;
9698
import io.trino.sql.tree.AliasedRelation;
9799
import io.trino.sql.tree.AllColumns;
@@ -134,6 +136,7 @@
134136
import io.trino.sql.tree.IfExpression;
135137
import io.trino.sql.tree.InListExpression;
136138
import io.trino.sql.tree.InPredicate;
139+
import io.trino.sql.tree.Insert;
137140
import io.trino.sql.tree.Intersect;
138141
import io.trino.sql.tree.IntervalLiteral;
139142
import io.trino.sql.tree.IsNotNullPredicate;
@@ -195,6 +198,7 @@
195198
import java.util.List;
196199
import java.util.Map;
197200
import java.util.Optional;
201+
import java.util.UUID;
198202
import java.util.stream.Collectors;
199203

200204
import static com.starrocks.analysis.AnalyticWindow.BoundaryType.CURRENT_ROW;
@@ -1244,6 +1248,15 @@ protected ParseNode visitCast(Cast node, ParseTreeContext context) {
12441248
return new CastExpr(new TypeDef(getType(node.getType())), (Expr) visit(node.getExpression(), context));
12451249
}
12461250

1251+
@Override
1252+
protected ParseNode visitInsert(Insert node, ParseTreeContext context) {
1253+
List<String> parts = node.getTarget().getParts();
1254+
String tableName = parts.get(parts.size() - 1);
1255+
return new InsertStmt(qualifiedNameToTableName(convertQualifiedName(node.getTarget())), null,
1256+
tableName.concat(UUID.randomUUID().toString()), null,
1257+
(QueryStatement) visit(node.getQuery(), context), true, new HashMap<>(0), NodePosition.ZERO);
1258+
}
1259+
12471260
@Override
12481261
protected ParseNode visitCreateTableAsSelect(CreateTableAsSelect node, ParseTreeContext context) {
12491262
Map<String, String> properties = new HashMap<>();

‎fe/fe-core/src/main/java/com/starrocks/connector/parser/trino/TrinoParserUtils.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.trino.sql.tree.CreateTableAsSelect;
2727
import io.trino.sql.tree.Explain;
2828
import io.trino.sql.tree.ExplainAnalyze;
29+
import io.trino.sql.tree.Insert;
2930
import io.trino.sql.tree.Query;
3031
import io.trino.sql.tree.Statement;
3132

@@ -40,7 +41,7 @@ public static StatementBase toStatement(String query, long sqlMode) {
4041
String trimmedQuery = query.trim();
4142
Statement statement = TrinoParser.parse(trimmedQuery);
4243
if (statement instanceof Query || statement instanceof Explain || statement instanceof ExplainAnalyze
43-
|| statement instanceof CreateTableAsSelect) {
44+
|| statement instanceof CreateTableAsSelect || statement instanceof Insert) {
4445
return (StatementBase) statement.accept(new AstBuilder(sqlMode), new ParseTreeContext());
4546
} else {
4647
throw trinoParserUnsupportedException("Unsupported statement type: " + statement.getClass().getName());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2021-present StarRocks, Inc. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// https://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.starrocks.connector.parser.trino;
16+
17+
import com.starrocks.sql.ast.InsertStmt;
18+
import com.starrocks.sql.ast.QueryStatement;
19+
import com.starrocks.sql.parser.SqlParser;
20+
import org.junit.BeforeClass;
21+
import org.junit.Test;
22+
23+
public class TrinoInsertTest extends TrinoTestBase {
24+
@BeforeClass
25+
public static void beforeClass() throws Exception {
26+
TrinoTestBase.beforeClass();
27+
}
28+
29+
@Test
30+
public void testInsertTrinoDialect() throws Exception {
31+
String insertSql = "insert into t3 select doy(date '2022-03-06')";
32+
try {
33+
connectContext.getSessionVariable().setSqlDialect("trino");
34+
InsertStmt ctasStmt =
35+
(InsertStmt) SqlParser.parse(insertSql, connectContext.getSessionVariable()).get(0);
36+
QueryStatement queryStmt = ctasStmt.getQueryStatement();
37+
assertPlanContains(queryStmt, "dayofyear('2022-03-06 00:00:00')");
38+
39+
connectContext.getSessionVariable().setSqlDialect("starrocks");
40+
analyzeFail(insertSql, "No matching function with signature: doy(date)");
41+
} finally {
42+
connectContext.getSessionVariable().setSqlDialect("trino");
43+
}
44+
}
45+
}

‎fe/fe-core/src/test/java/com/starrocks/connector/parser/trino/TrinoTestBase.java

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ public static void beforeClass() throws Exception {
9494
"\"in_memory\" = \"false\"\n" +
9595
");");
9696

97+
starRocksAssert.withTable("CREATE TABLE `t3` (\n" +
98+
"`day` int NULL COMMENT \"\") \n" +
99+
"PROPERTIES ('replication_num' = '1')");
100+
97101
starRocksAssert.withTable("CREATE TABLE `tall` (\n" +
98102
" `ta` varchar(20) NULL COMMENT \"\",\n" +
99103
" `tb` smallint(6) NULL COMMENT \"\",\n" +

0 commit comments

Comments
 (0)
Please sign in to comment.