001package gudusoft.gsqlparser.nodes.oceanbase; 002 003import gudusoft.gsqlparser.EDbObjectType; 004import gudusoft.gsqlparser.TSourceToken; 005import gudusoft.gsqlparser.nodes.TObjectName; 006import gudusoft.gsqlparser.nodes.TParseTreeNode; 007import gudusoft.gsqlparser.nodes.TParseTreeVisitor; 008 009/** 010 * AST node for OceanBase {@code CREATE OUTLINE} (Phase 4 Batch 8). 011 * 012 * <p>OceanBase outlines bind a stored execution plan to a SQL pattern. 013 * Two documented forms: 014 * <ul> 015 * <li><b>Bound to a parsed statement</b>: {@code CREATE OUTLINE name 016 * ON SELECT ... [USING HINT /*+ ... */]}. The bound SQL is 017 * parsed as a child via the top-level statement rule and exposed 018 * through {@link #getBoundStatement()}. The optional USING HINT 019 * clause carries a raw comment token.</li> 020 * <li><b>Bound to a SQL ID</b>: {@code CREATE OUTLINE name ON 021 * 'SQL_ID_HEX_STRING'}. The SQL ID is stored as 022 * {@link #getSqlId()}; {@link #getBoundStatement()} is null.</li> 023 * </ul> 024 * 025 * @since 4.0.1.4 026 */ 027public class TOceanbaseCreateOutlineSqlNode extends TParseTreeNode { 028 029 private TObjectName outlineName; 030 private TParseTreeNode boundStatement; 031 private TObjectName sqlId; 032 private TSourceToken usingHintToken; 033 private boolean orReplace; 034 035 public TObjectName getOutlineName() { 036 return outlineName; 037 } 038 039 public void setOutlineName(TObjectName outlineName) { 040 this.outlineName = outlineName; 041 if (outlineName != null) { 042 outlineName.setDbObjectType(EDbObjectType.database); 043 } 044 } 045 046 public TParseTreeNode getBoundStatement() { 047 return boundStatement; 048 } 049 050 public void setBoundStatement(TParseTreeNode boundStatement) { 051 this.boundStatement = boundStatement; 052 } 053 054 public TObjectName getSqlId() { 055 return sqlId; 056 } 057 058 public void setSqlId(TObjectName sqlId) { 059 this.sqlId = sqlId; 060 } 061 062 public TSourceToken getUsingHintToken() { 063 return usingHintToken; 064 } 065 066 public void setUsingHintToken(TSourceToken usingHintToken) { 067 this.usingHintToken = usingHintToken; 068 } 069 070 public boolean isOrReplace() { 071 return orReplace; 072 } 073 074 public void setOrReplace(boolean orReplace) { 075 this.orReplace = orReplace; 076 } 077 078 @Override 079 public void init(Object arg1) { 080 setOutlineName((TObjectName) arg1); 081 } 082 083 @Override 084 public void accept(TParseTreeVisitor v) { 085 v.preVisit(this); 086 v.postVisit(this); 087 } 088 089 @Override 090 public void acceptChildren(TParseTreeVisitor v) { 091 v.preVisit(this); 092 if (outlineName != null) outlineName.acceptChildren(v); 093 if (boundStatement != null) boundStatement.acceptChildren(v); 094 if (sqlId != null) sqlId.acceptChildren(v); 095 v.postVisit(this); 096 } 097}