001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.ESqlStatementType;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.nodes.*;
007
008/**
009 * CANCEL BACKUP and CANCEL RESTORE statements for StarRocks.
010 *
011 * Syntax:
012 * CANCEL BACKUP FROM <db_name>
013 * CANCEL BACKUP FOR EXTERNAL CATALOG
014 * CANCEL RESTORE FROM <db_name>
015 *
016 * Note: If a RESTORE task is canceled during the COMMIT phase, the restored
017 * data will be corrupted and inaccessible.
018 */
019public class TStarrocksCancelBackupRestoreStmt extends TCustomSqlStatement {
020
021    /**
022     * Type of cancel statement - BACKUP or RESTORE
023     */
024    public enum CancelType {
025        BACKUP,
026        RESTORE
027    }
028
029    // Type of cancel statement
030    private CancelType cancelType;
031
032    // FROM clause - database name
033    private TObjectName databaseName;
034
035    // FOR EXTERNAL CATALOG flag (BACKUP only)
036    private boolean forExternalCatalog;
037
038    public TStarrocksCancelBackupRestoreStmt(EDbVendor dbvendor) {
039        super(dbvendor);
040        // Will be set based on cancelType during parsing
041        sqlstatementtype = ESqlStatementType.sststarrocksCancelBackup;
042    }
043
044    // Getters
045    public CancelType getCancelType() {
046        return cancelType;
047    }
048
049    public TObjectName getDatabaseName() {
050        return databaseName;
051    }
052
053    public boolean isForExternalCatalog() {
054        return forExternalCatalog;
055    }
056
057    @Override
058    public int doParseStatement(TCustomSqlStatement psql) {
059        if (rootNode == null) return -1;
060        super.doParseStatement(psql);
061
062        TCancelBackupRestoreSqlNode node = (TCancelBackupRestoreSqlNode) rootNode;
063
064        TCancelBackupRestoreSqlNode.CancelType nodeCancelType = node.getCancelType();
065        if (nodeCancelType == TCancelBackupRestoreSqlNode.CancelType.BACKUP) {
066            this.cancelType = CancelType.BACKUP;
067            this.sqlstatementtype = ESqlStatementType.sststarrocksCancelBackup;
068        } else {
069            this.cancelType = CancelType.RESTORE;
070            this.sqlstatementtype = ESqlStatementType.sststarrocksCancelRestore;
071        }
072
073        this.databaseName = node.getDatabaseName();
074        this.forExternalCatalog = node.isForExternalCatalog();
075
076        return 0;
077    }
078
079    @Override
080    public void accept(TParseTreeVisitor v) {
081        v.preVisit(this);
082        v.postVisit(this);
083    }
084
085    @Override
086    public void acceptChildren(TParseTreeVisitor v) {
087        v.preVisit(this);
088        v.postVisit(this);
089    }
090}