001package gudusoft.gsqlparser.stmt.mssql;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.TObjectName;
005import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
006import gudusoft.gsqlparser.nodes.mssql.TMssqlReadtextSqlNode;
007
008/**
009 * SQL Server READTEXT statement:
010 * <pre>READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]</pre>
011 * The read {@code table.column} reference is registered as a statement table
012 * so name resolution links the column to its table
013 * ({@link TObjectName#getSourceTable()}). The offset and size operands are
014 * scalar values with no name-resolution semantics and are not modeled.
015 */
016public class TMssqlReadText extends TCustomSqlStatement {
017
018    public TMssqlReadText(EDbVendor dbvendor){
019        super(dbvendor);
020        sqlstatementtype = ESqlStatementType.sstmssqlreadtext;
021    }
022
023    private TObjectName sourceColumnName = null;
024    private TObjectName sourceTextPtr = null;
025
026    /** The name of the table and text, ntext, or image column to be read. */
027    public TObjectName getSourceColumnName() {
028        return sourceColumnName;
029    }
030
031    /** The text pointer value (returned by the TEXTPTR function). */
032    public TObjectName getSourceTextPtr() {
033        return sourceTextPtr;
034    }
035
036    public int doParseStatement(TCustomSqlStatement psql) {
037        if (rootNode == null) return -1;
038        if (!(rootNode instanceof TMssqlReadtextSqlNode)) {
039            // shared-dialect grammars (access/odbc) may still produce a stub or
040            // dummy node for this statement type -- degrade gracefully
041            return super.doParseStatement(psql);
042        }
043        TMssqlReadtextSqlNode readtextSqlNode = (TMssqlReadtextSqlNode)rootNode;
044        super.doParseStatement(psql);
045        this.sourceColumnName = readtextSqlNode.getSourceColumnName();
046        this.sourceTextPtr = readtextSqlNode.getSourceTextPtr();
047        TMssqlUpdateText.bindLobColumnTable(this, this.sourceColumnName, ETableEffectType.tetSelect);
048        return 0;
049    }
050
051    public void accept(TParseTreeVisitor v){
052        v.preVisit(this);
053        v.postVisit(this);
054    }
055
056    public void acceptChildren(TParseTreeVisitor v){
057        v.preVisit(this);
058        v.postVisit(this);
059    }
060}