001package gudusoft.gsqlparser.stmt; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.nodes.*; 005import gudusoft.gsqlparser.sqlenv.TSQLEnv; 006import gudusoft.gsqlparser.sqlenv.TSQLTable; 007 008/** 009 * Define a view, which is a logical table based on one or more tables or views. 010 */ 011 012public class TCreateViewSqlStatement extends TCustomSqlStatement { 013 private boolean isSecure = false; 014 private boolean isRecursive = false; 015 private ETableKind tableKind = ETableKind.etkBase; 016 017 public boolean isSecure() { 018 return isSecure; 019 } 020 021 public boolean isRecursive() { 022 return isRecursive; 023 } 024 025 public ETableKind getTableKind() { 026 return tableKind; 027 } 028 029 public TObjectName getComment(){ 030 if (commentClause == null) return null; 031 if (commentClause.getComment() == null) return null; 032 return commentClause.getComment(); 033 } 034 private TCreateTableOption commentClause; 035 036// public TCreateTableOption getCommentClause() { 037// return commentClause; 038// } 039 040 private TSelectSqlStatement subquery = null; 041 private TViewAliasClause viewAliasClause = null; 042 private TSourceToken stForce = null; 043 private TSourceToken stReplace = null; 044 private TObjectNameList viewAttributeList; 045 private boolean isForce = false; 046 private boolean isNoForce = false; 047 048 public void setForce(boolean isForce) { 049 this.isForce = isForce; 050 } 051 052 public void setNoForce(boolean isNoForce) { 053 this.isNoForce = isNoForce; 054 } 055 056 public boolean isForce() { 057 058 return isForce; 059 } 060 061 public boolean isNoForce() { 062 return isNoForce; 063 } 064 065 public void setViewAttributeList(TObjectNameList viewAttributeList) { 066 this.viewAttributeList = viewAttributeList; 067 } 068 069 public TObjectNameList getViewAttributeList() { 070 071 return viewAttributeList; 072 } 073 074 public void setSubquery(TSelectSqlStatement subquery) { 075 this.subquery = subquery; 076 } 077 078 public void setViewAliasClause(TViewAliasClause viewAliasClause) { 079 this.viewAliasClause = viewAliasClause; 080 } 081 082 public void setStForce(TSourceToken stForce) { 083 this.stForce = stForce; 084 } 085 086 public void setStReplace(TSourceToken stReplace) { 087 this.stReplace = stReplace; 088 } 089 090 public void setRowTypeName(TObjectName rowTypeName) { 091 this.rowTypeName = rowTypeName; 092 } 093 094 public void setRestrictionClause(TRestrictionClause restrictionClause) { 095 this.restrictionClause = restrictionClause; 096 } 097 098 public void setViewName(TObjectName viewName) { 099 this.viewName = viewName; 100 } 101 102 private TObjectName rowTypeName; 103 104 public TObjectName getRowTypeName() { 105 return rowTypeName; 106 } 107 108 public TSourceToken getStForce() { 109 return stForce; 110 } 111 112 public TSourceToken getStReplace() { 113 return stReplace; 114 } 115 116 /** 117 * Oracle, DB2 restriction clause 118 * @return DB2 restriction clause 119 */ 120 public TRestrictionClause getRestrictionClause() { 121 return restrictionClause; 122 } 123 124 private TRestrictionClause restrictionClause = null; 125 126 127 public TViewAliasClause getViewAliasClause() { 128 return viewAliasClause; 129 } 130 131 public TCreateViewSqlStatement(EDbVendor dbvendor) { 132 super(dbvendor); 133 sqlstatementtype = ESqlStatementType.sstcreateview; 134 } 135 136 /** 137 * 138 * @return a subquery that identifies columns and rows of the table(s) that the view is based on. 139 */ 140 public TSelectSqlStatement getSubquery() { 141 return subquery; 142 } 143 144 void buildsql() { 145 } 146 147 void clear() { 148 } 149 150 String getasprettytext() { 151 return ""; 152 } 153 154 void iterate(TVisitorAbs pvisitor) { 155 } 156 157 public int doParseStatement(TCustomSqlStatement psql) { 158 if (rootNode == null) return -1; 159 TCreateViewSqlNode createViewSqlNode = (TCreateViewSqlNode)rootNode; 160 super.doParseStatement(psql); 161 this.viewName = createViewSqlNode.getViewName(); 162 this.viewName.setDbObjectType(EDbObjectType.view); 163 this.isSecure = createViewSqlNode.isSecure(); 164 this.isRecursive = createViewSqlNode.isRecursive(); 165 this.tableKind = createViewSqlNode.getTableKind(); 166 this.viewName.setTableKind(this.tableKind); 167 168 TSQLTable sqlView = null; 169 if (getSqlEnv() != null) { 170 sqlView = getSqlEnv().addView(viewName.toString(),true); 171 172// if (getSqlEnv().getDefaultCatalogName() != null){ 173// if (this.viewName.getDatabaseToken() == null){ 174// this.viewName.setDatabaseToken(new TSourceToken(getSqlEnv().getDefaultCatalogName())); 175// } 176// } 177 178 this.viewName.setSqlEnv(getSqlEnv()); 179 } 180 rowTypeName = createViewSqlNode.getRowTypeName(); 181 182 if (createViewSqlNode.getSelectSqlNode() != null) { 183 // gaussdb create view using jdbc option does not support subquery 184 // https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0197.html 185 subquery = new TSelectSqlStatement(this.dbvendor); 186 subquery.rootNode = createViewSqlNode.getSelectSqlNode(); 187 subquery.doParseStatement(this); 188 } 189 190 if (createViewSqlNode.getViewAliasClause() != null){ 191 createViewSqlNode.getViewAliasClause().doParse(this, ESqlClause.viewAlias); 192 this.viewAliasClause = createViewSqlNode.getViewAliasClause(); 193 if (sqlView != null){ 194 for(int i=0;i<viewAliasClause.getViewAliasItemList().size();i++){ 195 TViewAliasItem item = viewAliasClause.getViewAliasItemList().getViewAliasItem(i); 196 if (item.getAlias() != null){ 197 sqlView.addColumn(item.getAlias().toString()); 198 } 199 } 200 } 201 }else{ 202 if ((sqlView != null)&&(subquery != null)) { 203 TSelectSqlStatement viewQuery = subquery; 204 if (subquery.isCombinedQuery()){ 205 viewQuery = subquery.getRightStmt(); 206 } 207 viewQuery.addColumnInSelectListToSQLEnv(sqlView); 208// for(int i=0;i<viewQuery.getResultColumnList().size();i++){ 209// TResultColumn resultColumn = viewQuery.getResultColumnList().getResultColumn(i); 210// String aliasName = null; 211// if (resultColumn.getAliasClause() != null){ 212// aliasName = resultColumn.getAliasClause().getAliasName().toString(); 213// }else{ 214// if (resultColumn.getExpr().getObjectOperand() != null){ 215// aliasName = resultColumn.getExpr().getObjectOperand().toString(); 216// } 217// } 218// if (aliasName != null){ 219// sqlView.addColumn(TSQLEnv.getObjectName(aliasName)); 220// } 221// } 222 } 223 } 224 225 this.restrictionClause = createViewSqlNode.getRestrictionClause(); 226 this.stForce = createViewSqlNode.getStForce(); 227 isForce = createViewSqlNode.isForce(); 228 isNoForce = createViewSqlNode.isNoForce(); 229 this.stReplace = createViewSqlNode.getStReplace(); 230 viewAttributeList = createViewSqlNode.getViewAttributeList(); 231 this.commentClause = createViewSqlNode.getCommentClause(); 232 233 return 0; 234 } 235 236 private TObjectName viewName = null; 237 238 /** 239 * 240 * @return the name of the view or the object view. 241 */ 242 public TObjectName getViewName() { 243 return viewName; 244 } 245 246 public void accept(TParseTreeVisitor v){ 247 v.preVisit(this); 248 v.postVisit(this); 249 } 250 251 public void acceptChildren(TParseTreeVisitor v){ 252 v.preVisit(this); 253 if (viewAliasClause != null) viewAliasClause.acceptChildren(v); 254 if(subquery != null){ 255 subquery.acceptChildren(v); 256 } 257 258 if (restrictionClause != null) restrictionClause.acceptChildren(v); 259 v.postVisit(this); 260 } 261}