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}