001package gudusoft.gsqlparser.stmt;
002
003
004import gudusoft.gsqlparser.*;
005import gudusoft.gsqlparser.nodes.*;
006
007public class TUpsertStmt extends TCustomSqlStatement {
008
009    public TUpsertStmt(EDbVendor dbvendor) {
010        super(dbvendor);
011        sqlstatementtype = ESqlStatementType.sstupsert;
012    }
013    public int doParseStatement(TCustomSqlStatement psql) {
014        if (rootNode == null) return -1;
015        super.doParseStatement(psql);
016        TUpsertSqlNode upsertSqlNode = (TUpsertSqlNode) rootNode;
017
018        TTable lcTable = analyzeFromTable(upsertSqlNode.getTargetTable(),true);
019        lcTable.setEffectType(ETableEffectType.tetUpsert);
020        setTargetTable(lcTable);
021
022        this.columnList = upsertSqlNode.getColumnList();
023
024
025        if (upsertSqlNode.getValues() != null){
026            upsertSqlNode.getValues().doParse(this, ESqlClause.insertValues);
027            this.values = upsertSqlNode.getValues();
028        }else if (upsertSqlNode.getSubQueryNode() != null){
029            subQuery = new TSelectSqlStatement(this.dbvendor);
030            subQuery.rootNode = upsertSqlNode.getSubQueryNode();
031            subQuery.doParseStatement(this);
032        }
033
034        if (upsertSqlNode.getReturningClause() != null){
035            upsertSqlNode.getReturningClause().doParse(this,ESqlClause.returning);
036            this.setReturningClause(upsertSqlNode.getReturningClause());
037        }
038
039        this.setWhereClause(upsertSqlNode.getWhereClause());
040
041        return 0;
042    }
043
044    private TObjectNameList columnList;
045
046    public TObjectNameList getColumnList() {
047        return columnList;
048    }
049
050    private TMultiTargetList values = null;
051
052    public TMultiTargetList getValues() {
053        return values;
054    }
055
056    private TSelectSqlStatement subQuery = null;
057
058    public TSelectSqlStatement getSubQuery() {
059        return subQuery;
060    }
061
062    public void accept(TParseTreeVisitor v){
063        v.preVisit(this);
064        v.postVisit(this);
065    }
066
067    public void acceptChildren(TParseTreeVisitor v){
068        v.preVisit(this);
069        v.postVisit(this);
070    }
071
072}