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}