001package gudusoft.gsqlparser.nodes.oceanbase;
002
003import gudusoft.gsqlparser.nodes.TObjectName;
004import gudusoft.gsqlparser.nodes.TParseTreeNode;
005import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
006
007/**
008 * AST node for OceanBase {@code ALTER SYSTEM} (Phase 4 Batch 3 + 10).
009 *
010 * <p>{@code ALTER SYSTEM} is OceanBase's catch-all for cluster
011 * operations. The grammar scope includes:
012 * <ul>
013 *   <li><b>Parameter</b>: {@code SET name = value [SCOPE|TENANT|SERVER|ZONE = x]}</li>
014 *   <li><b>Freeze</b>: {@code MAJOR FREEZE [TENANT = x]}</li>
015 *   <li><b>Zone</b>: {@code ADD|DELETE|START|STOP ZONE '...'}</li>
016 *   <li><b>Server</b>: {@code ADD|DELETE SERVER '...' ZONE = x}</li>
017 *   <li><b>Switchover</b>: {@code SWITCHOVER TO [PRIMARY] TENANT = x}</li>
018 *   <li><b>Backup</b>: {@code BACKUP DATABASE | BACKUP TENANT = x}</li>
019 *   <li><b>Batch 10 verbs</b>: {@code CHANGE REPLICA}, {@code MIGRATE
020 *       UNIT}, {@code ADD|DROP STORAGE}, {@code CHANGE TENANT ...
021 *       SUSPEND|RESUME}, etc.</li>
022 * </ul>
023 *
024 * <p>The {@link #getActionType()} enum identifies which variant was
025 * matched. Downstream tooling can switch on it and read just the
026 * relevant fields ({@link #getSettingName()},
027 * {@link #getSettingValue()}, {@link #getTargetName()}).
028 *
029 * @since 4.0.1.4
030 */
031public class TOceanbaseAlterSystemSqlNode extends TParseTreeNode {
032
033    public enum EAction {
034        /** {@code ALTER SYSTEM SET param = value [... scope]} */
035        SET_PARAMETER,
036        /** {@code ALTER SYSTEM MAJOR FREEZE [TENANT = x]} */
037        MAJOR_FREEZE,
038        /** {@code ALTER SYSTEM ADD ZONE} / {@code DELETE ZONE} / {@code START/STOP ZONE} */
039        ZONE_OP,
040        /** {@code ALTER SYSTEM ADD SERVER} / {@code DELETE SERVER} */
041        SERVER_OP,
042        /** {@code ALTER SYSTEM SWITCHOVER TO ...} */
043        SWITCHOVER,
044        /** {@code ALTER SYSTEM BACKUP ...} */
045        BACKUP,
046        /** {@code ALTER SYSTEM CHANGE REPLICA ...} (Batch 10) */
047        CHANGE_REPLICA,
048        /** {@code ALTER SYSTEM MIGRATE UNIT = N DESTINATION = '...'} (Batch 10) */
049        MIGRATE_UNIT,
050        /** {@code ALTER SYSTEM ADD|DROP STORAGE '...' [ZONE = x]} (Batch 10) */
051        STORAGE_OP,
052        /** {@code ALTER SYSTEM CHANGE TENANT x SUSPEND|RESUME} (Batch 10) */
053        CHANGE_TENANT,
054        /** {@code ALTER SYSTEM MINOR FREEZE [TENANT = x]} */
055        MINOR_FREEZE,
056        /** {@code ALTER SYSTEM FLUSH PLAN CACHE [TENANT = x]} */
057        FLUSH_PLAN_CACHE,
058        /** {@code ALTER SYSTEM SWITCH REPLICA LEADER ...} */
059        SWITCH_REPLICA,
060        /** {@code ALTER SYSTEM BOOTSTRAP ...} */
061        BOOTSTRAP,
062        /** {@code ALTER SYSTEM ARCHIVELOG} */
063        ARCHIVELOG,
064        /** {@code ALTER SYSTEM NOARCHIVELOG} */
065        NOARCHIVELOG,
066        /** {@code ALTER SYSTEM SUSPEND|RESUME RECOVERY} */
067        RECOVERY,
068        /** {@code ALTER SYSTEM CANCEL RESTORE tenant} */
069        CANCEL_RESTORE,
070        /** {@code ALTER SYSTEM RESTORE tenant FROM ... UNTIL ... WITH ...} */
071        RESTORE_TENANT,
072        /** {@code ALTER SYSTEM CANCEL BACKUP} / {@code ALTER SYSTEM CANCEL DELETE BACKUP} */
073        CANCEL_BACKUP,
074        /** Any other ALTER SYSTEM verb not specifically modelled. */
075        OTHER
076    }
077
078    private EAction actionType;
079    private TObjectName settingName;
080    private TObjectName settingValue;
081    private TObjectName targetName;
082    private String subVerb;
083
084    public EAction getActionType() {
085        return actionType;
086    }
087
088    public void setActionType(EAction actionType) {
089        this.actionType = actionType;
090    }
091
092    public TObjectName getSettingName() {
093        return settingName;
094    }
095
096    public void setSettingName(TObjectName settingName) {
097        this.settingName = settingName;
098    }
099
100    public TObjectName getSettingValue() {
101        return settingValue;
102    }
103
104    public void setSettingValue(TObjectName settingValue) {
105        this.settingValue = settingValue;
106    }
107
108    public TObjectName getTargetName() {
109        return targetName;
110    }
111
112    public void setTargetName(TObjectName targetName) {
113        this.targetName = targetName;
114    }
115
116    /**
117     * @return a lowercase string identifying the sub-verb when relevant
118     *         (e.g., {@code "add"} for {@code ADD ZONE}, {@code "delete"}
119     *         for {@code DELETE ZONE}, {@code "start"} / {@code "stop"}),
120     *         or {@code null} when not applicable.
121     */
122    public String getSubVerb() {
123        return subVerb;
124    }
125
126    public void setSubVerb(String subVerb) {
127        this.subVerb = subVerb;
128    }
129
130    @Override
131    public void accept(TParseTreeVisitor v) {
132        v.preVisit(this);
133        v.postVisit(this);
134    }
135
136    @Override
137    public void acceptChildren(TParseTreeVisitor v) {
138        v.preVisit(this);
139        if (settingName != null) settingName.acceptChildren(v);
140        if (settingValue != null) settingValue.acceptChildren(v);
141        if (targetName != null) targetName.acceptChildren(v);
142        v.postVisit(this);
143    }
144}