This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new e3b059e339f [fix](nereids) Fix not check column name when create or
alter view (#42206) (#42323)
e3b059e339f is described below
commit e3b059e339f12e5a81accba0a048f7671e9d1c36
Author: seawinde <[email protected]>
AuthorDate: Thu Oct 24 10:11:32 2024 +0800
[fix](nereids) Fix not check column name when create or alter view (#42206)
(#42323)
pr: https://github.com/apache/doris/pull/42206
commitId: 2bcaa5b4
---
.../trees/plans/commands/info/AlterViewInfo.java | 19 -------------
.../trees/plans/commands/info/BaseViewInfo.java | 26 +++++++++++++++---
.../trees/plans/commands/info/CreateViewInfo.java | 29 ++++----------------
.../data/ddl_p0/test_create_view_nereids.out | 24 ++++++++++++++++-
.../suites/ddl_p0/test_create_view_nereids.groovy | 31 ++++++++++++++++++++--
5 files changed, 80 insertions(+), 49 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
index 6ebd2f8c1d9..b5e47bc0770 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterViewInfo.java
@@ -20,7 +20,6 @@ package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.analysis.AlterViewStmt;
import org.apache.doris.analysis.ColWithComment;
import org.apache.doris.analysis.TableName;
-import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.DatabaseIf;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.TableIf;
@@ -31,18 +30,12 @@ import org.apache.doris.common.FeNameFormat;
import org.apache.doris.common.UserException;
import org.apache.doris.common.util.Util;
import org.apache.doris.mysql.privilege.PrivPredicate;
-import org.apache.doris.nereids.NereidsPlanner;
-import org.apache.doris.nereids.analyzer.UnboundResultSink;
-import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.trees.expressions.Slot;
-import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
import org.apache.doris.qe.ConnectContext;
import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import java.util.List;
-import java.util.Set;
/** AlterViewInfo */
public class AlterViewInfo extends BaseViewInfo {
@@ -82,18 +75,6 @@ public class AlterViewInfo extends BaseViewInfo {
createFinalCols(outputs);
}
- /**validate*/
- public void validate(ConnectContext ctx) throws UserException {
- NereidsPlanner planner = new NereidsPlanner(ctx.getStatementContext());
- planner.planWithLock(new UnboundResultSink<>(logicalQuery),
PhysicalProperties.ANY, ExplainLevel.NONE);
- Set<String> colSets = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
- for (Column col : finalCols) {
- if (!colSets.add(col.getName())) {
-
ErrorReport.reportAnalysisException(ErrorCode.ERR_DUP_FIELDNAME, col.getName());
- }
- }
- }
-
/**translateToLegacyStmt*/
public AlterViewStmt translateToLegacyStmt(ConnectContext ctx) {
List<ColWithComment> cols = Lists.newArrayList();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
index 5631e354977..b8332a256ef 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BaseViewInfo.java
@@ -21,12 +21,15 @@ import org.apache.doris.catalog.Column;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.FeNameFormat;
import org.apache.doris.common.Pair;
+import org.apache.doris.common.UserException;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.DorisParser;
import org.apache.doris.nereids.DorisParser.NamedExpressionContext;
import org.apache.doris.nereids.DorisParser.NamedExpressionSeqContext;
import org.apache.doris.nereids.DorisParserBaseVisitor;
+import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.analyzer.UnboundResultSink;
import org.apache.doris.nereids.jobs.executor.AbstractBatchJobExecutor;
@@ -44,6 +47,7 @@ import
org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionVisitor;
import org.apache.doris.nereids.trees.plans.Plan;
+import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
import org.apache.doris.nereids.trees.plans.logical.LogicalCTEAnchor;
import org.apache.doris.nereids.trees.plans.logical.LogicalCTEProducer;
@@ -64,6 +68,7 @@ import org.apache.doris.nereids.util.Utils;
import org.apache.doris.qe.ConnectContext;
import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.RuleNode;
@@ -71,6 +76,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.TreeMap;
/** BaseViewInfo */
@@ -96,9 +102,6 @@ public class BaseViewInfo {
if (logicalQuery instanceof LogicalFileSink) {
throw new AnalysisException("Not support OUTFILE clause in CREATE
VIEW statement");
}
- if (parsedViewPlan instanceof UnboundResultSink) {
- parsedViewPlan = (LogicalPlan) ((UnboundResultSink<?>)
parsedViewPlan).child();
- }
CascadesContext viewContextForStar = CascadesContext.initContext(
stmtCtx, parsedViewPlan, PhysicalProperties.ANY);
AnalyzerForCreateView analyzerForStar = new
AnalyzerForCreateView(viewContextForStar);
@@ -214,6 +217,23 @@ public class BaseViewInfo {
}
}
+ /**validate*/
+ public void validate(ConnectContext ctx) throws UserException {
+ NereidsPlanner planner = new NereidsPlanner(ctx.getStatementContext());
+ planner.planWithLock(new UnboundResultSink<>(logicalQuery),
PhysicalProperties.ANY, ExplainLevel.NONE);
+ Set<String> colSets = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
+ for (Column col : finalCols) {
+ if (!colSets.add(col.getName())) {
+
ErrorReport.reportAnalysisException(ErrorCode.ERR_DUP_FIELDNAME, col.getName());
+ }
+ try {
+ FeNameFormat.checkColumnName(col.getName());
+ } catch (org.apache.doris.common.AnalysisException e) {
+ throw new
org.apache.doris.nereids.exceptions.AnalysisException(e.getMessage(), e);
+ }
+ }
+ }
+
/** traverse ast to find the outermost project list location information
in sql*/
protected static class IndexFinder extends DorisParserBaseVisitor<Void> {
private boolean found = false;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
index 8409e8137ed..93c287885ec 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateViewInfo.java
@@ -20,7 +20,6 @@ package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.analysis.ColWithComment;
import org.apache.doris.analysis.CreateViewStmt;
import org.apache.doris.analysis.TableName;
-import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.Env;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
@@ -28,18 +27,12 @@ import org.apache.doris.common.FeNameFormat;
import org.apache.doris.common.UserException;
import org.apache.doris.common.util.Util;
import org.apache.doris.mysql.privilege.PrivPredicate;
-import org.apache.doris.nereids.NereidsPlanner;
-import org.apache.doris.nereids.analyzer.UnboundResultSink;
-import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.trees.expressions.Slot;
-import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
import org.apache.doris.qe.ConnectContext;
import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import java.util.List;
-import java.util.Set;
/**
* CreateViewInfo
@@ -60,15 +53,6 @@ public class CreateViewInfo extends BaseViewInfo {
/** init */
public void init(ConnectContext ctx) throws UserException {
- analyzeAndFillRewriteSqlMap(querySql, ctx);
- OutermostPlanFinderContext outermostPlanFinderContext = new
OutermostPlanFinderContext();
- analyzedPlan.accept(OutermostPlanFinder.INSTANCE,
outermostPlanFinderContext);
- List<Slot> outputs =
outermostPlanFinderContext.outermostPlan.getOutput();
- createFinalCols(outputs);
- }
-
- /**validate*/
- public void validate(ConnectContext ctx) throws UserException {
viewName.analyze(ctx);
FeNameFormat.checkTableName(viewName.getTbl());
// disallow external catalog
@@ -79,14 +63,11 @@ public class CreateViewInfo extends BaseViewInfo {
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLE_ACCESS_DENIED_ERROR,
PrivPredicate.CREATE.getPrivs().toString(),
viewName.getTbl());
}
- NereidsPlanner planner = new NereidsPlanner(ctx.getStatementContext());
- planner.planWithLock(new UnboundResultSink<>(logicalQuery),
PhysicalProperties.ANY, ExplainLevel.NONE);
- Set<String> colSets = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
- for (Column col : finalCols) {
- if (!colSets.add(col.getName())) {
-
ErrorReport.reportAnalysisException(ErrorCode.ERR_DUP_FIELDNAME, col.getName());
- }
- }
+ analyzeAndFillRewriteSqlMap(querySql, ctx);
+ OutermostPlanFinderContext outermostPlanFinderContext = new
OutermostPlanFinderContext();
+ analyzedPlan.accept(OutermostPlanFinder.INSTANCE,
outermostPlanFinderContext);
+ List<Slot> outputs =
outermostPlanFinderContext.outermostPlan.getOutput();
+ createFinalCols(outputs);
}
/**translateToLegacyStmt*/
diff --git a/regression-test/data/ddl_p0/test_create_view_nereids.out
b/regression-test/data/ddl_p0/test_create_view_nereids.out
index 4cac00352a9..1b2ba19d937 100644
--- a/regression-test/data/ddl_p0/test_create_view_nereids.out
+++ b/regression-test/data/ddl_p0/test_create_view_nereids.out
@@ -202,7 +202,7 @@ test_view_from_view CREATE VIEW `test_view_from_view` AS
select `internal`.`regr
7 1
-- !test_backquote_in_view_define_sql --
-test_backquote_in_view_define CREATE VIEW `test_backquote_in_view_define` AS
select `internal`.`regression_test_ddl_p0`.`mal_test_view`.`a` AS `ab``c`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` AS `c2` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`; utf8mb4
utf8mb4_0900_bin
+test_backquote_in_view_define CREATE VIEW `test_backquote_in_view_define` AS
select `internal`.`regression_test_ddl_p0`.`mal_test_view`.`a` AS `abc`,
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` AS `c2` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`; utf8mb4
utf8mb4_0900_bin
-- !test_backquote_in_table_alias --
\N 6
@@ -226,6 +226,28 @@ test_backquote_in_view_define CREATE VIEW
`test_backquote_in_view_define` AS sel
-- !test_backquote_in_table_alias_sql --
test_backquote_in_table_alias CREATE VIEW `test_backquote_in_table_alias` AS
select `internal`.`regression_test_ddl_p0`.`ab``c`.`a` AS `c1`,
`internal`.`regression_test_ddl_p0`.`ab``c`.`b` AS `c2` from (select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`,`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b`
from `internal`.`regression_test_ddl_p0`.`mal_test_view`) `ab``c`; utf8mb4
utf8mb4_0900_bin
+-- !test_invalid_column_name_in_table --
+\N 6
+1 2
+1 3
+1 4
+1 4
+1 7
+2 8
+3 5
+3 6
+3 9
+4 2
+5 \N
+5 6
+5 6
+5 6
+5 8
+7 1
+
+-- !test_invalid_column_name_in_table_define_sql --
+test_invalid_column_name_in_table CREATE VIEW
`test_invalid_column_name_in_table` AS select
`internal`.`regression_test_ddl_p0`.`mal_test_view`.`a`
,`internal`.`regression_test_ddl_p0`.`mal_test_view`.`b` from
`internal`.`regression_test_ddl_p0`.`mal_test_view`; utf8mb4 utf8mb4_0900_bin
+
-- !test_generate --
1 10 A 30
1 10 A 60
diff --git a/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
b/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
index 38347deffc6..55d59a1bd6d 100644
--- a/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
+++ b/regression-test/suites/ddl_p0/test_create_view_nereids.groovy
@@ -267,10 +267,15 @@ suite("test_create_view_nereids") {
qt_test_create_view_from_view_sql "show create view test_view_from_view"
// test backquote in name
+ try {
+ sql "create view test_backquote_in_view_define(`ab``c`, c2) as select
a,b from mal_test_view;"
+ } catch (Exception e) {
+ assertTrue(e.getMessage().contains("Incorrect column name 'ab`c'"))
+ }
sql "drop view if exists test_backquote_in_view_define;"
- sql "create view test_backquote_in_view_define(`ab``c`, c2) as select a,b
from mal_test_view;"
- qt_test_backquote_in_view_define "select * from
test_backquote_in_view_define order by `ab``c`, c2;"
+ sql "create view test_backquote_in_view_define(`abc`, c2) as select a,b
from mal_test_view;"
+ qt_test_backquote_in_view_define "select * from
test_backquote_in_view_define order by abc, c2;"
qt_test_backquote_in_view_define_sql "show create view
test_backquote_in_view_define;"
sql "drop view if exists test_backquote_in_table_alias;"
@@ -278,6 +283,28 @@ suite("test_create_view_nereids") {
qt_test_backquote_in_table_alias "select * from
test_backquote_in_table_alias order by c1, c2;"
qt_test_backquote_in_table_alias_sql "show create view
test_backquote_in_table_alias;"
+ // test invalid column name
+ sql """set enable_unicode_name_support = true;"""
+ sql "drop view if exists test_invalid_column_name_in_table;"
+ try {
+ // create view should fail if contains invalid column name
+ sql "create view test_invalid_column_name_in_table as select a as
'(第一列)',b from mal_test_view;"
+ } catch (Exception e) {
+ assertTrue(e.getMessage().contains("Incorrect column name '(第一列)'"))
+ }
+
+ sql "create view test_invalid_column_name_in_table as select a ,b from
mal_test_view;"
+ order_qt_test_invalid_column_name_in_table "select * from
test_invalid_column_name_in_table"
+ order_qt_test_invalid_column_name_in_table_define_sql "show create view
test_invalid_column_name_in_table;"
+
+ try {
+ // alter view should fail if contains invalid column name
+ sql "alter view test_invalid_column_name_in_table as select a as
'(第一列)',b from mal_test_view;"
+ } catch (Exception e) {
+ assertTrue(e.getMessage().contains("Incorrect column name '(第一列)'"))
+ }
+ sql """set enable_unicode_name_support = false;"""
+
sql "drop table if exists create_view_table1"
sql """CREATE TABLE create_view_table1 (
id INT,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]