From d94ae20d4a1645994407733fc02c633621568b58 Mon Sep 17 00:00:00 2001 From: zzzzzzzs <1443539042@qq.com> Date: Wed, 25 Oct 2023 11:12:00 +0800 Subject: [PATCH] [improvement](nereids) support insert into doris_internal_table_id(xxx) (#25722) --- .../org/apache/doris/nereids/DorisParser.g4 | 3 +- .../nereids/parser/LogicalPlanBuilder.java | 14 ++- .../insert_into_table/insert_use_table_id.out | 48 ++++++++ .../doris/regression/suite/Suite.groovy | 16 +++ .../insert_use_table_id.groovy | 107 ++++++++++++++++++ 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 regression-test/data/nereids_p0/insert_into_table/insert_use_table_id.out create mode 100644 regression-test/suites/nereids_p0/insert_into_table/insert_use_table_id.groovy diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 065117d3b0..4c74e424e6 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -50,7 +50,8 @@ statement (ROLLUP LEFT_PAREN rollupDefs RIGHT_PAREN)? propertyClause? (AS query)? #createTable - | explain? INSERT (INTO | OVERWRITE TABLE) tableName=multipartIdentifier + | explain? INSERT (INTO | OVERWRITE TABLE) + (tableName=multipartIdentifier | DORIS_INTERNAL_TABLE_ID LEFT_PAREN tableId=INTEGER_VALUE RIGHT_PAREN) (PARTITION partition=identifierList)? // partition define (WITH LABEL labelName=identifier)? cols=identifierList? // label and columns define (LEFT_BRACKET hints=identifierSeq RIGHT_BRACKET)? // hint define diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index b817803f23..49209dcd54 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -20,8 +20,10 @@ package org.apache.doris.nereids.parser; import org.apache.doris.analysis.ArithmeticExpr.Operator; import org.apache.doris.analysis.BrokerDesc; import org.apache.doris.analysis.StorageBackend; +import org.apache.doris.analysis.TableName; import org.apache.doris.analysis.UserIdentity; import org.apache.doris.catalog.AggregateType; +import org.apache.doris.catalog.Env; import org.apache.doris.catalog.KeysType; import org.apache.doris.common.Config; import org.apache.doris.common.FeConstants; @@ -411,7 +413,17 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { @Override public LogicalPlan visitInsertIntoQuery(InsertIntoQueryContext ctx) { boolean isOverwrite = ctx.INTO() == null; - List tableName = visitMultipartIdentifier(ctx.tableName); + List tableName = new ArrayList<>(); + if (null != ctx.tableName) { + tableName = visitMultipartIdentifier(ctx.tableName); + } else if (null != ctx.tableId) { + TableName name = Env.getCurrentEnv().getInternalCatalog() + .getTableNameByTableId(Long.valueOf(ctx.tableId.getText())); + tableName.add(name.getDb()); + tableName.add(name.getTbl()); + } else { + throw new ParseException("tableName and tableId cannot both be null"); + } String labelName = ctx.labelName == null ? null : ctx.labelName.getText(); List colNames = ctx.cols == null ? ImmutableList.of() : visitIdentifierList(ctx.cols); List partitions = ctx.partition == null ? ImmutableList.of() : visitIdentifierList(ctx.partition); diff --git a/regression-test/data/nereids_p0/insert_into_table/insert_use_table_id.out b/regression-test/data/nereids_p0/insert_into_table/insert_use_table_id.out new file mode 100644 index 0000000000..d0020443bf --- /dev/null +++ b/regression-test/data/nereids_p0/insert_into_table/insert_use_table_id.out @@ -0,0 +1,48 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql_cross_join -- +1 10 1 1 1.0 2000-01-01 1 10 10 10.0 2000-01-10 1 +1 10 1 1 1.0 2000-01-01 1 10 10 10.0 2000-01-10 4 +1 10 1 1 1.0 2000-01-01 1 10 10 10.0 2000-01-10 5 +1 10 1 1 1.0 2000-01-01 2 20 20 20.0 2000-01-20 1 +1 10 1 1 1.0 2000-01-01 2 20 20 20.0 2000-01-20 4 +1 10 1 1 1.0 2000-01-01 2 20 20 20.0 2000-01-20 5 +1 10 1 1 1.0 2000-01-01 3 30 30 30.0 2000-01-30 1 +1 10 1 1 1.0 2000-01-01 3 30 30 30.0 2000-01-30 4 +1 10 1 1 1.0 2000-01-01 3 30 30 30.0 2000-01-30 5 +1 10 1 1 1.0 2000-01-01 4 4 4 4.0 2000-01-04 1 +1 10 1 1 1.0 2000-01-01 4 4 4 4.0 2000-01-04 4 +1 10 1 1 1.0 2000-01-01 4 4 4 4.0 2000-01-04 5 +1 10 1 1 1.0 2000-01-01 5 5 5 5.0 2000-01-05 1 +1 10 1 1 1.0 2000-01-01 5 5 5 5.0 2000-01-05 4 +1 10 1 1 1.0 2000-01-01 5 5 5 5.0 2000-01-05 5 +2 20 2 2 2.0 2000-01-02 1 10 10 10.0 2000-01-10 1 +2 20 2 2 2.0 2000-01-02 1 10 10 10.0 2000-01-10 4 +2 20 2 2 2.0 2000-01-02 1 10 10 10.0 2000-01-10 5 +2 20 2 2 2.0 2000-01-02 2 20 20 20.0 2000-01-20 1 +2 20 2 2 2.0 2000-01-02 2 20 20 20.0 2000-01-20 4 +2 20 2 2 2.0 2000-01-02 2 20 20 20.0 2000-01-20 5 +2 20 2 2 2.0 2000-01-02 3 30 30 30.0 2000-01-30 1 +2 20 2 2 2.0 2000-01-02 3 30 30 30.0 2000-01-30 4 +2 20 2 2 2.0 2000-01-02 3 30 30 30.0 2000-01-30 5 +2 20 2 2 2.0 2000-01-02 4 4 4 4.0 2000-01-04 1 +2 20 2 2 2.0 2000-01-02 4 4 4 4.0 2000-01-04 4 +2 20 2 2 2.0 2000-01-02 4 4 4 4.0 2000-01-04 5 +2 20 2 2 2.0 2000-01-02 5 5 5 5.0 2000-01-05 1 +2 20 2 2 2.0 2000-01-02 5 5 5 5.0 2000-01-05 4 +2 20 2 2 2.0 2000-01-02 5 5 5 5.0 2000-01-05 5 +3 30 3 3 3.0 2000-01-03 1 10 10 10.0 2000-01-10 1 +3 30 3 3 3.0 2000-01-03 1 10 10 10.0 2000-01-10 4 +3 30 3 3 3.0 2000-01-03 1 10 10 10.0 2000-01-10 5 +3 30 3 3 3.0 2000-01-03 2 20 20 20.0 2000-01-20 1 +3 30 3 3 3.0 2000-01-03 2 20 20 20.0 2000-01-20 4 +3 30 3 3 3.0 2000-01-03 2 20 20 20.0 2000-01-20 5 +3 30 3 3 3.0 2000-01-03 3 30 30 30.0 2000-01-30 1 +3 30 3 3 3.0 2000-01-03 3 30 30 30.0 2000-01-30 4 +3 30 3 3 3.0 2000-01-03 3 30 30 30.0 2000-01-30 5 +3 30 3 3 3.0 2000-01-03 4 4 4 4.0 2000-01-04 1 +3 30 3 3 3.0 2000-01-03 4 4 4 4.0 2000-01-04 4 +3 30 3 3 3.0 2000-01-03 4 4 4 4.0 2000-01-04 5 +3 30 3 3 3.0 2000-01-03 5 5 5 5.0 2000-01-05 1 +3 30 3 3 3.0 2000-01-03 5 5 5 5.0 2000-01-05 4 +3 30 3 3 3.0 2000-01-03 5 5 5 5.0 2000-01-05 5 + diff --git a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy index 0b7bc65975..5065f0e3e3 100644 --- a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy +++ b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy @@ -295,6 +295,22 @@ class Suite implements GroovyInterceptable { return result; } + + long getTableId(String tableName) { + def dbInfo = sql "show proc '/dbs'" + for(List row : dbInfo) { + if (row[1].split(":")[1].equals(context.dbName)) { + def tbInfo = sql "show proc '/dbs/${row[0]}' " + for (List tb : tbInfo) { + if (tb[1].equals(tableName)) { + println(tb[0]) + return tb[0].toLong() + } + } + } + } + } + List> order_sql(String sqlStr) { return sql(sqlStr, true) } diff --git a/regression-test/suites/nereids_p0/insert_into_table/insert_use_table_id.groovy b/regression-test/suites/nereids_p0/insert_into_table/insert_use_table_id.groovy new file mode 100644 index 0000000000..930fe35b60 --- /dev/null +++ b/regression-test/suites/nereids_p0/insert_into_table/insert_use_table_id.groovy @@ -0,0 +1,107 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + + + +suite('nereids_insert_use_table_id') { + sql 'set enable_nereids_planner=true' + sql 'set enable_fallback_to_original_planner=false' + sql 'set enable_nereids_dml=true' + sql 'set enable_strict_consistency_dml=true' + + // sql 'CREATE DATABASE IF NOT EXISTS dnereids_insert_use_table_id_test' + // sql 'use nereids_insert_use_table_id_test' + + def t1 = 'table_id_value_t1' + def t2 = 'table_id_value_t2' + def t3 = 'table_id_value_t3' + + sql "drop table if exists ${t1}" + sql "drop table if exists ${t2}" + sql "drop table if exists ${t3}" + + sql """ + create table ${t1} ( + id int, + id1 int, + c1 bigint, + c2 string, + c3 double, + c4 date + ) unique key (id, id1) + distributed by hash(id, id1) buckets 13 + properties( + 'replication_num'='1', + "function_column.sequence_col" = "c4" + ); + """ + + sql """ + create table ${t2} ( + id int, + c1 bigint, + c2 string, + c3 double, + c4 date + ) unique key (id) + distributed by hash(id) buckets 13 + properties( + 'replication_num'='1' + ); + """ + + sql """ + create table ${t3} ( + id int + ) distributed by hash(id) buckets 13 + properties( + 'replication_num'='1' + ); + """ + + + sql """ + INSERT INTO DORIS_INTERNAL_TABLE_ID(${getTableId(t1)}) VALUES + (1, (1 + 9) * (10 - 9), 1, '1', 1.0, '2000-01-01'), + (2, 20, 2, '2', 2.0, days_add('2000-01-01', 1)), + (3, 30, 3, '3', 3.0, makedate(2000, 3)); + """ + + sql """ + INSERT INTO DORIS_INTERNAL_TABLE_ID(${getTableId(t2)}) VALUES + (1, 10, '10', 10.0, '2000-01-10'), + (2, 20, '20', 20.0, '2000-01-20'), + (3, 30, '30', 30.0, '2000-01-30'), + (4, 4, '4', 4.0, '2000-01-04'), + (5, 5, '5', 5.0, '2000-01-05'); + """ + + sql """ + INSERT INTO DORIS_INTERNAL_TABLE_ID(${getTableId(t3)}) VALUES + (1), + (4), + (5); + """ + + sql "sync" + qt_sql_cross_join "select * from ${t1}, ${t2}, ${t3} order by ${t1}.id, ${t1}.id1, ${t2}.id, ${t3}.id" + + +} + +