Skip to content

Commit

Permalink
[feature](Nereids) support set and use statement syntax only
Browse files Browse the repository at this point in the history
1. add a new Command type: UnsupportedCommand to handle the statement
   only support parse but could not execute.
2. support syntax about set and use
  • Loading branch information
morrySnow committed Apr 24, 2024
1 parent dd1895f commit a5d31eb
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,7 @@ VALUES: 'VALUES';
VARCHAR: 'VARCHAR';
VARIABLES: 'VARIABLES';
VARIANT: 'VARIANT';
VAULT: 'VAULT';
VERBOSE: 'VERBOSE';
VERSION: 'VERSION';
VIEW: 'VIEW';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,40 @@ statementBase
constraint #addConstraint
| ALTER TABLE table=multipartIdentifier
DROP CONSTRAINT constraintName=errorCapturingIdentifier #dropConstraint
| SHOW CONSTRAINTS FROM table=multipartIdentifier #showConstraint
| SHOW CONSTRAINTS FROM table=multipartIdentifier #showConstraint
| unsupportedStatement #unsupported
;

unsupportedStatement
: SET identifier AS DEFAULT STORAGE VAULT #setDefaultStorageVault
| SET PROPERTY (FOR user=identifierOrText)? propertyItemList #setUserProperties
| SET (GLOBAL | LOCAL | SESSION)? identifier EQ (expression | DEFAULT) #setSystemVariableWithType
| SET variable #setSystemVariableWithoutType
| SET (CHAR SET | CHARSET) (charsetName=identifierOrText | DEFAULT) #setCharset
| SET NAMES EQ expression #setNames
| SET (GLOBAL | LOCAL | SESSION)? TRANSACTION
( transactionAccessMode
| isolationLevel
| transactionAccessMode COMMA isolationLevel
| isolationLevel COMMA transactionAccessMode) #setTransaction
| SET NAMES (charsetName=identifierOrText | DEFAULT) (COLLATE collateName=identifierOrText | DEFAULT)? #setCollate
| SET PASSWORD (FOR userIdentify)? EQ (STRING_LITERAL | (PASSWORD LEFT_PAREN STRING_LITERAL RIGHT_PAREN)) #setPassword
| SET LDAP_ADMIN_PASSWORD EQ (STRING_LITERAL | (PASSWORD LEFT_PAREN STRING_LITERAL RIGHT_PAREN)) #setLdapAdminPassword
| USE (catalog=identifier DOT)? database=identifier #useDatabase
| USE ((catalog=identifier DOT)? database=identifier)? ATSIGN cluster=identifier #useCloudCluster
;

variable
: (ATSIGN ATSIGN (GLOBAL | LOCAL | SESSION)?)? identifier EQ (expression | DEFAULT) #setSystemVariable
| ATSIGN identifier EQ expression #setUserVariable
;

transactionAccessMode
: READ (ONLY | WRITE)
;

isolationLevel
: ISOLATION LEVEL ((READ UNCOMMITTED) | (READ COMMITTED) | (REPEATABLE READ) | (SERIALIZABLE))
;

constraint
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 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.

package org.apache.doris.nereids.exceptions;

/**
* Exception for unsupported command to run in Nereids.
*/
public class MustFallbackException extends RuntimeException {
public MustFallbackException(String msg) {
super(String.format("Must fallback to legacy planner, because %s", msg));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@
import org.apache.doris.nereids.DorisParser.TimestampdiffContext;
import org.apache.doris.nereids.DorisParser.TypeConstructorContext;
import org.apache.doris.nereids.DorisParser.UnitIdentifierContext;
import org.apache.doris.nereids.DorisParser.UnsupportedContext;
import org.apache.doris.nereids.DorisParser.UpdateAssignmentContext;
import org.apache.doris.nereids.DorisParser.UpdateAssignmentSeqContext;
import org.apache.doris.nereids.DorisParser.UpdateContext;
Expand Down Expand Up @@ -379,6 +380,7 @@
import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand;
import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand;
import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVInfo;
import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVPropertyInfo;
Expand Down Expand Up @@ -3493,4 +3495,9 @@ public LogicalPlan visitShowCreateProcedure(ShowCreateProcedureContext ctx) {
FuncNameInfo procedureName = new FuncNameInfo(nameParts);
return ParserUtils.withOrigin(ctx, () -> new ShowCreateProcedureCommand(procedureName));
}

@Override
public Object visitUnsupported(UnsupportedContext ctx) {
return UnsupportedCommand.INSTANCE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,5 +152,7 @@ public enum PlanType {
SHOW_PROCEDURE_COMMAND,
SHOW_CREATE_PROCEDURE_COMMAND,
CREATE_VIEW_COMMAND,
ALTER_VIEW_COMMAND
ALTER_VIEW_COMMAND,

UNSUPPORTED_COMMAND
}
Original file line number Diff line number Diff line change
@@ -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.

package org.apache.doris.nereids.trees.plans.commands;

import org.apache.doris.nereids.exceptions.MustFallbackException;
import org.apache.doris.nereids.trees.plans.PlanType;
import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.qe.StmtExecutor;

/**
* all Nereids' unsupported command
*/
public class UnsupportedCommand extends Command implements NoForward {

public static UnsupportedCommand INSTANCE = new UnsupportedCommand();

public UnsupportedCommand() {
super(PlanType.UNSUPPORTED_COMMAND);
}

@Override
public void run(ConnectContext ctx, StmtExecutor executor) throws Exception {
throw new MustFallbackException("unsupported command");
}

@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
return visitor.visitUnsupportedCommand(this, context);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand;
import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand;
import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
import org.apache.doris.nereids.trees.plans.commands.insert.BatchInsertIntoTableCommand;
import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand;
Expand Down Expand Up @@ -166,4 +167,8 @@ default R visitCreateViewCommand(CreateViewCommand createViewCommand, C context)
default R visitAlterViewCommand(AlterViewCommand alterViewCommand, C context) {
return visitCommand(alterViewCommand, context);
}

default R visitUnsupportedCommand(UnsupportedCommand unsupportedCommand, C context) {
return visitCommand(unsupportedCommand, context);
}
}
13 changes: 10 additions & 3 deletions fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.PlanProcess;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.exceptions.MustFallbackException;
import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.minidump.MinidumpUtils;
Expand Down Expand Up @@ -596,6 +597,7 @@ public void execute(TUniqueId queryId) throws Exception {
boolean isGroupCommit = (Config.wait_internal_group_commit_finish
|| context.sessionVariable.isEnableInsertGroupCommit()) && isInsertCommand;
if (e instanceof NereidsException
&& !(((NereidsException) e).getException() instanceof MustFallbackException)
&& !context.getSessionVariable().enableFallbackToOriginalPlanner
&& !isGroupCommit) {
LOG.warn("Analyze failed. {}", context.getQueryIdentifier(), e);
Expand Down Expand Up @@ -717,25 +719,30 @@ private void executeByNereids(TUniqueId queryId) throws Exception {
}
try {
((Command) logicalPlan).run(context, this);
} catch (MustFallbackException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Command({}) process failed.", originStmt.originStmt, e);
}
throw new NereidsException("Command(" + originStmt.originStmt + ") process failed.", e);
} catch (QueryStateException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Command(" + originStmt.originStmt + ") process failed.", e);
LOG.debug("Command({}) process failed.", originStmt.originStmt, e);
}
context.setState(e.getQueryState());
throw new NereidsException("Command(" + originStmt.originStmt + ") process failed",
new AnalysisException(e.getMessage(), e));
} catch (UserException e) {
// Return message to info client what happened.
if (LOG.isDebugEnabled()) {
LOG.debug("Command(" + originStmt.originStmt + ") process failed.", e);
LOG.debug("Command({}) process failed.", originStmt.originStmt, e);
}
context.getState().setError(e.getMysqlErrorCode(), e.getMessage());
throw new NereidsException("Command (" + originStmt.originStmt + ") process failed",
new AnalysisException(e.getMessage(), e));
} catch (Exception e) {
// Maybe our bug
if (LOG.isDebugEnabled()) {
LOG.debug("Command (" + originStmt.originStmt + ") process failed.", e);
LOG.debug("Command({}) process failed.", originStmt.originStmt, e);
}
context.getState().setError(ErrorCode.ERR_UNKNOWN_ERROR, e.getMessage());
throw new NereidsException("Command (" + originStmt.originStmt + ") process failed.",
Expand Down

0 comments on commit a5d31eb

Please sign in to comment.