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                table.getObjectNameReferences().addObjectName(crf);
079                table.getLinkedColumns().addObjectName(crf);
080                crf.setSourceTable(table);
081            }
082
083            //insertNode.getColumnList().doParse(this,TBaseType.insertColumnClause);
084        }
085
086        if (targetList != null){
087
088//            if (psql instanceof TInsertSqlStatement){
089//                TInsertSqlStatement insert = (TInsertSqlStatement)psql;
090//                if (insert.getSubQuery() != null){
091//                    // insert overwrite all
092//                    //  into t1
093//                    //  into t1 (c1, c2, c3) values (n2, n1, default)
094//                    //  into t2 (c1, c2, c3)
095//                    //  into t2 values (n3, n2, n1)
096//                    //select n1, n2, n3 from src;
097//
098//                    for(TMultiTarget multiTarget:targetList){
099//                        if (multiTarget.getColumnList() ==null) continue;
100//                        for(TResultColumn resultColumn:multiTarget.getColumnList()){
101//                            TExpression expr = resultColumn.getExpr();
102//                            if (expr.getExpressionType() == EExpressionType.simple_object_name_t){
103//                                insert.getSubQuery().searchColumnInResultSet(expr.getObjectOperand(),false);
104//                            }
105//                        }
106//                    }
107//                }
108//            }
109
110            targetList.doParse(psql,ESqlClause.insertValues);
111        }
112
113    }
114
115    public void accept(TParseTreeVisitor v){
116        v.preVisit(this);
117        v.postVisit(this);
118    }
119
120    public void acceptChildren(TParseTreeVisitor v){
121        v.preVisit(this);
122        table.acceptChildren(v);
123        if (columnList != null){
124            columnList.acceptChildren(v);
125        }
126        if (targetList != null){
127            targetList.acceptChildren(v);
128        }
129        if (errorLoggingClause != null){
130            errorLoggingClause.acceptChildren(v);
131        }
132
133        v.postVisit(this);
134    }
135
136    public void setFromTable(TFromTable fromTable) {
137        this.fromTable = fromTable;
138    }
139
140    public void setTargetList(TMultiTargetList targetList) {
141        this.targetList = targetList;
142    }
143
144    public void setColumnList(TObjectNameList columnList) {
145        this.columnList = columnList;
146    }
147
148    public void setTable(TTable table) {
149        this.table = table;
150    }
151
152}