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