001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.EExpressionType;
004import gudusoft.gsqlparser.ESqlClause;
005import gudusoft.gsqlparser.ETableEffectType;
006import gudusoft.gsqlparser.TCustomSqlStatement;
007import gudusoft.gsqlparser.stmt.TInsertSqlStatement;
008
009public class TInsertIntoValue extends TParseTreeNode {
010
011    private TFromTable fromTable;
012    private TMultiTargetList targetList;
013    private TObjectNameList columnList;
014    private TTable table;
015
016    public TTable getTable() {
017        return table;
018    }
019
020    public TObjectNameList getColumnList() {
021        return columnList;
022    }
023
024    /**
025     * values in Oracle,snowflake Unconditional multi-table insert
026     *
027     * @return values
028     */
029    public TMultiTargetList getTargetList() {
030        return targetList;
031    }
032
033    public void init(Object arg1){
034        fromTable = (TFromTable)arg1;
035    }
036
037    public void init(Object arg1,Object arg2){
038        fromTable =  (TFromTable)((TDummy)arg1).node1;
039        if (((TDummy)arg1).node1 != null){
040            columnList = (TObjectNameList)((TDummy)arg1).node2;
041        }
042
043        if (arg2 != null){
044            targetList = (TMultiTargetList)((TDummy)arg2).list1;
045        }
046
047    }
048
049    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
050        table = psql.analyzeFromTable(fromTable,true);
051        table.setEffectType(ETableEffectType.tetInsert);
052
053        if (columnList != null){
054            TObjectName crf ;
055            for (int i=0;i< columnList.size();i++){
056                crf =columnList.getObjectName(i);
057                // link this column to table
058                crf.setLocation(ESqlClause.insertColumn);
059                table.getObjectNameReferences().addObjectName(crf);
060                table.getLinkedColumns().addObjectName(crf);
061                crf.setSourceTable(table);
062            }
063
064            //insertNode.getColumnList().doParse(this,TBaseType.insertColumnClause);
065        }
066
067        if (targetList != null){
068
069//            if (psql instanceof TInsertSqlStatement){
070//                TInsertSqlStatement insert = (TInsertSqlStatement)psql;
071//                if (insert.getSubQuery() != null){
072//                    // insert overwrite all
073//                    //  into t1
074//                    //  into t1 (c1, c2, c3) values (n2, n1, default)
075//                    //  into t2 (c1, c2, c3)
076//                    //  into t2 values (n3, n2, n1)
077//                    //select n1, n2, n3 from src;
078//
079//                    for(TMultiTarget multiTarget:targetList){
080//                        if (multiTarget.getColumnList() ==null) continue;
081//                        for(TResultColumn resultColumn:multiTarget.getColumnList()){
082//                            TExpression expr = resultColumn.getExpr();
083//                            if (expr.getExpressionType() == EExpressionType.simple_object_name_t){
084//                                insert.getSubQuery().searchColumnInResultSet(expr.getObjectOperand(),false);
085//                            }
086//                        }
087//                    }
088//                }
089//            }
090
091            targetList.doParse(psql,ESqlClause.insertValues);
092        }
093
094    }
095
096    public void accept(TParseTreeVisitor v){
097        v.preVisit(this);
098        v.postVisit(this);
099    }
100
101    public void acceptChildren(TParseTreeVisitor v){
102        v.preVisit(this);
103        table.acceptChildren(v);
104        if (columnList != null){
105            columnList.acceptChildren(v);
106        }
107        if (targetList != null){
108            targetList.acceptChildren(v);
109        }
110
111        v.postVisit(this);
112    }
113
114    public void setFromTable(TFromTable fromTable) {
115        this.fromTable = fromTable;
116    }
117
118    public void setTargetList(TMultiTargetList targetList) {
119        this.targetList = targetList;
120    }
121
122    public void setColumnList(TObjectNameList columnList) {
123        this.columnList = columnList;
124    }
125
126    public void setTable(TTable table) {
127        this.table = table;
128    }
129
130}