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 dbObject.setTableKind(ETableKind.etkTemporary); 106 table.setTableName(dbObject); 107 table.setTableType(ETableSource.objectname); 108 table.setEffectType(ETableEffectType.tetSelectInto); 109 psql.addToTables(table); 110 if (psql instanceof TSelectSqlStatement){ 111 TSelectSqlStatement subQuery = ((TSelectSqlStatement)psql); 112 table.setColumnListInTempTable(subQuery.getResultColumnList()); 113 114 TSQLTable sqlTmpTable = null; 115 if (psql.getSqlEnv() != null) { 116 sqlTmpTable = psql.getSqlEnv().addTable(dbObject.toString(),true); 117 118 if (subQuery.getResultColumnList().getResultColumn(0).toString().endsWith("*")){ 119 // select * into #tmp, we need to find real columns in from clause 120 // if (subQuery.getTables().getTable()) 121 ArrayList<String> columns = subQuery.getColumnsInFromClause(); 122 if (columns.size() > 0){ 123 for(String c:columns){ 124 sqlTmpTable.addColumn(c); 125 } 126 } 127 }else{ 128 subQuery.addColumnInSelectListToSQLEnv(sqlTmpTable); 129 } 130 } 131 } 132 } 133 } 134 }else { // database support: select .. into variable 135 if (dbObject.toString().startsWith(":")){ 136 // oracle, INTO :NEW.DI_RESID 137 expr.doParse(psql, ESqlClause.selectInto); 138 }else{ 139 if (dbObject.toString().startsWith("#")){ 140 // #temp_table, not a variable 141 dbObject.setDbObjectType(EDbObjectType.TEMP_TABLE); 142 }else{ 143 dbObject.setObjectType(TObjectName.ttobjVariable); 144 dbObject.setDbObjectType(EDbObjectType.variable); 145 } 146 } 147 } 148 }else{ 149 expr.doParse(psql, ESqlClause.selectInto); 150 } 151 } 152 } 153 } 154 155 //public void addTableToList() 156 157 public void accept(TParseTreeVisitor v){ 158 v.preVisit(this); 159 v.postVisit(this); 160 161 } 162 163 public void acceptChildren(TParseTreeVisitor v){ 164 v.preVisit(this); 165 v.postVisit(this); 166 } 167 168 public void setExprList(TExpressionList exprList) { 169 this.exprList = exprList; 170 } 171}