001package gudusoft.gsqlparser.stmt.mssql;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.TConstant;
005import gudusoft.gsqlparser.nodes.TObjectName;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007import gudusoft.gsqlparser.nodes.TTable;
008import gudusoft.gsqlparser.nodes.mssql.TMssqlWritetextSqlNode;
009
010/**
011 * SQL Server WRITETEXT statement:
012 * <pre>WRITETEXT { table.column text_ptr } [ WITH LOG ] { data }</pre>
013 * The written {@code table.column} reference is registered as the statement's
014 * target table so name resolution links the column to its table
015 * ({@link TObjectName#getSourceTable()}).
016 */
017public class TMssqlWriteText extends TCustomSqlStatement {
018
019    public TMssqlWriteText(EDbVendor dbvendor){
020        super(dbvendor);
021        sqlstatementtype = ESqlStatementType.sstmssqlwritetext;
022    }
023
024    private TObjectName destColumnName = null;
025    private TObjectName destTextPtr = null;
026    private TObjectName writeDataVariable = null;
027    private TConstant writeDataLiteral = null;
028
029    /** The name of the table and text, ntext, or image column to be written. */
030    public TObjectName getDestColumnName() {
031        return destColumnName;
032    }
033
034    /** The text pointer value (returned by the TEXTPTR function). */
035    public TObjectName getDestTextPtr() {
036        return destTextPtr;
037    }
038
039    /** The data operand when given as a variable, null otherwise. */
040    public TObjectName getWriteDataVariable() {
041        return writeDataVariable;
042    }
043
044    /** The data operand when given as a literal, null otherwise. */
045    public TConstant getWriteDataLiteral() {
046        return writeDataLiteral;
047    }
048
049    public int doParseStatement(TCustomSqlStatement psql) {
050        if (rootNode == null) return -1;
051        if (!(rootNode instanceof TMssqlWritetextSqlNode)) {
052            // shared-dialect grammars (access/odbc) may still produce a stub or
053            // dummy node for this statement type -- degrade gracefully
054            return super.doParseStatement(psql);
055        }
056        TMssqlWritetextSqlNode writetextSqlNode = (TMssqlWritetextSqlNode)rootNode;
057        super.doParseStatement(psql);
058        this.destColumnName = writetextSqlNode.getDestColumnName();
059        this.destTextPtr = writetextSqlNode.getDestTextPtr();
060        this.writeDataVariable = writetextSqlNode.getWriteDataVariable();
061        this.writeDataLiteral = writetextSqlNode.getWriteDataLiteral();
062        TTable table = TMssqlUpdateText.bindLobColumnTable(this, this.destColumnName, ETableEffectType.tetUpdate);
063        if (table != null) {
064            setTargetTable(table);
065        }
066        return 0;
067    }
068
069    public void accept(TParseTreeVisitor v){
070        v.preVisit(this);
071        v.postVisit(this);
072    }
073
074    public void acceptChildren(TParseTreeVisitor v){
075        v.preVisit(this);
076        v.postVisit(this);
077    }
078}