001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.compiler.TSymbolTableManager; 005import gudusoft.gsqlparser.compiler.TVariable; 006import gudusoft.gsqlparser.sqlenv.TSQLTable; 007import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 008 009import java.util.ArrayList; 010 011 012public class TIntoClause extends TParseTreeNode { 013 014 public void setBulkCollect(boolean bulkCollect) { 015 this.bulkCollect = bulkCollect; 016 } 017 018 public boolean isBulkCollect() { 019 020 return bulkCollect; 021 } 022 023 024 public TObjectName getTableName() { 025 return tableName; 026 } 027 028 private TObjectName tableName; 029 030 private boolean bulkCollect = false; 031 private TSourceToken filename; 032 private TExpressionList exprList = null; 033 private TObjectName intoName = null; 034 private TObjectNameList variableList = null; 035 036 public TObjectNameList getVariableList() { 037 return variableList; 038 } 039 040 public void setIntoName(TObjectName intoName) { 041 this.intoName = intoName; 042 } 043 044 public TObjectName getIntoName() { 045 if (intoName != null){ 046 return intoName; 047 }else{ 048 return exprList.getExpression(0).getObjectOperand(); 049 } 050 } 051 052 public TExpressionList getExprList() { 053 return exprList; 054 } 055 056 public TSourceToken getFilename() { 057 return filename; 058 } 059 060 public void init(Object arg1) 061 { 062 if (arg1 instanceof TExpressionList){ 063 exprList = (TExpressionList)arg1; 064 }else if (arg1 instanceof TSourceToken){ 065 filename = (TSourceToken)arg1; 066 }else if (arg1 instanceof TObjectNameList){ 067 variableList = (TObjectNameList)arg1; 068 for(int i=0;i<variableList.size();i++){ 069 if (variableList.getObjectName(i).toString().startsWith("#")){ 070 // #temp_table, not a variable 071 variableList.getObjectName(i).setDbObjectType(EDbObjectType.TEMP_TABLE); 072 }else{ 073 variableList.getObjectName(i).setDbObjectType(EDbObjectType.variable); 074 } 075 076 } 077 intoName = variableList.getObjectName(0); 078 }else if (arg1 instanceof TObjectName){ 079 tableName = (TObjectName)arg1; 080 } 081 } 082 083 public void doParse(TCustomSqlStatement psql, ESqlClause plocation){ 084 if (exprList != null){ 085 for(int i=0;i<exprList.size();i++){ 086 TExpression expr = exprList.getExpression(i); 087 if (expr.getExpressionType() == EExpressionType.simple_object_name_t){ 088 TObjectName dbObject = expr.getObjectOperand(); 089 if ((psql.dbvendor == EDbVendor.dbvmssql) 090 ||(psql.dbvendor == EDbVendor.dbvgreenplum) 091 ||(psql.dbvendor == EDbVendor.dbvpostgresql) 092 ||(psql.dbvendor == EDbVendor.dbvsybase) 093 ||(psql.dbvendor == EDbVendor.dbvodbc) 094 ){ // database support: select .. into table 095 if (dbObject.toString().startsWith("@")){ 096 // table variable 097 dbObject.setObjectType(TObjectName.ttobjVariable); 098 }else { 099 TVariable symbolVariable = TSymbolTableManager.searchSymbolVariable(psql.getFrameStack(),dbObject.toString()); //psql.searchSymbolVariable(dbObject.toString()); 100 if (symbolVariable != null){ 101 dbObject.setDbObjectType(EDbObjectType.variable); 102 }else{ 103 TTable table = new TTable(); 104 dbObject.setObjectType(TObjectName.ttobjTable); 105 if (dbObject.toString().startsWith("##")){ 106 // SQL Server global temporary table (##tablename) 107 dbObject.setTableKind(ETableKind.etkGlobalTemporary); 108 } else if (dbObject.toString().startsWith("#")){ 109 // SQL Server local temporary table (#tablename) 110 dbObject.setTableKind(ETableKind.etkTemporary); 111 } 112 table.setTableName(dbObject); 113 table.setTableType(ETableSource.objectname); 114 table.setEffectType(ETableEffectType.tetSelectInto); 115 psql.addToTables(table); 116 if (psql instanceof TSelectSqlStatement){ 117 TSelectSqlStatement subQuery = ((TSelectSqlStatement)psql); 118 table.setColumnListInTempTable(subQuery.getResultColumnList()); 119 120 TSQLTable sqlTmpTable = null; 121 if (psql.getSqlEnv() != null) { 122 sqlTmpTable = psql.getSqlEnv().addTable(dbObject.toString(),true); 123 124 if (subQuery.getResultColumnList().getResultColumn(0).toString().endsWith("*")){ 125 // select * into #tmp, we need to find real columns in from clause 126 // if (subQuery.getTables().getTable()) 127 ArrayList<String> columns = subQuery.getColumnsInFromClause(); 128 if (columns.size() > 0){ 129 for(String c:columns){ 130 sqlTmpTable.addColumn(c); 131 } 132 } 133 }else{ 134 subQuery.addColumnInSelectListToSQLEnv(sqlTmpTable); 135 } 136 } 137 } 138 } 139 } 140 }else { // database support: select .. into variable 141 if (dbObject.toString().startsWith(":")){ 142 // oracle, INTO :NEW.DI_RESID 143 expr.doParse(psql, ESqlClause.selectInto); 144 }else{ 145 if (dbObject.toString().startsWith("#")){ 146 // #temp_table, not a variable 147 dbObject.setDbObjectType(EDbObjectType.TEMP_TABLE); 148 }else{ 149 dbObject.setObjectType(TObjectName.ttobjVariable); 150 dbObject.setDbObjectType(EDbObjectType.variable); 151 } 152 } 153 } 154 }else{ 155 expr.doParse(psql, ESqlClause.selectInto); 156 } 157 } 158 } 159 } 160 161 //public void addTableToList() 162 163 public void accept(TParseTreeVisitor v){ 164 v.preVisit(this); 165 v.postVisit(this); 166 167 } 168 169 public void acceptChildren(TParseTreeVisitor v){ 170 v.preVisit(this); 171 v.postVisit(this); 172 } 173 174 public void setExprList(TExpressionList exprList) { 175 this.exprList = exprList; 176 } 177}