[Chore](materialized-view) forbiden create mv with some constant expr and curdate() (#18145)
forbiden create mv with some constant expr and curdate()
This commit is contained in:
@ -202,6 +202,18 @@ public class CreateMaterializedViewStmt extends DdlStmt {
|
||||
throw new AnalysisException("The materialized view only support the single column or function expr. "
|
||||
+ "Error column: " + selectListItemExpr.toSql());
|
||||
}
|
||||
List<SlotRef> slots = new ArrayList<>();
|
||||
selectListItemExpr.collect(SlotRef.class, slots);
|
||||
if (!isReplay && slots.size() == 0) {
|
||||
throw new AnalysisException(
|
||||
"The materialized view contain constant expr is disallowed, expr: "
|
||||
+ selectListItemExpr.toSql());
|
||||
}
|
||||
|
||||
if (!isReplay && selectListItemExpr.haveFunction("curdate")) {
|
||||
throw new AnalysisException(
|
||||
"The materialized view contain curdate is disallowed");
|
||||
}
|
||||
|
||||
if (selectListItemExpr instanceof FunctionCallExpr
|
||||
&& ((FunctionCallExpr) selectListItemExpr).isAggregateFunction()) {
|
||||
@ -220,9 +232,6 @@ public class CreateMaterializedViewStmt extends DdlStmt {
|
||||
"The function " + functionName + " must match pattern:" + mvColumnPattern.toString());
|
||||
}
|
||||
}
|
||||
// check duplicate column
|
||||
List<SlotRef> slots = new ArrayList<>();
|
||||
functionCallExpr.collect(SlotRef.class, slots);
|
||||
|
||||
if (beginIndexOfAggregation == -1) {
|
||||
beginIndexOfAggregation = i;
|
||||
|
||||
@ -2284,5 +2284,14 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean haveFunction(String functionName) {
|
||||
for (Expr expr : children) {
|
||||
if (expr.haveFunction(functionName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1870,4 +1870,12 @@ public class FunctionCallExpr extends Expr {
|
||||
private void setChildren() {
|
||||
orderByElements.forEach(o -> addChild(o.getExpr()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean haveFunction(String functionName) {
|
||||
if (fnName.toString().equalsIgnoreCase(functionName)) {
|
||||
return true;
|
||||
}
|
||||
return super.haveFunction(functionName);
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,6 +40,7 @@ import mockit.Mocked;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -84,7 +85,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testCountDistinct(@Injectable SlotRef slotRef, @Injectable ArithmeticExpr arithmeticExpr,
|
||||
@Injectable SelectStmt selectStmt, @Injectable Column column,
|
||||
@Injectable TableRef tableRef,
|
||||
@ -149,7 +150,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testAggregateWithFunctionColumnInSelectClause(@Injectable ArithmeticExpr arithmeticExpr,
|
||||
@Injectable SelectStmt selectStmt,
|
||||
@Injectable AggregateFunction aggregateFunction) throws UserException {
|
||||
@ -179,7 +180,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testJoinSelectClause(@Injectable SlotRef slotRef,
|
||||
@Injectable TableRef tableRef1,
|
||||
@Injectable TableRef tableRef2,
|
||||
@ -210,7 +211,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testSelectClauseWithWhereClause(@Injectable SlotRef slotRef,
|
||||
@Injectable TableRef tableRef,
|
||||
@Injectable Expr whereClause,
|
||||
@ -259,14 +260,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
selectStmt.analyze(analyzer);
|
||||
selectStmt.getSelectList();
|
||||
result = selectList;
|
||||
selectStmt.getTableRefs();
|
||||
result = Lists.newArrayList(tableRef);
|
||||
selectStmt.getWhereClause();
|
||||
result = null;
|
||||
selectStmt.getHavingPred();
|
||||
result = havingClause;
|
||||
slotRef.toSql();
|
||||
result = "k1";
|
||||
}
|
||||
};
|
||||
CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null);
|
||||
@ -288,9 +281,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
selectList.addItem(selectListItem1);
|
||||
SelectListItem selectListItem2 = new SelectListItem(slotRef2, null);
|
||||
selectList.addItem(selectListItem2);
|
||||
OrderByElement orderByElement1 = new OrderByElement(slotRef2, false, false);
|
||||
OrderByElement orderByElement2 = new OrderByElement(slotRef1, false, false);
|
||||
ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1, orderByElement2);
|
||||
|
||||
new Expectations() {
|
||||
{
|
||||
@ -299,20 +289,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
selectStmt.analyze(analyzer);
|
||||
selectStmt.getSelectList();
|
||||
result = selectList;
|
||||
selectStmt.getTableRefs();
|
||||
result = Lists.newArrayList(tableRef);
|
||||
selectStmt.getWhereClause();
|
||||
result = null;
|
||||
selectStmt.getHavingPred();
|
||||
result = null;
|
||||
selectStmt.getOrderByElements();
|
||||
result = orderByElementList;
|
||||
slotRef1.toSql();
|
||||
result = "k1";
|
||||
slotRef2.toSql();
|
||||
result = "k2";
|
||||
slotRef2.getColumnName();
|
||||
result = "k1";
|
||||
}
|
||||
};
|
||||
CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null);
|
||||
@ -324,7 +300,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testOrderByAggregateColumn(@Injectable SlotRef slotRef1,
|
||||
@Injectable TableRef tableRef,
|
||||
@Injectable SelectStmt selectStmt,
|
||||
@ -342,9 +318,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
Deencapsulation.setField(functionCallExpr, "fn", aggregateFunction);
|
||||
SelectListItem selectListItem2 = new SelectListItem(functionCallExpr, null);
|
||||
selectList.addItem(selectListItem2);
|
||||
OrderByElement orderByElement1 = new OrderByElement(functionCallExpr, false, false);
|
||||
OrderByElement orderByElement2 = new OrderByElement(slotRef1, false, false);
|
||||
ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1, orderByElement2);
|
||||
|
||||
new Expectations() {
|
||||
{
|
||||
@ -353,16 +326,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
selectStmt.analyze(analyzer);
|
||||
selectStmt.getSelectList();
|
||||
result = selectList;
|
||||
selectStmt.getTableRefs();
|
||||
result = Lists.newArrayList(tableRef);
|
||||
selectStmt.getWhereClause();
|
||||
result = null;
|
||||
selectStmt.getHavingPred();
|
||||
result = null;
|
||||
selectStmt.getOrderByElements();
|
||||
result = orderByElementList;
|
||||
slotRef1.toSql();
|
||||
result = "k1";
|
||||
}
|
||||
};
|
||||
CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null);
|
||||
@ -468,8 +431,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
Deencapsulation.setField(functionCallExpr, "fn", aggregateFunction);
|
||||
SelectListItem selectListItem3 = new SelectListItem(functionCallExpr, null);
|
||||
selectList.addItem(selectListItem3);
|
||||
OrderByElement orderByElement1 = new OrderByElement(slotRef1, false, false);
|
||||
ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1);
|
||||
|
||||
new Expectations() {
|
||||
{
|
||||
@ -478,18 +439,6 @@ public class CreateMaterializedViewStmtTest {
|
||||
selectStmt.analyze(analyzer);
|
||||
selectStmt.getSelectList();
|
||||
result = selectList;
|
||||
selectStmt.getTableRefs();
|
||||
result = Lists.newArrayList(tableRef);
|
||||
selectStmt.getWhereClause();
|
||||
result = null;
|
||||
selectStmt.getHavingPred();
|
||||
result = null;
|
||||
selectStmt.getOrderByElements();
|
||||
result = orderByElementList;
|
||||
slotRef1.toSql();
|
||||
result = "k1";
|
||||
slotRef2.toSql();
|
||||
result = "k2";
|
||||
}
|
||||
};
|
||||
CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null);
|
||||
@ -501,7 +450,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumnsWithoutOrderby(@Injectable SlotRef slotRef1,
|
||||
@Injectable SlotRef slotRef2,
|
||||
@Injectable SlotRef slotRef3,
|
||||
@ -604,7 +553,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumnsWithoutOrderbyWithoutAggregation(@Injectable SlotRef slotRef1,
|
||||
@Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4,
|
||||
@Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException {
|
||||
@ -706,7 +655,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
/*
|
||||
ISSUE: #3811
|
||||
*/
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumnsWithoutOrderbyWithoutAggregationWithFloat(@Injectable SlotRef slotRef1,
|
||||
@Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4,
|
||||
@Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException {
|
||||
@ -806,7 +755,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
/*
|
||||
ISSUE: #3811
|
||||
*/
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumnsWithoutOrderbyWithoutAggregationWithVarchar(@Injectable SlotRef slotRef1,
|
||||
@Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4,
|
||||
@Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException {
|
||||
@ -940,7 +889,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
/*
|
||||
ISSUE: #3811
|
||||
*/
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumnsWithFirstVarchar(@Injectable SlotRef slotRef1,
|
||||
@Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException {
|
||||
SelectList selectList = new SelectList();
|
||||
@ -995,7 +944,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testMVColumns(@Injectable SlotRef slotRef1,
|
||||
@Injectable SlotRef slotRef2,
|
||||
@Injectable TableRef tableRef,
|
||||
@ -1084,7 +1033,7 @@ public class CreateMaterializedViewStmtTest {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void testDeduplicateMV(@Injectable SlotRef slotRef1,
|
||||
@Injectable TableRef tableRef,
|
||||
@Injectable SelectStmt selectStmt,
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
// 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 ("const_invalid") {
|
||||
sql """ drop table if exists d_table; """
|
||||
|
||||
sql """
|
||||
create table d_table (
|
||||
k1 int null,
|
||||
k2 int not null,
|
||||
k3 bigint null,
|
||||
k4 varchar(100) null
|
||||
)
|
||||
duplicate key (k1,k2,k3)
|
||||
distributed BY hash(k1) buckets 3
|
||||
properties("replication_num" = "1");
|
||||
"""
|
||||
|
||||
test {
|
||||
sql "create materialized view const_1 as select k1,curdate() from d_table;"
|
||||
exception "errCode = 2,"
|
||||
}
|
||||
|
||||
test {
|
||||
sql "create materialized view const_2 as select k1,curdate()+k1 from d_table;"
|
||||
exception "errCode = 2,"
|
||||
}
|
||||
test {
|
||||
sql "create materialized view const_3 as select k1,abs(1+1) from d_table;"
|
||||
exception "errCode = 2,"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user