// $ANTLR 3.4 /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g 2014-01-20 22:57:46

  package org.tmatesoft.sqljet.core.internal.lang;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

import org.antlr.runtime.tree.*;


@SuppressWarnings({"all", "warnings", "unchecked"})
public class SqlParser extends Parser {
    public static final String[] tokenNames = new String[] {
        "", "", "", "", "A", "ABORT", "ADD", "AFTER", "ALIAS", "ALL", "ALTER", "AMPERSAND", "ANALYZE", "AND", "APOSTROPHE", "AS", "ASC", "ASTERISK", "AT", "ATTACH", "AUTOINCREMENT", "B", "BACKSLASH", "BEFORE", "BEGIN", "BETWEEN", "BIND", "BIND_NAME", "BLOB", "BLOB_LITERAL", "BY", "C", "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLON", "COLUMN", "COLUMNS", "COLUMN_CONSTRAINT", "COLUMN_EXPRESSION", "COMMA", "COMMENT", "COMMIT", "CONFLICT", "CONSTRAINT", "CONSTRAINTS", "CREATE", "CREATE_INDEX", "CREATE_TABLE", "CREATE_TRIGGER", "CREATE_VIEW", "CROSS", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "D", "DATABASE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DOLLAR", "DOT", "DOUBLE_PIPE", "DROP", "DROP_INDEX", "DROP_TABLE", "E", "EACH", "ELSE", "END", "EQUALS", "EQUALS2", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN", "F", "FAIL", "FALSE", "FLOAT", "FLOAT_EXP", "FLOAT_LITERAL", "FOR", "FOREIGN", "FROM", "FUNCTION_EXPRESSION", "FUNCTION_LITERAL", "G", "GLOB", "GREATER", "GREATER_OR_EQ", "GROUP", "H", "HAVING", "I", "ID", "ID_CORE", "ID_LITERAL", "ID_PLAIN", "ID_QUOTED", "ID_QUOTED_APOSTROPHE", "ID_QUOTED_CORE", "ID_QUOTED_CORE_APOSTROPHE", "ID_QUOTED_CORE_SQUARE", "ID_QUOTED_SQUARE", "ID_START", "IF", "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER", "INSERT", "INSTEAD", "INTEGER", "INTEGER_LITERAL", "INTERSECT", "INTO", "IN_TABLE", "IN_VALUES", "IS", "ISNULL", "IS_NOT", "IS_NULL", "J", "JOIN", "K", "KEY", "L", "LEFT", "LESS", "LESS_OR_EQ", "LIKE", "LIMIT", "LINE_COMMENT", "LPAREN", "LPAREN_SQUARE", "M", "MATCH", "MINUS", "N", "NATURAL", "NOT", "NOTNULL", "NOT_EQUALS", "NOT_EQUALS2", "NOT_NULL", "NULL", "O", "OF", "OFFSET", "ON", "OPTIONS", "OR", "ORDER", "ORDERING", "OUTER", "P", "PERCENT", "PIPE", "PLAN", "PLUS", "PRAGMA", "PRIMARY", "Q", "QUERY", "QUESTION", "QUOTE_DOUBLE", "QUOTE_SINGLE", "R", "RAISE", "REFERENCES", "REGEXP", "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "ROLLBACK", "ROW", "RPAREN", "RPAREN_SQUARE", "S", "SAVEPOINT", "SELECT", "SELECT_CORE", "SEMI", "SET", "SHIFT_LEFT", "SHIFT_RIGHT", "SLASH", "STATEMENT", "STRING", "STRING_CORE", "STRING_CORE_DOUBLE", "STRING_CORE_SINGLE", "STRING_DOUBLE", "STRING_ESCAPE_DOUBLE", "STRING_ESCAPE_SINGLE", "STRING_LITERAL", "STRING_SINGLE", "T", "TABLE", "TABLE_CONSTRAINT", "TEMPORARY", "THEN", "TILDA", "TO", "TRANSACTION", "TRIGGER", "TRUE", "TYPE", "TYPE_PARAMS", "U", "UNDERSCORE", "UNION", "UNIQUE", "UPDATE", "USING", "V", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "W", "WHEN", "WHERE", "WS", "X", "Y", "Z"
    };

    public static final int EOF=-1;
    public static final int A=4;
    public static final int ABORT=5;
    public static final int ADD=6;
    public static final int AFTER=7;
    public static final int ALIAS=8;
    public static final int ALL=9;
    public static final int ALTER=10;
    public static final int AMPERSAND=11;
    public static final int ANALYZE=12;
    public static final int AND=13;
    public static final int APOSTROPHE=14;
    public static final int AS=15;
    public static final int ASC=16;
    public static final int ASTERISK=17;
    public static final int AT=18;
    public static final int ATTACH=19;
    public static final int AUTOINCREMENT=20;
    public static final int B=21;
    public static final int BACKSLASH=22;
    public static final int BEFORE=23;
    public static final int BEGIN=24;
    public static final int BETWEEN=25;
    public static final int BIND=26;
    public static final int BIND_NAME=27;
    public static final int BLOB=28;
    public static final int BLOB_LITERAL=29;
    public static final int BY=30;
    public static final int C=31;
    public static final int CASCADE=32;
    public static final int CASE=33;
    public static final int CAST=34;
    public static final int CHECK=35;
    public static final int COLLATE=36;
    public static final int COLON=37;
    public static final int COLUMN=38;
    public static final int COLUMNS=39;
    public static final int COLUMN_CONSTRAINT=40;
    public static final int COLUMN_EXPRESSION=41;
    public static final int COMMA=42;
    public static final int COMMENT=43;
    public static final int COMMIT=44;
    public static final int CONFLICT=45;
    public static final int CONSTRAINT=46;
    public static final int CONSTRAINTS=47;
    public static final int CREATE=48;
    public static final int CREATE_INDEX=49;
    public static final int CREATE_TABLE=50;
    public static final int CREATE_TRIGGER=51;
    public static final int CREATE_VIEW=52;
    public static final int CROSS=53;
    public static final int CURRENT_DATE=54;
    public static final int CURRENT_TIME=55;
    public static final int CURRENT_TIMESTAMP=56;
    public static final int D=57;
    public static final int DATABASE=58;
    public static final int DEFAULT=59;
    public static final int DEFERRABLE=60;
    public static final int DEFERRED=61;
    public static final int DELETE=62;
    public static final int DESC=63;
    public static final int DETACH=64;
    public static final int DISTINCT=65;
    public static final int DOLLAR=66;
    public static final int DOT=67;
    public static final int DOUBLE_PIPE=68;
    public static final int DROP=69;
    public static final int DROP_INDEX=70;
    public static final int DROP_TABLE=71;
    public static final int E=72;
    public static final int EACH=73;
    public static final int ELSE=74;
    public static final int END=75;
    public static final int EQUALS=76;
    public static final int EQUALS2=77;
    public static final int ESCAPE=78;
    public static final int EXCEPT=79;
    public static final int EXCLUSIVE=80;
    public static final int EXISTS=81;
    public static final int EXPLAIN=82;
    public static final int F=83;
    public static final int FAIL=84;
    public static final int FALSE=85;
    public static final int FLOAT=86;
    public static final int FLOAT_EXP=87;
    public static final int FLOAT_LITERAL=88;
    public static final int FOR=89;
    public static final int FOREIGN=90;
    public static final int FROM=91;
    public static final int FUNCTION_EXPRESSION=92;
    public static final int FUNCTION_LITERAL=93;
    public static final int G=94;
    public static final int GLOB=95;
    public static final int GREATER=96;
    public static final int GREATER_OR_EQ=97;
    public static final int GROUP=98;
    public static final int H=99;
    public static final int HAVING=100;
    public static final int I=101;
    public static final int ID=102;
    public static final int ID_CORE=103;
    public static final int ID_LITERAL=104;
    public static final int ID_PLAIN=105;
    public static final int ID_QUOTED=106;
    public static final int ID_QUOTED_APOSTROPHE=107;
    public static final int ID_QUOTED_CORE=108;
    public static final int ID_QUOTED_CORE_APOSTROPHE=109;
    public static final int ID_QUOTED_CORE_SQUARE=110;
    public static final int ID_QUOTED_SQUARE=111;
    public static final int ID_START=112;
    public static final int IF=113;
    public static final int IGNORE=114;
    public static final int IMMEDIATE=115;
    public static final int IN=116;
    public static final int INDEX=117;
    public static final int INDEXED=118;
    public static final int INITIALLY=119;
    public static final int INNER=120;
    public static final int INSERT=121;
    public static final int INSTEAD=122;
    public static final int INTEGER=123;
    public static final int INTEGER_LITERAL=124;
    public static final int INTERSECT=125;
    public static final int INTO=126;
    public static final int IN_TABLE=127;
    public static final int IN_VALUES=128;
    public static final int IS=129;
    public static final int ISNULL=130;
    public static final int IS_NOT=131;
    public static final int IS_NULL=132;
    public static final int J=133;
    public static final int JOIN=134;
    public static final int K=135;
    public static final int KEY=136;
    public static final int L=137;
    public static final int LEFT=138;
    public static final int LESS=139;
    public static final int LESS_OR_EQ=140;
    public static final int LIKE=141;
    public static final int LIMIT=142;
    public static final int LINE_COMMENT=143;
    public static final int LPAREN=144;
    public static final int LPAREN_SQUARE=145;
    public static final int M=146;
    public static final int MATCH=147;
    public static final int MINUS=148;
    public static final int N=149;
    public static final int NATURAL=150;
    public static final int NOT=151;
    public static final int NOTNULL=152;
    public static final int NOT_EQUALS=153;
    public static final int NOT_EQUALS2=154;
    public static final int NOT_NULL=155;
    public static final int NULL=156;
    public static final int O=157;
    public static final int OF=158;
    public static final int OFFSET=159;
    public static final int ON=160;
    public static final int OPTIONS=161;
    public static final int OR=162;
    public static final int ORDER=163;
    public static final int ORDERING=164;
    public static final int OUTER=165;
    public static final int P=166;
    public static final int PERCENT=167;
    public static final int PIPE=168;
    public static final int PLAN=169;
    public static final int PLUS=170;
    public static final int PRAGMA=171;
    public static final int PRIMARY=172;
    public static final int Q=173;
    public static final int QUERY=174;
    public static final int QUESTION=175;
    public static final int QUOTE_DOUBLE=176;
    public static final int QUOTE_SINGLE=177;
    public static final int R=178;
    public static final int RAISE=179;
    public static final int REFERENCES=180;
    public static final int REGEXP=181;
    public static final int REINDEX=182;
    public static final int RELEASE=183;
    public static final int RENAME=184;
    public static final int REPLACE=185;
    public static final int RESTRICT=186;
    public static final int ROLLBACK=187;
    public static final int ROW=188;
    public static final int RPAREN=189;
    public static final int RPAREN_SQUARE=190;
    public static final int S=191;
    public static final int SAVEPOINT=192;
    public static final int SELECT=193;
    public static final int SELECT_CORE=194;
    public static final int SEMI=195;
    public static final int SET=196;
    public static final int SHIFT_LEFT=197;
    public static final int SHIFT_RIGHT=198;
    public static final int SLASH=199;
    public static final int STATEMENT=200;
    public static final int STRING=201;
    public static final int STRING_CORE=202;
    public static final int STRING_CORE_DOUBLE=203;
    public static final int STRING_CORE_SINGLE=204;
    public static final int STRING_DOUBLE=205;
    public static final int STRING_ESCAPE_DOUBLE=206;
    public static final int STRING_ESCAPE_SINGLE=207;
    public static final int STRING_LITERAL=208;
    public static final int STRING_SINGLE=209;
    public static final int T=210;
    public static final int TABLE=211;
    public static final int TABLE_CONSTRAINT=212;
    public static final int TEMPORARY=213;
    public static final int THEN=214;
    public static final int TILDA=215;
    public static final int TO=216;
    public static final int TRANSACTION=217;
    public static final int TRIGGER=218;
    public static final int TRUE=219;
    public static final int TYPE=220;
    public static final int TYPE_PARAMS=221;
    public static final int U=222;
    public static final int UNDERSCORE=223;
    public static final int UNION=224;
    public static final int UNIQUE=225;
    public static final int UPDATE=226;
    public static final int USING=227;
    public static final int V=228;
    public static final int VACUUM=229;
    public static final int VALUES=230;
    public static final int VIEW=231;
    public static final int VIRTUAL=232;
    public static final int W=233;
    public static final int WHEN=234;
    public static final int WHERE=235;
    public static final int WS=236;
    public static final int X=237;
    public static final int Y=238;
    public static final int Z=239;

    // delegates
    public Parser[] getDelegates() {
        return new Parser[] {};
    }

    // delegators


    public SqlParser(TokenStream input) {
        this(input, new RecognizerSharedState());
    }
    public SqlParser(TokenStream input, RecognizerSharedState state) {
        super(input, state);
    }

protected TreeAdaptor adaptor = new CommonTreeAdaptor();

public void setTreeAdaptor(TreeAdaptor adaptor) {
    this.adaptor = adaptor;
}
public TreeAdaptor getTreeAdaptor() {
    return adaptor;
}
    public String[] getTokenNames() { return SqlParser.tokenNames; }
    public String getGrammarFileName() { return "/home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g"; }



    // Disable error recovery.
    protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) throws RecognitionException {
        throw new MismatchedTokenException(ttype, input);
    }

    // Delegate error reporting to caller.
    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
        final StringBuilder buffer = new StringBuilder();
        buffer.append("[").append(getErrorHeader(e)).append("] ");
        buffer.append(getErrorMessage(e, tokenNames));
        if(e.token!=null) {
          final CharStream stream = e.token.getInputStream();
          if(stream!=null) {
            int size = stream.size();
            if(size>0) {
              buffer.append("\n").append(stream.substring(0, size-1));
            }
          }
        }
        throw new SqlJetParserException(buffer.toString(), e);
    }

        // unquotes identifier
    public static String unquoteId(String id) {
      if(id==null) {
        return null;
      }
      int len = id.length();
      if(len==0) {
        return "";
      }
      char first = id.charAt(0);
      char last = id.charAt(len-1);
      switch(first) {
        case '[' :
          first = ']';
        case '\'' :
        case '"' :
        case '`' :
          if(first==last) {
            return id.substring(1,len-1);
          }
        default:
          return id;
      }
    }


    public static String quotedId(final CommonTree ast) {
      if(ast instanceof QuotedId) {
        return ((QuotedId)ast).quotedId();
      }
      return ast.getText();
    }

    public static class QuotedId extends CommonTree {
        public QuotedId(Token t) { token=t;}
        public QuotedId(QuotedId node) { super(node); }
        public Tree dupNode() { return new QuotedId(this); }
        public String toString() { return token.getText();}
        public String getText() { return unquoteId(super.getText()); }
        public String quotedId() { return super.getText(); }
    }



    public static class sql_stmt_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sql_stmt_list"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:1: sql_stmt_list : sql_stmt ( SEMI ! ( sql_stmt SEMI !)* )? EOF !;
    public final SqlParser.sql_stmt_list_return sql_stmt_list() throws RecognitionException {
        SqlParser.sql_stmt_list_return retval = new SqlParser.sql_stmt_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token SEMI2=null;
        Token SEMI4=null;
        Token EOF5=null;
        SqlParser.sql_stmt_return sql_stmt1 =null;

        SqlParser.sql_stmt_return sql_stmt3 =null;


        Object SEMI2_tree=null;
        Object SEMI4_tree=null;
        Object EOF5_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:14: ( sql_stmt ( SEMI ! ( sql_stmt SEMI !)* )? EOF !)
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:16: sql_stmt ( SEMI ! ( sql_stmt SEMI !)* )? EOF !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_sql_stmt_in_sql_stmt_list223);
            sql_stmt1=sql_stmt();

            state._fsp--;

            adaptor.addChild(root_0, sql_stmt1.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:25: ( SEMI ! ( sql_stmt SEMI !)* )?
            int alt2=2;
            int LA2_0 = input.LA(1);

            if ( (LA2_0==SEMI) ) {
                alt2=1;
            }
            switch (alt2) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:26: SEMI ! ( sql_stmt SEMI !)*
                    {
                    SEMI2=(Token)match(input,SEMI,FOLLOW_SEMI_in_sql_stmt_list226); 

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:32: ( sql_stmt SEMI !)*
                    loop1:
                    do {
                        int alt1=2;
                        int LA1_0 = input.LA(1);

                        if ( (LA1_0==ALTER||LA1_0==ANALYZE||LA1_0==ATTACH||LA1_0==BEGIN||LA1_0==COMMIT||LA1_0==CREATE||LA1_0==DELETE||LA1_0==DETACH||LA1_0==DROP||LA1_0==END||LA1_0==EXPLAIN||LA1_0==INSERT||LA1_0==PRAGMA||(LA1_0 >= REINDEX && LA1_0 <= RELEASE)||LA1_0==REPLACE||LA1_0==ROLLBACK||(LA1_0 >= SAVEPOINT && LA1_0 <= SELECT)||LA1_0==UPDATE||LA1_0==VACUUM) ) {
                            alt1=1;
                        }


                        switch (alt1) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:159:33: sql_stmt SEMI !
                    	    {
                    	    pushFollow(FOLLOW_sql_stmt_in_sql_stmt_list230);
                    	    sql_stmt3=sql_stmt();

                    	    state._fsp--;

                    	    adaptor.addChild(root_0, sql_stmt3.getTree());

                    	    SEMI4=(Token)match(input,SEMI,FOLLOW_SEMI_in_sql_stmt_list232); 

                    	    }
                    	    break;

                    	default :
                    	    break loop1;
                        }
                    } while (true);


                    }
                    break;

            }


            EOF5=(Token)match(input,EOF,FOLLOW_EOF_in_sql_stmt_list240); 

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sql_stmt_list"


    public static class sql_stmt_itself_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sql_stmt_itself"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:161:1: sql_stmt_itself : sql_stmt ( SEMI !)? EOF !;
    public final SqlParser.sql_stmt_itself_return sql_stmt_itself() throws RecognitionException {
        SqlParser.sql_stmt_itself_return retval = new SqlParser.sql_stmt_itself_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token SEMI7=null;
        Token EOF8=null;
        SqlParser.sql_stmt_return sql_stmt6 =null;


        Object SEMI7_tree=null;
        Object EOF8_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:161:16: ( sql_stmt ( SEMI !)? EOF !)
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:161:18: sql_stmt ( SEMI !)? EOF !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_sql_stmt_in_sql_stmt_itself248);
            sql_stmt6=sql_stmt();

            state._fsp--;

            adaptor.addChild(root_0, sql_stmt6.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:161:27: ( SEMI !)?
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==SEMI) ) {
                alt3=1;
            }
            switch (alt3) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:161:28: SEMI !
                    {
                    SEMI7=(Token)match(input,SEMI,FOLLOW_SEMI_in_sql_stmt_itself251); 

                    }
                    break;

            }


            EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_sql_stmt_itself256); 

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sql_stmt_itself"


    public static class sql_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sql_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:1: sql_stmt : ( EXPLAIN ( QUERY PLAN )? )? sql_stmt_core ;
    public final SqlParser.sql_stmt_return sql_stmt() throws RecognitionException {
        SqlParser.sql_stmt_return retval = new SqlParser.sql_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EXPLAIN9=null;
        Token QUERY10=null;
        Token PLAN11=null;
        SqlParser.sql_stmt_core_return sql_stmt_core12 =null;


        Object EXPLAIN9_tree=null;
        Object QUERY10_tree=null;
        Object PLAN11_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:9: ( ( EXPLAIN ( QUERY PLAN )? )? sql_stmt_core )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:11: ( EXPLAIN ( QUERY PLAN )? )? sql_stmt_core
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:11: ( EXPLAIN ( QUERY PLAN )? )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==EXPLAIN) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:12: EXPLAIN ( QUERY PLAN )?
                    {
                    EXPLAIN9=(Token)match(input,EXPLAIN,FOLLOW_EXPLAIN_in_sql_stmt265); 
                    EXPLAIN9_tree = 
                    (Object)adaptor.create(EXPLAIN9)
                    ;
                    adaptor.addChild(root_0, EXPLAIN9_tree);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:20: ( QUERY PLAN )?
                    int alt4=2;
                    int LA4_0 = input.LA(1);

                    if ( (LA4_0==QUERY) ) {
                        alt4=1;
                    }
                    switch (alt4) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:163:21: QUERY PLAN
                            {
                            QUERY10=(Token)match(input,QUERY,FOLLOW_QUERY_in_sql_stmt268); 
                            QUERY10_tree = 
                            (Object)adaptor.create(QUERY10)
                            ;
                            adaptor.addChild(root_0, QUERY10_tree);


                            PLAN11=(Token)match(input,PLAN,FOLLOW_PLAN_in_sql_stmt270); 
                            PLAN11_tree = 
                            (Object)adaptor.create(PLAN11)
                            ;
                            adaptor.addChild(root_0, PLAN11_tree);


                            }
                            break;

                    }


                    }
                    break;

            }


            pushFollow(FOLLOW_sql_stmt_core_in_sql_stmt276);
            sql_stmt_core12=sql_stmt_core();

            state._fsp--;

            adaptor.addChild(root_0, sql_stmt_core12.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sql_stmt"


    public static class sql_stmt_core_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sql_stmt_core"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:165:1: sql_stmt_core : ( pragma_stmt | attach_stmt | detach_stmt | analyze_stmt | reindex_stmt | vacuum_stmt | select_stmt | insert_stmt | update_stmt | delete_stmt | begin_stmt | commit_stmt | rollback_stmt | savepoint_stmt | release_stmt | create_virtual_table_stmt | create_table_stmt | drop_table_stmt | alter_table_stmt | create_view_stmt | drop_view_stmt | create_index_stmt | drop_index_stmt | create_trigger_stmt | drop_trigger_stmt );
    public final SqlParser.sql_stmt_core_return sql_stmt_core() throws RecognitionException {
        SqlParser.sql_stmt_core_return retval = new SqlParser.sql_stmt_core_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.pragma_stmt_return pragma_stmt13 =null;

        SqlParser.attach_stmt_return attach_stmt14 =null;

        SqlParser.detach_stmt_return detach_stmt15 =null;

        SqlParser.analyze_stmt_return analyze_stmt16 =null;

        SqlParser.reindex_stmt_return reindex_stmt17 =null;

        SqlParser.vacuum_stmt_return vacuum_stmt18 =null;

        SqlParser.select_stmt_return select_stmt19 =null;

        SqlParser.insert_stmt_return insert_stmt20 =null;

        SqlParser.update_stmt_return update_stmt21 =null;

        SqlParser.delete_stmt_return delete_stmt22 =null;

        SqlParser.begin_stmt_return begin_stmt23 =null;

        SqlParser.commit_stmt_return commit_stmt24 =null;

        SqlParser.rollback_stmt_return rollback_stmt25 =null;

        SqlParser.savepoint_stmt_return savepoint_stmt26 =null;

        SqlParser.release_stmt_return release_stmt27 =null;

        SqlParser.create_virtual_table_stmt_return create_virtual_table_stmt28 =null;

        SqlParser.create_table_stmt_return create_table_stmt29 =null;

        SqlParser.drop_table_stmt_return drop_table_stmt30 =null;

        SqlParser.alter_table_stmt_return alter_table_stmt31 =null;

        SqlParser.create_view_stmt_return create_view_stmt32 =null;

        SqlParser.drop_view_stmt_return drop_view_stmt33 =null;

        SqlParser.create_index_stmt_return create_index_stmt34 =null;

        SqlParser.drop_index_stmt_return drop_index_stmt35 =null;

        SqlParser.create_trigger_stmt_return create_trigger_stmt36 =null;

        SqlParser.drop_trigger_stmt_return drop_trigger_stmt37 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:166:3: ( pragma_stmt | attach_stmt | detach_stmt | analyze_stmt | reindex_stmt | vacuum_stmt | select_stmt | insert_stmt | update_stmt | delete_stmt | begin_stmt | commit_stmt | rollback_stmt | savepoint_stmt | release_stmt | create_virtual_table_stmt | create_table_stmt | drop_table_stmt | alter_table_stmt | create_view_stmt | drop_view_stmt | create_index_stmt | drop_index_stmt | create_trigger_stmt | drop_trigger_stmt )
            int alt6=25;
            switch ( input.LA(1) ) {
            case PRAGMA:
                {
                alt6=1;
                }
                break;
            case ATTACH:
                {
                alt6=2;
                }
                break;
            case DETACH:
                {
                alt6=3;
                }
                break;
            case ANALYZE:
                {
                alt6=4;
                }
                break;
            case REINDEX:
                {
                alt6=5;
                }
                break;
            case VACUUM:
                {
                alt6=6;
                }
                break;
            case SELECT:
                {
                alt6=7;
                }
                break;
            case INSERT:
            case REPLACE:
                {
                alt6=8;
                }
                break;
            case UPDATE:
                {
                alt6=9;
                }
                break;
            case DELETE:
                {
                alt6=10;
                }
                break;
            case BEGIN:
                {
                alt6=11;
                }
                break;
            case COMMIT:
            case END:
                {
                alt6=12;
                }
                break;
            case ROLLBACK:
                {
                alt6=13;
                }
                break;
            case SAVEPOINT:
                {
                alt6=14;
                }
                break;
            case RELEASE:
                {
                alt6=15;
                }
                break;
            case CREATE:
                {
                switch ( input.LA(2) ) {
                case VIRTUAL:
                    {
                    alt6=16;
                    }
                    break;
                case TEMPORARY:
                    {
                    switch ( input.LA(3) ) {
                    case TABLE:
                        {
                        alt6=17;
                        }
                        break;
                    case VIEW:
                        {
                        alt6=20;
                        }
                        break;
                    case TRIGGER:
                        {
                        alt6=24;
                        }
                        break;
                    default:
                        NoViableAltException nvae =
                            new NoViableAltException("", 6, 21, input);

                        throw nvae;

                    }

                    }
                    break;
                case TABLE:
                    {
                    alt6=17;
                    }
                    break;
                case VIEW:
                    {
                    alt6=20;
                    }
                    break;
                case INDEX:
                case UNIQUE:
                    {
                    alt6=22;
                    }
                    break;
                case TRIGGER:
                    {
                    alt6=24;
                    }
                    break;
                default:
                    NoViableAltException nvae =
                        new NoViableAltException("", 6, 17, input);

                    throw nvae;

                }

                }
                break;
            case DROP:
                {
                switch ( input.LA(2) ) {
                case TABLE:
                    {
                    alt6=18;
                    }
                    break;
                case VIEW:
                    {
                    alt6=21;
                    }
                    break;
                case INDEX:
                    {
                    alt6=23;
                    }
                    break;
                case TRIGGER:
                    {
                    alt6=25;
                    }
                    break;
                default:
                    NoViableAltException nvae =
                        new NoViableAltException("", 6, 18, input);

                    throw nvae;

                }

                }
                break;
            case ALTER:
                {
                alt6=19;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;

            }

            switch (alt6) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:166:5: pragma_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_pragma_stmt_in_sql_stmt_core286);
                    pragma_stmt13=pragma_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, pragma_stmt13.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:167:5: attach_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_attach_stmt_in_sql_stmt_core292);
                    attach_stmt14=attach_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, attach_stmt14.getTree());

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:168:5: detach_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_detach_stmt_in_sql_stmt_core298);
                    detach_stmt15=detach_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, detach_stmt15.getTree());

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:169:5: analyze_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_analyze_stmt_in_sql_stmt_core304);
                    analyze_stmt16=analyze_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, analyze_stmt16.getTree());

                    }
                    break;
                case 5 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:170:5: reindex_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_reindex_stmt_in_sql_stmt_core310);
                    reindex_stmt17=reindex_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, reindex_stmt17.getTree());

                    }
                    break;
                case 6 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:171:5: vacuum_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_vacuum_stmt_in_sql_stmt_core316);
                    vacuum_stmt18=vacuum_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, vacuum_stmt18.getTree());

                    }
                    break;
                case 7 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:173:5: select_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_select_stmt_in_sql_stmt_core323);
                    select_stmt19=select_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, select_stmt19.getTree());

                    }
                    break;
                case 8 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:174:5: insert_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_insert_stmt_in_sql_stmt_core329);
                    insert_stmt20=insert_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, insert_stmt20.getTree());

                    }
                    break;
                case 9 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:175:5: update_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_update_stmt_in_sql_stmt_core335);
                    update_stmt21=update_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, update_stmt21.getTree());

                    }
                    break;
                case 10 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:176:5: delete_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_delete_stmt_in_sql_stmt_core341);
                    delete_stmt22=delete_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, delete_stmt22.getTree());

                    }
                    break;
                case 11 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:177:5: begin_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_begin_stmt_in_sql_stmt_core347);
                    begin_stmt23=begin_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, begin_stmt23.getTree());

                    }
                    break;
                case 12 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:178:5: commit_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_commit_stmt_in_sql_stmt_core353);
                    commit_stmt24=commit_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, commit_stmt24.getTree());

                    }
                    break;
                case 13 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:179:5: rollback_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rollback_stmt_in_sql_stmt_core359);
                    rollback_stmt25=rollback_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, rollback_stmt25.getTree());

                    }
                    break;
                case 14 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:180:5: savepoint_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_savepoint_stmt_in_sql_stmt_core365);
                    savepoint_stmt26=savepoint_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, savepoint_stmt26.getTree());

                    }
                    break;
                case 15 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:181:5: release_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_release_stmt_in_sql_stmt_core371);
                    release_stmt27=release_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, release_stmt27.getTree());

                    }
                    break;
                case 16 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:183:5: create_virtual_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_virtual_table_stmt_in_sql_stmt_core378);
                    create_virtual_table_stmt28=create_virtual_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_virtual_table_stmt28.getTree());

                    }
                    break;
                case 17 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:184:5: create_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_table_stmt_in_sql_stmt_core384);
                    create_table_stmt29=create_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_table_stmt29.getTree());

                    }
                    break;
                case 18 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:185:5: drop_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_drop_table_stmt_in_sql_stmt_core390);
                    drop_table_stmt30=drop_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, drop_table_stmt30.getTree());

                    }
                    break;
                case 19 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:186:5: alter_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_alter_table_stmt_in_sql_stmt_core396);
                    alter_table_stmt31=alter_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, alter_table_stmt31.getTree());

                    }
                    break;
                case 20 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:187:5: create_view_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_view_stmt_in_sql_stmt_core402);
                    create_view_stmt32=create_view_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_view_stmt32.getTree());

                    }
                    break;
                case 21 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:188:5: drop_view_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_drop_view_stmt_in_sql_stmt_core408);
                    drop_view_stmt33=drop_view_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, drop_view_stmt33.getTree());

                    }
                    break;
                case 22 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:189:5: create_index_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_index_stmt_in_sql_stmt_core414);
                    create_index_stmt34=create_index_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_index_stmt34.getTree());

                    }
                    break;
                case 23 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:190:5: drop_index_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_drop_index_stmt_in_sql_stmt_core420);
                    drop_index_stmt35=drop_index_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, drop_index_stmt35.getTree());

                    }
                    break;
                case 24 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:191:5: create_trigger_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_trigger_stmt_in_sql_stmt_core426);
                    create_trigger_stmt36=create_trigger_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_trigger_stmt36.getTree());

                    }
                    break;
                case 25 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:192:5: drop_trigger_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_drop_trigger_stmt_in_sql_stmt_core432);
                    drop_trigger_stmt37=drop_trigger_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, drop_trigger_stmt37.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sql_stmt_core"


    public static class schema_create_table_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "schema_create_table_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:195:1: schema_create_table_stmt : ( create_virtual_table_stmt | create_table_stmt );
    public final SqlParser.schema_create_table_stmt_return schema_create_table_stmt() throws RecognitionException {
        SqlParser.schema_create_table_stmt_return retval = new SqlParser.schema_create_table_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.create_virtual_table_stmt_return create_virtual_table_stmt38 =null;

        SqlParser.create_table_stmt_return create_table_stmt39 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:195:25: ( create_virtual_table_stmt | create_table_stmt )
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==CREATE) ) {
                int LA7_1 = input.LA(2);

                if ( (LA7_1==VIRTUAL) ) {
                    alt7=1;
                }
                else if ( (LA7_1==TABLE||LA7_1==TEMPORARY) ) {
                    alt7=2;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 7, 1, input);

                    throw nvae;

                }
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;

            }
            switch (alt7) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:195:27: create_virtual_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_virtual_table_stmt_in_schema_create_table_stmt442);
                    create_virtual_table_stmt38=create_virtual_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_virtual_table_stmt38.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:195:55: create_table_stmt
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_create_table_stmt_in_schema_create_table_stmt446);
                    create_table_stmt39=create_table_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, create_table_stmt39.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "schema_create_table_stmt"


    public static class qualified_table_name_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "qualified_table_name"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:1: qualified_table_name : (database_name= id DOT )? table_name= id ( INDEXED BY index_name= id | NOT INDEXED )? ;
    public final SqlParser.qualified_table_name_return qualified_table_name() throws RecognitionException {
        SqlParser.qualified_table_name_return retval = new SqlParser.qualified_table_name_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DOT40=null;
        Token INDEXED41=null;
        Token BY42=null;
        Token NOT43=null;
        Token INDEXED44=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.id_return index_name =null;


        Object DOT40_tree=null;
        Object INDEXED41_tree=null;
        Object BY42_tree=null;
        Object NOT43_tree=null;
        Object INDEXED44_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:21: ( (database_name= id DOT )? table_name= id ( INDEXED BY index_name= id | NOT INDEXED )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:23: (database_name= id DOT )? table_name= id ( INDEXED BY index_name= id | NOT INDEXED )?
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:23: (database_name= id DOT )?
            int alt8=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA8_1 = input.LA(2);

                    if ( (LA8_1==DOT) ) {
                        alt8=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA8_2 = input.LA(2);

                    if ( (LA8_2==DOT) ) {
                        alt8=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA8_3 = input.LA(2);

                    if ( (LA8_3==DOT) ) {
                        alt8=1;
                    }
                    }
                    break;
            }

            switch (alt8) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:24: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_qualified_table_name456);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT40=(Token)match(input,DOT,FOLLOW_DOT_in_qualified_table_name458); 
                    DOT40_tree = 
                    (Object)adaptor.create(DOT40)
                    ;
                    adaptor.addChild(root_0, DOT40_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_qualified_table_name464);
            table_name=id();

            state._fsp--;

            adaptor.addChild(root_0, table_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:61: ( INDEXED BY index_name= id | NOT INDEXED )?
            int alt9=3;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==INDEXED) ) {
                alt9=1;
            }
            else if ( (LA9_0==NOT) ) {
                alt9=2;
            }
            switch (alt9) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:62: INDEXED BY index_name= id
                    {
                    INDEXED41=(Token)match(input,INDEXED,FOLLOW_INDEXED_in_qualified_table_name467); 
                    INDEXED41_tree = 
                    (Object)adaptor.create(INDEXED41)
                    ;
                    adaptor.addChild(root_0, INDEXED41_tree);


                    BY42=(Token)match(input,BY,FOLLOW_BY_in_qualified_table_name469); 
                    BY42_tree = 
                    (Object)adaptor.create(BY42)
                    ;
                    adaptor.addChild(root_0, BY42_tree);


                    pushFollow(FOLLOW_id_in_qualified_table_name473);
                    index_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, index_name.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:197:89: NOT INDEXED
                    {
                    NOT43=(Token)match(input,NOT,FOLLOW_NOT_in_qualified_table_name477); 
                    NOT43_tree = 
                    (Object)adaptor.create(NOT43)
                    ;
                    adaptor.addChild(root_0, NOT43_tree);


                    INDEXED44=(Token)match(input,INDEXED,FOLLOW_INDEXED_in_qualified_table_name479); 
                    INDEXED44_tree = 
                    (Object)adaptor.create(INDEXED44)
                    ;
                    adaptor.addChild(root_0, INDEXED44_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "qualified_table_name"


    public static class expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:199:1: expr : or_subexpr ( OR ^ or_subexpr )* ;
    public final SqlParser.expr_return expr() throws RecognitionException {
        SqlParser.expr_return retval = new SqlParser.expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token OR46=null;
        SqlParser.or_subexpr_return or_subexpr45 =null;

        SqlParser.or_subexpr_return or_subexpr47 =null;


        Object OR46_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:199:5: ( or_subexpr ( OR ^ or_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:199:7: or_subexpr ( OR ^ or_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_or_subexpr_in_expr488);
            or_subexpr45=or_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, or_subexpr45.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:199:18: ( OR ^ or_subexpr )*
            loop10:
            do {
                int alt10=2;
                alt10 = dfa10.predict(input);
                switch (alt10) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:199:19: OR ^ or_subexpr
            	    {
            	    OR46=(Token)match(input,OR,FOLLOW_OR_in_expr491); 
            	    OR46_tree = 
            	    (Object)adaptor.create(OR46)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(OR46_tree, root_0);


            	    pushFollow(FOLLOW_or_subexpr_in_expr494);
            	    or_subexpr47=or_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, or_subexpr47.getTree());

            	    }
            	    break;

            	default :
            	    break loop10;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expr"


    public static class or_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "or_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:201:1: or_subexpr : and_subexpr ( AND ^ and_subexpr )* ;
    public final SqlParser.or_subexpr_return or_subexpr() throws RecognitionException {
        SqlParser.or_subexpr_return retval = new SqlParser.or_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token AND49=null;
        SqlParser.and_subexpr_return and_subexpr48 =null;

        SqlParser.and_subexpr_return and_subexpr50 =null;


        Object AND49_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:201:11: ( and_subexpr ( AND ^ and_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:201:13: and_subexpr ( AND ^ and_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_and_subexpr_in_or_subexpr503);
            and_subexpr48=and_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, and_subexpr48.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:201:25: ( AND ^ and_subexpr )*
            loop11:
            do {
                int alt11=2;
                alt11 = dfa11.predict(input);
                switch (alt11) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:201:26: AND ^ and_subexpr
            	    {
            	    AND49=(Token)match(input,AND,FOLLOW_AND_in_or_subexpr506); 
            	    AND49_tree = 
            	    (Object)adaptor.create(AND49)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(AND49_tree, root_0);


            	    pushFollow(FOLLOW_and_subexpr_in_or_subexpr509);
            	    and_subexpr50=and_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, and_subexpr50.getTree());

            	    }
            	    break;

            	default :
            	    break loop11;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "or_subexpr"


    public static class and_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "and_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:203:1: and_subexpr : eq_subexpr ( cond_expr ^)? ;
    public final SqlParser.and_subexpr_return and_subexpr() throws RecognitionException {
        SqlParser.and_subexpr_return retval = new SqlParser.and_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.eq_subexpr_return eq_subexpr51 =null;

        SqlParser.cond_expr_return cond_expr52 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:203:12: ( eq_subexpr ( cond_expr ^)? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:203:14: eq_subexpr ( cond_expr ^)?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_eq_subexpr_in_and_subexpr518);
            eq_subexpr51=eq_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, eq_subexpr51.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:203:34: ( cond_expr ^)?
            int alt12=2;
            alt12 = dfa12.predict(input);
            switch (alt12) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:203:34: cond_expr ^
                    {
                    pushFollow(FOLLOW_cond_expr_in_and_subexpr520);
                    cond_expr52=cond_expr();

                    state._fsp--;

                    root_0 = (Object)adaptor.becomeRoot(cond_expr52.getTree(), root_0);

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "and_subexpr"


    public static class cond_expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cond_expr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:205:1: cond_expr : ( ( NOT )? match_op match_expr= eq_subexpr ( ESCAPE escape_expr= eq_subexpr )? -> ^( match_op $match_expr ( NOT )? ( ^( ESCAPE $escape_expr) )? ) | ( NOT )? IN LPAREN expr ( COMMA expr )* RPAREN -> ^( IN_VALUES ( NOT )? ^( IN ( expr )+ ) ) | ( NOT )? IN (database_name= id DOT )? table_name= id -> ^( IN_TABLE ( NOT )? ^( IN ^( $table_name ( $database_name)? ) ) ) | ( NOT )? IN ^ LPAREN ! ( select_stmt )? RPAREN !| ( NOT )? EQUALS ^ LPAREN ! ( select_stmt )? RPAREN !| ( ISNULL -> IS_NULL | NOTNULL -> NOT_NULL | IS NULL -> IS_NULL | NOT NULL -> NOT_NULL | IS NOT NULL -> NOT_NULL ) | IS NOT ^ eq_subexpr | ( NOT )? BETWEEN e1= eq_subexpr AND e2= eq_subexpr -> ^( BETWEEN ( NOT )? ^( AND $e1 $e2) ) | ( ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr )+ );
    public final SqlParser.cond_expr_return cond_expr() throws RecognitionException {
        SqlParser.cond_expr_return retval = new SqlParser.cond_expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token NOT53=null;
        Token ESCAPE55=null;
        Token NOT56=null;
        Token IN57=null;
        Token LPAREN58=null;
        Token COMMA60=null;
        Token RPAREN62=null;
        Token NOT63=null;
        Token IN64=null;
        Token DOT65=null;
        Token NOT66=null;
        Token IN67=null;
        Token LPAREN68=null;
        Token RPAREN70=null;
        Token NOT71=null;
        Token EQUALS72=null;
        Token LPAREN73=null;
        Token RPAREN75=null;
        Token ISNULL76=null;
        Token NOTNULL77=null;
        Token IS78=null;
        Token NULL79=null;
        Token NOT80=null;
        Token NULL81=null;
        Token IS82=null;
        Token NOT83=null;
        Token NULL84=null;
        Token IS85=null;
        Token NOT86=null;
        Token NOT88=null;
        Token BETWEEN89=null;
        Token AND90=null;
        Token set91=null;
        SqlParser.eq_subexpr_return match_expr =null;

        SqlParser.eq_subexpr_return escape_expr =null;

        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.eq_subexpr_return e1 =null;

        SqlParser.eq_subexpr_return e2 =null;

        SqlParser.match_op_return match_op54 =null;

        SqlParser.expr_return expr59 =null;

        SqlParser.expr_return expr61 =null;

        SqlParser.select_stmt_return select_stmt69 =null;

        SqlParser.select_stmt_return select_stmt74 =null;

        SqlParser.eq_subexpr_return eq_subexpr87 =null;

        SqlParser.eq_subexpr_return eq_subexpr92 =null;


        Object NOT53_tree=null;
        Object ESCAPE55_tree=null;
        Object NOT56_tree=null;
        Object IN57_tree=null;
        Object LPAREN58_tree=null;
        Object COMMA60_tree=null;
        Object RPAREN62_tree=null;
        Object NOT63_tree=null;
        Object IN64_tree=null;
        Object DOT65_tree=null;
        Object NOT66_tree=null;
        Object IN67_tree=null;
        Object LPAREN68_tree=null;
        Object RPAREN70_tree=null;
        Object NOT71_tree=null;
        Object EQUALS72_tree=null;
        Object LPAREN73_tree=null;
        Object RPAREN75_tree=null;
        Object ISNULL76_tree=null;
        Object NOTNULL77_tree=null;
        Object IS78_tree=null;
        Object NULL79_tree=null;
        Object NOT80_tree=null;
        Object NULL81_tree=null;
        Object IS82_tree=null;
        Object NOT83_tree=null;
        Object NULL84_tree=null;
        Object IS85_tree=null;
        Object NOT86_tree=null;
        Object NOT88_tree=null;
        Object BETWEEN89_tree=null;
        Object AND90_tree=null;
        Object set91_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_IN=new RewriteRuleTokenStream(adaptor,"token IN");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_ESCAPE=new RewriteRuleTokenStream(adaptor,"token ESCAPE");
        RewriteRuleTokenStream stream_AND=new RewriteRuleTokenStream(adaptor,"token AND");
        RewriteRuleTokenStream stream_NOTNULL=new RewriteRuleTokenStream(adaptor,"token NOTNULL");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_IS=new RewriteRuleTokenStream(adaptor,"token IS");
        RewriteRuleTokenStream stream_BETWEEN=new RewriteRuleTokenStream(adaptor,"token BETWEEN");
        RewriteRuleTokenStream stream_NULL=new RewriteRuleTokenStream(adaptor,"token NULL");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleTokenStream stream_ISNULL=new RewriteRuleTokenStream(adaptor,"token ISNULL");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        RewriteRuleSubtreeStream stream_match_op=new RewriteRuleSubtreeStream(adaptor,"rule match_op");
        RewriteRuleSubtreeStream stream_eq_subexpr=new RewriteRuleSubtreeStream(adaptor,"rule eq_subexpr");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:3: ( ( NOT )? match_op match_expr= eq_subexpr ( ESCAPE escape_expr= eq_subexpr )? -> ^( match_op $match_expr ( NOT )? ( ^( ESCAPE $escape_expr) )? ) | ( NOT )? IN LPAREN expr ( COMMA expr )* RPAREN -> ^( IN_VALUES ( NOT )? ^( IN ( expr )+ ) ) | ( NOT )? IN (database_name= id DOT )? table_name= id -> ^( IN_TABLE ( NOT )? ^( IN ^( $table_name ( $database_name)? ) ) ) | ( NOT )? IN ^ LPAREN ! ( select_stmt )? RPAREN !| ( NOT )? EQUALS ^ LPAREN ! ( select_stmt )? RPAREN !| ( ISNULL -> IS_NULL | NOTNULL -> NOT_NULL | IS NULL -> IS_NULL | NOT NULL -> NOT_NULL | IS NOT NULL -> NOT_NULL ) | IS NOT ^ eq_subexpr | ( NOT )? BETWEEN e1= eq_subexpr AND e2= eq_subexpr -> ^( BETWEEN ( NOT )? ^( AND $e1 $e2) ) | ( ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr )+ )
            int alt26=9;
            alt26 = dfa26.predict(input);
            switch (alt26) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:5: ( NOT )? match_op match_expr= eq_subexpr ( ESCAPE escape_expr= eq_subexpr )?
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:5: ( NOT )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==NOT) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:5: NOT
                            {
                            NOT53=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr532);  
                            stream_NOT.add(NOT53);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_match_op_in_cond_expr535);
                    match_op54=match_op();

                    state._fsp--;

                    stream_match_op.add(match_op54.getTree());

                    pushFollow(FOLLOW_eq_subexpr_in_cond_expr539);
                    match_expr=eq_subexpr();

                    state._fsp--;

                    stream_eq_subexpr.add(match_expr.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:41: ( ESCAPE escape_expr= eq_subexpr )?
                    int alt14=2;
                    alt14 = dfa14.predict(input);
                    switch (alt14) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:42: ESCAPE escape_expr= eq_subexpr
                            {
                            ESCAPE55=(Token)match(input,ESCAPE,FOLLOW_ESCAPE_in_cond_expr542);  
                            stream_ESCAPE.add(ESCAPE55);


                            pushFollow(FOLLOW_eq_subexpr_in_cond_expr546);
                            escape_expr=eq_subexpr();

                            state._fsp--;

                            stream_eq_subexpr.add(escape_expr.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: NOT, match_op, escape_expr, ESCAPE, match_expr
                    // token labels: 
                    // rule labels: retval, match_expr, escape_expr
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_match_expr=new RewriteRuleSubtreeStream(adaptor,"rule match_expr",match_expr!=null?match_expr.tree:null);
                    RewriteRuleSubtreeStream stream_escape_expr=new RewriteRuleSubtreeStream(adaptor,"rule escape_expr",escape_expr!=null?escape_expr.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 206:74: -> ^( match_op $match_expr ( NOT )? ( ^( ESCAPE $escape_expr) )? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:77: ^( match_op $match_expr ( NOT )? ( ^( ESCAPE $escape_expr) )? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_match_op.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_match_expr.nextTree());

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:100: ( NOT )?
                        if ( stream_NOT.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_NOT.nextNode()
                            );

                        }
                        stream_NOT.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:105: ( ^( ESCAPE $escape_expr) )?
                        if ( stream_escape_expr.hasNext()||stream_ESCAPE.hasNext() ) {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:206:105: ^( ESCAPE $escape_expr)
                            {
                            Object root_2 = (Object)adaptor.nil();
                            root_2 = (Object)adaptor.becomeRoot(
                            stream_ESCAPE.nextNode()
                            , root_2);

                            adaptor.addChild(root_2, stream_escape_expr.nextTree());

                            adaptor.addChild(root_1, root_2);
                            }

                        }
                        stream_escape_expr.reset();
                        stream_ESCAPE.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:5: ( NOT )? IN LPAREN expr ( COMMA expr )* RPAREN
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:5: ( NOT )?
                    int alt15=2;
                    int LA15_0 = input.LA(1);

                    if ( (LA15_0==NOT) ) {
                        alt15=1;
                    }
                    switch (alt15) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:5: NOT
                            {
                            NOT56=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr574);  
                            stream_NOT.add(NOT56);


                            }
                            break;

                    }


                    IN57=(Token)match(input,IN,FOLLOW_IN_in_cond_expr577);  
                    stream_IN.add(IN57);


                    LPAREN58=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_cond_expr579);  
                    stream_LPAREN.add(LPAREN58);


                    pushFollow(FOLLOW_expr_in_cond_expr581);
                    expr59=expr();

                    state._fsp--;

                    stream_expr.add(expr59.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:25: ( COMMA expr )*
                    loop16:
                    do {
                        int alt16=2;
                        int LA16_0 = input.LA(1);

                        if ( (LA16_0==COMMA) ) {
                            alt16=1;
                        }


                        switch (alt16) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:26: COMMA expr
                    	    {
                    	    COMMA60=(Token)match(input,COMMA,FOLLOW_COMMA_in_cond_expr584);  
                    	    stream_COMMA.add(COMMA60);


                    	    pushFollow(FOLLOW_expr_in_cond_expr586);
                    	    expr61=expr();

                    	    state._fsp--;

                    	    stream_expr.add(expr61.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop16;
                        }
                    } while (true);


                    RPAREN62=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_cond_expr590);  
                    stream_RPAREN.add(RPAREN62);


                    // AST REWRITE
                    // elements: expr, IN, NOT
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 207:46: -> ^( IN_VALUES ( NOT )? ^( IN ( expr )+ ) )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:49: ^( IN_VALUES ( NOT )? ^( IN ( expr )+ ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(IN_VALUES, "IN_VALUES")
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:61: ( NOT )?
                        if ( stream_NOT.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_NOT.nextNode()
                            );

                        }
                        stream_NOT.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:207:66: ^( IN ( expr )+ )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        stream_IN.nextNode()
                        , root_2);

                        if ( !(stream_expr.hasNext()) ) {
                            throw new RewriteEarlyExitException();
                        }
                        while ( stream_expr.hasNext() ) {
                            adaptor.addChild(root_2, stream_expr.nextTree());

                        }
                        stream_expr.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:5: ( NOT )? IN (database_name= id DOT )? table_name= id
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:5: ( NOT )?
                    int alt17=2;
                    int LA17_0 = input.LA(1);

                    if ( (LA17_0==NOT) ) {
                        alt17=1;
                    }
                    switch (alt17) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:5: NOT
                            {
                            NOT63=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr612);  
                            stream_NOT.add(NOT63);


                            }
                            break;

                    }


                    IN64=(Token)match(input,IN,FOLLOW_IN_in_cond_expr615);  
                    stream_IN.add(IN64);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:13: (database_name= id DOT )?
                    int alt18=2;
                    alt18 = dfa18.predict(input);
                    switch (alt18) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:14: database_name= id DOT
                            {
                            pushFollow(FOLLOW_id_in_cond_expr620);
                            database_name=id();

                            state._fsp--;

                            stream_id.add(database_name.getTree());

                            DOT65=(Token)match(input,DOT,FOLLOW_DOT_in_cond_expr622);  
                            stream_DOT.add(DOT65);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_id_in_cond_expr628);
                    table_name=id();

                    state._fsp--;

                    stream_id.add(table_name.getTree());

                    // AST REWRITE
                    // elements: database_name, table_name, IN, NOT
                    // token labels: 
                    // rule labels: database_name, retval, table_name
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 208:51: -> ^( IN_TABLE ( NOT )? ^( IN ^( $table_name ( $database_name)? ) ) )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:54: ^( IN_TABLE ( NOT )? ^( IN ^( $table_name ( $database_name)? ) ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(IN_TABLE, "IN_TABLE")
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:65: ( NOT )?
                        if ( stream_NOT.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_NOT.nextNode()
                            );

                        }
                        stream_NOT.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:70: ^( IN ^( $table_name ( $database_name)? ) )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        stream_IN.nextNode()
                        , root_2);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:75: ^( $table_name ( $database_name)? )
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_3);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:208:90: ( $database_name)?
                        if ( stream_database_name.hasNext() ) {
                            adaptor.addChild(root_3, stream_database_name.nextTree());

                        }
                        stream_database_name.reset();

                        adaptor.addChild(root_2, root_3);
                        }

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:209:5: ( NOT )? IN ^ LPAREN ! ( select_stmt )? RPAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:209:5: ( NOT )?
                    int alt19=2;
                    int LA19_0 = input.LA(1);

                    if ( (LA19_0==NOT) ) {
                        alt19=1;
                    }
                    switch (alt19) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:209:5: NOT
                            {
                            NOT66=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr656); 
                            NOT66_tree = 
                            (Object)adaptor.create(NOT66)
                            ;
                            adaptor.addChild(root_0, NOT66_tree);


                            }
                            break;

                    }


                    IN67=(Token)match(input,IN,FOLLOW_IN_in_cond_expr659); 
                    IN67_tree = 
                    (Object)adaptor.create(IN67)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(IN67_tree, root_0);


                    LPAREN68=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_cond_expr662); 

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:209:22: ( select_stmt )?
                    int alt20=2;
                    int LA20_0 = input.LA(1);

                    if ( (LA20_0==SELECT) ) {
                        alt20=1;
                    }
                    switch (alt20) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:209:22: select_stmt
                            {
                            pushFollow(FOLLOW_select_stmt_in_cond_expr665);
                            select_stmt69=select_stmt();

                            state._fsp--;

                            adaptor.addChild(root_0, select_stmt69.getTree());

                            }
                            break;

                    }


                    RPAREN70=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_cond_expr668); 

                    }
                    break;
                case 5 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:210:5: ( NOT )? EQUALS ^ LPAREN ! ( select_stmt )? RPAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:210:5: ( NOT )?
                    int alt21=2;
                    int LA21_0 = input.LA(1);

                    if ( (LA21_0==NOT) ) {
                        alt21=1;
                    }
                    switch (alt21) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:210:5: NOT
                            {
                            NOT71=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr675); 
                            NOT71_tree = 
                            (Object)adaptor.create(NOT71)
                            ;
                            adaptor.addChild(root_0, NOT71_tree);


                            }
                            break;

                    }


                    EQUALS72=(Token)match(input,EQUALS,FOLLOW_EQUALS_in_cond_expr678); 
                    EQUALS72_tree = 
                    (Object)adaptor.create(EQUALS72)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(EQUALS72_tree, root_0);


                    LPAREN73=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_cond_expr681); 

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:210:26: ( select_stmt )?
                    int alt22=2;
                    int LA22_0 = input.LA(1);

                    if ( (LA22_0==SELECT) ) {
                        alt22=1;
                    }
                    switch (alt22) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:210:26: select_stmt
                            {
                            pushFollow(FOLLOW_select_stmt_in_cond_expr684);
                            select_stmt74=select_stmt();

                            state._fsp--;

                            adaptor.addChild(root_0, select_stmt74.getTree());

                            }
                            break;

                    }


                    RPAREN75=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_cond_expr687); 

                    }
                    break;
                case 6 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:5: ( ISNULL -> IS_NULL | NOTNULL -> NOT_NULL | IS NULL -> IS_NULL | NOT NULL -> NOT_NULL | IS NOT NULL -> NOT_NULL )
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:5: ( ISNULL -> IS_NULL | NOTNULL -> NOT_NULL | IS NULL -> IS_NULL | NOT NULL -> NOT_NULL | IS NOT NULL -> NOT_NULL )
                    int alt23=5;
                    switch ( input.LA(1) ) {
                    case ISNULL:
                        {
                        alt23=1;
                        }
                        break;
                    case NOTNULL:
                        {
                        alt23=2;
                        }
                        break;
                    case IS:
                        {
                        int LA23_3 = input.LA(2);

                        if ( (LA23_3==NULL) ) {
                            alt23=3;
                        }
                        else if ( (LA23_3==NOT) ) {
                            alt23=5;
                        }
                        else {
                            NoViableAltException nvae =
                                new NoViableAltException("", 23, 3, input);

                            throw nvae;

                        }
                        }
                        break;
                    case NOT:
                        {
                        alt23=4;
                        }
                        break;
                    default:
                        NoViableAltException nvae =
                            new NoViableAltException("", 23, 0, input);

                        throw nvae;

                    }

                    switch (alt23) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:6: ISNULL
                            {
                            ISNULL76=(Token)match(input,ISNULL,FOLLOW_ISNULL_in_cond_expr695);  
                            stream_ISNULL.add(ISNULL76);


                            // AST REWRITE
                            // elements: 
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 211:13: -> IS_NULL
                            {
                                adaptor.addChild(root_0, 
                                (Object)adaptor.create(IS_NULL, "IS_NULL")
                                );

                            }


                            retval.tree = root_0;

                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:26: NOTNULL
                            {
                            NOTNULL77=(Token)match(input,NOTNULL,FOLLOW_NOTNULL_in_cond_expr703);  
                            stream_NOTNULL.add(NOTNULL77);


                            // AST REWRITE
                            // elements: 
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 211:34: -> NOT_NULL
                            {
                                adaptor.addChild(root_0, 
                                (Object)adaptor.create(NOT_NULL, "NOT_NULL")
                                );

                            }


                            retval.tree = root_0;

                            }
                            break;
                        case 3 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:48: IS NULL
                            {
                            IS78=(Token)match(input,IS,FOLLOW_IS_in_cond_expr711);  
                            stream_IS.add(IS78);


                            NULL79=(Token)match(input,NULL,FOLLOW_NULL_in_cond_expr713);  
                            stream_NULL.add(NULL79);


                            // AST REWRITE
                            // elements: 
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 211:56: -> IS_NULL
                            {
                                adaptor.addChild(root_0, 
                                (Object)adaptor.create(IS_NULL, "IS_NULL")
                                );

                            }


                            retval.tree = root_0;

                            }
                            break;
                        case 4 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:69: NOT NULL
                            {
                            NOT80=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr721);  
                            stream_NOT.add(NOT80);


                            NULL81=(Token)match(input,NULL,FOLLOW_NULL_in_cond_expr723);  
                            stream_NULL.add(NULL81);


                            // AST REWRITE
                            // elements: 
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 211:78: -> NOT_NULL
                            {
                                adaptor.addChild(root_0, 
                                (Object)adaptor.create(NOT_NULL, "NOT_NULL")
                                );

                            }


                            retval.tree = root_0;

                            }
                            break;
                        case 5 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:211:92: IS NOT NULL
                            {
                            IS82=(Token)match(input,IS,FOLLOW_IS_in_cond_expr731);  
                            stream_IS.add(IS82);


                            NOT83=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr733);  
                            stream_NOT.add(NOT83);


                            NULL84=(Token)match(input,NULL,FOLLOW_NULL_in_cond_expr735);  
                            stream_NULL.add(NULL84);


                            // AST REWRITE
                            // elements: 
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 211:104: -> NOT_NULL
                            {
                                adaptor.addChild(root_0, 
                                (Object)adaptor.create(NOT_NULL, "NOT_NULL")
                                );

                            }


                            retval.tree = root_0;

                            }
                            break;

                    }


                    }
                    break;
                case 7 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:212:5: IS NOT ^ eq_subexpr
                    {
                    root_0 = (Object)adaptor.nil();


                    IS85=(Token)match(input,IS,FOLLOW_IS_in_cond_expr746); 
                    IS85_tree = 
                    (Object)adaptor.create(IS85)
                    ;
                    adaptor.addChild(root_0, IS85_tree);


                    NOT86=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr748); 
                    NOT86_tree = 
                    (Object)adaptor.create(NOT86)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(NOT86_tree, root_0);


                    pushFollow(FOLLOW_eq_subexpr_in_cond_expr751);
                    eq_subexpr87=eq_subexpr();

                    state._fsp--;

                    adaptor.addChild(root_0, eq_subexpr87.getTree());

                    }
                    break;
                case 8 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:5: ( NOT )? BETWEEN e1= eq_subexpr AND e2= eq_subexpr
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:5: ( NOT )?
                    int alt24=2;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==NOT) ) {
                        alt24=1;
                    }
                    switch (alt24) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:5: NOT
                            {
                            NOT88=(Token)match(input,NOT,FOLLOW_NOT_in_cond_expr757);  
                            stream_NOT.add(NOT88);


                            }
                            break;

                    }


                    BETWEEN89=(Token)match(input,BETWEEN,FOLLOW_BETWEEN_in_cond_expr760);  
                    stream_BETWEEN.add(BETWEEN89);


                    pushFollow(FOLLOW_eq_subexpr_in_cond_expr764);
                    e1=eq_subexpr();

                    state._fsp--;

                    stream_eq_subexpr.add(e1.getTree());

                    AND90=(Token)match(input,AND,FOLLOW_AND_in_cond_expr766);  
                    stream_AND.add(AND90);


                    pushFollow(FOLLOW_eq_subexpr_in_cond_expr770);
                    e2=eq_subexpr();

                    state._fsp--;

                    stream_eq_subexpr.add(e2.getTree());

                    // AST REWRITE
                    // elements: NOT, e2, BETWEEN, e1, AND
                    // token labels: 
                    // rule labels: retval, e1, e2
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_e1=new RewriteRuleSubtreeStream(adaptor,"rule e1",e1!=null?e1.tree:null);
                    RewriteRuleSubtreeStream stream_e2=new RewriteRuleSubtreeStream(adaptor,"rule e2",e2!=null?e2.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 213:50: -> ^( BETWEEN ( NOT )? ^( AND $e1 $e2) )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:53: ^( BETWEEN ( NOT )? ^( AND $e1 $e2) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        stream_BETWEEN.nextNode()
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:63: ( NOT )?
                        if ( stream_NOT.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_NOT.nextNode()
                            );

                        }
                        stream_NOT.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:213:68: ^( AND $e1 $e2)
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        stream_AND.nextNode()
                        , root_2);

                        adaptor.addChild(root_2, stream_e1.nextTree());

                        adaptor.addChild(root_2, stream_e2.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 9 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:214:5: ( ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr )+
                    {
                    root_0 = (Object)adaptor.nil();


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:214:5: ( ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr )+
                    int cnt25=0;
                    loop25:
                    do {
                        int alt25=2;
                        int LA25_0 = input.LA(1);

                        if ( ((LA25_0 >= EQUALS && LA25_0 <= EQUALS2)||(LA25_0 >= NOT_EQUALS && LA25_0 <= NOT_EQUALS2)) ) {
                            alt25=1;
                        }


                        switch (alt25) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:214:6: ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr
                    	    {
                    	    set91=(Token)input.LT(1);

                    	    set91=(Token)input.LT(1);

                    	    if ( (input.LA(1) >= EQUALS && input.LA(1) <= EQUALS2)||(input.LA(1) >= NOT_EQUALS && input.LA(1) <= NOT_EQUALS2) ) {
                    	        input.consume();
                    	        root_0 = (Object)adaptor.becomeRoot(
                    	        (Object)adaptor.create(set91)
                    	        , root_0);
                    	        state.errorRecovery=false;
                    	    }
                    	    else {
                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
                    	        throw mse;
                    	    }


                    	    pushFollow(FOLLOW_eq_subexpr_in_cond_expr813);
                    	    eq_subexpr92=eq_subexpr();

                    	    state._fsp--;

                    	    adaptor.addChild(root_0, eq_subexpr92.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt25 >= 1 ) break loop25;
                                EarlyExitException eee =
                                    new EarlyExitException(25, input);
                                throw eee;
                        }
                        cnt25++;
                    } while (true);


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cond_expr"


    public static class match_op_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "match_op"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:217:1: match_op : ( LIKE | GLOB | REGEXP | MATCH );
    public final SqlParser.match_op_return match_op() throws RecognitionException {
        SqlParser.match_op_return retval = new SqlParser.match_op_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set93=null;

        Object set93_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:217:9: ( LIKE | GLOB | REGEXP | MATCH )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
            {
            root_0 = (Object)adaptor.nil();


            set93=(Token)input.LT(1);

            if ( input.LA(1)==GLOB||input.LA(1)==LIKE||input.LA(1)==MATCH||input.LA(1)==REGEXP ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set93)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "match_op"


    public static class eq_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "eq_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:219:1: eq_subexpr : neq_subexpr ( ( LESS | LESS_OR_EQ | GREATER | GREATER_OR_EQ ) ^ neq_subexpr )* ;
    public final SqlParser.eq_subexpr_return eq_subexpr() throws RecognitionException {
        SqlParser.eq_subexpr_return retval = new SqlParser.eq_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set95=null;
        SqlParser.neq_subexpr_return neq_subexpr94 =null;

        SqlParser.neq_subexpr_return neq_subexpr96 =null;


        Object set95_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:219:11: ( neq_subexpr ( ( LESS | LESS_OR_EQ | GREATER | GREATER_OR_EQ ) ^ neq_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:219:13: neq_subexpr ( ( LESS | LESS_OR_EQ | GREATER | GREATER_OR_EQ ) ^ neq_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_neq_subexpr_in_eq_subexpr846);
            neq_subexpr94=neq_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, neq_subexpr94.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:219:25: ( ( LESS | LESS_OR_EQ | GREATER | GREATER_OR_EQ ) ^ neq_subexpr )*
            loop27:
            do {
                int alt27=2;
                int LA27_0 = input.LA(1);

                if ( ((LA27_0 >= GREATER && LA27_0 <= GREATER_OR_EQ)||(LA27_0 >= LESS && LA27_0 <= LESS_OR_EQ)) ) {
                    alt27=1;
                }


                switch (alt27) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:219:26: ( LESS | LESS_OR_EQ | GREATER | GREATER_OR_EQ ) ^ neq_subexpr
            	    {
            	    set95=(Token)input.LT(1);

            	    set95=(Token)input.LT(1);

            	    if ( (input.LA(1) >= GREATER && input.LA(1) <= GREATER_OR_EQ)||(input.LA(1) >= LESS && input.LA(1) <= LESS_OR_EQ) ) {
            	        input.consume();
            	        root_0 = (Object)adaptor.becomeRoot(
            	        (Object)adaptor.create(set95)
            	        , root_0);
            	        state.errorRecovery=false;
            	    }
            	    else {
            	        MismatchedSetException mse = new MismatchedSetException(null,input);
            	        throw mse;
            	    }


            	    pushFollow(FOLLOW_neq_subexpr_in_eq_subexpr866);
            	    neq_subexpr96=neq_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, neq_subexpr96.getTree());

            	    }
            	    break;

            	default :
            	    break loop27;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "eq_subexpr"


    public static class neq_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "neq_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:221:1: neq_subexpr : bit_subexpr ( ( SHIFT_LEFT | SHIFT_RIGHT | AMPERSAND | PIPE ) ^ bit_subexpr )* ;
    public final SqlParser.neq_subexpr_return neq_subexpr() throws RecognitionException {
        SqlParser.neq_subexpr_return retval = new SqlParser.neq_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set98=null;
        SqlParser.bit_subexpr_return bit_subexpr97 =null;

        SqlParser.bit_subexpr_return bit_subexpr99 =null;


        Object set98_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:221:12: ( bit_subexpr ( ( SHIFT_LEFT | SHIFT_RIGHT | AMPERSAND | PIPE ) ^ bit_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:221:14: bit_subexpr ( ( SHIFT_LEFT | SHIFT_RIGHT | AMPERSAND | PIPE ) ^ bit_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_bit_subexpr_in_neq_subexpr875);
            bit_subexpr97=bit_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, bit_subexpr97.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:221:26: ( ( SHIFT_LEFT | SHIFT_RIGHT | AMPERSAND | PIPE ) ^ bit_subexpr )*
            loop28:
            do {
                int alt28=2;
                int LA28_0 = input.LA(1);

                if ( (LA28_0==AMPERSAND||LA28_0==PIPE||(LA28_0 >= SHIFT_LEFT && LA28_0 <= SHIFT_RIGHT)) ) {
                    alt28=1;
                }


                switch (alt28) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:221:27: ( SHIFT_LEFT | SHIFT_RIGHT | AMPERSAND | PIPE ) ^ bit_subexpr
            	    {
            	    set98=(Token)input.LT(1);

            	    set98=(Token)input.LT(1);

            	    if ( input.LA(1)==AMPERSAND||input.LA(1)==PIPE||(input.LA(1) >= SHIFT_LEFT && input.LA(1) <= SHIFT_RIGHT) ) {
            	        input.consume();
            	        root_0 = (Object)adaptor.becomeRoot(
            	        (Object)adaptor.create(set98)
            	        , root_0);
            	        state.errorRecovery=false;
            	    }
            	    else {
            	        MismatchedSetException mse = new MismatchedSetException(null,input);
            	        throw mse;
            	    }


            	    pushFollow(FOLLOW_bit_subexpr_in_neq_subexpr895);
            	    bit_subexpr99=bit_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, bit_subexpr99.getTree());

            	    }
            	    break;

            	default :
            	    break loop28;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "neq_subexpr"


    public static class bit_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "bit_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:223:1: bit_subexpr : add_subexpr ( ( PLUS | MINUS ) ^ add_subexpr )* ;
    public final SqlParser.bit_subexpr_return bit_subexpr() throws RecognitionException {
        SqlParser.bit_subexpr_return retval = new SqlParser.bit_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set101=null;
        SqlParser.add_subexpr_return add_subexpr100 =null;

        SqlParser.add_subexpr_return add_subexpr102 =null;


        Object set101_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:223:12: ( add_subexpr ( ( PLUS | MINUS ) ^ add_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:223:14: add_subexpr ( ( PLUS | MINUS ) ^ add_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_add_subexpr_in_bit_subexpr904);
            add_subexpr100=add_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, add_subexpr100.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:223:26: ( ( PLUS | MINUS ) ^ add_subexpr )*
            loop29:
            do {
                int alt29=2;
                int LA29_0 = input.LA(1);

                if ( (LA29_0==MINUS||LA29_0==PLUS) ) {
                    alt29=1;
                }


                switch (alt29) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:223:27: ( PLUS | MINUS ) ^ add_subexpr
            	    {
            	    set101=(Token)input.LT(1);

            	    set101=(Token)input.LT(1);

            	    if ( input.LA(1)==MINUS||input.LA(1)==PLUS ) {
            	        input.consume();
            	        root_0 = (Object)adaptor.becomeRoot(
            	        (Object)adaptor.create(set101)
            	        , root_0);
            	        state.errorRecovery=false;
            	    }
            	    else {
            	        MismatchedSetException mse = new MismatchedSetException(null,input);
            	        throw mse;
            	    }


            	    pushFollow(FOLLOW_add_subexpr_in_bit_subexpr916);
            	    add_subexpr102=add_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, add_subexpr102.getTree());

            	    }
            	    break;

            	default :
            	    break loop29;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "bit_subexpr"


    public static class add_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "add_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:225:1: add_subexpr : mul_subexpr ( ( ASTERISK | SLASH | PERCENT ) ^ mul_subexpr )* ;
    public final SqlParser.add_subexpr_return add_subexpr() throws RecognitionException {
        SqlParser.add_subexpr_return retval = new SqlParser.add_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set104=null;
        SqlParser.mul_subexpr_return mul_subexpr103 =null;

        SqlParser.mul_subexpr_return mul_subexpr105 =null;


        Object set104_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:225:12: ( mul_subexpr ( ( ASTERISK | SLASH | PERCENT ) ^ mul_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:225:14: mul_subexpr ( ( ASTERISK | SLASH | PERCENT ) ^ mul_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_mul_subexpr_in_add_subexpr925);
            mul_subexpr103=mul_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, mul_subexpr103.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:225:26: ( ( ASTERISK | SLASH | PERCENT ) ^ mul_subexpr )*
            loop30:
            do {
                int alt30=2;
                int LA30_0 = input.LA(1);

                if ( (LA30_0==ASTERISK||LA30_0==PERCENT||LA30_0==SLASH) ) {
                    alt30=1;
                }


                switch (alt30) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:225:27: ( ASTERISK | SLASH | PERCENT ) ^ mul_subexpr
            	    {
            	    set104=(Token)input.LT(1);

            	    set104=(Token)input.LT(1);

            	    if ( input.LA(1)==ASTERISK||input.LA(1)==PERCENT||input.LA(1)==SLASH ) {
            	        input.consume();
            	        root_0 = (Object)adaptor.becomeRoot(
            	        (Object)adaptor.create(set104)
            	        , root_0);
            	        state.errorRecovery=false;
            	    }
            	    else {
            	        MismatchedSetException mse = new MismatchedSetException(null,input);
            	        throw mse;
            	    }


            	    pushFollow(FOLLOW_mul_subexpr_in_add_subexpr941);
            	    mul_subexpr105=mul_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, mul_subexpr105.getTree());

            	    }
            	    break;

            	default :
            	    break loop30;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "add_subexpr"


    public static class mul_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "mul_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:227:1: mul_subexpr : con_subexpr ( DOUBLE_PIPE ^ con_subexpr )* ;
    public final SqlParser.mul_subexpr_return mul_subexpr() throws RecognitionException {
        SqlParser.mul_subexpr_return retval = new SqlParser.mul_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DOUBLE_PIPE107=null;
        SqlParser.con_subexpr_return con_subexpr106 =null;

        SqlParser.con_subexpr_return con_subexpr108 =null;


        Object DOUBLE_PIPE107_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:227:12: ( con_subexpr ( DOUBLE_PIPE ^ con_subexpr )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:227:14: con_subexpr ( DOUBLE_PIPE ^ con_subexpr )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_con_subexpr_in_mul_subexpr950);
            con_subexpr106=con_subexpr();

            state._fsp--;

            adaptor.addChild(root_0, con_subexpr106.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:227:26: ( DOUBLE_PIPE ^ con_subexpr )*
            loop31:
            do {
                int alt31=2;
                int LA31_0 = input.LA(1);

                if ( (LA31_0==DOUBLE_PIPE) ) {
                    alt31=1;
                }


                switch (alt31) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:227:27: DOUBLE_PIPE ^ con_subexpr
            	    {
            	    DOUBLE_PIPE107=(Token)match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_mul_subexpr953); 
            	    DOUBLE_PIPE107_tree = 
            	    (Object)adaptor.create(DOUBLE_PIPE107)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(DOUBLE_PIPE107_tree, root_0);


            	    pushFollow(FOLLOW_con_subexpr_in_mul_subexpr956);
            	    con_subexpr108=con_subexpr();

            	    state._fsp--;

            	    adaptor.addChild(root_0, con_subexpr108.getTree());

            	    }
            	    break;

            	default :
            	    break loop31;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "mul_subexpr"


    public static class con_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "con_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:229:1: con_subexpr : ( unary_subexpr | unary_op unary_subexpr -> ^( unary_op unary_subexpr ) );
    public final SqlParser.con_subexpr_return con_subexpr() throws RecognitionException {
        SqlParser.con_subexpr_return retval = new SqlParser.con_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.unary_subexpr_return unary_subexpr109 =null;

        SqlParser.unary_op_return unary_op110 =null;

        SqlParser.unary_subexpr_return unary_subexpr111 =null;


        RewriteRuleSubtreeStream stream_unary_subexpr=new RewriteRuleSubtreeStream(adaptor,"rule unary_subexpr");
        RewriteRuleSubtreeStream stream_unary_op=new RewriteRuleSubtreeStream(adaptor,"rule unary_op");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:229:12: ( unary_subexpr | unary_op unary_subexpr -> ^( unary_op unary_subexpr ) )
            int alt32=2;
            switch ( input.LA(1) ) {
            case ABORT:
            case ADD:
            case AFTER:
            case ALL:
            case ALTER:
            case ANALYZE:
            case AND:
            case AS:
            case ASC:
            case AT:
            case ATTACH:
            case AUTOINCREMENT:
            case BEFORE:
            case BEGIN:
            case BETWEEN:
            case BLOB:
            case BY:
            case CASCADE:
            case CASE:
            case CAST:
            case CHECK:
            case COLLATE:
            case COLON:
            case COLUMN:
            case COMMIT:
            case CONFLICT:
            case CONSTRAINT:
            case CREATE:
            case CROSS:
            case CURRENT_DATE:
            case CURRENT_TIME:
            case CURRENT_TIMESTAMP:
            case DATABASE:
            case DEFAULT:
            case DEFERRABLE:
            case DEFERRED:
            case DELETE:
            case DESC:
            case DETACH:
            case DISTINCT:
            case DROP:
            case EACH:
            case ELSE:
            case END:
            case ESCAPE:
            case EXCEPT:
            case EXCLUSIVE:
            case EXISTS:
            case EXPLAIN:
            case FAIL:
            case FALSE:
            case FLOAT:
            case FOR:
            case FOREIGN:
            case FROM:
            case GROUP:
            case HAVING:
            case ID:
            case IF:
            case IGNORE:
            case IMMEDIATE:
            case INDEX:
            case INDEXED:
            case INITIALLY:
            case INNER:
            case INSERT:
            case INSTEAD:
            case INTEGER:
            case INTERSECT:
            case INTO:
            case IS:
            case JOIN:
            case KEY:
            case LEFT:
            case LIMIT:
            case LPAREN:
            case NATURAL:
            case NULL:
            case OF:
            case OFFSET:
            case ON:
            case OR:
            case ORDER:
            case OUTER:
            case PLAN:
            case PRAGMA:
            case PRIMARY:
            case QUERY:
            case QUESTION:
            case RAISE:
            case REFERENCES:
            case REINDEX:
            case RELEASE:
            case RENAME:
            case REPLACE:
            case RESTRICT:
            case ROLLBACK:
            case ROW:
            case SAVEPOINT:
            case SELECT:
            case SET:
            case STRING:
            case TABLE:
            case TEMPORARY:
            case THEN:
            case TO:
            case TRANSACTION:
            case TRIGGER:
            case TRUE:
            case UNION:
            case UNIQUE:
            case UPDATE:
            case USING:
            case VACUUM:
            case VALUES:
            case VIEW:
            case VIRTUAL:
            case WHEN:
            case WHERE:
                {
                alt32=1;
                }
                break;
            case NOT:
                {
                int LA32_17 = input.LA(2);

                if ( (LA32_17==EXISTS) ) {
                    int LA32_22 = input.LA(3);

                    if ( (LA32_22==LPAREN) ) {
                        int LA32_42 = input.LA(4);

                        if ( (LA32_42==SELECT) ) {
                            alt32=1;
                        }
                        else {
                            NoViableAltException nvae =
                                new NoViableAltException("", 32, 42, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA32_22==DOT) ) {
                        alt32=2;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 32, 22, input);

                        throw nvae;

                    }
                }
                else if ( ((LA32_17 >= ABORT && LA32_17 <= AFTER)||(LA32_17 >= ALL && LA32_17 <= ALTER)||(LA32_17 >= ANALYZE && LA32_17 <= AND)||(LA32_17 >= AS && LA32_17 <= ASC)||(LA32_17 >= AT && LA32_17 <= AUTOINCREMENT)||(LA32_17 >= BEFORE && LA32_17 <= BETWEEN)||LA32_17==BLOB||LA32_17==BY||(LA32_17 >= CASCADE && LA32_17 <= COLUMN)||(LA32_17 >= COMMIT && LA32_17 <= CONSTRAINT)||LA32_17==CREATE||(LA32_17 >= CROSS && LA32_17 <= CURRENT_TIMESTAMP)||(LA32_17 >= DATABASE && LA32_17 <= DISTINCT)||LA32_17==DROP||(LA32_17 >= EACH && LA32_17 <= END)||(LA32_17 >= ESCAPE && LA32_17 <= EXCLUSIVE)||LA32_17==EXPLAIN||(LA32_17 >= FAIL && LA32_17 <= FLOAT)||(LA32_17 >= FOR && LA32_17 <= FROM)||LA32_17==GROUP||LA32_17==HAVING||LA32_17==ID||(LA32_17 >= IF && LA32_17 <= IMMEDIATE)||(LA32_17 >= INDEX && LA32_17 <= INTEGER)||(LA32_17 >= INTERSECT && LA32_17 <= INTO)||LA32_17==IS||LA32_17==JOIN||LA32_17==KEY||LA32_17==LEFT||LA32_17==LIMIT||LA32_17==LPAREN||(LA32_17 >= NATURAL && LA32_17 <= NOT)||LA32_17==NULL||(LA32_17 >= OF && LA32_17 <= ON)||(LA32_17 >= OR && LA32_17 <= ORDER)||LA32_17==OUTER||LA32_17==PLAN||(LA32_17 >= PRAGMA && LA32_17 <= PRIMARY)||(LA32_17 >= QUERY && LA32_17 <= QUESTION)||(LA32_17 >= RAISE && LA32_17 <= REFERENCES)||(LA32_17 >= REINDEX && LA32_17 <= ROW)||(LA32_17 >= SAVEPOINT && LA32_17 <= SELECT)||LA32_17==SET||LA32_17==STRING||LA32_17==TABLE||(LA32_17 >= TEMPORARY && LA32_17 <= THEN)||(LA32_17 >= TO && LA32_17 <= TRUE)||(LA32_17 >= UNION && LA32_17 <= USING)||(LA32_17 >= VACUUM && LA32_17 <= VIRTUAL)||(LA32_17 >= WHEN && LA32_17 <= WHERE)) ) {
                    alt32=2;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 32, 17, input);

                    throw nvae;

                }
                }
                break;
            case MINUS:
            case PLUS:
            case TILDA:
                {
                alt32=2;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 32, 0, input);

                throw nvae;

            }

            switch (alt32) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:229:14: unary_subexpr
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_unary_subexpr_in_con_subexpr965);
                    unary_subexpr109=unary_subexpr();

                    state._fsp--;

                    adaptor.addChild(root_0, unary_subexpr109.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:229:30: unary_op unary_subexpr
                    {
                    pushFollow(FOLLOW_unary_op_in_con_subexpr969);
                    unary_op110=unary_op();

                    state._fsp--;

                    stream_unary_op.add(unary_op110.getTree());

                    pushFollow(FOLLOW_unary_subexpr_in_con_subexpr971);
                    unary_subexpr111=unary_subexpr();

                    state._fsp--;

                    stream_unary_subexpr.add(unary_subexpr111.getTree());

                    // AST REWRITE
                    // elements: unary_subexpr, unary_op
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 229:53: -> ^( unary_op unary_subexpr )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:229:56: ^( unary_op unary_subexpr )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_unary_op.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_unary_subexpr.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "con_subexpr"


    public static class unary_op_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unary_op"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:231:1: unary_op : ( PLUS | MINUS | TILDA | NOT );
    public final SqlParser.unary_op_return unary_op() throws RecognitionException {
        SqlParser.unary_op_return retval = new SqlParser.unary_op_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set112=null;

        Object set112_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:231:9: ( PLUS | MINUS | TILDA | NOT )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
            {
            root_0 = (Object)adaptor.nil();


            set112=(Token)input.LT(1);

            if ( input.LA(1)==MINUS||input.LA(1)==NOT||input.LA(1)==PLUS||input.LA(1)==TILDA ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set112)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unary_op"


    public static class unary_subexpr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unary_subexpr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:233:1: unary_subexpr : atom_expr ( COLLATE ^collation_name= ID )? ;
    public final SqlParser.unary_subexpr_return unary_subexpr() throws RecognitionException {
        SqlParser.unary_subexpr_return retval = new SqlParser.unary_subexpr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token collation_name=null;
        Token COLLATE114=null;
        SqlParser.atom_expr_return atom_expr113 =null;


        Object collation_name_tree=null;
        Object COLLATE114_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:233:14: ( atom_expr ( COLLATE ^collation_name= ID )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:233:16: atom_expr ( COLLATE ^collation_name= ID )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_atom_expr_in_unary_subexpr1005);
            atom_expr113=atom_expr();

            state._fsp--;

            adaptor.addChild(root_0, atom_expr113.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:233:26: ( COLLATE ^collation_name= ID )?
            int alt33=2;
            alt33 = dfa33.predict(input);
            switch (alt33) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:233:27: COLLATE ^collation_name= ID
                    {
                    COLLATE114=(Token)match(input,COLLATE,FOLLOW_COLLATE_in_unary_subexpr1008); 
                    COLLATE114_tree = 
                    (Object)adaptor.create(COLLATE114)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(COLLATE114_tree, root_0);


                    collation_name=(Token)match(input,ID,FOLLOW_ID_in_unary_subexpr1013); 
                    collation_name_tree = 
                    (Object)adaptor.create(collation_name)
                    ;
                    adaptor.addChild(root_0, collation_name_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unary_subexpr"


    public static class atom_expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "atom_expr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:235:1: atom_expr : ( literal_value | bind_parameter | ( (database_name= id DOT )? table_name= id DOT )? column_name= ID -> ^( COLUMN_EXPRESSION ^( $column_name ( ^( $table_name ( $database_name)? ) )? ) ) |name= ID LPAREN ( ( DISTINCT )? args+= expr ( COMMA args+= expr )* | ASTERISK )? RPAREN -> ^( FUNCTION_EXPRESSION $name ( DISTINCT )? ( $args)* ( ASTERISK )? ) | LPAREN ! expr RPAREN !| CAST ^ LPAREN ! expr AS ! type_name RPAREN !| ( ( NOT )? EXISTS )? LPAREN select_stmt RPAREN | CASE (case_expr= expr )? ( when_expr )+ ( ELSE else_expr= expr )? END -> ^( CASE ( $case_expr)? ( when_expr )+ ( $else_expr)? ) | raise_function );
    public final SqlParser.atom_expr_return atom_expr() throws RecognitionException {
        SqlParser.atom_expr_return retval = new SqlParser.atom_expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token column_name=null;
        Token name=null;
        Token DOT117=null;
        Token DOT118=null;
        Token LPAREN119=null;
        Token DISTINCT120=null;
        Token COMMA121=null;
        Token ASTERISK122=null;
        Token RPAREN123=null;
        Token LPAREN124=null;
        Token RPAREN126=null;
        Token CAST127=null;
        Token LPAREN128=null;
        Token AS130=null;
        Token RPAREN132=null;
        Token NOT133=null;
        Token EXISTS134=null;
        Token LPAREN135=null;
        Token RPAREN137=null;
        Token CASE138=null;
        Token ELSE140=null;
        Token END141=null;
        List list_args=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.expr_return case_expr =null;

        SqlParser.expr_return else_expr =null;

        SqlParser.literal_value_return literal_value115 =null;

        SqlParser.bind_parameter_return bind_parameter116 =null;

        SqlParser.expr_return expr125 =null;

        SqlParser.expr_return expr129 =null;

        SqlParser.type_name_return type_name131 =null;

        SqlParser.select_stmt_return select_stmt136 =null;

        SqlParser.when_expr_return when_expr139 =null;

        SqlParser.raise_function_return raise_function142 =null;

        RuleReturnScope args = null;
        Object column_name_tree=null;
        Object name_tree=null;
        Object DOT117_tree=null;
        Object DOT118_tree=null;
        Object LPAREN119_tree=null;
        Object DISTINCT120_tree=null;
        Object COMMA121_tree=null;
        Object ASTERISK122_tree=null;
        Object RPAREN123_tree=null;
        Object LPAREN124_tree=null;
        Object RPAREN126_tree=null;
        Object CAST127_tree=null;
        Object LPAREN128_tree=null;
        Object AS130_tree=null;
        Object RPAREN132_tree=null;
        Object NOT133_tree=null;
        Object EXISTS134_tree=null;
        Object LPAREN135_tree=null;
        Object RPAREN137_tree=null;
        Object CASE138_tree=null;
        Object ELSE140_tree=null;
        Object END141_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_END=new RewriteRuleTokenStream(adaptor,"token END");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_DISTINCT=new RewriteRuleTokenStream(adaptor,"token DISTINCT");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleTokenStream stream_ELSE=new RewriteRuleTokenStream(adaptor,"token ELSE");
        RewriteRuleTokenStream stream_CASE=new RewriteRuleTokenStream(adaptor,"token CASE");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_when_expr=new RewriteRuleSubtreeStream(adaptor,"rule when_expr");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:236:3: ( literal_value | bind_parameter | ( (database_name= id DOT )? table_name= id DOT )? column_name= ID -> ^( COLUMN_EXPRESSION ^( $column_name ( ^( $table_name ( $database_name)? ) )? ) ) |name= ID LPAREN ( ( DISTINCT )? args+= expr ( COMMA args+= expr )* | ASTERISK )? RPAREN -> ^( FUNCTION_EXPRESSION $name ( DISTINCT )? ( $args)* ( ASTERISK )? ) | LPAREN ! expr RPAREN !| CAST ^ LPAREN ! expr AS ! type_name RPAREN !| ( ( NOT )? EXISTS )? LPAREN select_stmt RPAREN | CASE (case_expr= expr )? ( when_expr )+ ( ELSE else_expr= expr )? END -> ^( CASE ( $case_expr)? ( when_expr )+ ( $else_expr)? ) | raise_function )
            int alt44=9;
            alt44 = dfa44.predict(input);
            switch (alt44) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:236:5: literal_value
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_literal_value_in_atom_expr1025);
                    literal_value115=literal_value();

                    state._fsp--;

                    adaptor.addChild(root_0, literal_value115.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:237:5: bind_parameter
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_bind_parameter_in_atom_expr1031);
                    bind_parameter116=bind_parameter();

                    state._fsp--;

                    adaptor.addChild(root_0, bind_parameter116.getTree());

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:5: ( (database_name= id DOT )? table_name= id DOT )? column_name= ID
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:5: ( (database_name= id DOT )? table_name= id DOT )?
                    int alt35=2;
                    int LA35_0 = input.LA(1);

                    if ( (LA35_0==ID) ) {
                        int LA35_1 = input.LA(2);

                        if ( (LA35_1==DOT) ) {
                            alt35=1;
                        }
                    }
                    else if ( ((LA35_0 >= ABORT && LA35_0 <= AFTER)||(LA35_0 >= ALL && LA35_0 <= ALTER)||(LA35_0 >= ANALYZE && LA35_0 <= AND)||(LA35_0 >= AS && LA35_0 <= ASC)||(LA35_0 >= ATTACH && LA35_0 <= AUTOINCREMENT)||(LA35_0 >= BEFORE && LA35_0 <= BETWEEN)||LA35_0==BY||(LA35_0 >= CASCADE && LA35_0 <= COLLATE)||LA35_0==COLUMN||(LA35_0 >= COMMIT && LA35_0 <= CONSTRAINT)||LA35_0==CREATE||(LA35_0 >= CROSS && LA35_0 <= CURRENT_TIMESTAMP)||(LA35_0 >= DATABASE && LA35_0 <= DISTINCT)||LA35_0==DROP||(LA35_0 >= EACH && LA35_0 <= END)||(LA35_0 >= ESCAPE && LA35_0 <= EXPLAIN)||LA35_0==FAIL||(LA35_0 >= FOR && LA35_0 <= FROM)||LA35_0==GROUP||LA35_0==HAVING||(LA35_0 >= IF && LA35_0 <= IMMEDIATE)||(LA35_0 >= INDEX && LA35_0 <= INSTEAD)||(LA35_0 >= INTERSECT && LA35_0 <= INTO)||LA35_0==IS||LA35_0==JOIN||LA35_0==KEY||LA35_0==LEFT||LA35_0==LIMIT||LA35_0==NATURAL||LA35_0==NULL||(LA35_0 >= OF && LA35_0 <= ON)||(LA35_0 >= OR && LA35_0 <= ORDER)||LA35_0==OUTER||LA35_0==PLAN||(LA35_0 >= PRAGMA && LA35_0 <= PRIMARY)||LA35_0==QUERY||(LA35_0 >= RAISE && LA35_0 <= REFERENCES)||(LA35_0 >= REINDEX && LA35_0 <= ROW)||(LA35_0 >= SAVEPOINT && LA35_0 <= SELECT)||LA35_0==SET||LA35_0==STRING||LA35_0==TABLE||(LA35_0 >= TEMPORARY && LA35_0 <= THEN)||(LA35_0 >= TO && LA35_0 <= TRIGGER)||(LA35_0 >= UNION && LA35_0 <= USING)||(LA35_0 >= VACUUM && LA35_0 <= VIRTUAL)||(LA35_0 >= WHEN && LA35_0 <= WHERE)) ) {
                        alt35=1;
                    }
                    switch (alt35) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:6: (database_name= id DOT )? table_name= id DOT
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:6: (database_name= id DOT )?
                            int alt34=2;
                            alt34 = dfa34.predict(input);
                            switch (alt34) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:7: database_name= id DOT
                                    {
                                    pushFollow(FOLLOW_id_in_atom_expr1041);
                                    database_name=id();

                                    state._fsp--;

                                    stream_id.add(database_name.getTree());

                                    DOT117=(Token)match(input,DOT,FOLLOW_DOT_in_atom_expr1043);  
                                    stream_DOT.add(DOT117);


                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_id_in_atom_expr1049);
                            table_name=id();

                            state._fsp--;

                            stream_id.add(table_name.getTree());

                            DOT118=(Token)match(input,DOT,FOLLOW_DOT_in_atom_expr1051);  
                            stream_DOT.add(DOT118);


                            }
                            break;

                    }


                    column_name=(Token)match(input,ID,FOLLOW_ID_in_atom_expr1057);  
                    stream_ID.add(column_name);


                    // AST REWRITE
                    // elements: column_name, database_name, table_name
                    // token labels: column_name
                    // rule labels: database_name, retval, table_name
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleTokenStream stream_column_name=new RewriteRuleTokenStream(adaptor,"token column_name",column_name);
                    RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 238:65: -> ^( COLUMN_EXPRESSION ^( $column_name ( ^( $table_name ( $database_name)? ) )? ) )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:68: ^( COLUMN_EXPRESSION ^( $column_name ( ^( $table_name ( $database_name)? ) )? ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(COLUMN_EXPRESSION, "COLUMN_EXPRESSION")
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:88: ^( $column_name ( ^( $table_name ( $database_name)? ) )? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_column_name.nextNode(), root_2);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:103: ( ^( $table_name ( $database_name)? ) )?
                        if ( stream_database_name.hasNext()||stream_table_name.hasNext() ) {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:103: ^( $table_name ( $database_name)? )
                            {
                            Object root_3 = (Object)adaptor.nil();
                            root_3 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_3);

                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:238:118: ( $database_name)?
                            if ( stream_database_name.hasNext() ) {
                                adaptor.addChild(root_3, stream_database_name.nextTree());

                            }
                            stream_database_name.reset();

                            adaptor.addChild(root_2, root_3);
                            }

                        }
                        stream_database_name.reset();
                        stream_table_name.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:5: name= ID LPAREN ( ( DISTINCT )? args+= expr ( COMMA args+= expr )* | ASTERISK )? RPAREN
                    {
                    name=(Token)match(input,ID,FOLLOW_ID_in_atom_expr1086);  
                    stream_ID.add(name);


                    LPAREN119=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_atom_expr1088);  
                    stream_LPAREN.add(LPAREN119);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:20: ( ( DISTINCT )? args+= expr ( COMMA args+= expr )* | ASTERISK )?
                    int alt38=3;
                    int LA38_0 = input.LA(1);

                    if ( ((LA38_0 >= ABORT && LA38_0 <= AFTER)||(LA38_0 >= ALL && LA38_0 <= ALTER)||(LA38_0 >= ANALYZE && LA38_0 <= AND)||(LA38_0 >= AS && LA38_0 <= ASC)||(LA38_0 >= AT && LA38_0 <= AUTOINCREMENT)||(LA38_0 >= BEFORE && LA38_0 <= BETWEEN)||LA38_0==BLOB||LA38_0==BY||(LA38_0 >= CASCADE && LA38_0 <= COLUMN)||(LA38_0 >= COMMIT && LA38_0 <= CONSTRAINT)||LA38_0==CREATE||(LA38_0 >= CROSS && LA38_0 <= CURRENT_TIMESTAMP)||(LA38_0 >= DATABASE && LA38_0 <= DISTINCT)||LA38_0==DROP||(LA38_0 >= EACH && LA38_0 <= END)||(LA38_0 >= ESCAPE && LA38_0 <= EXPLAIN)||(LA38_0 >= FAIL && LA38_0 <= FLOAT)||(LA38_0 >= FOR && LA38_0 <= FROM)||LA38_0==GROUP||LA38_0==HAVING||LA38_0==ID||(LA38_0 >= IF && LA38_0 <= IMMEDIATE)||(LA38_0 >= INDEX && LA38_0 <= INTEGER)||(LA38_0 >= INTERSECT && LA38_0 <= INTO)||LA38_0==IS||LA38_0==JOIN||LA38_0==KEY||LA38_0==LEFT||LA38_0==LIMIT||LA38_0==LPAREN||LA38_0==MINUS||(LA38_0 >= NATURAL && LA38_0 <= NOT)||LA38_0==NULL||(LA38_0 >= OF && LA38_0 <= ON)||(LA38_0 >= OR && LA38_0 <= ORDER)||LA38_0==OUTER||(LA38_0 >= PLAN && LA38_0 <= PRIMARY)||(LA38_0 >= QUERY && LA38_0 <= QUESTION)||(LA38_0 >= RAISE && LA38_0 <= REFERENCES)||(LA38_0 >= REINDEX && LA38_0 <= ROW)||(LA38_0 >= SAVEPOINT && LA38_0 <= SELECT)||LA38_0==SET||LA38_0==STRING||LA38_0==TABLE||(LA38_0 >= TEMPORARY && LA38_0 <= TRUE)||(LA38_0 >= UNION && LA38_0 <= USING)||(LA38_0 >= VACUUM && LA38_0 <= VIRTUAL)||(LA38_0 >= WHEN && LA38_0 <= WHERE)) ) {
                        alt38=1;
                    }
                    else if ( (LA38_0==ASTERISK) ) {
                        alt38=2;
                    }
                    switch (alt38) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:21: ( DISTINCT )? args+= expr ( COMMA args+= expr )*
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:21: ( DISTINCT )?
                            int alt36=2;
                            int LA36_0 = input.LA(1);

                            if ( (LA36_0==DISTINCT) ) {
                                int LA36_1 = input.LA(2);

                                if ( ((LA36_1 >= ABORT && LA36_1 <= AFTER)||(LA36_1 >= ALL && LA36_1 <= ALTER)||(LA36_1 >= ANALYZE && LA36_1 <= AND)||(LA36_1 >= AS && LA36_1 <= ASC)||(LA36_1 >= AT && LA36_1 <= AUTOINCREMENT)||(LA36_1 >= BEFORE && LA36_1 <= BETWEEN)||LA36_1==BLOB||LA36_1==BY||(LA36_1 >= CASCADE && LA36_1 <= COLUMN)||(LA36_1 >= COMMIT && LA36_1 <= CONSTRAINT)||LA36_1==CREATE||(LA36_1 >= CROSS && LA36_1 <= CURRENT_TIMESTAMP)||(LA36_1 >= DATABASE && LA36_1 <= DISTINCT)||LA36_1==DROP||(LA36_1 >= EACH && LA36_1 <= END)||(LA36_1 >= ESCAPE && LA36_1 <= EXPLAIN)||(LA36_1 >= FAIL && LA36_1 <= FLOAT)||(LA36_1 >= FOR && LA36_1 <= FROM)||LA36_1==GROUP||LA36_1==HAVING||LA36_1==ID||(LA36_1 >= IF && LA36_1 <= IMMEDIATE)||(LA36_1 >= INDEX && LA36_1 <= INTEGER)||(LA36_1 >= INTERSECT && LA36_1 <= INTO)||LA36_1==IS||LA36_1==JOIN||LA36_1==KEY||LA36_1==LEFT||LA36_1==LIMIT||LA36_1==LPAREN||LA36_1==MINUS||(LA36_1 >= NATURAL && LA36_1 <= NOT)||LA36_1==NULL||(LA36_1 >= OF && LA36_1 <= ON)||(LA36_1 >= OR && LA36_1 <= ORDER)||LA36_1==OUTER||(LA36_1 >= PLAN && LA36_1 <= PRIMARY)||(LA36_1 >= QUERY && LA36_1 <= QUESTION)||(LA36_1 >= RAISE && LA36_1 <= REFERENCES)||(LA36_1 >= REINDEX && LA36_1 <= ROW)||(LA36_1 >= SAVEPOINT && LA36_1 <= SELECT)||LA36_1==SET||LA36_1==STRING||LA36_1==TABLE||(LA36_1 >= TEMPORARY && LA36_1 <= TRUE)||(LA36_1 >= UNION && LA36_1 <= USING)||(LA36_1 >= VACUUM && LA36_1 <= VIRTUAL)||(LA36_1 >= WHEN && LA36_1 <= WHERE)) ) {
                                    alt36=1;
                                }
                            }
                            switch (alt36) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:21: DISTINCT
                                    {
                                    DISTINCT120=(Token)match(input,DISTINCT,FOLLOW_DISTINCT_in_atom_expr1091);  
                                    stream_DISTINCT.add(DISTINCT120);


                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_expr_in_atom_expr1096);
                            args=expr();

                            state._fsp--;

                            stream_expr.add(args.getTree());
                            if (list_args==null) list_args=new ArrayList();
                            list_args.add(args.getTree());


                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:42: ( COMMA args+= expr )*
                            loop37:
                            do {
                                int alt37=2;
                                int LA37_0 = input.LA(1);

                                if ( (LA37_0==COMMA) ) {
                                    alt37=1;
                                }


                                switch (alt37) {
                            	case 1 :
                            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:43: COMMA args+= expr
                            	    {
                            	    COMMA121=(Token)match(input,COMMA,FOLLOW_COMMA_in_atom_expr1099);  
                            	    stream_COMMA.add(COMMA121);


                            	    pushFollow(FOLLOW_expr_in_atom_expr1103);
                            	    args=expr();

                            	    state._fsp--;

                            	    stream_expr.add(args.getTree());
                            	    if (list_args==null) list_args=new ArrayList();
                            	    list_args.add(args.getTree());


                            	    }
                            	    break;

                            	default :
                            	    break loop37;
                                }
                            } while (true);


                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:64: ASTERISK
                            {
                            ASTERISK122=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_atom_expr1109);  
                            stream_ASTERISK.add(ASTERISK122);


                            }
                            break;

                    }


                    RPAREN123=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_atom_expr1113);  
                    stream_RPAREN.add(RPAREN123);


                    // AST REWRITE
                    // elements: ASTERISK, args, name, DISTINCT
                    // token labels: name
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: args
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleTokenStream stream_name=new RewriteRuleTokenStream(adaptor,"token name",name);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_args=new RewriteRuleSubtreeStream(adaptor,"token args",list_args);
                    root_0 = (Object)adaptor.nil();
                    // 239:82: -> ^( FUNCTION_EXPRESSION $name ( DISTINCT )? ( $args)* ( ASTERISK )? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:85: ^( FUNCTION_EXPRESSION $name ( DISTINCT )? ( $args)* ( ASTERISK )? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FUNCTION_EXPRESSION, "FUNCTION_EXPRESSION")
                        , root_1);

                        adaptor.addChild(root_1, stream_name.nextNode());

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:113: ( DISTINCT )?
                        if ( stream_DISTINCT.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_DISTINCT.nextNode()
                            );

                        }
                        stream_DISTINCT.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:124: ( $args)*
                        while ( stream_args.hasNext() ) {
                            adaptor.addChild(root_1, stream_args.nextTree());

                        }
                        stream_args.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:239:130: ( ASTERISK )?
                        if ( stream_ASTERISK.hasNext() ) {
                            adaptor.addChild(root_1, 
                            stream_ASTERISK.nextNode()
                            );

                        }
                        stream_ASTERISK.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 5 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:240:5: LPAREN ! expr RPAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LPAREN124=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_atom_expr1138); 

                    pushFollow(FOLLOW_expr_in_atom_expr1141);
                    expr125=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr125.getTree());

                    RPAREN126=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_atom_expr1143); 

                    }
                    break;
                case 6 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:241:5: CAST ^ LPAREN ! expr AS ! type_name RPAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    CAST127=(Token)match(input,CAST,FOLLOW_CAST_in_atom_expr1150); 
                    CAST127_tree = 
                    (Object)adaptor.create(CAST127)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(CAST127_tree, root_0);


                    LPAREN128=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_atom_expr1153); 

                    pushFollow(FOLLOW_expr_in_atom_expr1156);
                    expr129=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr129.getTree());

                    AS130=(Token)match(input,AS,FOLLOW_AS_in_atom_expr1158); 

                    pushFollow(FOLLOW_type_name_in_atom_expr1161);
                    type_name131=type_name();

                    state._fsp--;

                    adaptor.addChild(root_0, type_name131.getTree());

                    RPAREN132=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_atom_expr1163); 

                    }
                    break;
                case 7 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:242:5: ( ( NOT )? EXISTS )? LPAREN select_stmt RPAREN
                    {
                    root_0 = (Object)adaptor.nil();


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:242:5: ( ( NOT )? EXISTS )?
                    int alt40=2;
                    int LA40_0 = input.LA(1);

                    if ( (LA40_0==EXISTS||LA40_0==NOT) ) {
                        alt40=1;
                    }
                    switch (alt40) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:242:6: ( NOT )? EXISTS
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:242:6: ( NOT )?
                            int alt39=2;
                            int LA39_0 = input.LA(1);

                            if ( (LA39_0==NOT) ) {
                                alt39=1;
                            }
                            switch (alt39) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:242:7: NOT
                                    {
                                    NOT133=(Token)match(input,NOT,FOLLOW_NOT_in_atom_expr1172); 
                                    NOT133_tree = 
                                    (Object)adaptor.create(NOT133)
                                    ;
                                    adaptor.addChild(root_0, NOT133_tree);


                                    }
                                    break;

                            }


                            EXISTS134=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_atom_expr1176); 
                            EXISTS134_tree = 
                            (Object)adaptor.create(EXISTS134)
                            ;
                            adaptor.addChild(root_0, EXISTS134_tree);


                            }
                            break;

                    }


                    LPAREN135=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_atom_expr1180); 
                    LPAREN135_tree = 
                    (Object)adaptor.create(LPAREN135)
                    ;
                    adaptor.addChild(root_0, LPAREN135_tree);


                    pushFollow(FOLLOW_select_stmt_in_atom_expr1182);
                    select_stmt136=select_stmt();

                    state._fsp--;

                    adaptor.addChild(root_0, select_stmt136.getTree());

                    RPAREN137=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_atom_expr1184); 
                    RPAREN137_tree = 
                    (Object)adaptor.create(RPAREN137)
                    ;
                    adaptor.addChild(root_0, RPAREN137_tree);


                    }
                    break;
                case 8 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:5: CASE (case_expr= expr )? ( when_expr )+ ( ELSE else_expr= expr )? END
                    {
                    CASE138=(Token)match(input,CASE,FOLLOW_CASE_in_atom_expr1190);  
                    stream_CASE.add(CASE138);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:10: (case_expr= expr )?
                    int alt41=2;
                    int LA41_0 = input.LA(1);

                    if ( ((LA41_0 >= ABORT && LA41_0 <= AFTER)||(LA41_0 >= ALL && LA41_0 <= ALTER)||(LA41_0 >= ANALYZE && LA41_0 <= AND)||(LA41_0 >= AS && LA41_0 <= ASC)||(LA41_0 >= AT && LA41_0 <= AUTOINCREMENT)||(LA41_0 >= BEFORE && LA41_0 <= BETWEEN)||LA41_0==BLOB||LA41_0==BY||(LA41_0 >= CASCADE && LA41_0 <= COLUMN)||(LA41_0 >= COMMIT && LA41_0 <= CONSTRAINT)||LA41_0==CREATE||(LA41_0 >= CROSS && LA41_0 <= CURRENT_TIMESTAMP)||(LA41_0 >= DATABASE && LA41_0 <= DISTINCT)||LA41_0==DROP||(LA41_0 >= EACH && LA41_0 <= END)||(LA41_0 >= ESCAPE && LA41_0 <= EXPLAIN)||(LA41_0 >= FAIL && LA41_0 <= FLOAT)||(LA41_0 >= FOR && LA41_0 <= FROM)||LA41_0==GROUP||LA41_0==HAVING||LA41_0==ID||(LA41_0 >= IF && LA41_0 <= IMMEDIATE)||(LA41_0 >= INDEX && LA41_0 <= INTEGER)||(LA41_0 >= INTERSECT && LA41_0 <= INTO)||LA41_0==IS||LA41_0==JOIN||LA41_0==KEY||LA41_0==LEFT||LA41_0==LIMIT||LA41_0==LPAREN||LA41_0==MINUS||(LA41_0 >= NATURAL && LA41_0 <= NOT)||LA41_0==NULL||(LA41_0 >= OF && LA41_0 <= ON)||(LA41_0 >= OR && LA41_0 <= ORDER)||LA41_0==OUTER||(LA41_0 >= PLAN && LA41_0 <= PRIMARY)||(LA41_0 >= QUERY && LA41_0 <= QUESTION)||(LA41_0 >= RAISE && LA41_0 <= REFERENCES)||(LA41_0 >= REINDEX && LA41_0 <= ROW)||(LA41_0 >= SAVEPOINT && LA41_0 <= SELECT)||LA41_0==SET||LA41_0==STRING||LA41_0==TABLE||(LA41_0 >= TEMPORARY && LA41_0 <= TRUE)||(LA41_0 >= UNION && LA41_0 <= USING)||(LA41_0 >= VACUUM && LA41_0 <= VIRTUAL)||LA41_0==WHERE) ) {
                        alt41=1;
                    }
                    else if ( (LA41_0==WHEN) ) {
                        int LA41_20 = input.LA(2);

                        if ( (LA41_20==DOT) ) {
                            alt41=1;
                        }
                    }
                    switch (alt41) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:11: case_expr= expr
                            {
                            pushFollow(FOLLOW_expr_in_atom_expr1195);
                            case_expr=expr();

                            state._fsp--;

                            stream_expr.add(case_expr.getTree());

                            }
                            break;

                    }


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:28: ( when_expr )+
                    int cnt42=0;
                    loop42:
                    do {
                        int alt42=2;
                        int LA42_0 = input.LA(1);

                        if ( (LA42_0==WHEN) ) {
                            alt42=1;
                        }


                        switch (alt42) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:28: when_expr
                    	    {
                    	    pushFollow(FOLLOW_when_expr_in_atom_expr1199);
                    	    when_expr139=when_expr();

                    	    state._fsp--;

                    	    stream_when_expr.add(when_expr139.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt42 >= 1 ) break loop42;
                                EarlyExitException eee =
                                    new EarlyExitException(42, input);
                                throw eee;
                        }
                        cnt42++;
                    } while (true);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:39: ( ELSE else_expr= expr )?
                    int alt43=2;
                    int LA43_0 = input.LA(1);

                    if ( (LA43_0==ELSE) ) {
                        alt43=1;
                    }
                    switch (alt43) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:40: ELSE else_expr= expr
                            {
                            ELSE140=(Token)match(input,ELSE,FOLLOW_ELSE_in_atom_expr1203);  
                            stream_ELSE.add(ELSE140);


                            pushFollow(FOLLOW_expr_in_atom_expr1207);
                            else_expr=expr();

                            state._fsp--;

                            stream_expr.add(else_expr.getTree());

                            }
                            break;

                    }


                    END141=(Token)match(input,END,FOLLOW_END_in_atom_expr1211);  
                    stream_END.add(END141);


                    // AST REWRITE
                    // elements: case_expr, when_expr, else_expr, CASE
                    // token labels: 
                    // rule labels: retval, case_expr, else_expr
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_case_expr=new RewriteRuleSubtreeStream(adaptor,"rule case_expr",case_expr!=null?case_expr.tree:null);
                    RewriteRuleSubtreeStream stream_else_expr=new RewriteRuleSubtreeStream(adaptor,"rule else_expr",else_expr!=null?else_expr.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 243:66: -> ^( CASE ( $case_expr)? ( when_expr )+ ( $else_expr)? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:69: ^( CASE ( $case_expr)? ( when_expr )+ ( $else_expr)? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        stream_CASE.nextNode()
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:77: ( $case_expr)?
                        if ( stream_case_expr.hasNext() ) {
                            adaptor.addChild(root_1, stream_case_expr.nextTree());

                        }
                        stream_case_expr.reset();

                        if ( !(stream_when_expr.hasNext()) ) {
                            throw new RewriteEarlyExitException();
                        }
                        while ( stream_when_expr.hasNext() ) {
                            adaptor.addChild(root_1, stream_when_expr.nextTree());

                        }
                        stream_when_expr.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:243:100: ( $else_expr)?
                        if ( stream_else_expr.hasNext() ) {
                            adaptor.addChild(root_1, stream_else_expr.nextTree());

                        }
                        stream_else_expr.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 9 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:244:5: raise_function
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_raise_function_in_atom_expr1234);
                    raise_function142=raise_function();

                    state._fsp--;

                    adaptor.addChild(root_0, raise_function142.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "atom_expr"


    public static class when_expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "when_expr"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:247:1: when_expr : WHEN e1= expr THEN e2= expr -> ^( WHEN $e1 $e2) ;
    public final SqlParser.when_expr_return when_expr() throws RecognitionException {
        SqlParser.when_expr_return retval = new SqlParser.when_expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token WHEN143=null;
        Token THEN144=null;
        SqlParser.expr_return e1 =null;

        SqlParser.expr_return e2 =null;


        Object WHEN143_tree=null;
        Object THEN144_tree=null;
        RewriteRuleTokenStream stream_THEN=new RewriteRuleTokenStream(adaptor,"token THEN");
        RewriteRuleTokenStream stream_WHEN=new RewriteRuleTokenStream(adaptor,"token WHEN");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:247:10: ( WHEN e1= expr THEN e2= expr -> ^( WHEN $e1 $e2) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:247:12: WHEN e1= expr THEN e2= expr
            {
            WHEN143=(Token)match(input,WHEN,FOLLOW_WHEN_in_when_expr1244);  
            stream_WHEN.add(WHEN143);


            pushFollow(FOLLOW_expr_in_when_expr1248);
            e1=expr();

            state._fsp--;

            stream_expr.add(e1.getTree());

            THEN144=(Token)match(input,THEN,FOLLOW_THEN_in_when_expr1250);  
            stream_THEN.add(THEN144);


            pushFollow(FOLLOW_expr_in_when_expr1254);
            e2=expr();

            state._fsp--;

            stream_expr.add(e2.getTree());

            // AST REWRITE
            // elements: WHEN, e1, e2
            // token labels: 
            // rule labels: retval, e1, e2
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_e1=new RewriteRuleSubtreeStream(adaptor,"rule e1",e1!=null?e1.tree:null);
            RewriteRuleSubtreeStream stream_e2=new RewriteRuleSubtreeStream(adaptor,"rule e2",e2!=null?e2.tree:null);

            root_0 = (Object)adaptor.nil();
            // 247:38: -> ^( WHEN $e1 $e2)
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:247:41: ^( WHEN $e1 $e2)
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_WHEN.nextNode()
                , root_1);

                adaptor.addChild(root_1, stream_e1.nextTree());

                adaptor.addChild(root_1, stream_e2.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "when_expr"


    public static class literal_value_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "literal_value"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:249:1: literal_value : ( INTEGER -> ^( INTEGER_LITERAL INTEGER ) | FLOAT -> ^( FLOAT_LITERAL FLOAT ) | STRING -> ^( STRING_LITERAL STRING ) | BLOB -> ^( BLOB_LITERAL BLOB ) | NULL | CURRENT_TIME -> ^( FUNCTION_LITERAL CURRENT_TIME ) | CURRENT_DATE -> ^( FUNCTION_LITERAL CURRENT_DATE ) | CURRENT_TIMESTAMP -> ^( FUNCTION_LITERAL CURRENT_TIMESTAMP ) | bool );
    public final SqlParser.literal_value_return literal_value() throws RecognitionException {
        SqlParser.literal_value_return retval = new SqlParser.literal_value_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token INTEGER145=null;
        Token FLOAT146=null;
        Token STRING147=null;
        Token BLOB148=null;
        Token NULL149=null;
        Token CURRENT_TIME150=null;
        Token CURRENT_DATE151=null;
        Token CURRENT_TIMESTAMP152=null;
        SqlParser.bool_return bool153 =null;


        Object INTEGER145_tree=null;
        Object FLOAT146_tree=null;
        Object STRING147_tree=null;
        Object BLOB148_tree=null;
        Object NULL149_tree=null;
        Object CURRENT_TIME150_tree=null;
        Object CURRENT_DATE151_tree=null;
        Object CURRENT_TIMESTAMP152_tree=null;
        RewriteRuleTokenStream stream_INTEGER=new RewriteRuleTokenStream(adaptor,"token INTEGER");
        RewriteRuleTokenStream stream_BLOB=new RewriteRuleTokenStream(adaptor,"token BLOB");
        RewriteRuleTokenStream stream_FLOAT=new RewriteRuleTokenStream(adaptor,"token FLOAT");
        RewriteRuleTokenStream stream_CURRENT_TIMESTAMP=new RewriteRuleTokenStream(adaptor,"token CURRENT_TIMESTAMP");
        RewriteRuleTokenStream stream_CURRENT_DATE=new RewriteRuleTokenStream(adaptor,"token CURRENT_DATE");
        RewriteRuleTokenStream stream_CURRENT_TIME=new RewriteRuleTokenStream(adaptor,"token CURRENT_TIME");
        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:250:3: ( INTEGER -> ^( INTEGER_LITERAL INTEGER ) | FLOAT -> ^( FLOAT_LITERAL FLOAT ) | STRING -> ^( STRING_LITERAL STRING ) | BLOB -> ^( BLOB_LITERAL BLOB ) | NULL | CURRENT_TIME -> ^( FUNCTION_LITERAL CURRENT_TIME ) | CURRENT_DATE -> ^( FUNCTION_LITERAL CURRENT_DATE ) | CURRENT_TIMESTAMP -> ^( FUNCTION_LITERAL CURRENT_TIMESTAMP ) | bool )
            int alt45=9;
            switch ( input.LA(1) ) {
            case INTEGER:
                {
                alt45=1;
                }
                break;
            case FLOAT:
                {
                alt45=2;
                }
                break;
            case STRING:
                {
                alt45=3;
                }
                break;
            case BLOB:
                {
                alt45=4;
                }
                break;
            case NULL:
                {
                alt45=5;
                }
                break;
            case CURRENT_TIME:
                {
                alt45=6;
                }
                break;
            case CURRENT_DATE:
                {
                alt45=7;
                }
                break;
            case CURRENT_TIMESTAMP:
                {
                alt45=8;
                }
                break;
            case FALSE:
            case TRUE:
                {
                alt45=9;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;

            }

            switch (alt45) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:250:5: INTEGER
                    {
                    INTEGER145=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_literal_value1276);  
                    stream_INTEGER.add(INTEGER145);


                    // AST REWRITE
                    // elements: INTEGER
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 250:13: -> ^( INTEGER_LITERAL INTEGER )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:250:16: ^( INTEGER_LITERAL INTEGER )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(INTEGER_LITERAL, "INTEGER_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_INTEGER.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:251:5: FLOAT
                    {
                    FLOAT146=(Token)match(input,FLOAT,FOLLOW_FLOAT_in_literal_value1290);  
                    stream_FLOAT.add(FLOAT146);


                    // AST REWRITE
                    // elements: FLOAT
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 251:11: -> ^( FLOAT_LITERAL FLOAT )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:251:14: ^( FLOAT_LITERAL FLOAT )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FLOAT_LITERAL, "FLOAT_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_FLOAT.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:252:5: STRING
                    {
                    STRING147=(Token)match(input,STRING,FOLLOW_STRING_in_literal_value1304);  
                    stream_STRING.add(STRING147);


                    // AST REWRITE
                    // elements: STRING
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 252:12: -> ^( STRING_LITERAL STRING )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:252:15: ^( STRING_LITERAL STRING )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(STRING_LITERAL, "STRING_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_STRING.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:253:5: BLOB
                    {
                    BLOB148=(Token)match(input,BLOB,FOLLOW_BLOB_in_literal_value1318);  
                    stream_BLOB.add(BLOB148);


                    // AST REWRITE
                    // elements: BLOB
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 253:10: -> ^( BLOB_LITERAL BLOB )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:253:13: ^( BLOB_LITERAL BLOB )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(BLOB_LITERAL, "BLOB_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_BLOB.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 5 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:254:5: NULL
                    {
                    root_0 = (Object)adaptor.nil();


                    NULL149=(Token)match(input,NULL,FOLLOW_NULL_in_literal_value1332); 
                    NULL149_tree = 
                    (Object)adaptor.create(NULL149)
                    ;
                    adaptor.addChild(root_0, NULL149_tree);


                    }
                    break;
                case 6 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:255:5: CURRENT_TIME
                    {
                    CURRENT_TIME150=(Token)match(input,CURRENT_TIME,FOLLOW_CURRENT_TIME_in_literal_value1338);  
                    stream_CURRENT_TIME.add(CURRENT_TIME150);


                    // AST REWRITE
                    // elements: CURRENT_TIME
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 255:18: -> ^( FUNCTION_LITERAL CURRENT_TIME )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:255:21: ^( FUNCTION_LITERAL CURRENT_TIME )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FUNCTION_LITERAL, "FUNCTION_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_CURRENT_TIME.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 7 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:256:5: CURRENT_DATE
                    {
                    CURRENT_DATE151=(Token)match(input,CURRENT_DATE,FOLLOW_CURRENT_DATE_in_literal_value1352);  
                    stream_CURRENT_DATE.add(CURRENT_DATE151);


                    // AST REWRITE
                    // elements: CURRENT_DATE
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 256:18: -> ^( FUNCTION_LITERAL CURRENT_DATE )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:256:21: ^( FUNCTION_LITERAL CURRENT_DATE )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FUNCTION_LITERAL, "FUNCTION_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_CURRENT_DATE.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 8 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:257:5: CURRENT_TIMESTAMP
                    {
                    CURRENT_TIMESTAMP152=(Token)match(input,CURRENT_TIMESTAMP,FOLLOW_CURRENT_TIMESTAMP_in_literal_value1366);  
                    stream_CURRENT_TIMESTAMP.add(CURRENT_TIMESTAMP152);


                    // AST REWRITE
                    // elements: CURRENT_TIMESTAMP
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 257:23: -> ^( FUNCTION_LITERAL CURRENT_TIMESTAMP )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:257:26: ^( FUNCTION_LITERAL CURRENT_TIMESTAMP )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FUNCTION_LITERAL, "FUNCTION_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_CURRENT_TIMESTAMP.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 9 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:258:5: bool
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_bool_in_literal_value1380);
                    bool153=bool();

                    state._fsp--;

                    adaptor.addChild(root_0, bool153.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "literal_value"


    public static class bind_parameter_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "bind_parameter"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:261:1: bind_parameter : ( QUESTION -> BIND | QUESTION position= INTEGER -> ^( BIND $position) | COLON name= id -> ^( BIND_NAME $name) | AT name= id -> ^( BIND_NAME $name) );
    public final SqlParser.bind_parameter_return bind_parameter() throws RecognitionException {
        SqlParser.bind_parameter_return retval = new SqlParser.bind_parameter_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token position=null;
        Token QUESTION154=null;
        Token QUESTION155=null;
        Token COLON156=null;
        Token AT157=null;
        SqlParser.id_return name =null;


        Object position_tree=null;
        Object QUESTION154_tree=null;
        Object QUESTION155_tree=null;
        Object COLON156_tree=null;
        Object AT157_tree=null;
        RewriteRuleTokenStream stream_AT=new RewriteRuleTokenStream(adaptor,"token AT");
        RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
        RewriteRuleTokenStream stream_INTEGER=new RewriteRuleTokenStream(adaptor,"token INTEGER");
        RewriteRuleTokenStream stream_QUESTION=new RewriteRuleTokenStream(adaptor,"token QUESTION");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:262:3: ( QUESTION -> BIND | QUESTION position= INTEGER -> ^( BIND $position) | COLON name= id -> ^( BIND_NAME $name) | AT name= id -> ^( BIND_NAME $name) )
            int alt46=4;
            switch ( input.LA(1) ) {
            case QUESTION:
                {
                int LA46_1 = input.LA(2);

                if ( (LA46_1==INTEGER) ) {
                    alt46=2;
                }
                else if ( (LA46_1==EOF||(LA46_1 >= ABORT && LA46_1 <= AFTER)||(LA46_1 >= ALL && LA46_1 <= AND)||(LA46_1 >= AS && LA46_1 <= ASTERISK)||(LA46_1 >= ATTACH && LA46_1 <= AUTOINCREMENT)||(LA46_1 >= BEFORE && LA46_1 <= BETWEEN)||LA46_1==BY||(LA46_1 >= CASCADE && LA46_1 <= COLLATE)||LA46_1==COLUMN||LA46_1==COMMA||(LA46_1 >= COMMIT && LA46_1 <= CONSTRAINT)||LA46_1==CREATE||(LA46_1 >= CROSS && LA46_1 <= CURRENT_TIMESTAMP)||(LA46_1 >= DATABASE && LA46_1 <= DISTINCT)||(LA46_1 >= DOUBLE_PIPE && LA46_1 <= DROP)||(LA46_1 >= EACH && LA46_1 <= EXPLAIN)||LA46_1==FAIL||(LA46_1 >= FOR && LA46_1 <= FROM)||(LA46_1 >= GLOB && LA46_1 <= GROUP)||LA46_1==HAVING||LA46_1==ID||(LA46_1 >= IF && LA46_1 <= INSTEAD)||(LA46_1 >= INTERSECT && LA46_1 <= INTO)||(LA46_1 >= IS && LA46_1 <= ISNULL)||LA46_1==JOIN||LA46_1==KEY||(LA46_1 >= LEFT && LA46_1 <= LIMIT)||(LA46_1 >= MATCH && LA46_1 <= MINUS)||(LA46_1 >= NATURAL && LA46_1 <= NOT_EQUALS2)||LA46_1==NULL||(LA46_1 >= OF && LA46_1 <= ON)||(LA46_1 >= OR && LA46_1 <= ORDER)||LA46_1==OUTER||(LA46_1 >= PERCENT && LA46_1 <= PRIMARY)||LA46_1==QUERY||(LA46_1 >= RAISE && LA46_1 <= RPAREN)||(LA46_1 >= SAVEPOINT && LA46_1 <= SELECT)||(LA46_1 >= SEMI && LA46_1 <= SLASH)||LA46_1==STRING||LA46_1==TABLE||(LA46_1 >= TEMPORARY && LA46_1 <= THEN)||(LA46_1 >= TO && LA46_1 <= TRIGGER)||(LA46_1 >= UNION && LA46_1 <= USING)||(LA46_1 >= VACUUM && LA46_1 <= VIRTUAL)||(LA46_1 >= WHEN && LA46_1 <= WHERE)) ) {
                    alt46=1;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 1, input);

                    throw nvae;

                }
                }
                break;
            case COLON:
                {
                alt46=3;
                }
                break;
            case AT:
                {
                alt46=4;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 46, 0, input);

                throw nvae;

            }

            switch (alt46) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:262:5: QUESTION
                    {
                    QUESTION154=(Token)match(input,QUESTION,FOLLOW_QUESTION_in_bind_parameter1393);  
                    stream_QUESTION.add(QUESTION154);


                    // AST REWRITE
                    // elements: 
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 262:14: -> BIND
                    {
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(BIND, "BIND")
                        );

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:263:5: QUESTION position= INTEGER
                    {
                    QUESTION155=(Token)match(input,QUESTION,FOLLOW_QUESTION_in_bind_parameter1403);  
                    stream_QUESTION.add(QUESTION155);


                    position=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_bind_parameter1407);  
                    stream_INTEGER.add(position);


                    // AST REWRITE
                    // elements: position
                    // token labels: position
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleTokenStream stream_position=new RewriteRuleTokenStream(adaptor,"token position",position);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 263:31: -> ^( BIND $position)
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:263:34: ^( BIND $position)
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(BIND, "BIND")
                        , root_1);

                        adaptor.addChild(root_1, stream_position.nextNode());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:264:5: COLON name= id
                    {
                    COLON156=(Token)match(input,COLON,FOLLOW_COLON_in_bind_parameter1422);  
                    stream_COLON.add(COLON156);


                    pushFollow(FOLLOW_id_in_bind_parameter1426);
                    name=id();

                    state._fsp--;

                    stream_id.add(name.getTree());

                    // AST REWRITE
                    // elements: name
                    // token labels: 
                    // rule labels: retval, name
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_name=new RewriteRuleSubtreeStream(adaptor,"rule name",name!=null?name.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 264:19: -> ^( BIND_NAME $name)
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:264:22: ^( BIND_NAME $name)
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(BIND_NAME, "BIND_NAME")
                        , root_1);

                        adaptor.addChild(root_1, stream_name.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:265:5: AT name= id
                    {
                    AT157=(Token)match(input,AT,FOLLOW_AT_in_bind_parameter1441);  
                    stream_AT.add(AT157);


                    pushFollow(FOLLOW_id_in_bind_parameter1445);
                    name=id();

                    state._fsp--;

                    stream_id.add(name.getTree());

                    // AST REWRITE
                    // elements: name
                    // token labels: 
                    // rule labels: retval, name
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_name=new RewriteRuleSubtreeStream(adaptor,"rule name",name!=null?name.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 265:16: -> ^( BIND_NAME $name)
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:265:19: ^( BIND_NAME $name)
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(BIND_NAME, "BIND_NAME")
                        , root_1);

                        adaptor.addChild(root_1, stream_name.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "bind_parameter"


    public static class raise_function_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "raise_function"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:1: raise_function : RAISE ^ LPAREN ! ( IGNORE | ( ROLLBACK | ABORT | FAIL ) COMMA !error_message= STRING ) RPAREN !;
    public final SqlParser.raise_function_return raise_function() throws RecognitionException {
        SqlParser.raise_function_return retval = new SqlParser.raise_function_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token error_message=null;
        Token RAISE158=null;
        Token LPAREN159=null;
        Token IGNORE160=null;
        Token set161=null;
        Token COMMA162=null;
        Token RPAREN163=null;

        Object error_message_tree=null;
        Object RAISE158_tree=null;
        Object LPAREN159_tree=null;
        Object IGNORE160_tree=null;
        Object set161_tree=null;
        Object COMMA162_tree=null;
        Object RPAREN163_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:15: ( RAISE ^ LPAREN ! ( IGNORE | ( ROLLBACK | ABORT | FAIL ) COMMA !error_message= STRING ) RPAREN !)
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:17: RAISE ^ LPAREN ! ( IGNORE | ( ROLLBACK | ABORT | FAIL ) COMMA !error_message= STRING ) RPAREN !
            {
            root_0 = (Object)adaptor.nil();


            RAISE158=(Token)match(input,RAISE,FOLLOW_RAISE_in_raise_function1466); 
            RAISE158_tree = 
            (Object)adaptor.create(RAISE158)
            ;
            root_0 = (Object)adaptor.becomeRoot(RAISE158_tree, root_0);


            LPAREN159=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_raise_function1469); 

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:32: ( IGNORE | ( ROLLBACK | ABORT | FAIL ) COMMA !error_message= STRING )
            int alt47=2;
            int LA47_0 = input.LA(1);

            if ( (LA47_0==IGNORE) ) {
                alt47=1;
            }
            else if ( (LA47_0==ABORT||LA47_0==FAIL||LA47_0==ROLLBACK) ) {
                alt47=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 47, 0, input);

                throw nvae;

            }
            switch (alt47) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:33: IGNORE
                    {
                    IGNORE160=(Token)match(input,IGNORE,FOLLOW_IGNORE_in_raise_function1473); 
                    IGNORE160_tree = 
                    (Object)adaptor.create(IGNORE160)
                    ;
                    adaptor.addChild(root_0, IGNORE160_tree);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:270:42: ( ROLLBACK | ABORT | FAIL ) COMMA !error_message= STRING
                    {
                    set161=(Token)input.LT(1);

                    if ( input.LA(1)==ABORT||input.LA(1)==FAIL||input.LA(1)==ROLLBACK ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set161)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    COMMA162=(Token)match(input,COMMA,FOLLOW_COMMA_in_raise_function1489); 

                    error_message=(Token)match(input,STRING,FOLLOW_STRING_in_raise_function1494); 
                    error_message_tree = 
                    (Object)adaptor.create(error_message)
                    ;
                    adaptor.addChild(root_0, error_message_tree);


                    }
                    break;

            }


            RPAREN163=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_raise_function1497); 

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "raise_function"


    public static class type_name_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "type_name"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:1: type_name : (names+= ID )+ ( LPAREN size1= signed_number ( COMMA size2= signed_number )? RPAREN )? -> ^( TYPE ^( TYPE_PARAMS ( $size1)? ( $size2)? ) ( $names)+ ) ;
    public final SqlParser.type_name_return type_name() throws RecognitionException {
        SqlParser.type_name_return retval = new SqlParser.type_name_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LPAREN164=null;
        Token COMMA165=null;
        Token RPAREN166=null;
        Token names=null;
        List list_names=null;
        SqlParser.signed_number_return size1 =null;

        SqlParser.signed_number_return size2 =null;


        Object LPAREN164_tree=null;
        Object COMMA165_tree=null;
        Object RPAREN166_tree=null;
        Object names_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_signed_number=new RewriteRuleSubtreeStream(adaptor,"rule signed_number");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:10: ( (names+= ID )+ ( LPAREN size1= signed_number ( COMMA size2= signed_number )? RPAREN )? -> ^( TYPE ^( TYPE_PARAMS ( $size1)? ( $size2)? ) ( $names)+ ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:12: (names+= ID )+ ( LPAREN size1= signed_number ( COMMA size2= signed_number )? RPAREN )?
            {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:17: (names+= ID )+
            int cnt48=0;
            loop48:
            do {
                int alt48=2;
                int LA48_0 = input.LA(1);

                if ( (LA48_0==ID) ) {
                    alt48=1;
                }


                switch (alt48) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:17: names+= ID
            	    {
            	    names=(Token)match(input,ID,FOLLOW_ID_in_type_name1507);  
            	    stream_ID.add(names);

            	    if (list_names==null) list_names=new ArrayList();
            	    list_names.add(names);


            	    }
            	    break;

            	default :
            	    if ( cnt48 >= 1 ) break loop48;
                        EarlyExitException eee =
                            new EarlyExitException(48, input);
                        throw eee;
                }
                cnt48++;
            } while (true);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:23: ( LPAREN size1= signed_number ( COMMA size2= signed_number )? RPAREN )?
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==LPAREN) ) {
                alt50=1;
            }
            switch (alt50) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:24: LPAREN size1= signed_number ( COMMA size2= signed_number )? RPAREN
                    {
                    LPAREN164=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_type_name1511);  
                    stream_LPAREN.add(LPAREN164);


                    pushFollow(FOLLOW_signed_number_in_type_name1515);
                    size1=signed_number();

                    state._fsp--;

                    stream_signed_number.add(size1.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:51: ( COMMA size2= signed_number )?
                    int alt49=2;
                    int LA49_0 = input.LA(1);

                    if ( (LA49_0==COMMA) ) {
                        alt49=1;
                    }
                    switch (alt49) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:272:52: COMMA size2= signed_number
                            {
                            COMMA165=(Token)match(input,COMMA,FOLLOW_COMMA_in_type_name1518);  
                            stream_COMMA.add(COMMA165);


                            pushFollow(FOLLOW_signed_number_in_type_name1522);
                            size2=signed_number();

                            state._fsp--;

                            stream_signed_number.add(size2.getTree());

                            }
                            break;

                    }


                    RPAREN166=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_type_name1526);  
                    stream_RPAREN.add(RPAREN166);


                    }
                    break;

            }


            // AST REWRITE
            // elements: size1, names, size2
            // token labels: 
            // rule labels: retval, size2, size1
            // token list labels: names
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleTokenStream stream_names=new RewriteRuleTokenStream(adaptor,"token names", list_names);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_size2=new RewriteRuleSubtreeStream(adaptor,"rule size2",size2!=null?size2.tree:null);
            RewriteRuleSubtreeStream stream_size1=new RewriteRuleSubtreeStream(adaptor,"rule size1",size1!=null?size1.tree:null);

            root_0 = (Object)adaptor.nil();
            // 273:50: -> ^( TYPE ^( TYPE_PARAMS ( $size1)? ( $size2)? ) ( $names)+ )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:273:4: ^( TYPE ^( TYPE_PARAMS ( $size1)? ( $size2)? ) ( $names)+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TYPE, "TYPE")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:273:11: ^( TYPE_PARAMS ( $size1)? ( $size2)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TYPE_PARAMS, "TYPE_PARAMS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:273:26: ( $size1)?
                if ( stream_size1.hasNext() ) {
                    adaptor.addChild(root_2, stream_size1.nextTree());

                }
                stream_size1.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:273:34: ( $size2)?
                if ( stream_size2.hasNext() ) {
                    adaptor.addChild(root_2, stream_size2.nextTree());

                }
                stream_size2.reset();

                adaptor.addChild(root_1, root_2);
                }

                if ( !(stream_names.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_names.hasNext() ) {
                    adaptor.addChild(root_1, stream_names.nextNode());

                }
                stream_names.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "type_name"


    public static class signed_number_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "signed_number"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:275:1: signed_number : ( PLUS | MINUS )? ( INTEGER | FLOAT ) ;
    public final SqlParser.signed_number_return signed_number() throws RecognitionException {
        SqlParser.signed_number_return retval = new SqlParser.signed_number_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set167=null;
        Token set168=null;

        Object set167_tree=null;
        Object set168_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:275:14: ( ( PLUS | MINUS )? ( INTEGER | FLOAT ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:275:16: ( PLUS | MINUS )? ( INTEGER | FLOAT )
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:275:16: ( PLUS | MINUS )?
            int alt51=2;
            int LA51_0 = input.LA(1);

            if ( (LA51_0==MINUS||LA51_0==PLUS) ) {
                alt51=1;
            }
            switch (alt51) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
                    {
                    set167=(Token)input.LT(1);

                    if ( input.LA(1)==MINUS||input.LA(1)==PLUS ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set167)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    }
                    break;

            }


            set168=(Token)input.LT(1);

            if ( input.LA(1)==FLOAT||input.LA(1)==INTEGER ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set168)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "signed_number"


    public static class pragma_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pragma_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:1: pragma_stmt : PRAGMA (database_name= id DOT )? pragma_name= id ( EQUALS pragma_value | LPAREN pragma_value RPAREN )? -> ^( PRAGMA ^( $pragma_name ( $database_name)? ) ( pragma_value )? ) ;
    public final SqlParser.pragma_stmt_return pragma_stmt() throws RecognitionException {
        SqlParser.pragma_stmt_return retval = new SqlParser.pragma_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PRAGMA169=null;
        Token DOT170=null;
        Token EQUALS171=null;
        Token LPAREN173=null;
        Token RPAREN175=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return pragma_name =null;

        SqlParser.pragma_value_return pragma_value172 =null;

        SqlParser.pragma_value_return pragma_value174 =null;


        Object PRAGMA169_tree=null;
        Object DOT170_tree=null;
        Object EQUALS171_tree=null;
        Object LPAREN173_tree=null;
        Object RPAREN175_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_EQUALS=new RewriteRuleTokenStream(adaptor,"token EQUALS");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleTokenStream stream_PRAGMA=new RewriteRuleTokenStream(adaptor,"token PRAGMA");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_pragma_value=new RewriteRuleSubtreeStream(adaptor,"rule pragma_value");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:12: ( PRAGMA (database_name= id DOT )? pragma_name= id ( EQUALS pragma_value | LPAREN pragma_value RPAREN )? -> ^( PRAGMA ^( $pragma_name ( $database_name)? ) ( pragma_value )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:14: PRAGMA (database_name= id DOT )? pragma_name= id ( EQUALS pragma_value | LPAREN pragma_value RPAREN )?
            {
            PRAGMA169=(Token)match(input,PRAGMA,FOLLOW_PRAGMA_in_pragma_stmt1580);  
            stream_PRAGMA.add(PRAGMA169);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:21: (database_name= id DOT )?
            int alt52=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA52_1 = input.LA(2);

                    if ( (LA52_1==DOT) ) {
                        alt52=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA52_2 = input.LA(2);

                    if ( (LA52_2==DOT) ) {
                        alt52=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA52_3 = input.LA(2);

                    if ( (LA52_3==DOT) ) {
                        alt52=1;
                    }
                    }
                    break;
            }

            switch (alt52) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:22: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_pragma_stmt1585);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT170=(Token)match(input,DOT,FOLLOW_DOT_in_pragma_stmt1587);  
                    stream_DOT.add(DOT170);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_pragma_stmt1593);
            pragma_name=id();

            state._fsp--;

            stream_id.add(pragma_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:60: ( EQUALS pragma_value | LPAREN pragma_value RPAREN )?
            int alt53=3;
            int LA53_0 = input.LA(1);

            if ( (LA53_0==EQUALS) ) {
                alt53=1;
            }
            else if ( (LA53_0==LPAREN) ) {
                alt53=2;
            }
            switch (alt53) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:61: EQUALS pragma_value
                    {
                    EQUALS171=(Token)match(input,EQUALS,FOLLOW_EQUALS_in_pragma_stmt1596);  
                    stream_EQUALS.add(EQUALS171);


                    pushFollow(FOLLOW_pragma_value_in_pragma_stmt1598);
                    pragma_value172=pragma_value();

                    state._fsp--;

                    stream_pragma_value.add(pragma_value172.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:278:83: LPAREN pragma_value RPAREN
                    {
                    LPAREN173=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_pragma_stmt1602);  
                    stream_LPAREN.add(LPAREN173);


                    pushFollow(FOLLOW_pragma_value_in_pragma_stmt1604);
                    pragma_value174=pragma_value();

                    state._fsp--;

                    stream_pragma_value.add(pragma_value174.getTree());

                    RPAREN175=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_pragma_stmt1606);  
                    stream_RPAREN.add(RPAREN175);


                    }
                    break;

            }


            // AST REWRITE
            // elements: pragma_value, PRAGMA, database_name, pragma_name
            // token labels: 
            // rule labels: database_name, retval, pragma_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_pragma_name=new RewriteRuleSubtreeStream(adaptor,"rule pragma_name",pragma_name!=null?pragma_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 279:59: -> ^( PRAGMA ^( $pragma_name ( $database_name)? ) ( pragma_value )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:279:4: ^( PRAGMA ^( $pragma_name ( $database_name)? ) ( pragma_value )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_PRAGMA.nextNode()
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:279:13: ^( $pragma_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_pragma_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:279:29: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:279:45: ( pragma_value )?
                if ( stream_pragma_value.hasNext() ) {
                    adaptor.addChild(root_1, stream_pragma_value.nextTree());

                }
                stream_pragma_value.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pragma_stmt"


    public static class pragma_value_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pragma_value"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:281:1: pragma_value : ( signed_number -> ^( FLOAT_LITERAL signed_number ) | ID -> ^( ID_LITERAL ID ) | STRING -> ^( STRING_LITERAL STRING ) | bool );
    public final SqlParser.pragma_value_return pragma_value() throws RecognitionException {
        SqlParser.pragma_value_return retval = new SqlParser.pragma_value_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ID177=null;
        Token STRING178=null;
        SqlParser.signed_number_return signed_number176 =null;

        SqlParser.bool_return bool179 =null;


        Object ID177_tree=null;
        Object STRING178_tree=null;
        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
        RewriteRuleSubtreeStream stream_signed_number=new RewriteRuleSubtreeStream(adaptor,"rule signed_number");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:282:2: ( signed_number -> ^( FLOAT_LITERAL signed_number ) | ID -> ^( ID_LITERAL ID ) | STRING -> ^( STRING_LITERAL STRING ) | bool )
            int alt54=4;
            switch ( input.LA(1) ) {
            case FLOAT:
            case INTEGER:
            case MINUS:
            case PLUS:
                {
                alt54=1;
                }
                break;
            case ID:
                {
                alt54=2;
                }
                break;
            case STRING:
                {
                alt54=3;
                }
                break;
            case FALSE:
            case TRUE:
                {
                alt54=4;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 54, 0, input);

                throw nvae;

            }

            switch (alt54) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:282:4: signed_number
                    {
                    pushFollow(FOLLOW_signed_number_in_pragma_value1635);
                    signed_number176=signed_number();

                    state._fsp--;

                    stream_signed_number.add(signed_number176.getTree());

                    // AST REWRITE
                    // elements: signed_number
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 282:18: -> ^( FLOAT_LITERAL signed_number )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:282:21: ^( FLOAT_LITERAL signed_number )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FLOAT_LITERAL, "FLOAT_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, stream_signed_number.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:283:4: ID
                    {
                    ID177=(Token)match(input,ID,FOLLOW_ID_in_pragma_value1648);  
                    stream_ID.add(ID177);


                    // AST REWRITE
                    // elements: ID
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 283:7: -> ^( ID_LITERAL ID )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:283:10: ^( ID_LITERAL ID )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ID_LITERAL, "ID_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_ID.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:284:4: STRING
                    {
                    STRING178=(Token)match(input,STRING,FOLLOW_STRING_in_pragma_value1661);  
                    stream_STRING.add(STRING178);


                    // AST REWRITE
                    // elements: STRING
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 284:11: -> ^( STRING_LITERAL STRING )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:284:14: ^( STRING_LITERAL STRING )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(STRING_LITERAL, "STRING_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_STRING.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:285:4: bool
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_bool_in_pragma_value1674);
                    bool179=bool();

                    state._fsp--;

                    adaptor.addChild(root_0, bool179.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pragma_value"


    public static class attach_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "attach_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:289:1: attach_stmt : ATTACH ( DATABASE )? filename= id AS database_name= id ;
    public final SqlParser.attach_stmt_return attach_stmt() throws RecognitionException {
        SqlParser.attach_stmt_return retval = new SqlParser.attach_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ATTACH180=null;
        Token DATABASE181=null;
        Token AS182=null;
        SqlParser.id_return filename =null;

        SqlParser.id_return database_name =null;


        Object ATTACH180_tree=null;
        Object DATABASE181_tree=null;
        Object AS182_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:289:12: ( ATTACH ( DATABASE )? filename= id AS database_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:289:14: ATTACH ( DATABASE )? filename= id AS database_name= id
            {
            root_0 = (Object)adaptor.nil();


            ATTACH180=(Token)match(input,ATTACH,FOLLOW_ATTACH_in_attach_stmt1684); 
            ATTACH180_tree = 
            (Object)adaptor.create(ATTACH180)
            ;
            adaptor.addChild(root_0, ATTACH180_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:289:21: ( DATABASE )?
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==DATABASE) ) {
                int LA55_1 = input.LA(2);

                if ( ((LA55_1 >= ABORT && LA55_1 <= AFTER)||(LA55_1 >= ALL && LA55_1 <= ALTER)||(LA55_1 >= ANALYZE && LA55_1 <= AND)||LA55_1==ASC||(LA55_1 >= ATTACH && LA55_1 <= AUTOINCREMENT)||(LA55_1 >= BEFORE && LA55_1 <= BETWEEN)||LA55_1==BY||(LA55_1 >= CASCADE && LA55_1 <= COLLATE)||LA55_1==COLUMN||(LA55_1 >= COMMIT && LA55_1 <= CONSTRAINT)||LA55_1==CREATE||(LA55_1 >= CROSS && LA55_1 <= CURRENT_TIMESTAMP)||(LA55_1 >= DATABASE && LA55_1 <= DISTINCT)||LA55_1==DROP||(LA55_1 >= EACH && LA55_1 <= END)||(LA55_1 >= ESCAPE && LA55_1 <= EXPLAIN)||LA55_1==FAIL||(LA55_1 >= FOR && LA55_1 <= FROM)||LA55_1==GROUP||LA55_1==HAVING||LA55_1==ID||(LA55_1 >= IF && LA55_1 <= IMMEDIATE)||(LA55_1 >= INDEX && LA55_1 <= INSTEAD)||(LA55_1 >= INTERSECT && LA55_1 <= INTO)||LA55_1==IS||LA55_1==JOIN||LA55_1==KEY||LA55_1==LEFT||LA55_1==LIMIT||LA55_1==NATURAL||LA55_1==NULL||(LA55_1 >= OF && LA55_1 <= ON)||(LA55_1 >= OR && LA55_1 <= ORDER)||LA55_1==OUTER||LA55_1==PLAN||(LA55_1 >= PRAGMA && LA55_1 <= PRIMARY)||LA55_1==QUERY||(LA55_1 >= RAISE && LA55_1 <= REFERENCES)||(LA55_1 >= REINDEX && LA55_1 <= ROW)||(LA55_1 >= SAVEPOINT && LA55_1 <= SELECT)||LA55_1==SET||LA55_1==STRING||LA55_1==TABLE||(LA55_1 >= TEMPORARY && LA55_1 <= THEN)||(LA55_1 >= TO && LA55_1 <= TRIGGER)||(LA55_1 >= UNION && LA55_1 <= USING)||(LA55_1 >= VACUUM && LA55_1 <= VIRTUAL)||(LA55_1 >= WHEN && LA55_1 <= WHERE)) ) {
                    alt55=1;
                }
                else if ( (LA55_1==AS) ) {
                    int LA55_7 = input.LA(3);

                    if ( (LA55_7==AS) ) {
                        int LA55_9 = input.LA(4);

                        if ( ((LA55_9 >= ABORT && LA55_9 <= AFTER)||(LA55_9 >= ALL && LA55_9 <= ALTER)||(LA55_9 >= ANALYZE && LA55_9 <= AND)||(LA55_9 >= AS && LA55_9 <= ASC)||(LA55_9 >= ATTACH && LA55_9 <= AUTOINCREMENT)||(LA55_9 >= BEFORE && LA55_9 <= BETWEEN)||LA55_9==BY||(LA55_9 >= CASCADE && LA55_9 <= COLLATE)||LA55_9==COLUMN||(LA55_9 >= COMMIT && LA55_9 <= CONSTRAINT)||LA55_9==CREATE||(LA55_9 >= CROSS && LA55_9 <= CURRENT_TIMESTAMP)||(LA55_9 >= DATABASE && LA55_9 <= DISTINCT)||LA55_9==DROP||(LA55_9 >= EACH && LA55_9 <= END)||(LA55_9 >= ESCAPE && LA55_9 <= EXPLAIN)||LA55_9==FAIL||(LA55_9 >= FOR && LA55_9 <= FROM)||LA55_9==GROUP||LA55_9==HAVING||LA55_9==ID||(LA55_9 >= IF && LA55_9 <= IMMEDIATE)||(LA55_9 >= INDEX && LA55_9 <= INSTEAD)||(LA55_9 >= INTERSECT && LA55_9 <= INTO)||LA55_9==IS||LA55_9==JOIN||LA55_9==KEY||LA55_9==LEFT||LA55_9==LIMIT||LA55_9==NATURAL||LA55_9==NULL||(LA55_9 >= OF && LA55_9 <= ON)||(LA55_9 >= OR && LA55_9 <= ORDER)||LA55_9==OUTER||LA55_9==PLAN||(LA55_9 >= PRAGMA && LA55_9 <= PRIMARY)||LA55_9==QUERY||(LA55_9 >= RAISE && LA55_9 <= REFERENCES)||(LA55_9 >= REINDEX && LA55_9 <= ROW)||(LA55_9 >= SAVEPOINT && LA55_9 <= SELECT)||LA55_9==SET||LA55_9==STRING||LA55_9==TABLE||(LA55_9 >= TEMPORARY && LA55_9 <= THEN)||(LA55_9 >= TO && LA55_9 <= TRIGGER)||(LA55_9 >= UNION && LA55_9 <= USING)||(LA55_9 >= VACUUM && LA55_9 <= VIRTUAL)||(LA55_9 >= WHEN && LA55_9 <= WHERE)) ) {
                            alt55=1;
                        }
                    }
                }
            }
            switch (alt55) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:289:22: DATABASE
                    {
                    DATABASE181=(Token)match(input,DATABASE,FOLLOW_DATABASE_in_attach_stmt1687); 
                    DATABASE181_tree = 
                    (Object)adaptor.create(DATABASE181)
                    ;
                    adaptor.addChild(root_0, DATABASE181_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_attach_stmt1693);
            filename=id();

            state._fsp--;

            adaptor.addChild(root_0, filename.getTree());

            AS182=(Token)match(input,AS,FOLLOW_AS_in_attach_stmt1695); 
            AS182_tree = 
            (Object)adaptor.create(AS182)
            ;
            adaptor.addChild(root_0, AS182_tree);


            pushFollow(FOLLOW_id_in_attach_stmt1699);
            database_name=id();

            state._fsp--;

            adaptor.addChild(root_0, database_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "attach_stmt"


    public static class detach_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "detach_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:292:1: detach_stmt : DETACH ( DATABASE )? database_name= id ;
    public final SqlParser.detach_stmt_return detach_stmt() throws RecognitionException {
        SqlParser.detach_stmt_return retval = new SqlParser.detach_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DETACH183=null;
        Token DATABASE184=null;
        SqlParser.id_return database_name =null;


        Object DETACH183_tree=null;
        Object DATABASE184_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:292:12: ( DETACH ( DATABASE )? database_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:292:14: DETACH ( DATABASE )? database_name= id
            {
            root_0 = (Object)adaptor.nil();


            DETACH183=(Token)match(input,DETACH,FOLLOW_DETACH_in_detach_stmt1707); 
            DETACH183_tree = 
            (Object)adaptor.create(DETACH183)
            ;
            adaptor.addChild(root_0, DETACH183_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:292:21: ( DATABASE )?
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==DATABASE) ) {
                int LA56_1 = input.LA(2);

                if ( ((LA56_1 >= ABORT && LA56_1 <= AFTER)||(LA56_1 >= ALL && LA56_1 <= ALTER)||(LA56_1 >= ANALYZE && LA56_1 <= AND)||(LA56_1 >= AS && LA56_1 <= ASC)||(LA56_1 >= ATTACH && LA56_1 <= AUTOINCREMENT)||(LA56_1 >= BEFORE && LA56_1 <= BETWEEN)||LA56_1==BY||(LA56_1 >= CASCADE && LA56_1 <= COLLATE)||LA56_1==COLUMN||(LA56_1 >= COMMIT && LA56_1 <= CONSTRAINT)||LA56_1==CREATE||(LA56_1 >= CROSS && LA56_1 <= CURRENT_TIMESTAMP)||(LA56_1 >= DATABASE && LA56_1 <= DISTINCT)||LA56_1==DROP||(LA56_1 >= EACH && LA56_1 <= END)||(LA56_1 >= ESCAPE && LA56_1 <= EXPLAIN)||LA56_1==FAIL||(LA56_1 >= FOR && LA56_1 <= FROM)||LA56_1==GROUP||LA56_1==HAVING||LA56_1==ID||(LA56_1 >= IF && LA56_1 <= IMMEDIATE)||(LA56_1 >= INDEX && LA56_1 <= INSTEAD)||(LA56_1 >= INTERSECT && LA56_1 <= INTO)||LA56_1==IS||LA56_1==JOIN||LA56_1==KEY||LA56_1==LEFT||LA56_1==LIMIT||LA56_1==NATURAL||LA56_1==NULL||(LA56_1 >= OF && LA56_1 <= ON)||(LA56_1 >= OR && LA56_1 <= ORDER)||LA56_1==OUTER||LA56_1==PLAN||(LA56_1 >= PRAGMA && LA56_1 <= PRIMARY)||LA56_1==QUERY||(LA56_1 >= RAISE && LA56_1 <= REFERENCES)||(LA56_1 >= REINDEX && LA56_1 <= ROW)||(LA56_1 >= SAVEPOINT && LA56_1 <= SELECT)||LA56_1==SET||LA56_1==STRING||LA56_1==TABLE||(LA56_1 >= TEMPORARY && LA56_1 <= THEN)||(LA56_1 >= TO && LA56_1 <= TRIGGER)||(LA56_1 >= UNION && LA56_1 <= USING)||(LA56_1 >= VACUUM && LA56_1 <= VIRTUAL)||(LA56_1 >= WHEN && LA56_1 <= WHERE)) ) {
                    alt56=1;
                }
            }
            switch (alt56) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:292:22: DATABASE
                    {
                    DATABASE184=(Token)match(input,DATABASE,FOLLOW_DATABASE_in_detach_stmt1710); 
                    DATABASE184_tree = 
                    (Object)adaptor.create(DATABASE184)
                    ;
                    adaptor.addChild(root_0, DATABASE184_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_detach_stmt1716);
            database_name=id();

            state._fsp--;

            adaptor.addChild(root_0, database_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "detach_stmt"


    public static class analyze_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "analyze_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:1: analyze_stmt : ANALYZE (database_or_table_name= id |database_name= id DOT table_name= id )? ;
    public final SqlParser.analyze_stmt_return analyze_stmt() throws RecognitionException {
        SqlParser.analyze_stmt_return retval = new SqlParser.analyze_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ANALYZE185=null;
        Token DOT186=null;
        SqlParser.id_return database_or_table_name =null;

        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;


        Object ANALYZE185_tree=null;
        Object DOT186_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:13: ( ANALYZE (database_or_table_name= id |database_name= id DOT table_name= id )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:15: ANALYZE (database_or_table_name= id |database_name= id DOT table_name= id )?
            {
            root_0 = (Object)adaptor.nil();


            ANALYZE185=(Token)match(input,ANALYZE,FOLLOW_ANALYZE_in_analyze_stmt1724); 
            ANALYZE185_tree = 
            (Object)adaptor.create(ANALYZE185)
            ;
            adaptor.addChild(root_0, ANALYZE185_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:23: (database_or_table_name= id |database_name= id DOT table_name= id )?
            int alt57=3;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA57_1 = input.LA(2);

                    if ( (LA57_1==EOF||LA57_1==SEMI) ) {
                        alt57=1;
                    }
                    else if ( (LA57_1==DOT) ) {
                        alt57=2;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA57_2 = input.LA(2);

                    if ( (LA57_2==EOF||LA57_2==SEMI) ) {
                        alt57=1;
                    }
                    else if ( (LA57_2==DOT) ) {
                        alt57=2;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA57_3 = input.LA(2);

                    if ( (LA57_3==EOF||LA57_3==SEMI) ) {
                        alt57=1;
                    }
                    else if ( (LA57_3==DOT) ) {
                        alt57=2;
                    }
                    }
                    break;
            }

            switch (alt57) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:24: database_or_table_name= id
                    {
                    pushFollow(FOLLOW_id_in_analyze_stmt1729);
                    database_or_table_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_or_table_name.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:295:52: database_name= id DOT table_name= id
                    {
                    pushFollow(FOLLOW_id_in_analyze_stmt1735);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT186=(Token)match(input,DOT,FOLLOW_DOT_in_analyze_stmt1737); 
                    DOT186_tree = 
                    (Object)adaptor.create(DOT186)
                    ;
                    adaptor.addChild(root_0, DOT186_tree);


                    pushFollow(FOLLOW_id_in_analyze_stmt1741);
                    table_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, table_name.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "analyze_stmt"


    public static class reindex_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "reindex_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:298:1: reindex_stmt : REINDEX (database_name= id DOT )? collation_or_table_or_index_name= id ;
    public final SqlParser.reindex_stmt_return reindex_stmt() throws RecognitionException {
        SqlParser.reindex_stmt_return retval = new SqlParser.reindex_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REINDEX187=null;
        Token DOT188=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return collation_or_table_or_index_name =null;


        Object REINDEX187_tree=null;
        Object DOT188_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:298:13: ( REINDEX (database_name= id DOT )? collation_or_table_or_index_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:298:15: REINDEX (database_name= id DOT )? collation_or_table_or_index_name= id
            {
            root_0 = (Object)adaptor.nil();


            REINDEX187=(Token)match(input,REINDEX,FOLLOW_REINDEX_in_reindex_stmt1751); 
            REINDEX187_tree = 
            (Object)adaptor.create(REINDEX187)
            ;
            adaptor.addChild(root_0, REINDEX187_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:298:23: (database_name= id DOT )?
            int alt58=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA58_1 = input.LA(2);

                    if ( (LA58_1==DOT) ) {
                        alt58=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA58_2 = input.LA(2);

                    if ( (LA58_2==DOT) ) {
                        alt58=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA58_3 = input.LA(2);

                    if ( (LA58_3==DOT) ) {
                        alt58=1;
                    }
                    }
                    break;
            }

            switch (alt58) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:298:24: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_reindex_stmt1756);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT188=(Token)match(input,DOT,FOLLOW_DOT_in_reindex_stmt1758); 
                    DOT188_tree = 
                    (Object)adaptor.create(DOT188)
                    ;
                    adaptor.addChild(root_0, DOT188_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_reindex_stmt1764);
            collation_or_table_or_index_name=id();

            state._fsp--;

            adaptor.addChild(root_0, collation_or_table_or_index_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "reindex_stmt"


    public static class vacuum_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "vacuum_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:301:1: vacuum_stmt : VACUUM ;
    public final SqlParser.vacuum_stmt_return vacuum_stmt() throws RecognitionException {
        SqlParser.vacuum_stmt_return retval = new SqlParser.vacuum_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token VACUUM189=null;

        Object VACUUM189_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:301:12: ( VACUUM )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:301:14: VACUUM
            {
            root_0 = (Object)adaptor.nil();


            VACUUM189=(Token)match(input,VACUUM,FOLLOW_VACUUM_in_vacuum_stmt1772); 
            VACUUM189_tree = 
            (Object)adaptor.create(VACUUM189)
            ;
            adaptor.addChild(root_0, VACUUM189_tree);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "vacuum_stmt"


    public static class operation_conflict_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "operation_conflict_clause"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:307:1: operation_conflict_clause : OR ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE ) ;
    public final SqlParser.operation_conflict_clause_return operation_conflict_clause() throws RecognitionException {
        SqlParser.operation_conflict_clause_return retval = new SqlParser.operation_conflict_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token OR190=null;
        Token set191=null;

        Object OR190_tree=null;
        Object set191_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:307:26: ( OR ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:307:28: OR ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE )
            {
            root_0 = (Object)adaptor.nil();


            OR190=(Token)match(input,OR,FOLLOW_OR_in_operation_conflict_clause1783); 
            OR190_tree = 
            (Object)adaptor.create(OR190)
            ;
            adaptor.addChild(root_0, OR190_tree);


            set191=(Token)input.LT(1);

            if ( input.LA(1)==ABORT||input.LA(1)==FAIL||input.LA(1)==IGNORE||input.LA(1)==REPLACE||input.LA(1)==ROLLBACK ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set191)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "operation_conflict_clause"


    public static class ordering_term_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "ordering_term"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:1: ordering_term : expr ( ASC | DESC )? -> ^( ORDERING expr ( ASC )? ( DESC )? ) ;
    public final SqlParser.ordering_term_return ordering_term() throws RecognitionException {
        SqlParser.ordering_term_return retval = new SqlParser.ordering_term_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASC193=null;
        Token DESC194=null;
        SqlParser.expr_return expr192 =null;


        Object ASC193_tree=null;
        Object DESC194_tree=null;
        RewriteRuleTokenStream stream_ASC=new RewriteRuleTokenStream(adaptor,"token ASC");
        RewriteRuleTokenStream stream_DESC=new RewriteRuleTokenStream(adaptor,"token DESC");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:14: ( expr ( ASC | DESC )? -> ^( ORDERING expr ( ASC )? ( DESC )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:16: expr ( ASC | DESC )?
            {
            pushFollow(FOLLOW_expr_in_ordering_term1810);
            expr192=expr();

            state._fsp--;

            stream_expr.add(expr192.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:82: ( ASC | DESC )?
            int alt59=3;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==ASC) ) {
                alt59=1;
            }
            else if ( (LA59_0==DESC) ) {
                alt59=2;
            }
            switch (alt59) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:83: ASC
                    {
                    ASC193=(Token)match(input,ASC,FOLLOW_ASC_in_ordering_term1815);  
                    stream_ASC.add(ASC193);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:309:89: DESC
                    {
                    DESC194=(Token)match(input,DESC,FOLLOW_DESC_in_ordering_term1819);  
                    stream_DESC.add(DESC194);


                    }
                    break;

            }


            // AST REWRITE
            // elements: DESC, ASC, expr
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 310:35: -> ^( ORDERING expr ( ASC )? ( DESC )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:310:4: ^( ORDERING expr ( ASC )? ( DESC )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ORDERING, "ORDERING")
                , root_1);

                adaptor.addChild(root_1, stream_expr.nextTree());

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:310:20: ( ASC )?
                if ( stream_ASC.hasNext() ) {
                    adaptor.addChild(root_1, 
                    stream_ASC.nextNode()
                    );

                }
                stream_ASC.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:310:27: ( DESC )?
                if ( stream_DESC.hasNext() ) {
                    adaptor.addChild(root_1, 
                    stream_DESC.nextNode()
                    );

                }
                stream_DESC.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "ordering_term"


    public static class operation_limited_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "operation_limited_clause"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:312:1: operation_limited_clause : ( ORDER BY ordering_term ( COMMA ordering_term )* )? LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? ;
    public final SqlParser.operation_limited_clause_return operation_limited_clause() throws RecognitionException {
        SqlParser.operation_limited_clause_return retval = new SqlParser.operation_limited_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token limit=null;
        Token offset=null;
        Token ORDER195=null;
        Token BY196=null;
        Token COMMA198=null;
        Token LIMIT200=null;
        Token set201=null;
        SqlParser.ordering_term_return ordering_term197 =null;

        SqlParser.ordering_term_return ordering_term199 =null;


        Object limit_tree=null;
        Object offset_tree=null;
        Object ORDER195_tree=null;
        Object BY196_tree=null;
        Object COMMA198_tree=null;
        Object LIMIT200_tree=null;
        Object set201_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:312:25: ( ( ORDER BY ordering_term ( COMMA ordering_term )* )? LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:313:3: ( ORDER BY ordering_term ( COMMA ordering_term )* )? LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )?
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:313:3: ( ORDER BY ordering_term ( COMMA ordering_term )* )?
            int alt61=2;
            int LA61_0 = input.LA(1);

            if ( (LA61_0==ORDER) ) {
                alt61=1;
            }
            switch (alt61) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:313:4: ORDER BY ordering_term ( COMMA ordering_term )*
                    {
                    ORDER195=(Token)match(input,ORDER,FOLLOW_ORDER_in_operation_limited_clause1849); 
                    ORDER195_tree = 
                    (Object)adaptor.create(ORDER195)
                    ;
                    adaptor.addChild(root_0, ORDER195_tree);


                    BY196=(Token)match(input,BY,FOLLOW_BY_in_operation_limited_clause1851); 
                    BY196_tree = 
                    (Object)adaptor.create(BY196)
                    ;
                    adaptor.addChild(root_0, BY196_tree);


                    pushFollow(FOLLOW_ordering_term_in_operation_limited_clause1853);
                    ordering_term197=ordering_term();

                    state._fsp--;

                    adaptor.addChild(root_0, ordering_term197.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:313:27: ( COMMA ordering_term )*
                    loop60:
                    do {
                        int alt60=2;
                        int LA60_0 = input.LA(1);

                        if ( (LA60_0==COMMA) ) {
                            alt60=1;
                        }


                        switch (alt60) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:313:28: COMMA ordering_term
                    	    {
                    	    COMMA198=(Token)match(input,COMMA,FOLLOW_COMMA_in_operation_limited_clause1856); 
                    	    COMMA198_tree = 
                    	    (Object)adaptor.create(COMMA198)
                    	    ;
                    	    adaptor.addChild(root_0, COMMA198_tree);


                    	    pushFollow(FOLLOW_ordering_term_in_operation_limited_clause1858);
                    	    ordering_term199=ordering_term();

                    	    state._fsp--;

                    	    adaptor.addChild(root_0, ordering_term199.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop60;
                        }
                    } while (true);


                    }
                    break;

            }


            LIMIT200=(Token)match(input,LIMIT,FOLLOW_LIMIT_in_operation_limited_clause1866); 
            LIMIT200_tree = 
            (Object)adaptor.create(LIMIT200)
            ;
            adaptor.addChild(root_0, LIMIT200_tree);


            limit=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_operation_limited_clause1870); 
            limit_tree = 
            (Object)adaptor.create(limit)
            ;
            adaptor.addChild(root_0, limit_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:314:23: ( ( OFFSET | COMMA ) offset= INTEGER )?
            int alt62=2;
            int LA62_0 = input.LA(1);

            if ( (LA62_0==COMMA||LA62_0==OFFSET) ) {
                alt62=1;
            }
            switch (alt62) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:314:24: ( OFFSET | COMMA ) offset= INTEGER
                    {
                    set201=(Token)input.LT(1);

                    if ( input.LA(1)==COMMA||input.LA(1)==OFFSET ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set201)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    offset=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_operation_limited_clause1883); 
                    offset_tree = 
                    (Object)adaptor.create(offset)
                    ;
                    adaptor.addChild(root_0, offset_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "operation_limited_clause"


    public static class select_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:317:1: select_stmt : select_list ( ORDER BY ordering_term ( COMMA ordering_term )* )? ( LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? )? -> ^( SELECT select_list ( ^( ORDER ( ordering_term )+ ) )? ( ^( LIMIT $limit ( $offset)? ) )? ) ;
    public final SqlParser.select_stmt_return select_stmt() throws RecognitionException {
        SqlParser.select_stmt_return retval = new SqlParser.select_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token limit=null;
        Token offset=null;
        Token ORDER203=null;
        Token BY204=null;
        Token COMMA206=null;
        Token LIMIT208=null;
        Token OFFSET209=null;
        Token COMMA210=null;
        SqlParser.select_list_return select_list202 =null;

        SqlParser.ordering_term_return ordering_term205 =null;

        SqlParser.ordering_term_return ordering_term207 =null;


        Object limit_tree=null;
        Object offset_tree=null;
        Object ORDER203_tree=null;
        Object BY204_tree=null;
        Object COMMA206_tree=null;
        Object LIMIT208_tree=null;
        Object OFFSET209_tree=null;
        Object COMMA210_tree=null;
        RewriteRuleTokenStream stream_INTEGER=new RewriteRuleTokenStream(adaptor,"token INTEGER");
        RewriteRuleTokenStream stream_BY=new RewriteRuleTokenStream(adaptor,"token BY");
        RewriteRuleTokenStream stream_ORDER=new RewriteRuleTokenStream(adaptor,"token ORDER");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LIMIT=new RewriteRuleTokenStream(adaptor,"token LIMIT");
        RewriteRuleTokenStream stream_OFFSET=new RewriteRuleTokenStream(adaptor,"token OFFSET");
        RewriteRuleSubtreeStream stream_select_list=new RewriteRuleSubtreeStream(adaptor,"rule select_list");
        RewriteRuleSubtreeStream stream_ordering_term=new RewriteRuleSubtreeStream(adaptor,"rule ordering_term");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:317:12: ( select_list ( ORDER BY ordering_term ( COMMA ordering_term )* )? ( LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? )? -> ^( SELECT select_list ( ^( ORDER ( ordering_term )+ ) )? ( ^( LIMIT $limit ( $offset)? ) )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:317:14: select_list ( ORDER BY ordering_term ( COMMA ordering_term )* )? ( LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? )?
            {
            pushFollow(FOLLOW_select_list_in_select_stmt1893);
            select_list202=select_list();

            state._fsp--;

            stream_select_list.add(select_list202.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:318:3: ( ORDER BY ordering_term ( COMMA ordering_term )* )?
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==ORDER) ) {
                alt64=1;
            }
            switch (alt64) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:318:4: ORDER BY ordering_term ( COMMA ordering_term )*
                    {
                    ORDER203=(Token)match(input,ORDER,FOLLOW_ORDER_in_select_stmt1898);  
                    stream_ORDER.add(ORDER203);


                    BY204=(Token)match(input,BY,FOLLOW_BY_in_select_stmt1900);  
                    stream_BY.add(BY204);


                    pushFollow(FOLLOW_ordering_term_in_select_stmt1902);
                    ordering_term205=ordering_term();

                    state._fsp--;

                    stream_ordering_term.add(ordering_term205.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:318:27: ( COMMA ordering_term )*
                    loop63:
                    do {
                        int alt63=2;
                        int LA63_0 = input.LA(1);

                        if ( (LA63_0==COMMA) ) {
                            alt63=1;
                        }


                        switch (alt63) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:318:28: COMMA ordering_term
                    	    {
                    	    COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_select_stmt1905);  
                    	    stream_COMMA.add(COMMA206);


                    	    pushFollow(FOLLOW_ordering_term_in_select_stmt1907);
                    	    ordering_term207=ordering_term();

                    	    state._fsp--;

                    	    stream_ordering_term.add(ordering_term207.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop63;
                        }
                    } while (true);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:3: ( LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )? )?
            int alt67=2;
            int LA67_0 = input.LA(1);

            if ( (LA67_0==LIMIT) ) {
                alt67=1;
            }
            switch (alt67) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:4: LIMIT limit= INTEGER ( ( OFFSET | COMMA ) offset= INTEGER )?
                    {
                    LIMIT208=(Token)match(input,LIMIT,FOLLOW_LIMIT_in_select_stmt1916);  
                    stream_LIMIT.add(LIMIT208);


                    limit=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_select_stmt1920);  
                    stream_INTEGER.add(limit);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:24: ( ( OFFSET | COMMA ) offset= INTEGER )?
                    int alt66=2;
                    int LA66_0 = input.LA(1);

                    if ( (LA66_0==COMMA||LA66_0==OFFSET) ) {
                        alt66=1;
                    }
                    switch (alt66) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:25: ( OFFSET | COMMA ) offset= INTEGER
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:25: ( OFFSET | COMMA )
                            int alt65=2;
                            int LA65_0 = input.LA(1);

                            if ( (LA65_0==OFFSET) ) {
                                alt65=1;
                            }
                            else if ( (LA65_0==COMMA) ) {
                                alt65=2;
                            }
                            else {
                                NoViableAltException nvae =
                                    new NoViableAltException("", 65, 0, input);

                                throw nvae;

                            }
                            switch (alt65) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:26: OFFSET
                                    {
                                    OFFSET209=(Token)match(input,OFFSET,FOLLOW_OFFSET_in_select_stmt1924);  
                                    stream_OFFSET.add(OFFSET209);


                                    }
                                    break;
                                case 2 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:319:35: COMMA
                                    {
                                    COMMA210=(Token)match(input,COMMA,FOLLOW_COMMA_in_select_stmt1928);  
                                    stream_COMMA.add(COMMA210);


                                    }
                                    break;

                            }


                            offset=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_select_stmt1933);  
                            stream_INTEGER.add(offset);


                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: ORDER, select_list, offset, LIMIT, ordering_term, limit
            // token labels: limit, offset
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleTokenStream stream_limit=new RewriteRuleTokenStream(adaptor,"token limit",limit);
            RewriteRuleTokenStream stream_offset=new RewriteRuleTokenStream(adaptor,"token offset",offset);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 320:2: -> ^( SELECT select_list ( ^( ORDER ( ordering_term )+ ) )? ( ^( LIMIT $limit ( $offset)? ) )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:320:4: ^( SELECT select_list ( ^( ORDER ( ordering_term )+ ) )? ( ^( LIMIT $limit ( $offset)? ) )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT, "SELECT")
                , root_1);

                adaptor.addChild(root_1, stream_select_list.nextTree());

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:321:22: ( ^( ORDER ( ordering_term )+ ) )?
                if ( stream_ORDER.hasNext()||stream_ordering_term.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:321:22: ^( ORDER ( ordering_term )+ )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_ORDER.nextNode()
                    , root_2);

                    if ( !(stream_ordering_term.hasNext()) ) {
                        throw new RewriteEarlyExitException();
                    }
                    while ( stream_ordering_term.hasNext() ) {
                        adaptor.addChild(root_2, stream_ordering_term.nextTree());

                    }
                    stream_ordering_term.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_ORDER.reset();
                stream_ordering_term.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:321:47: ( ^( LIMIT $limit ( $offset)? ) )?
                if ( stream_offset.hasNext()||stream_LIMIT.hasNext()||stream_limit.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:321:47: ^( LIMIT $limit ( $offset)? )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_LIMIT.nextNode()
                    , root_2);

                    adaptor.addChild(root_2, stream_limit.nextNode());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:321:63: ( $offset)?
                    if ( stream_offset.hasNext() ) {
                        adaptor.addChild(root_2, stream_offset.nextNode());

                    }
                    stream_offset.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_offset.reset();
                stream_LIMIT.reset();
                stream_limit.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_stmt"


    public static class select_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_list"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:324:1: select_list : select_core ( select_op ^ select_core )* ;
    public final SqlParser.select_list_return select_list() throws RecognitionException {
        SqlParser.select_list_return retval = new SqlParser.select_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.select_core_return select_core211 =null;

        SqlParser.select_op_return select_op212 =null;

        SqlParser.select_core_return select_core213 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:324:12: ( select_core ( select_op ^ select_core )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:325:3: select_core ( select_op ^ select_core )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_select_core_in_select_list1978);
            select_core211=select_core();

            state._fsp--;

            adaptor.addChild(root_0, select_core211.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:325:15: ( select_op ^ select_core )*
            loop68:
            do {
                int alt68=2;
                int LA68_0 = input.LA(1);

                if ( (LA68_0==EXCEPT||LA68_0==INTERSECT||LA68_0==UNION) ) {
                    alt68=1;
                }


                switch (alt68) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:325:16: select_op ^ select_core
            	    {
            	    pushFollow(FOLLOW_select_op_in_select_list1981);
            	    select_op212=select_op();

            	    state._fsp--;

            	    root_0 = (Object)adaptor.becomeRoot(select_op212.getTree(), root_0);

            	    pushFollow(FOLLOW_select_core_in_select_list1984);
            	    select_core213=select_core();

            	    state._fsp--;

            	    adaptor.addChild(root_0, select_core213.getTree());

            	    }
            	    break;

            	default :
            	    break loop68;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_list"


    public static class select_op_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_op"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:1: select_op : ( UNION ^ ( ALL )? | INTERSECT | EXCEPT );
    public final SqlParser.select_op_return select_op() throws RecognitionException {
        SqlParser.select_op_return retval = new SqlParser.select_op_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token UNION214=null;
        Token ALL215=null;
        Token INTERSECT216=null;
        Token EXCEPT217=null;

        Object UNION214_tree=null;
        Object ALL215_tree=null;
        Object INTERSECT216_tree=null;
        Object EXCEPT217_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:10: ( UNION ^ ( ALL )? | INTERSECT | EXCEPT )
            int alt70=3;
            switch ( input.LA(1) ) {
            case UNION:
                {
                alt70=1;
                }
                break;
            case INTERSECT:
                {
                alt70=2;
                }
                break;
            case EXCEPT:
                {
                alt70=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 70, 0, input);

                throw nvae;

            }

            switch (alt70) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:12: UNION ^ ( ALL )?
                    {
                    root_0 = (Object)adaptor.nil();


                    UNION214=(Token)match(input,UNION,FOLLOW_UNION_in_select_op1993); 
                    UNION214_tree = 
                    (Object)adaptor.create(UNION214)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(UNION214_tree, root_0);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:19: ( ALL )?
                    int alt69=2;
                    int LA69_0 = input.LA(1);

                    if ( (LA69_0==ALL) ) {
                        alt69=1;
                    }
                    switch (alt69) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:20: ALL
                            {
                            ALL215=(Token)match(input,ALL,FOLLOW_ALL_in_select_op1997); 
                            ALL215_tree = 
                            (Object)adaptor.create(ALL215)
                            ;
                            adaptor.addChild(root_0, ALL215_tree);


                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:28: INTERSECT
                    {
                    root_0 = (Object)adaptor.nil();


                    INTERSECT216=(Token)match(input,INTERSECT,FOLLOW_INTERSECT_in_select_op2003); 
                    INTERSECT216_tree = 
                    (Object)adaptor.create(INTERSECT216)
                    ;
                    adaptor.addChild(root_0, INTERSECT216_tree);


                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:327:40: EXCEPT
                    {
                    root_0 = (Object)adaptor.nil();


                    EXCEPT217=(Token)match(input,EXCEPT,FOLLOW_EXCEPT_in_select_op2007); 
                    EXCEPT217_tree = 
                    (Object)adaptor.create(EXCEPT217)
                    ;
                    adaptor.addChild(root_0, EXCEPT217_tree);


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_op"


    public static class select_core_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_core"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:329:1: select_core : SELECT ( ALL | DISTINCT )? result_column ( COMMA result_column )* ( FROM join_source )? ( WHERE where_expr= expr )? ( GROUP BY ordering_term ( COMMA ordering_term )* ( HAVING having_expr= expr )? )? -> ^( SELECT_CORE ( DISTINCT )? ^( COLUMNS ( result_column )+ ) ( ^( FROM join_source ) )? ( ^( WHERE $where_expr) )? ( ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? ) )? ) ;
    public final SqlParser.select_core_return select_core() throws RecognitionException {
        SqlParser.select_core_return retval = new SqlParser.select_core_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token SELECT218=null;
        Token ALL219=null;
        Token DISTINCT220=null;
        Token COMMA222=null;
        Token FROM224=null;
        Token WHERE226=null;
        Token GROUP227=null;
        Token BY228=null;
        Token COMMA230=null;
        Token HAVING232=null;
        SqlParser.expr_return where_expr =null;

        SqlParser.expr_return having_expr =null;

        SqlParser.result_column_return result_column221 =null;

        SqlParser.result_column_return result_column223 =null;

        SqlParser.join_source_return join_source225 =null;

        SqlParser.ordering_term_return ordering_term229 =null;

        SqlParser.ordering_term_return ordering_term231 =null;


        Object SELECT218_tree=null;
        Object ALL219_tree=null;
        Object DISTINCT220_tree=null;
        Object COMMA222_tree=null;
        Object FROM224_tree=null;
        Object WHERE226_tree=null;
        Object GROUP227_tree=null;
        Object BY228_tree=null;
        Object COMMA230_tree=null;
        Object HAVING232_tree=null;
        RewriteRuleTokenStream stream_WHERE=new RewriteRuleTokenStream(adaptor,"token WHERE");
        RewriteRuleTokenStream stream_GROUP=new RewriteRuleTokenStream(adaptor,"token GROUP");
        RewriteRuleTokenStream stream_BY=new RewriteRuleTokenStream(adaptor,"token BY");
        RewriteRuleTokenStream stream_HAVING=new RewriteRuleTokenStream(adaptor,"token HAVING");
        RewriteRuleTokenStream stream_FROM=new RewriteRuleTokenStream(adaptor,"token FROM");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_SELECT=new RewriteRuleTokenStream(adaptor,"token SELECT");
        RewriteRuleTokenStream stream_DISTINCT=new RewriteRuleTokenStream(adaptor,"token DISTINCT");
        RewriteRuleTokenStream stream_ALL=new RewriteRuleTokenStream(adaptor,"token ALL");
        RewriteRuleSubtreeStream stream_ordering_term=new RewriteRuleSubtreeStream(adaptor,"rule ordering_term");
        RewriteRuleSubtreeStream stream_result_column=new RewriteRuleSubtreeStream(adaptor,"rule result_column");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        RewriteRuleSubtreeStream stream_join_source=new RewriteRuleSubtreeStream(adaptor,"rule join_source");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:329:12: ( SELECT ( ALL | DISTINCT )? result_column ( COMMA result_column )* ( FROM join_source )? ( WHERE where_expr= expr )? ( GROUP BY ordering_term ( COMMA ordering_term )* ( HAVING having_expr= expr )? )? -> ^( SELECT_CORE ( DISTINCT )? ^( COLUMNS ( result_column )+ ) ( ^( FROM join_source ) )? ( ^( WHERE $where_expr) )? ( ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? ) )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:3: SELECT ( ALL | DISTINCT )? result_column ( COMMA result_column )* ( FROM join_source )? ( WHERE where_expr= expr )? ( GROUP BY ordering_term ( COMMA ordering_term )* ( HAVING having_expr= expr )? )?
            {
            SELECT218=(Token)match(input,SELECT,FOLLOW_SELECT_in_select_core2016);  
            stream_SELECT.add(SELECT218);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:10: ( ALL | DISTINCT )?
            int alt71=3;
            alt71 = dfa71.predict(input);
            switch (alt71) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:11: ALL
                    {
                    ALL219=(Token)match(input,ALL,FOLLOW_ALL_in_select_core2019);  
                    stream_ALL.add(ALL219);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:17: DISTINCT
                    {
                    DISTINCT220=(Token)match(input,DISTINCT,FOLLOW_DISTINCT_in_select_core2023);  
                    stream_DISTINCT.add(DISTINCT220);


                    }
                    break;

            }


            pushFollow(FOLLOW_result_column_in_select_core2027);
            result_column221=result_column();

            state._fsp--;

            stream_result_column.add(result_column221.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:42: ( COMMA result_column )*
            loop72:
            do {
                int alt72=2;
                int LA72_0 = input.LA(1);

                if ( (LA72_0==COMMA) ) {
                    alt72=1;
                }


                switch (alt72) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:43: COMMA result_column
            	    {
            	    COMMA222=(Token)match(input,COMMA,FOLLOW_COMMA_in_select_core2030);  
            	    stream_COMMA.add(COMMA222);


            	    pushFollow(FOLLOW_result_column_in_select_core2032);
            	    result_column223=result_column();

            	    state._fsp--;

            	    stream_result_column.add(result_column223.getTree());

            	    }
            	    break;

            	default :
            	    break loop72;
                }
            } while (true);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:65: ( FROM join_source )?
            int alt73=2;
            int LA73_0 = input.LA(1);

            if ( (LA73_0==FROM) ) {
                alt73=1;
            }
            switch (alt73) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:66: FROM join_source
                    {
                    FROM224=(Token)match(input,FROM,FOLLOW_FROM_in_select_core2037);  
                    stream_FROM.add(FROM224);


                    pushFollow(FOLLOW_join_source_in_select_core2039);
                    join_source225=join_source();

                    state._fsp--;

                    stream_join_source.add(join_source225.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:85: ( WHERE where_expr= expr )?
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( (LA74_0==WHERE) ) {
                alt74=1;
            }
            switch (alt74) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:330:86: WHERE where_expr= expr
                    {
                    WHERE226=(Token)match(input,WHERE,FOLLOW_WHERE_in_select_core2044);  
                    stream_WHERE.add(WHERE226);


                    pushFollow(FOLLOW_expr_in_select_core2048);
                    where_expr=expr();

                    state._fsp--;

                    stream_expr.add(where_expr.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:3: ( GROUP BY ordering_term ( COMMA ordering_term )* ( HAVING having_expr= expr )? )?
            int alt77=2;
            int LA77_0 = input.LA(1);

            if ( (LA77_0==GROUP) ) {
                alt77=1;
            }
            switch (alt77) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:5: GROUP BY ordering_term ( COMMA ordering_term )* ( HAVING having_expr= expr )?
                    {
                    GROUP227=(Token)match(input,GROUP,FOLLOW_GROUP_in_select_core2056);  
                    stream_GROUP.add(GROUP227);


                    BY228=(Token)match(input,BY,FOLLOW_BY_in_select_core2058);  
                    stream_BY.add(BY228);


                    pushFollow(FOLLOW_ordering_term_in_select_core2060);
                    ordering_term229=ordering_term();

                    state._fsp--;

                    stream_ordering_term.add(ordering_term229.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:28: ( COMMA ordering_term )*
                    loop75:
                    do {
                        int alt75=2;
                        int LA75_0 = input.LA(1);

                        if ( (LA75_0==COMMA) ) {
                            alt75=1;
                        }


                        switch (alt75) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:29: COMMA ordering_term
                    	    {
                    	    COMMA230=(Token)match(input,COMMA,FOLLOW_COMMA_in_select_core2063);  
                    	    stream_COMMA.add(COMMA230);


                    	    pushFollow(FOLLOW_ordering_term_in_select_core2065);
                    	    ordering_term231=ordering_term();

                    	    state._fsp--;

                    	    stream_ordering_term.add(ordering_term231.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop75;
                        }
                    } while (true);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:51: ( HAVING having_expr= expr )?
                    int alt76=2;
                    int LA76_0 = input.LA(1);

                    if ( (LA76_0==HAVING) ) {
                        alt76=1;
                    }
                    switch (alt76) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:331:52: HAVING having_expr= expr
                            {
                            HAVING232=(Token)match(input,HAVING,FOLLOW_HAVING_in_select_core2070);  
                            stream_HAVING.add(HAVING232);


                            pushFollow(FOLLOW_expr_in_select_core2074);
                            having_expr=expr();

                            state._fsp--;

                            stream_expr.add(having_expr.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: result_column, ordering_term, where_expr, having_expr, HAVING, GROUP, WHERE, FROM, DISTINCT, join_source
            // token labels: 
            // rule labels: retval, having_expr, where_expr
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_having_expr=new RewriteRuleSubtreeStream(adaptor,"rule having_expr",having_expr!=null?having_expr.tree:null);
            RewriteRuleSubtreeStream stream_where_expr=new RewriteRuleSubtreeStream(adaptor,"rule where_expr",where_expr!=null?where_expr.tree:null);

            root_0 = (Object)adaptor.nil();
            // 332:2: -> ^( SELECT_CORE ( DISTINCT )? ^( COLUMNS ( result_column )+ ) ( ^( FROM join_source ) )? ( ^( WHERE $where_expr) )? ( ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? ) )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:332:4: ^( SELECT_CORE ( DISTINCT )? ^( COLUMNS ( result_column )+ ) ( ^( FROM join_source ) )? ( ^( WHERE $where_expr) )? ( ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? ) )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_CORE, "SELECT_CORE")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:15: ( DISTINCT )?
                if ( stream_DISTINCT.hasNext() ) {
                    adaptor.addChild(root_1, 
                    stream_DISTINCT.nextNode()
                    );

                }
                stream_DISTINCT.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:27: ^( COLUMNS ( result_column )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                if ( !(stream_result_column.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_result_column.hasNext() ) {
                    adaptor.addChild(root_2, stream_result_column.nextTree());

                }
                stream_result_column.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:53: ( ^( FROM join_source ) )?
                if ( stream_FROM.hasNext()||stream_join_source.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:53: ^( FROM join_source )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_FROM.nextNode()
                    , root_2);

                    adaptor.addChild(root_2, stream_join_source.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_FROM.reset();
                stream_join_source.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:74: ( ^( WHERE $where_expr) )?
                if ( stream_where_expr.hasNext()||stream_WHERE.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:333:74: ^( WHERE $where_expr)
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_WHERE.nextNode()
                    , root_2);

                    adaptor.addChild(root_2, stream_where_expr.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_where_expr.reset();
                stream_WHERE.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:334:3: ( ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? ) )?
                if ( stream_ordering_term.hasNext()||stream_HAVING.hasNext()||stream_having_expr.hasNext()||stream_GROUP.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:334:3: ^( GROUP ( ordering_term )+ ( ^( HAVING $having_expr) )? )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_GROUP.nextNode()
                    , root_2);

                    if ( !(stream_ordering_term.hasNext()) ) {
                        throw new RewriteEarlyExitException();
                    }
                    while ( stream_ordering_term.hasNext() ) {
                        adaptor.addChild(root_2, stream_ordering_term.nextTree());

                    }
                    stream_ordering_term.reset();

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:334:26: ( ^( HAVING $having_expr) )?
                    if ( stream_having_expr.hasNext()||stream_HAVING.hasNext() ) {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:334:26: ^( HAVING $having_expr)
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(
                        stream_HAVING.nextNode()
                        , root_3);

                        adaptor.addChild(root_3, stream_having_expr.nextTree());

                        adaptor.addChild(root_2, root_3);
                        }

                    }
                    stream_having_expr.reset();
                    stream_HAVING.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_ordering_term.reset();
                stream_HAVING.reset();
                stream_having_expr.reset();
                stream_GROUP.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_core"


    public static class result_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "result_column"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:337:1: result_column : ( ASTERISK |table_name= id DOT ASTERISK -> ^( ASTERISK $table_name) | expr ( ( AS )? column_alias= id )? -> ^( ALIAS expr ( $column_alias)? ) );
    public final SqlParser.result_column_return result_column() throws RecognitionException {
        SqlParser.result_column_return retval = new SqlParser.result_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK233=null;
        Token DOT234=null;
        Token ASTERISK235=null;
        Token AS237=null;
        SqlParser.id_return table_name =null;

        SqlParser.id_return column_alias =null;

        SqlParser.expr_return expr236 =null;


        Object ASTERISK233_tree=null;
        Object DOT234_tree=null;
        Object ASTERISK235_tree=null;
        Object AS237_tree=null;
        RewriteRuleTokenStream stream_AS=new RewriteRuleTokenStream(adaptor,"token AS");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:338:3: ( ASTERISK |table_name= id DOT ASTERISK -> ^( ASTERISK $table_name) | expr ( ( AS )? column_alias= id )? -> ^( ALIAS expr ( $column_alias)? ) )
            int alt80=3;
            alt80 = dfa80.predict(input);
            switch (alt80) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:338:5: ASTERISK
                    {
                    root_0 = (Object)adaptor.nil();


                    ASTERISK233=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_result_column2144); 
                    ASTERISK233_tree = 
                    (Object)adaptor.create(ASTERISK233)
                    ;
                    adaptor.addChild(root_0, ASTERISK233_tree);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:339:5: table_name= id DOT ASTERISK
                    {
                    pushFollow(FOLLOW_id_in_result_column2152);
                    table_name=id();

                    state._fsp--;

                    stream_id.add(table_name.getTree());

                    DOT234=(Token)match(input,DOT,FOLLOW_DOT_in_result_column2154);  
                    stream_DOT.add(DOT234);


                    ASTERISK235=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_result_column2156);  
                    stream_ASTERISK.add(ASTERISK235);


                    // AST REWRITE
                    // elements: table_name, ASTERISK
                    // token labels: 
                    // rule labels: retval, table_name
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 339:32: -> ^( ASTERISK $table_name)
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:339:35: ^( ASTERISK $table_name)
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        stream_ASTERISK.nextNode()
                        , root_1);

                        adaptor.addChild(root_1, stream_table_name.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:5: expr ( ( AS )? column_alias= id )?
                    {
                    pushFollow(FOLLOW_expr_in_result_column2171);
                    expr236=expr();

                    state._fsp--;

                    stream_expr.add(expr236.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:10: ( ( AS )? column_alias= id )?
                    int alt79=2;
                    alt79 = dfa79.predict(input);
                    switch (alt79) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:11: ( AS )? column_alias= id
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:11: ( AS )?
                            int alt78=2;
                            alt78 = dfa78.predict(input);
                            switch (alt78) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:12: AS
                                    {
                                    AS237=(Token)match(input,AS,FOLLOW_AS_in_result_column2175);  
                                    stream_AS.add(AS237);


                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_id_in_result_column2181);
                            column_alias=id();

                            state._fsp--;

                            stream_id.add(column_alias.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: expr, column_alias
                    // token labels: 
                    // rule labels: retval, column_alias
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_column_alias=new RewriteRuleSubtreeStream(adaptor,"rule column_alias",column_alias!=null?column_alias.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 340:35: -> ^( ALIAS expr ( $column_alias)? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:38: ^( ALIAS expr ( $column_alias)? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ALIAS, "ALIAS")
                        , root_1);

                        adaptor.addChild(root_1, stream_expr.nextTree());

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:340:52: ( $column_alias)?
                        if ( stream_column_alias.hasNext() ) {
                            adaptor.addChild(root_1, stream_column_alias.nextTree());

                        }
                        stream_column_alias.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "result_column"


    public static class join_source_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_source"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:1: join_source : single_source ( join_op ^ single_source ( join_constraint )? )* ;
    public final SqlParser.join_source_return join_source() throws RecognitionException {
        SqlParser.join_source_return retval = new SqlParser.join_source_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.single_source_return single_source238 =null;

        SqlParser.join_op_return join_op239 =null;

        SqlParser.single_source_return single_source240 =null;

        SqlParser.join_constraint_return join_constraint241 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:12: ( single_source ( join_op ^ single_source ( join_constraint )? )* )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:14: single_source ( join_op ^ single_source ( join_constraint )? )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_single_source_in_join_source2202);
            single_source238=single_source();

            state._fsp--;

            adaptor.addChild(root_0, single_source238.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:28: ( join_op ^ single_source ( join_constraint )? )*
            loop82:
            do {
                int alt82=2;
                int LA82_0 = input.LA(1);

                if ( (LA82_0==COMMA||LA82_0==CROSS||LA82_0==INNER||LA82_0==JOIN||LA82_0==LEFT||LA82_0==NATURAL||LA82_0==OUTER) ) {
                    alt82=1;
                }


                switch (alt82) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:29: join_op ^ single_source ( join_constraint )?
            	    {
            	    pushFollow(FOLLOW_join_op_in_join_source2205);
            	    join_op239=join_op();

            	    state._fsp--;

            	    root_0 = (Object)adaptor.becomeRoot(join_op239.getTree(), root_0);

            	    pushFollow(FOLLOW_single_source_in_join_source2208);
            	    single_source240=single_source();

            	    state._fsp--;

            	    adaptor.addChild(root_0, single_source240.getTree());

            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:52: ( join_constraint )?
            	    int alt81=2;
            	    int LA81_0 = input.LA(1);

            	    if ( (LA81_0==ON||LA81_0==USING) ) {
            	        alt81=1;
            	    }
            	    switch (alt81) {
            	        case 1 :
            	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:342:53: join_constraint
            	            {
            	            pushFollow(FOLLOW_join_constraint_in_join_source2211);
            	            join_constraint241=join_constraint();

            	            state._fsp--;

            	            adaptor.addChild(root_0, join_constraint241.getTree());

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop82;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_source"


    public static class single_source_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "single_source"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:344:1: single_source : ( (database_name= id DOT )? table_name= ID ( ( AS )? table_alias= ID )? ( INDEXED BY index_name= id | NOT INDEXED )? -> ^( ALIAS ^( $table_name ( $database_name)? ) ( $table_alias)? ( ^( INDEXED ( NOT )? ( $index_name)? ) )? ) | LPAREN select_stmt RPAREN ( ( AS )? table_alias= ID )? -> ^( ALIAS select_stmt ( $table_alias)? ) | LPAREN ! join_source RPAREN !);
    public final SqlParser.single_source_return single_source() throws RecognitionException {
        SqlParser.single_source_return retval = new SqlParser.single_source_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token table_name=null;
        Token table_alias=null;
        Token DOT242=null;
        Token AS243=null;
        Token INDEXED244=null;
        Token BY245=null;
        Token NOT246=null;
        Token INDEXED247=null;
        Token LPAREN248=null;
        Token RPAREN250=null;
        Token AS251=null;
        Token LPAREN252=null;
        Token RPAREN254=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return index_name =null;

        SqlParser.select_stmt_return select_stmt249 =null;

        SqlParser.join_source_return join_source253 =null;


        Object table_name_tree=null;
        Object table_alias_tree=null;
        Object DOT242_tree=null;
        Object AS243_tree=null;
        Object INDEXED244_tree=null;
        Object BY245_tree=null;
        Object NOT246_tree=null;
        Object INDEXED247_tree=null;
        Object LPAREN248_tree=null;
        Object RPAREN250_tree=null;
        Object AS251_tree=null;
        Object LPAREN252_tree=null;
        Object RPAREN254_tree=null;
        RewriteRuleTokenStream stream_INDEXED=new RewriteRuleTokenStream(adaptor,"token INDEXED");
        RewriteRuleTokenStream stream_AS=new RewriteRuleTokenStream(adaptor,"token AS");
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_BY=new RewriteRuleTokenStream(adaptor,"token BY");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_select_stmt=new RewriteRuleSubtreeStream(adaptor,"rule select_stmt");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:3: ( (database_name= id DOT )? table_name= ID ( ( AS )? table_alias= ID )? ( INDEXED BY index_name= id | NOT INDEXED )? -> ^( ALIAS ^( $table_name ( $database_name)? ) ( $table_alias)? ( ^( INDEXED ( NOT )? ( $index_name)? ) )? ) | LPAREN select_stmt RPAREN ( ( AS )? table_alias= ID )? -> ^( ALIAS select_stmt ( $table_alias)? ) | LPAREN ! join_source RPAREN !)
            int alt89=3;
            int LA89_0 = input.LA(1);

            if ( ((LA89_0 >= ABORT && LA89_0 <= AFTER)||(LA89_0 >= ALL && LA89_0 <= ALTER)||(LA89_0 >= ANALYZE && LA89_0 <= AND)||(LA89_0 >= AS && LA89_0 <= ASC)||(LA89_0 >= ATTACH && LA89_0 <= AUTOINCREMENT)||(LA89_0 >= BEFORE && LA89_0 <= BETWEEN)||LA89_0==BY||(LA89_0 >= CASCADE && LA89_0 <= COLLATE)||LA89_0==COLUMN||(LA89_0 >= COMMIT && LA89_0 <= CONSTRAINT)||LA89_0==CREATE||(LA89_0 >= CROSS && LA89_0 <= CURRENT_TIMESTAMP)||(LA89_0 >= DATABASE && LA89_0 <= DISTINCT)||LA89_0==DROP||(LA89_0 >= EACH && LA89_0 <= END)||(LA89_0 >= ESCAPE && LA89_0 <= EXPLAIN)||LA89_0==FAIL||(LA89_0 >= FOR && LA89_0 <= FROM)||LA89_0==GROUP||LA89_0==HAVING||LA89_0==ID||(LA89_0 >= IF && LA89_0 <= IMMEDIATE)||(LA89_0 >= INDEX && LA89_0 <= INSTEAD)||(LA89_0 >= INTERSECT && LA89_0 <= INTO)||LA89_0==IS||LA89_0==JOIN||LA89_0==KEY||LA89_0==LEFT||LA89_0==LIMIT||LA89_0==NATURAL||LA89_0==NULL||(LA89_0 >= OF && LA89_0 <= ON)||(LA89_0 >= OR && LA89_0 <= ORDER)||LA89_0==OUTER||LA89_0==PLAN||(LA89_0 >= PRAGMA && LA89_0 <= PRIMARY)||LA89_0==QUERY||(LA89_0 >= RAISE && LA89_0 <= REFERENCES)||(LA89_0 >= REINDEX && LA89_0 <= ROW)||(LA89_0 >= SAVEPOINT && LA89_0 <= SELECT)||LA89_0==SET||LA89_0==STRING||LA89_0==TABLE||(LA89_0 >= TEMPORARY && LA89_0 <= THEN)||(LA89_0 >= TO && LA89_0 <= TRIGGER)||(LA89_0 >= UNION && LA89_0 <= USING)||(LA89_0 >= VACUUM && LA89_0 <= VIRTUAL)||(LA89_0 >= WHEN && LA89_0 <= WHERE)) ) {
                alt89=1;
            }
            else if ( (LA89_0==LPAREN) ) {
                int LA89_4 = input.LA(2);

                if ( (LA89_4==SELECT) ) {
                    int LA89_5 = input.LA(3);

                    if ( ((LA89_5 >= ABORT && LA89_5 <= AFTER)||(LA89_5 >= ALL && LA89_5 <= ALTER)||(LA89_5 >= ANALYZE && LA89_5 <= AND)||(LA89_5 >= AS && LA89_5 <= AUTOINCREMENT)||(LA89_5 >= BEFORE && LA89_5 <= BETWEEN)||LA89_5==BLOB||LA89_5==BY||(LA89_5 >= CASCADE && LA89_5 <= COLUMN)||(LA89_5 >= COMMIT && LA89_5 <= CONSTRAINT)||LA89_5==CREATE||(LA89_5 >= CROSS && LA89_5 <= CURRENT_TIMESTAMP)||(LA89_5 >= DATABASE && LA89_5 <= DISTINCT)||LA89_5==DROP||(LA89_5 >= EACH && LA89_5 <= END)||(LA89_5 >= ESCAPE && LA89_5 <= EXPLAIN)||(LA89_5 >= FAIL && LA89_5 <= FLOAT)||(LA89_5 >= FOR && LA89_5 <= FROM)||LA89_5==GROUP||LA89_5==HAVING||LA89_5==ID||(LA89_5 >= IF && LA89_5 <= IMMEDIATE)||(LA89_5 >= INDEX && LA89_5 <= INTEGER)||(LA89_5 >= INTERSECT && LA89_5 <= INTO)||LA89_5==IS||LA89_5==JOIN||LA89_5==KEY||LA89_5==LEFT||LA89_5==LIMIT||LA89_5==LPAREN||LA89_5==MINUS||(LA89_5 >= NATURAL && LA89_5 <= NOT)||LA89_5==NULL||(LA89_5 >= OF && LA89_5 <= ON)||(LA89_5 >= OR && LA89_5 <= ORDER)||LA89_5==OUTER||(LA89_5 >= PLAN && LA89_5 <= PRIMARY)||(LA89_5 >= QUERY && LA89_5 <= QUESTION)||(LA89_5 >= RAISE && LA89_5 <= REFERENCES)||(LA89_5 >= REINDEX && LA89_5 <= ROW)||(LA89_5 >= SAVEPOINT && LA89_5 <= SELECT)||LA89_5==SET||LA89_5==STRING||LA89_5==TABLE||(LA89_5 >= TEMPORARY && LA89_5 <= TRUE)||(LA89_5 >= UNION && LA89_5 <= USING)||(LA89_5 >= VACUUM && LA89_5 <= VIRTUAL)||(LA89_5 >= WHEN && LA89_5 <= WHERE)) ) {
                        alt89=2;
                    }
                    else if ( (LA89_5==DOT) ) {
                        alt89=3;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 89, 5, input);

                        throw nvae;

                    }
                }
                else if ( ((LA89_4 >= ABORT && LA89_4 <= AFTER)||(LA89_4 >= ALL && LA89_4 <= ALTER)||(LA89_4 >= ANALYZE && LA89_4 <= AND)||(LA89_4 >= AS && LA89_4 <= ASC)||(LA89_4 >= ATTACH && LA89_4 <= AUTOINCREMENT)||(LA89_4 >= BEFORE && LA89_4 <= BETWEEN)||LA89_4==BY||(LA89_4 >= CASCADE && LA89_4 <= COLLATE)||LA89_4==COLUMN||(LA89_4 >= COMMIT && LA89_4 <= CONSTRAINT)||LA89_4==CREATE||(LA89_4 >= CROSS && LA89_4 <= CURRENT_TIMESTAMP)||(LA89_4 >= DATABASE && LA89_4 <= DISTINCT)||LA89_4==DROP||(LA89_4 >= EACH && LA89_4 <= END)||(LA89_4 >= ESCAPE && LA89_4 <= EXPLAIN)||LA89_4==FAIL||(LA89_4 >= FOR && LA89_4 <= FROM)||LA89_4==GROUP||LA89_4==HAVING||LA89_4==ID||(LA89_4 >= IF && LA89_4 <= IMMEDIATE)||(LA89_4 >= INDEX && LA89_4 <= INSTEAD)||(LA89_4 >= INTERSECT && LA89_4 <= INTO)||LA89_4==IS||LA89_4==JOIN||LA89_4==KEY||LA89_4==LEFT||LA89_4==LIMIT||LA89_4==LPAREN||LA89_4==NATURAL||LA89_4==NULL||(LA89_4 >= OF && LA89_4 <= ON)||(LA89_4 >= OR && LA89_4 <= ORDER)||LA89_4==OUTER||LA89_4==PLAN||(LA89_4 >= PRAGMA && LA89_4 <= PRIMARY)||LA89_4==QUERY||(LA89_4 >= RAISE && LA89_4 <= REFERENCES)||(LA89_4 >= REINDEX && LA89_4 <= ROW)||LA89_4==SAVEPOINT||LA89_4==SET||LA89_4==STRING||LA89_4==TABLE||(LA89_4 >= TEMPORARY && LA89_4 <= THEN)||(LA89_4 >= TO && LA89_4 <= TRIGGER)||(LA89_4 >= UNION && LA89_4 <= USING)||(LA89_4 >= VACUUM && LA89_4 <= VIRTUAL)||(LA89_4 >= WHEN && LA89_4 <= WHERE)) ) {
                    alt89=3;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 89, 4, input);

                    throw nvae;

                }
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 89, 0, input);

                throw nvae;

            }
            switch (alt89) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:5: (database_name= id DOT )? table_name= ID ( ( AS )? table_alias= ID )? ( INDEXED BY index_name= id | NOT INDEXED )?
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:5: (database_name= id DOT )?
                    int alt83=2;
                    int LA83_0 = input.LA(1);

                    if ( (LA83_0==ID) ) {
                        int LA83_1 = input.LA(2);

                        if ( (LA83_1==DOT) ) {
                            alt83=1;
                        }
                    }
                    else if ( ((LA83_0 >= ABORT && LA83_0 <= AFTER)||(LA83_0 >= ALL && LA83_0 <= ALTER)||(LA83_0 >= ANALYZE && LA83_0 <= AND)||(LA83_0 >= AS && LA83_0 <= ASC)||(LA83_0 >= ATTACH && LA83_0 <= AUTOINCREMENT)||(LA83_0 >= BEFORE && LA83_0 <= BETWEEN)||LA83_0==BY||(LA83_0 >= CASCADE && LA83_0 <= COLLATE)||LA83_0==COLUMN||(LA83_0 >= COMMIT && LA83_0 <= CONSTRAINT)||LA83_0==CREATE||(LA83_0 >= CROSS && LA83_0 <= CURRENT_TIMESTAMP)||(LA83_0 >= DATABASE && LA83_0 <= DISTINCT)||LA83_0==DROP||(LA83_0 >= EACH && LA83_0 <= END)||(LA83_0 >= ESCAPE && LA83_0 <= EXPLAIN)||LA83_0==FAIL||(LA83_0 >= FOR && LA83_0 <= FROM)||LA83_0==GROUP||LA83_0==HAVING||(LA83_0 >= IF && LA83_0 <= IMMEDIATE)||(LA83_0 >= INDEX && LA83_0 <= INSTEAD)||(LA83_0 >= INTERSECT && LA83_0 <= INTO)||LA83_0==IS||LA83_0==JOIN||LA83_0==KEY||LA83_0==LEFT||LA83_0==LIMIT||LA83_0==NATURAL||LA83_0==NULL||(LA83_0 >= OF && LA83_0 <= ON)||(LA83_0 >= OR && LA83_0 <= ORDER)||LA83_0==OUTER||LA83_0==PLAN||(LA83_0 >= PRAGMA && LA83_0 <= PRIMARY)||LA83_0==QUERY||(LA83_0 >= RAISE && LA83_0 <= REFERENCES)||(LA83_0 >= REINDEX && LA83_0 <= ROW)||(LA83_0 >= SAVEPOINT && LA83_0 <= SELECT)||LA83_0==SET||LA83_0==STRING||LA83_0==TABLE||(LA83_0 >= TEMPORARY && LA83_0 <= THEN)||(LA83_0 >= TO && LA83_0 <= TRIGGER)||(LA83_0 >= UNION && LA83_0 <= USING)||(LA83_0 >= VACUUM && LA83_0 <= VIRTUAL)||(LA83_0 >= WHEN && LA83_0 <= WHERE)) ) {
                        alt83=1;
                    }
                    switch (alt83) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:6: database_name= id DOT
                            {
                            pushFollow(FOLLOW_id_in_single_source2228);
                            database_name=id();

                            state._fsp--;

                            stream_id.add(database_name.getTree());

                            DOT242=(Token)match(input,DOT,FOLLOW_DOT_in_single_source2230);  
                            stream_DOT.add(DOT242);


                            }
                            break;

                    }


                    table_name=(Token)match(input,ID,FOLLOW_ID_in_single_source2236);  
                    stream_ID.add(table_name);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:43: ( ( AS )? table_alias= ID )?
                    int alt85=2;
                    int LA85_0 = input.LA(1);

                    if ( (LA85_0==AS||LA85_0==ID) ) {
                        alt85=1;
                    }
                    switch (alt85) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:44: ( AS )? table_alias= ID
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:44: ( AS )?
                            int alt84=2;
                            int LA84_0 = input.LA(1);

                            if ( (LA84_0==AS) ) {
                                alt84=1;
                            }
                            switch (alt84) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:45: AS
                                    {
                                    AS243=(Token)match(input,AS,FOLLOW_AS_in_single_source2240);  
                                    stream_AS.add(AS243);


                                    }
                                    break;

                            }


                            table_alias=(Token)match(input,ID,FOLLOW_ID_in_single_source2246);  
                            stream_ID.add(table_alias);


                            }
                            break;

                    }


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:67: ( INDEXED BY index_name= id | NOT INDEXED )?
                    int alt86=3;
                    int LA86_0 = input.LA(1);

                    if ( (LA86_0==INDEXED) ) {
                        alt86=1;
                    }
                    else if ( (LA86_0==NOT) ) {
                        alt86=2;
                    }
                    switch (alt86) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:68: INDEXED BY index_name= id
                            {
                            INDEXED244=(Token)match(input,INDEXED,FOLLOW_INDEXED_in_single_source2251);  
                            stream_INDEXED.add(INDEXED244);


                            BY245=(Token)match(input,BY,FOLLOW_BY_in_single_source2253);  
                            stream_BY.add(BY245);


                            pushFollow(FOLLOW_id_in_single_source2257);
                            index_name=id();

                            state._fsp--;

                            stream_id.add(index_name.getTree());

                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:345:95: NOT INDEXED
                            {
                            NOT246=(Token)match(input,NOT,FOLLOW_NOT_in_single_source2261);  
                            stream_NOT.add(NOT246);


                            INDEXED247=(Token)match(input,INDEXED,FOLLOW_INDEXED_in_single_source2263);  
                            stream_INDEXED.add(INDEXED247);


                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: NOT, table_alias, database_name, index_name, table_name, INDEXED
                    // token labels: table_name, table_alias
                    // rule labels: index_name, database_name, retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleTokenStream stream_table_name=new RewriteRuleTokenStream(adaptor,"token table_name",table_name);
                    RewriteRuleTokenStream stream_table_alias=new RewriteRuleTokenStream(adaptor,"token table_alias",table_alias);
                    RewriteRuleSubtreeStream stream_index_name=new RewriteRuleSubtreeStream(adaptor,"rule index_name",index_name!=null?index_name.tree:null);
                    RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 346:3: -> ^( ALIAS ^( $table_name ( $database_name)? ) ( $table_alias)? ( ^( INDEXED ( NOT )? ( $index_name)? ) )? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:6: ^( ALIAS ^( $table_name ( $database_name)? ) ( $table_alias)? ( ^( INDEXED ( NOT )? ( $index_name)? ) )? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ALIAS, "ALIAS")
                        , root_1);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:14: ^( $table_name ( $database_name)? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_2);

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:29: ( $database_name)?
                        if ( stream_database_name.hasNext() ) {
                            adaptor.addChild(root_2, stream_database_name.nextTree());

                        }
                        stream_database_name.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:46: ( $table_alias)?
                        if ( stream_table_alias.hasNext() ) {
                            adaptor.addChild(root_1, stream_table_alias.nextNode());

                        }
                        stream_table_alias.reset();

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:59: ( ^( INDEXED ( NOT )? ( $index_name)? ) )?
                        if ( stream_NOT.hasNext()||stream_index_name.hasNext()||stream_INDEXED.hasNext() ) {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:59: ^( INDEXED ( NOT )? ( $index_name)? )
                            {
                            Object root_2 = (Object)adaptor.nil();
                            root_2 = (Object)adaptor.becomeRoot(
                            stream_INDEXED.nextNode()
                            , root_2);

                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:69: ( NOT )?
                            if ( stream_NOT.hasNext() ) {
                                adaptor.addChild(root_2, 
                                stream_NOT.nextNode()
                                );

                            }
                            stream_NOT.reset();

                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:346:75: ( $index_name)?
                            if ( stream_index_name.hasNext() ) {
                                adaptor.addChild(root_2, stream_index_name.nextTree());

                            }
                            stream_index_name.reset();

                            adaptor.addChild(root_1, root_2);
                            }

                        }
                        stream_NOT.reset();
                        stream_index_name.reset();
                        stream_INDEXED.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:347:5: LPAREN select_stmt RPAREN ( ( AS )? table_alias= ID )?
                    {
                    LPAREN248=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_single_source2304);  
                    stream_LPAREN.add(LPAREN248);


                    pushFollow(FOLLOW_select_stmt_in_single_source2306);
                    select_stmt249=select_stmt();

                    state._fsp--;

                    stream_select_stmt.add(select_stmt249.getTree());

                    RPAREN250=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_single_source2308);  
                    stream_RPAREN.add(RPAREN250);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:347:31: ( ( AS )? table_alias= ID )?
                    int alt88=2;
                    int LA88_0 = input.LA(1);

                    if ( (LA88_0==AS||LA88_0==ID) ) {
                        alt88=1;
                    }
                    switch (alt88) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:347:32: ( AS )? table_alias= ID
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:347:32: ( AS )?
                            int alt87=2;
                            int LA87_0 = input.LA(1);

                            if ( (LA87_0==AS) ) {
                                alt87=1;
                            }
                            switch (alt87) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:347:33: AS
                                    {
                                    AS251=(Token)match(input,AS,FOLLOW_AS_in_single_source2312);  
                                    stream_AS.add(AS251);


                                    }
                                    break;

                            }


                            table_alias=(Token)match(input,ID,FOLLOW_ID_in_single_source2318);  
                            stream_ID.add(table_alias);


                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: table_alias, select_stmt
                    // token labels: table_alias
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleTokenStream stream_table_alias=new RewriteRuleTokenStream(adaptor,"token table_alias",table_alias);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 348:3: -> ^( ALIAS select_stmt ( $table_alias)? )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:348:6: ^( ALIAS select_stmt ( $table_alias)? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ALIAS, "ALIAS")
                        , root_1);

                        adaptor.addChild(root_1, stream_select_stmt.nextTree());

                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:348:27: ( $table_alias)?
                        if ( stream_table_alias.hasNext() ) {
                            adaptor.addChild(root_1, stream_table_alias.nextNode());

                        }
                        stream_table_alias.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:349:5: LPAREN ! join_source RPAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LPAREN252=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_single_source2340); 

                    pushFollow(FOLLOW_join_source_in_single_source2343);
                    join_source253=join_source();

                    state._fsp--;

                    adaptor.addChild(root_0, join_source253.getTree());

                    RPAREN254=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_single_source2345); 

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "single_source"


    public static class join_op_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_op"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:351:1: join_op : ( COMMA | ( NATURAL )? ( ( LEFT )? ( OUTER )? | INNER | CROSS ) JOIN ^);
    public final SqlParser.join_op_return join_op() throws RecognitionException {
        SqlParser.join_op_return retval = new SqlParser.join_op_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA255=null;
        Token NATURAL256=null;
        Token LEFT257=null;
        Token OUTER258=null;
        Token INNER259=null;
        Token CROSS260=null;
        Token JOIN261=null;

        Object COMMA255_tree=null;
        Object NATURAL256_tree=null;
        Object LEFT257_tree=null;
        Object OUTER258_tree=null;
        Object INNER259_tree=null;
        Object CROSS260_tree=null;
        Object JOIN261_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:352:3: ( COMMA | ( NATURAL )? ( ( LEFT )? ( OUTER )? | INNER | CROSS ) JOIN ^)
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==COMMA) ) {
                alt94=1;
            }
            else if ( (LA94_0==CROSS||LA94_0==INNER||LA94_0==JOIN||LA94_0==LEFT||LA94_0==NATURAL||LA94_0==OUTER) ) {
                alt94=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 94, 0, input);

                throw nvae;

            }
            switch (alt94) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:352:5: COMMA
                    {
                    root_0 = (Object)adaptor.nil();


                    COMMA255=(Token)match(input,COMMA,FOLLOW_COMMA_in_join_op2356); 
                    COMMA255_tree = 
                    (Object)adaptor.create(COMMA255)
                    ;
                    adaptor.addChild(root_0, COMMA255_tree);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:5: ( NATURAL )? ( ( LEFT )? ( OUTER )? | INNER | CROSS ) JOIN ^
                    {
                    root_0 = (Object)adaptor.nil();


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:5: ( NATURAL )?
                    int alt90=2;
                    int LA90_0 = input.LA(1);

                    if ( (LA90_0==NATURAL) ) {
                        alt90=1;
                    }
                    switch (alt90) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:6: NATURAL
                            {
                            NATURAL256=(Token)match(input,NATURAL,FOLLOW_NATURAL_in_join_op2363); 
                            NATURAL256_tree = 
                            (Object)adaptor.create(NATURAL256)
                            ;
                            adaptor.addChild(root_0, NATURAL256_tree);


                            }
                            break;

                    }


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:16: ( ( LEFT )? ( OUTER )? | INNER | CROSS )
                    int alt93=3;
                    switch ( input.LA(1) ) {
                    case JOIN:
                    case LEFT:
                    case OUTER:
                        {
                        alt93=1;
                        }
                        break;
                    case INNER:
                        {
                        alt93=2;
                        }
                        break;
                    case CROSS:
                        {
                        alt93=3;
                        }
                        break;
                    default:
                        NoViableAltException nvae =
                            new NoViableAltException("", 93, 0, input);

                        throw nvae;

                    }

                    switch (alt93) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:17: ( LEFT )? ( OUTER )?
                            {
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:17: ( LEFT )?
                            int alt91=2;
                            int LA91_0 = input.LA(1);

                            if ( (LA91_0==LEFT) ) {
                                alt91=1;
                            }
                            switch (alt91) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:18: LEFT
                                    {
                                    LEFT257=(Token)match(input,LEFT,FOLLOW_LEFT_in_join_op2369); 
                                    LEFT257_tree = 
                                    (Object)adaptor.create(LEFT257)
                                    ;
                                    adaptor.addChild(root_0, LEFT257_tree);


                                    }
                                    break;

                            }


                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:25: ( OUTER )?
                            int alt92=2;
                            int LA92_0 = input.LA(1);

                            if ( (LA92_0==OUTER) ) {
                                alt92=1;
                            }
                            switch (alt92) {
                                case 1 :
                                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:26: OUTER
                                    {
                                    OUTER258=(Token)match(input,OUTER,FOLLOW_OUTER_in_join_op2374); 
                                    OUTER258_tree = 
                                    (Object)adaptor.create(OUTER258)
                                    ;
                                    adaptor.addChild(root_0, OUTER258_tree);


                                    }
                                    break;

                            }


                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:36: INNER
                            {
                            INNER259=(Token)match(input,INNER,FOLLOW_INNER_in_join_op2380); 
                            INNER259_tree = 
                            (Object)adaptor.create(INNER259)
                            ;
                            adaptor.addChild(root_0, INNER259_tree);


                            }
                            break;
                        case 3 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:353:44: CROSS
                            {
                            CROSS260=(Token)match(input,CROSS,FOLLOW_CROSS_in_join_op2384); 
                            CROSS260_tree = 
                            (Object)adaptor.create(CROSS260)
                            ;
                            adaptor.addChild(root_0, CROSS260_tree);


                            }
                            break;

                    }


                    JOIN261=(Token)match(input,JOIN,FOLLOW_JOIN_in_join_op2387); 
                    JOIN261_tree = 
                    (Object)adaptor.create(JOIN261)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(JOIN261_tree, root_0);


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_op"


    public static class join_constraint_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_constraint"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:355:1: join_constraint : ( ON ^ expr | USING LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN -> ^( USING ( $column_names)+ ) );
    public final SqlParser.join_constraint_return join_constraint() throws RecognitionException {
        SqlParser.join_constraint_return retval = new SqlParser.join_constraint_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ON262=null;
        Token USING264=null;
        Token LPAREN265=null;
        Token COMMA266=null;
        Token RPAREN267=null;
        List list_column_names=null;
        SqlParser.expr_return expr263 =null;

        RuleReturnScope column_names = null;
        Object ON262_tree=null;
        Object USING264_tree=null;
        Object LPAREN265_tree=null;
        Object COMMA266_tree=null;
        Object RPAREN267_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_USING=new RewriteRuleTokenStream(adaptor,"token USING");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:356:3: ( ON ^ expr | USING LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN -> ^( USING ( $column_names)+ ) )
            int alt96=2;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==ON) ) {
                alt96=1;
            }
            else if ( (LA96_0==USING) ) {
                alt96=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 96, 0, input);

                throw nvae;

            }
            switch (alt96) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:356:5: ON ^ expr
                    {
                    root_0 = (Object)adaptor.nil();


                    ON262=(Token)match(input,ON,FOLLOW_ON_in_join_constraint2398); 
                    ON262_tree = 
                    (Object)adaptor.create(ON262)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(ON262_tree, root_0);


                    pushFollow(FOLLOW_expr_in_join_constraint2401);
                    expr263=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr263.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:357:5: USING LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN
                    {
                    USING264=(Token)match(input,USING,FOLLOW_USING_in_join_constraint2407);  
                    stream_USING.add(USING264);


                    LPAREN265=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_join_constraint2409);  
                    stream_LPAREN.add(LPAREN265);


                    pushFollow(FOLLOW_id_in_join_constraint2413);
                    column_names=id();

                    state._fsp--;

                    stream_id.add(column_names.getTree());
                    if (list_column_names==null) list_column_names=new ArrayList();
                    list_column_names.add(column_names.getTree());


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:357:35: ( COMMA column_names+= id )*
                    loop95:
                    do {
                        int alt95=2;
                        int LA95_0 = input.LA(1);

                        if ( (LA95_0==COMMA) ) {
                            alt95=1;
                        }


                        switch (alt95) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:357:36: COMMA column_names+= id
                    	    {
                    	    COMMA266=(Token)match(input,COMMA,FOLLOW_COMMA_in_join_constraint2416);  
                    	    stream_COMMA.add(COMMA266);


                    	    pushFollow(FOLLOW_id_in_join_constraint2420);
                    	    column_names=id();

                    	    state._fsp--;

                    	    stream_id.add(column_names.getTree());
                    	    if (list_column_names==null) list_column_names=new ArrayList();
                    	    list_column_names.add(column_names.getTree());


                    	    }
                    	    break;

                    	default :
                    	    break loop95;
                        }
                    } while (true);


                    RPAREN267=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_join_constraint2424);  
                    stream_RPAREN.add(RPAREN267);


                    // AST REWRITE
                    // elements: USING, column_names
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: column_names
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_column_names=new RewriteRuleSubtreeStream(adaptor,"token column_names",list_column_names);
                    root_0 = (Object)adaptor.nil();
                    // 357:68: -> ^( USING ( $column_names)+ )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:357:71: ^( USING ( $column_names)+ )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        stream_USING.nextNode()
                        , root_1);

                        if ( !(stream_column_names.hasNext()) ) {
                            throw new RewriteEarlyExitException();
                        }
                        while ( stream_column_names.hasNext() ) {
                            adaptor.addChild(root_1, stream_column_names.nextTree());

                        }
                        stream_column_names.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_constraint"


    public static class insert_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "insert_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:1: insert_stmt : ( INSERT ( operation_conflict_clause )? | REPLACE ) INTO (database_name= id DOT )? table_name= id ( ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt ) | DEFAULT VALUES ) ;
    public final SqlParser.insert_stmt_return insert_stmt() throws RecognitionException {
        SqlParser.insert_stmt_return retval = new SqlParser.insert_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token INSERT268=null;
        Token REPLACE270=null;
        Token INTO271=null;
        Token DOT272=null;
        Token LPAREN273=null;
        Token COMMA274=null;
        Token RPAREN275=null;
        Token VALUES276=null;
        Token LPAREN277=null;
        Token COMMA278=null;
        Token RPAREN279=null;
        Token DEFAULT281=null;
        Token VALUES282=null;
        List list_column_names=null;
        List list_values=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.operation_conflict_clause_return operation_conflict_clause269 =null;

        SqlParser.select_stmt_return select_stmt280 =null;

        RuleReturnScope column_names = null;
        RuleReturnScope values = null;
        Object INSERT268_tree=null;
        Object REPLACE270_tree=null;
        Object INTO271_tree=null;
        Object DOT272_tree=null;
        Object LPAREN273_tree=null;
        Object COMMA274_tree=null;
        Object RPAREN275_tree=null;
        Object VALUES276_tree=null;
        Object LPAREN277_tree=null;
        Object COMMA278_tree=null;
        Object RPAREN279_tree=null;
        Object DEFAULT281_tree=null;
        Object VALUES282_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:12: ( ( INSERT ( operation_conflict_clause )? | REPLACE ) INTO (database_name= id DOT )? table_name= id ( ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt ) | DEFAULT VALUES ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:14: ( INSERT ( operation_conflict_clause )? | REPLACE ) INTO (database_name= id DOT )? table_name= id ( ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt ) | DEFAULT VALUES )
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:14: ( INSERT ( operation_conflict_clause )? | REPLACE )
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==INSERT) ) {
                alt98=1;
            }
            else if ( (LA98_0==REPLACE) ) {
                alt98=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 98, 0, input);

                throw nvae;

            }
            switch (alt98) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:15: INSERT ( operation_conflict_clause )?
                    {
                    INSERT268=(Token)match(input,INSERT,FOLLOW_INSERT_in_insert_stmt2443); 
                    INSERT268_tree = 
                    (Object)adaptor.create(INSERT268)
                    ;
                    adaptor.addChild(root_0, INSERT268_tree);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:22: ( operation_conflict_clause )?
                    int alt97=2;
                    int LA97_0 = input.LA(1);

                    if ( (LA97_0==OR) ) {
                        alt97=1;
                    }
                    switch (alt97) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:23: operation_conflict_clause
                            {
                            pushFollow(FOLLOW_operation_conflict_clause_in_insert_stmt2446);
                            operation_conflict_clause269=operation_conflict_clause();

                            state._fsp--;

                            adaptor.addChild(root_0, operation_conflict_clause269.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:53: REPLACE
                    {
                    REPLACE270=(Token)match(input,REPLACE,FOLLOW_REPLACE_in_insert_stmt2452); 
                    REPLACE270_tree = 
                    (Object)adaptor.create(REPLACE270)
                    ;
                    adaptor.addChild(root_0, REPLACE270_tree);


                    }
                    break;

            }


            INTO271=(Token)match(input,INTO,FOLLOW_INTO_in_insert_stmt2455); 
            INTO271_tree = 
            (Object)adaptor.create(INTO271)
            ;
            adaptor.addChild(root_0, INTO271_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:67: (database_name= id DOT )?
            int alt99=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA99_1 = input.LA(2);

                    if ( (LA99_1==DOT) ) {
                        alt99=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA99_2 = input.LA(2);

                    if ( (LA99_2==DOT) ) {
                        alt99=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA99_3 = input.LA(2);

                    if ( (LA99_3==DOT) ) {
                        alt99=1;
                    }
                    }
                    break;
            }

            switch (alt99) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:360:68: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_insert_stmt2460);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT272=(Token)match(input,DOT,FOLLOW_DOT_in_insert_stmt2462); 
                    DOT272_tree = 
                    (Object)adaptor.create(DOT272)
                    ;
                    adaptor.addChild(root_0, DOT272_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_insert_stmt2468);
            table_name=id();

            state._fsp--;

            adaptor.addChild(root_0, table_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:3: ( ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt ) | DEFAULT VALUES )
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==LPAREN||LA104_0==SELECT||LA104_0==VALUES) ) {
                alt104=1;
            }
            else if ( (LA104_0==DEFAULT) ) {
                alt104=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 104, 0, input);

                throw nvae;

            }
            switch (alt104) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:5: ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt )
                    {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:5: ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )?
                    int alt101=2;
                    int LA101_0 = input.LA(1);

                    if ( (LA101_0==LPAREN) ) {
                        alt101=1;
                    }
                    switch (alt101) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:6: LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN
                            {
                            LPAREN273=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_insert_stmt2475); 
                            LPAREN273_tree = 
                            (Object)adaptor.create(LPAREN273)
                            ;
                            adaptor.addChild(root_0, LPAREN273_tree);


                            pushFollow(FOLLOW_id_in_insert_stmt2479);
                            column_names=id();

                            state._fsp--;

                            adaptor.addChild(root_0, column_names.getTree());
                            if (list_column_names==null) list_column_names=new ArrayList();
                            list_column_names.add(column_names.getTree());


                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:30: ( COMMA column_names+= id )*
                            loop100:
                            do {
                                int alt100=2;
                                int LA100_0 = input.LA(1);

                                if ( (LA100_0==COMMA) ) {
                                    alt100=1;
                                }


                                switch (alt100) {
                            	case 1 :
                            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:361:31: COMMA column_names+= id
                            	    {
                            	    COMMA274=(Token)match(input,COMMA,FOLLOW_COMMA_in_insert_stmt2482); 
                            	    COMMA274_tree = 
                            	    (Object)adaptor.create(COMMA274)
                            	    ;
                            	    adaptor.addChild(root_0, COMMA274_tree);


                            	    pushFollow(FOLLOW_id_in_insert_stmt2486);
                            	    column_names=id();

                            	    state._fsp--;

                            	    adaptor.addChild(root_0, column_names.getTree());
                            	    if (list_column_names==null) list_column_names=new ArrayList();
                            	    list_column_names.add(column_names.getTree());


                            	    }
                            	    break;

                            	default :
                            	    break loop100;
                                }
                            } while (true);


                            RPAREN275=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_insert_stmt2490); 
                            RPAREN275_tree = 
                            (Object)adaptor.create(RPAREN275)
                            ;
                            adaptor.addChild(root_0, RPAREN275_tree);


                            }
                            break;

                    }


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:362:5: ( VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN | select_stmt )
                    int alt103=2;
                    int LA103_0 = input.LA(1);

                    if ( (LA103_0==VALUES) ) {
                        alt103=1;
                    }
                    else if ( (LA103_0==SELECT) ) {
                        alt103=2;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 103, 0, input);

                        throw nvae;

                    }
                    switch (alt103) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:362:6: VALUES LPAREN values+= expr ( COMMA values+= expr )* RPAREN
                            {
                            VALUES276=(Token)match(input,VALUES,FOLLOW_VALUES_in_insert_stmt2499); 
                            VALUES276_tree = 
                            (Object)adaptor.create(VALUES276)
                            ;
                            adaptor.addChild(root_0, VALUES276_tree);


                            LPAREN277=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_insert_stmt2501); 
                            LPAREN277_tree = 
                            (Object)adaptor.create(LPAREN277)
                            ;
                            adaptor.addChild(root_0, LPAREN277_tree);


                            pushFollow(FOLLOW_expr_in_insert_stmt2505);
                            values=expr();

                            state._fsp--;

                            adaptor.addChild(root_0, values.getTree());
                            if (list_values==null) list_values=new ArrayList();
                            list_values.add(values.getTree());


                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:362:33: ( COMMA values+= expr )*
                            loop102:
                            do {
                                int alt102=2;
                                int LA102_0 = input.LA(1);

                                if ( (LA102_0==COMMA) ) {
                                    alt102=1;
                                }


                                switch (alt102) {
                            	case 1 :
                            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:362:34: COMMA values+= expr
                            	    {
                            	    COMMA278=(Token)match(input,COMMA,FOLLOW_COMMA_in_insert_stmt2508); 
                            	    COMMA278_tree = 
                            	    (Object)adaptor.create(COMMA278)
                            	    ;
                            	    adaptor.addChild(root_0, COMMA278_tree);


                            	    pushFollow(FOLLOW_expr_in_insert_stmt2512);
                            	    values=expr();

                            	    state._fsp--;

                            	    adaptor.addChild(root_0, values.getTree());
                            	    if (list_values==null) list_values=new ArrayList();
                            	    list_values.add(values.getTree());


                            	    }
                            	    break;

                            	default :
                            	    break loop102;
                                }
                            } while (true);


                            RPAREN279=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_insert_stmt2516); 
                            RPAREN279_tree = 
                            (Object)adaptor.create(RPAREN279)
                            ;
                            adaptor.addChild(root_0, RPAREN279_tree);


                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:362:64: select_stmt
                            {
                            pushFollow(FOLLOW_select_stmt_in_insert_stmt2520);
                            select_stmt280=select_stmt();

                            state._fsp--;

                            adaptor.addChild(root_0, select_stmt280.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:363:5: DEFAULT VALUES
                    {
                    DEFAULT281=(Token)match(input,DEFAULT,FOLLOW_DEFAULT_in_insert_stmt2527); 
                    DEFAULT281_tree = 
                    (Object)adaptor.create(DEFAULT281)
                    ;
                    adaptor.addChild(root_0, DEFAULT281_tree);


                    VALUES282=(Token)match(input,VALUES,FOLLOW_VALUES_in_insert_stmt2529); 
                    VALUES282_tree = 
                    (Object)adaptor.create(VALUES282)
                    ;
                    adaptor.addChild(root_0, VALUES282_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "insert_stmt"


    public static class update_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:366:1: update_stmt : UPDATE ( operation_conflict_clause )? qualified_table_name SET values+= update_set ( COMMA values+= update_set )* ( WHERE expr )? ( operation_limited_clause )? ;
    public final SqlParser.update_stmt_return update_stmt() throws RecognitionException {
        SqlParser.update_stmt_return retval = new SqlParser.update_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token UPDATE283=null;
        Token SET286=null;
        Token COMMA287=null;
        Token WHERE288=null;
        List list_values=null;
        SqlParser.operation_conflict_clause_return operation_conflict_clause284 =null;

        SqlParser.qualified_table_name_return qualified_table_name285 =null;

        SqlParser.expr_return expr289 =null;

        SqlParser.operation_limited_clause_return operation_limited_clause290 =null;

        RuleReturnScope values = null;
        Object UPDATE283_tree=null;
        Object SET286_tree=null;
        Object COMMA287_tree=null;
        Object WHERE288_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:366:12: ( UPDATE ( operation_conflict_clause )? qualified_table_name SET values+= update_set ( COMMA values+= update_set )* ( WHERE expr )? ( operation_limited_clause )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:366:14: UPDATE ( operation_conflict_clause )? qualified_table_name SET values+= update_set ( COMMA values+= update_set )* ( WHERE expr )? ( operation_limited_clause )?
            {
            root_0 = (Object)adaptor.nil();


            UPDATE283=(Token)match(input,UPDATE,FOLLOW_UPDATE_in_update_stmt2539); 
            UPDATE283_tree = 
            (Object)adaptor.create(UPDATE283)
            ;
            adaptor.addChild(root_0, UPDATE283_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:366:21: ( operation_conflict_clause )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==OR) ) {
                int LA105_1 = input.LA(2);

                if ( (LA105_1==ABORT||LA105_1==FAIL||LA105_1==IGNORE||LA105_1==REPLACE||LA105_1==ROLLBACK) ) {
                    alt105=1;
                }
            }
            switch (alt105) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:366:22: operation_conflict_clause
                    {
                    pushFollow(FOLLOW_operation_conflict_clause_in_update_stmt2542);
                    operation_conflict_clause284=operation_conflict_clause();

                    state._fsp--;

                    adaptor.addChild(root_0, operation_conflict_clause284.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_qualified_table_name_in_update_stmt2546);
            qualified_table_name285=qualified_table_name();

            state._fsp--;

            adaptor.addChild(root_0, qualified_table_name285.getTree());

            SET286=(Token)match(input,SET,FOLLOW_SET_in_update_stmt2550); 
            SET286_tree = 
            (Object)adaptor.create(SET286)
            ;
            adaptor.addChild(root_0, SET286_tree);


            pushFollow(FOLLOW_update_set_in_update_stmt2554);
            values=update_set();

            state._fsp--;

            adaptor.addChild(root_0, values.getTree());
            if (list_values==null) list_values=new ArrayList();
            list_values.add(values.getTree());


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:26: ( COMMA values+= update_set )*
            loop106:
            do {
                int alt106=2;
                int LA106_0 = input.LA(1);

                if ( (LA106_0==COMMA) ) {
                    alt106=1;
                }


                switch (alt106) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:27: COMMA values+= update_set
            	    {
            	    COMMA287=(Token)match(input,COMMA,FOLLOW_COMMA_in_update_stmt2557); 
            	    COMMA287_tree = 
            	    (Object)adaptor.create(COMMA287)
            	    ;
            	    adaptor.addChild(root_0, COMMA287_tree);


            	    pushFollow(FOLLOW_update_set_in_update_stmt2561);
            	    values=update_set();

            	    state._fsp--;

            	    adaptor.addChild(root_0, values.getTree());
            	    if (list_values==null) list_values=new ArrayList();
            	    list_values.add(values.getTree());


            	    }
            	    break;

            	default :
            	    break loop106;
                }
            } while (true);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:54: ( WHERE expr )?
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==WHERE) ) {
                alt107=1;
            }
            switch (alt107) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:55: WHERE expr
                    {
                    WHERE288=(Token)match(input,WHERE,FOLLOW_WHERE_in_update_stmt2566); 
                    WHERE288_tree = 
                    (Object)adaptor.create(WHERE288)
                    ;
                    adaptor.addChild(root_0, WHERE288_tree);


                    pushFollow(FOLLOW_expr_in_update_stmt2568);
                    expr289=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr289.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:68: ( operation_limited_clause )?
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==LIMIT||LA108_0==ORDER) ) {
                alt108=1;
            }
            switch (alt108) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:367:69: operation_limited_clause
                    {
                    pushFollow(FOLLOW_operation_limited_clause_in_update_stmt2573);
                    operation_limited_clause290=operation_limited_clause();

                    state._fsp--;

                    adaptor.addChild(root_0, operation_limited_clause290.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_stmt"


    public static class update_set_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_set"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:369:1: update_set : column_name= id EQUALS expr ;
    public final SqlParser.update_set_return update_set() throws RecognitionException {
        SqlParser.update_set_return retval = new SqlParser.update_set_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS291=null;
        SqlParser.id_return column_name =null;

        SqlParser.expr_return expr292 =null;


        Object EQUALS291_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:369:11: (column_name= id EQUALS expr )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:369:13: column_name= id EQUALS expr
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_id_in_update_set2584);
            column_name=id();

            state._fsp--;

            adaptor.addChild(root_0, column_name.getTree());

            EQUALS291=(Token)match(input,EQUALS,FOLLOW_EQUALS_in_update_set2586); 
            EQUALS291_tree = 
            (Object)adaptor.create(EQUALS291)
            ;
            adaptor.addChild(root_0, EQUALS291_tree);


            pushFollow(FOLLOW_expr_in_update_set2588);
            expr292=expr();

            state._fsp--;

            adaptor.addChild(root_0, expr292.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_set"


    public static class delete_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "delete_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:1: delete_stmt : DELETE FROM qualified_table_name ( WHERE expr )? ( operation_limited_clause )? ;
    public final SqlParser.delete_stmt_return delete_stmt() throws RecognitionException {
        SqlParser.delete_stmt_return retval = new SqlParser.delete_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DELETE293=null;
        Token FROM294=null;
        Token WHERE296=null;
        SqlParser.qualified_table_name_return qualified_table_name295 =null;

        SqlParser.expr_return expr297 =null;

        SqlParser.operation_limited_clause_return operation_limited_clause298 =null;


        Object DELETE293_tree=null;
        Object FROM294_tree=null;
        Object WHERE296_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:12: ( DELETE FROM qualified_table_name ( WHERE expr )? ( operation_limited_clause )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:14: DELETE FROM qualified_table_name ( WHERE expr )? ( operation_limited_clause )?
            {
            root_0 = (Object)adaptor.nil();


            DELETE293=(Token)match(input,DELETE,FOLLOW_DELETE_in_delete_stmt2596); 
            DELETE293_tree = 
            (Object)adaptor.create(DELETE293)
            ;
            adaptor.addChild(root_0, DELETE293_tree);


            FROM294=(Token)match(input,FROM,FOLLOW_FROM_in_delete_stmt2598); 
            FROM294_tree = 
            (Object)adaptor.create(FROM294)
            ;
            adaptor.addChild(root_0, FROM294_tree);


            pushFollow(FOLLOW_qualified_table_name_in_delete_stmt2600);
            qualified_table_name295=qualified_table_name();

            state._fsp--;

            adaptor.addChild(root_0, qualified_table_name295.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:47: ( WHERE expr )?
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==WHERE) ) {
                alt109=1;
            }
            switch (alt109) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:48: WHERE expr
                    {
                    WHERE296=(Token)match(input,WHERE,FOLLOW_WHERE_in_delete_stmt2603); 
                    WHERE296_tree = 
                    (Object)adaptor.create(WHERE296)
                    ;
                    adaptor.addChild(root_0, WHERE296_tree);


                    pushFollow(FOLLOW_expr_in_delete_stmt2605);
                    expr297=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr297.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:61: ( operation_limited_clause )?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==LIMIT||LA110_0==ORDER) ) {
                alt110=1;
            }
            switch (alt110) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:372:62: operation_limited_clause
                    {
                    pushFollow(FOLLOW_operation_limited_clause_in_delete_stmt2610);
                    operation_limited_clause298=operation_limited_clause();

                    state._fsp--;

                    adaptor.addChild(root_0, operation_limited_clause298.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "delete_stmt"


    public static class begin_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "begin_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:1: begin_stmt : BEGIN ( DEFERRED | IMMEDIATE | EXCLUSIVE )? ( TRANSACTION )? ;
    public final SqlParser.begin_stmt_return begin_stmt() throws RecognitionException {
        SqlParser.begin_stmt_return retval = new SqlParser.begin_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token BEGIN299=null;
        Token set300=null;
        Token TRANSACTION301=null;

        Object BEGIN299_tree=null;
        Object set300_tree=null;
        Object TRANSACTION301_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:11: ( BEGIN ( DEFERRED | IMMEDIATE | EXCLUSIVE )? ( TRANSACTION )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:13: BEGIN ( DEFERRED | IMMEDIATE | EXCLUSIVE )? ( TRANSACTION )?
            {
            root_0 = (Object)adaptor.nil();


            BEGIN299=(Token)match(input,BEGIN,FOLLOW_BEGIN_in_begin_stmt2620); 
            BEGIN299_tree = 
            (Object)adaptor.create(BEGIN299)
            ;
            adaptor.addChild(root_0, BEGIN299_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:19: ( DEFERRED | IMMEDIATE | EXCLUSIVE )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==DEFERRED||LA111_0==EXCLUSIVE||LA111_0==IMMEDIATE) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
                    {
                    set300=(Token)input.LT(1);

                    if ( input.LA(1)==DEFERRED||input.LA(1)==EXCLUSIVE||input.LA(1)==IMMEDIATE ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set300)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:55: ( TRANSACTION )?
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==TRANSACTION) ) {
                alt112=1;
            }
            switch (alt112) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:375:56: TRANSACTION
                    {
                    TRANSACTION301=(Token)match(input,TRANSACTION,FOLLOW_TRANSACTION_in_begin_stmt2636); 
                    TRANSACTION301_tree = 
                    (Object)adaptor.create(TRANSACTION301)
                    ;
                    adaptor.addChild(root_0, TRANSACTION301_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "begin_stmt"


    public static class commit_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "commit_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:378:1: commit_stmt : ( COMMIT | END ) ( TRANSACTION )? ;
    public final SqlParser.commit_stmt_return commit_stmt() throws RecognitionException {
        SqlParser.commit_stmt_return retval = new SqlParser.commit_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set302=null;
        Token TRANSACTION303=null;

        Object set302_tree=null;
        Object TRANSACTION303_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:378:12: ( ( COMMIT | END ) ( TRANSACTION )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:378:14: ( COMMIT | END ) ( TRANSACTION )?
            {
            root_0 = (Object)adaptor.nil();


            set302=(Token)input.LT(1);

            if ( input.LA(1)==COMMIT||input.LA(1)==END ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set302)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:378:29: ( TRANSACTION )?
            int alt113=2;
            int LA113_0 = input.LA(1);

            if ( (LA113_0==TRANSACTION) ) {
                alt113=1;
            }
            switch (alt113) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:378:30: TRANSACTION
                    {
                    TRANSACTION303=(Token)match(input,TRANSACTION,FOLLOW_TRANSACTION_in_commit_stmt2655); 
                    TRANSACTION303_tree = 
                    (Object)adaptor.create(TRANSACTION303)
                    ;
                    adaptor.addChild(root_0, TRANSACTION303_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "commit_stmt"


    public static class rollback_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "rollback_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:1: rollback_stmt : ROLLBACK ( TRANSACTION )? ( TO ( SAVEPOINT )? savepoint_name= id )? ;
    public final SqlParser.rollback_stmt_return rollback_stmt() throws RecognitionException {
        SqlParser.rollback_stmt_return retval = new SqlParser.rollback_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ROLLBACK304=null;
        Token TRANSACTION305=null;
        Token TO306=null;
        Token SAVEPOINT307=null;
        SqlParser.id_return savepoint_name =null;


        Object ROLLBACK304_tree=null;
        Object TRANSACTION305_tree=null;
        Object TO306_tree=null;
        Object SAVEPOINT307_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:14: ( ROLLBACK ( TRANSACTION )? ( TO ( SAVEPOINT )? savepoint_name= id )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:16: ROLLBACK ( TRANSACTION )? ( TO ( SAVEPOINT )? savepoint_name= id )?
            {
            root_0 = (Object)adaptor.nil();


            ROLLBACK304=(Token)match(input,ROLLBACK,FOLLOW_ROLLBACK_in_rollback_stmt2665); 
            ROLLBACK304_tree = 
            (Object)adaptor.create(ROLLBACK304)
            ;
            adaptor.addChild(root_0, ROLLBACK304_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:25: ( TRANSACTION )?
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==TRANSACTION) ) {
                alt114=1;
            }
            switch (alt114) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:26: TRANSACTION
                    {
                    TRANSACTION305=(Token)match(input,TRANSACTION,FOLLOW_TRANSACTION_in_rollback_stmt2668); 
                    TRANSACTION305_tree = 
                    (Object)adaptor.create(TRANSACTION305)
                    ;
                    adaptor.addChild(root_0, TRANSACTION305_tree);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:40: ( TO ( SAVEPOINT )? savepoint_name= id )?
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==TO) ) {
                alt116=1;
            }
            switch (alt116) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:41: TO ( SAVEPOINT )? savepoint_name= id
                    {
                    TO306=(Token)match(input,TO,FOLLOW_TO_in_rollback_stmt2673); 
                    TO306_tree = 
                    (Object)adaptor.create(TO306)
                    ;
                    adaptor.addChild(root_0, TO306_tree);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:44: ( SAVEPOINT )?
                    int alt115=2;
                    int LA115_0 = input.LA(1);

                    if ( (LA115_0==SAVEPOINT) ) {
                        int LA115_1 = input.LA(2);

                        if ( ((LA115_1 >= ABORT && LA115_1 <= AFTER)||(LA115_1 >= ALL && LA115_1 <= ALTER)||(LA115_1 >= ANALYZE && LA115_1 <= AND)||(LA115_1 >= AS && LA115_1 <= ASC)||(LA115_1 >= ATTACH && LA115_1 <= AUTOINCREMENT)||(LA115_1 >= BEFORE && LA115_1 <= BETWEEN)||LA115_1==BY||(LA115_1 >= CASCADE && LA115_1 <= COLLATE)||LA115_1==COLUMN||(LA115_1 >= COMMIT && LA115_1 <= CONSTRAINT)||LA115_1==CREATE||(LA115_1 >= CROSS && LA115_1 <= CURRENT_TIMESTAMP)||(LA115_1 >= DATABASE && LA115_1 <= DISTINCT)||LA115_1==DROP||(LA115_1 >= EACH && LA115_1 <= END)||(LA115_1 >= ESCAPE && LA115_1 <= EXPLAIN)||LA115_1==FAIL||(LA115_1 >= FOR && LA115_1 <= FROM)||LA115_1==GROUP||LA115_1==HAVING||LA115_1==ID||(LA115_1 >= IF && LA115_1 <= IMMEDIATE)||(LA115_1 >= INDEX && LA115_1 <= INSTEAD)||(LA115_1 >= INTERSECT && LA115_1 <= INTO)||LA115_1==IS||LA115_1==JOIN||LA115_1==KEY||LA115_1==LEFT||LA115_1==LIMIT||LA115_1==NATURAL||LA115_1==NULL||(LA115_1 >= OF && LA115_1 <= ON)||(LA115_1 >= OR && LA115_1 <= ORDER)||LA115_1==OUTER||LA115_1==PLAN||(LA115_1 >= PRAGMA && LA115_1 <= PRIMARY)||LA115_1==QUERY||(LA115_1 >= RAISE && LA115_1 <= REFERENCES)||(LA115_1 >= REINDEX && LA115_1 <= ROW)||(LA115_1 >= SAVEPOINT && LA115_1 <= SELECT)||LA115_1==SET||LA115_1==STRING||LA115_1==TABLE||(LA115_1 >= TEMPORARY && LA115_1 <= THEN)||(LA115_1 >= TO && LA115_1 <= TRIGGER)||(LA115_1 >= UNION && LA115_1 <= USING)||(LA115_1 >= VACUUM && LA115_1 <= VIRTUAL)||(LA115_1 >= WHEN && LA115_1 <= WHERE)) ) {
                            alt115=1;
                        }
                    }
                    switch (alt115) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:381:45: SAVEPOINT
                            {
                            SAVEPOINT307=(Token)match(input,SAVEPOINT,FOLLOW_SAVEPOINT_in_rollback_stmt2676); 
                            SAVEPOINT307_tree = 
                            (Object)adaptor.create(SAVEPOINT307)
                            ;
                            adaptor.addChild(root_0, SAVEPOINT307_tree);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_id_in_rollback_stmt2682);
                    savepoint_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, savepoint_name.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "rollback_stmt"


    public static class savepoint_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "savepoint_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:384:1: savepoint_stmt : SAVEPOINT savepoint_name= id ;
    public final SqlParser.savepoint_stmt_return savepoint_stmt() throws RecognitionException {
        SqlParser.savepoint_stmt_return retval = new SqlParser.savepoint_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token SAVEPOINT308=null;
        SqlParser.id_return savepoint_name =null;


        Object SAVEPOINT308_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:384:15: ( SAVEPOINT savepoint_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:384:17: SAVEPOINT savepoint_name= id
            {
            root_0 = (Object)adaptor.nil();


            SAVEPOINT308=(Token)match(input,SAVEPOINT,FOLLOW_SAVEPOINT_in_savepoint_stmt2692); 
            SAVEPOINT308_tree = 
            (Object)adaptor.create(SAVEPOINT308)
            ;
            adaptor.addChild(root_0, SAVEPOINT308_tree);


            pushFollow(FOLLOW_id_in_savepoint_stmt2696);
            savepoint_name=id();

            state._fsp--;

            adaptor.addChild(root_0, savepoint_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "savepoint_stmt"


    public static class release_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "release_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:387:1: release_stmt : RELEASE ( SAVEPOINT )? savepoint_name= id ;
    public final SqlParser.release_stmt_return release_stmt() throws RecognitionException {
        SqlParser.release_stmt_return retval = new SqlParser.release_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token RELEASE309=null;
        Token SAVEPOINT310=null;
        SqlParser.id_return savepoint_name =null;


        Object RELEASE309_tree=null;
        Object SAVEPOINT310_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:387:13: ( RELEASE ( SAVEPOINT )? savepoint_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:387:15: RELEASE ( SAVEPOINT )? savepoint_name= id
            {
            root_0 = (Object)adaptor.nil();


            RELEASE309=(Token)match(input,RELEASE,FOLLOW_RELEASE_in_release_stmt2704); 
            RELEASE309_tree = 
            (Object)adaptor.create(RELEASE309)
            ;
            adaptor.addChild(root_0, RELEASE309_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:387:23: ( SAVEPOINT )?
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( (LA117_0==SAVEPOINT) ) {
                int LA117_1 = input.LA(2);

                if ( ((LA117_1 >= ABORT && LA117_1 <= AFTER)||(LA117_1 >= ALL && LA117_1 <= ALTER)||(LA117_1 >= ANALYZE && LA117_1 <= AND)||(LA117_1 >= AS && LA117_1 <= ASC)||(LA117_1 >= ATTACH && LA117_1 <= AUTOINCREMENT)||(LA117_1 >= BEFORE && LA117_1 <= BETWEEN)||LA117_1==BY||(LA117_1 >= CASCADE && LA117_1 <= COLLATE)||LA117_1==COLUMN||(LA117_1 >= COMMIT && LA117_1 <= CONSTRAINT)||LA117_1==CREATE||(LA117_1 >= CROSS && LA117_1 <= CURRENT_TIMESTAMP)||(LA117_1 >= DATABASE && LA117_1 <= DISTINCT)||LA117_1==DROP||(LA117_1 >= EACH && LA117_1 <= END)||(LA117_1 >= ESCAPE && LA117_1 <= EXPLAIN)||LA117_1==FAIL||(LA117_1 >= FOR && LA117_1 <= FROM)||LA117_1==GROUP||LA117_1==HAVING||LA117_1==ID||(LA117_1 >= IF && LA117_1 <= IMMEDIATE)||(LA117_1 >= INDEX && LA117_1 <= INSTEAD)||(LA117_1 >= INTERSECT && LA117_1 <= INTO)||LA117_1==IS||LA117_1==JOIN||LA117_1==KEY||LA117_1==LEFT||LA117_1==LIMIT||LA117_1==NATURAL||LA117_1==NULL||(LA117_1 >= OF && LA117_1 <= ON)||(LA117_1 >= OR && LA117_1 <= ORDER)||LA117_1==OUTER||LA117_1==PLAN||(LA117_1 >= PRAGMA && LA117_1 <= PRIMARY)||LA117_1==QUERY||(LA117_1 >= RAISE && LA117_1 <= REFERENCES)||(LA117_1 >= REINDEX && LA117_1 <= ROW)||(LA117_1 >= SAVEPOINT && LA117_1 <= SELECT)||LA117_1==SET||LA117_1==STRING||LA117_1==TABLE||(LA117_1 >= TEMPORARY && LA117_1 <= THEN)||(LA117_1 >= TO && LA117_1 <= TRIGGER)||(LA117_1 >= UNION && LA117_1 <= USING)||(LA117_1 >= VACUUM && LA117_1 <= VIRTUAL)||(LA117_1 >= WHEN && LA117_1 <= WHERE)) ) {
                    alt117=1;
                }
            }
            switch (alt117) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:387:24: SAVEPOINT
                    {
                    SAVEPOINT310=(Token)match(input,SAVEPOINT,FOLLOW_SAVEPOINT_in_release_stmt2707); 
                    SAVEPOINT310_tree = 
                    (Object)adaptor.create(SAVEPOINT310)
                    ;
                    adaptor.addChild(root_0, SAVEPOINT310_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_release_stmt2713);
            savepoint_name=id();

            state._fsp--;

            adaptor.addChild(root_0, savepoint_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "release_stmt"


    public static class table_conflict_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_conflict_clause"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:394:1: table_conflict_clause : ON ! CONFLICT ^ ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE ) ;
    public final SqlParser.table_conflict_clause_return table_conflict_clause() throws RecognitionException {
        SqlParser.table_conflict_clause_return retval = new SqlParser.table_conflict_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ON311=null;
        Token CONFLICT312=null;
        Token set313=null;

        Object ON311_tree=null;
        Object CONFLICT312_tree=null;
        Object set313_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:394:22: ( ON ! CONFLICT ^ ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:394:24: ON ! CONFLICT ^ ( ROLLBACK | ABORT | FAIL | IGNORE | REPLACE )
            {
            root_0 = (Object)adaptor.nil();


            ON311=(Token)match(input,ON,FOLLOW_ON_in_table_conflict_clause2725); 

            CONFLICT312=(Token)match(input,CONFLICT,FOLLOW_CONFLICT_in_table_conflict_clause2728); 
            CONFLICT312_tree = 
            (Object)adaptor.create(CONFLICT312)
            ;
            root_0 = (Object)adaptor.becomeRoot(CONFLICT312_tree, root_0);


            set313=(Token)input.LT(1);

            if ( input.LA(1)==ABORT||input.LA(1)==FAIL||input.LA(1)==IGNORE||input.LA(1)==REPLACE||input.LA(1)==ROLLBACK ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set313)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_conflict_clause"


    public static class create_virtual_table_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "create_virtual_table_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:398:1: create_virtual_table_stmt : CREATE VIRTUAL TABLE (database_name= id DOT )? table_name= id USING module_name= id ( LPAREN column_def ( COMMA column_def )* RPAREN )? -> ^( CREATE_TABLE ^( OPTIONS VIRTUAL ) ^( $table_name ( $database_name)? ) ^( $module_name) ( ^( COLUMNS ( column_def )+ ) )? ) ;
    public final SqlParser.create_virtual_table_stmt_return create_virtual_table_stmt() throws RecognitionException {
        SqlParser.create_virtual_table_stmt_return retval = new SqlParser.create_virtual_table_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CREATE314=null;
        Token VIRTUAL315=null;
        Token TABLE316=null;
        Token DOT317=null;
        Token USING318=null;
        Token LPAREN319=null;
        Token COMMA321=null;
        Token RPAREN323=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.id_return module_name =null;

        SqlParser.column_def_return column_def320 =null;

        SqlParser.column_def_return column_def322 =null;


        Object CREATE314_tree=null;
        Object VIRTUAL315_tree=null;
        Object TABLE316_tree=null;
        Object DOT317_tree=null;
        Object USING318_tree=null;
        Object LPAREN319_tree=null;
        Object COMMA321_tree=null;
        Object RPAREN323_tree=null;
        RewriteRuleTokenStream stream_TABLE=new RewriteRuleTokenStream(adaptor,"token TABLE");
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_CREATE=new RewriteRuleTokenStream(adaptor,"token CREATE");
        RewriteRuleTokenStream stream_USING=new RewriteRuleTokenStream(adaptor,"token USING");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_VIRTUAL=new RewriteRuleTokenStream(adaptor,"token VIRTUAL");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_column_def=new RewriteRuleSubtreeStream(adaptor,"rule column_def");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:398:26: ( CREATE VIRTUAL TABLE (database_name= id DOT )? table_name= id USING module_name= id ( LPAREN column_def ( COMMA column_def )* RPAREN )? -> ^( CREATE_TABLE ^( OPTIONS VIRTUAL ) ^( $table_name ( $database_name)? ) ^( $module_name) ( ^( COLUMNS ( column_def )+ ) )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:398:28: CREATE VIRTUAL TABLE (database_name= id DOT )? table_name= id USING module_name= id ( LPAREN column_def ( COMMA column_def )* RPAREN )?
            {
            CREATE314=(Token)match(input,CREATE,FOLLOW_CREATE_in_create_virtual_table_stmt2758);  
            stream_CREATE.add(CREATE314);


            VIRTUAL315=(Token)match(input,VIRTUAL,FOLLOW_VIRTUAL_in_create_virtual_table_stmt2760);  
            stream_VIRTUAL.add(VIRTUAL315);


            TABLE316=(Token)match(input,TABLE,FOLLOW_TABLE_in_create_virtual_table_stmt2762);  
            stream_TABLE.add(TABLE316);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:398:49: (database_name= id DOT )?
            int alt118=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA118_1 = input.LA(2);

                    if ( (LA118_1==DOT) ) {
                        alt118=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA118_2 = input.LA(2);

                    if ( (LA118_2==DOT) ) {
                        alt118=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA118_3 = input.LA(2);

                    if ( (LA118_3==DOT) ) {
                        alt118=1;
                    }
                    }
                    break;
            }

            switch (alt118) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:398:50: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_create_virtual_table_stmt2767);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT317=(Token)match(input,DOT,FOLLOW_DOT_in_create_virtual_table_stmt2769);  
                    stream_DOT.add(DOT317);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_create_virtual_table_stmt2775);
            table_name=id();

            state._fsp--;

            stream_id.add(table_name.getTree());

            USING318=(Token)match(input,USING,FOLLOW_USING_in_create_virtual_table_stmt2779);  
            stream_USING.add(USING318);


            pushFollow(FOLLOW_id_in_create_virtual_table_stmt2783);
            module_name=id();

            state._fsp--;

            stream_id.add(module_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:399:24: ( LPAREN column_def ( COMMA column_def )* RPAREN )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==LPAREN) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:399:25: LPAREN column_def ( COMMA column_def )* RPAREN
                    {
                    LPAREN319=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_create_virtual_table_stmt2786);  
                    stream_LPAREN.add(LPAREN319);


                    pushFollow(FOLLOW_column_def_in_create_virtual_table_stmt2788);
                    column_def320=column_def();

                    state._fsp--;

                    stream_column_def.add(column_def320.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:399:43: ( COMMA column_def )*
                    loop119:
                    do {
                        int alt119=2;
                        int LA119_0 = input.LA(1);

                        if ( (LA119_0==COMMA) ) {
                            alt119=1;
                        }


                        switch (alt119) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:399:44: COMMA column_def
                    	    {
                    	    COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_create_virtual_table_stmt2791);  
                    	    stream_COMMA.add(COMMA321);


                    	    pushFollow(FOLLOW_column_def_in_create_virtual_table_stmt2793);
                    	    column_def322=column_def();

                    	    state._fsp--;

                    	    stream_column_def.add(column_def322.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop119;
                        }
                    } while (true);


                    RPAREN323=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_create_virtual_table_stmt2797);  
                    stream_RPAREN.add(RPAREN323);


                    }
                    break;

            }


            // AST REWRITE
            // elements: database_name, column_def, table_name, VIRTUAL, module_name
            // token labels: 
            // rule labels: database_name, retval, table_name, module_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);
            RewriteRuleSubtreeStream stream_module_name=new RewriteRuleSubtreeStream(adaptor,"rule module_name",module_name!=null?module_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 400:3: -> ^( CREATE_TABLE ^( OPTIONS VIRTUAL ) ^( $table_name ( $database_name)? ) ^( $module_name) ( ^( COLUMNS ( column_def )+ ) )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:6: ^( CREATE_TABLE ^( OPTIONS VIRTUAL ) ^( $table_name ( $database_name)? ) ^( $module_name) ( ^( COLUMNS ( column_def )+ ) )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CREATE_TABLE, "CREATE_TABLE")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:21: ^( OPTIONS VIRTUAL )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                adaptor.addChild(root_2, 
                stream_VIRTUAL.nextNode()
                );

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:40: ^( $table_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:55: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:71: ^( $module_name)
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_module_name.nextNode(), root_2);

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:87: ( ^( COLUMNS ( column_def )+ ) )?
                if ( stream_column_def.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:400:87: ^( COLUMNS ( column_def )+ )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(COLUMNS, "COLUMNS")
                    , root_2);

                    if ( !(stream_column_def.hasNext()) ) {
                        throw new RewriteEarlyExitException();
                    }
                    while ( stream_column_def.hasNext() ) {
                        adaptor.addChild(root_2, stream_column_def.nextTree());

                    }
                    stream_column_def.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_column_def.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "create_virtual_table_stmt"


    public static class create_table_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "create_table_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:1: create_table_stmt : CREATE ( TEMPORARY )? TABLE ( IF NOT EXISTS )? (database_name= id DOT )? table_name= id ( LPAREN column_def ( COMMA column_def )* ( ( COMMA )? table_constraint )* RPAREN | AS select_stmt ) -> ^( CREATE_TABLE ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $table_name ( $database_name)? ) ( ^( COLUMNS ( column_def )+ ) )? ( ^( CONSTRAINTS ( table_constraint )* ) )? ( select_stmt )? ) ;
    public final SqlParser.create_table_stmt_return create_table_stmt() throws RecognitionException {
        SqlParser.create_table_stmt_return retval = new SqlParser.create_table_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CREATE324=null;
        Token TEMPORARY325=null;
        Token TABLE326=null;
        Token IF327=null;
        Token NOT328=null;
        Token EXISTS329=null;
        Token DOT330=null;
        Token LPAREN331=null;
        Token COMMA333=null;
        Token COMMA335=null;
        Token RPAREN337=null;
        Token AS338=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.column_def_return column_def332 =null;

        SqlParser.column_def_return column_def334 =null;

        SqlParser.table_constraint_return table_constraint336 =null;

        SqlParser.select_stmt_return select_stmt339 =null;


        Object CREATE324_tree=null;
        Object TEMPORARY325_tree=null;
        Object TABLE326_tree=null;
        Object IF327_tree=null;
        Object NOT328_tree=null;
        Object EXISTS329_tree=null;
        Object DOT330_tree=null;
        Object LPAREN331_tree=null;
        Object COMMA333_tree=null;
        Object COMMA335_tree=null;
        Object RPAREN337_tree=null;
        Object AS338_tree=null;
        RewriteRuleTokenStream stream_TABLE=new RewriteRuleTokenStream(adaptor,"token TABLE");
        RewriteRuleTokenStream stream_AS=new RewriteRuleTokenStream(adaptor,"token AS");
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_CREATE=new RewriteRuleTokenStream(adaptor,"token CREATE");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_TEMPORARY=new RewriteRuleTokenStream(adaptor,"token TEMPORARY");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_select_stmt=new RewriteRuleSubtreeStream(adaptor,"rule select_stmt");
        RewriteRuleSubtreeStream stream_column_def=new RewriteRuleSubtreeStream(adaptor,"rule column_def");
        RewriteRuleSubtreeStream stream_table_constraint=new RewriteRuleSubtreeStream(adaptor,"rule table_constraint");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:18: ( CREATE ( TEMPORARY )? TABLE ( IF NOT EXISTS )? (database_name= id DOT )? table_name= id ( LPAREN column_def ( COMMA column_def )* ( ( COMMA )? table_constraint )* RPAREN | AS select_stmt ) -> ^( CREATE_TABLE ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $table_name ( $database_name)? ) ( ^( COLUMNS ( column_def )+ ) )? ( ^( CONSTRAINTS ( table_constraint )* ) )? ( select_stmt )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:20: CREATE ( TEMPORARY )? TABLE ( IF NOT EXISTS )? (database_name= id DOT )? table_name= id ( LPAREN column_def ( COMMA column_def )* ( ( COMMA )? table_constraint )* RPAREN | AS select_stmt )
            {
            CREATE324=(Token)match(input,CREATE,FOLLOW_CREATE_in_create_table_stmt2843);  
            stream_CREATE.add(CREATE324);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:27: ( TEMPORARY )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==TEMPORARY) ) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:27: TEMPORARY
                    {
                    TEMPORARY325=(Token)match(input,TEMPORARY,FOLLOW_TEMPORARY_in_create_table_stmt2845);  
                    stream_TEMPORARY.add(TEMPORARY325);


                    }
                    break;

            }


            TABLE326=(Token)match(input,TABLE,FOLLOW_TABLE_in_create_table_stmt2848);  
            stream_TABLE.add(TABLE326);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:44: ( IF NOT EXISTS )?
            int alt122=2;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==IF) ) {
                int LA122_1 = input.LA(2);

                if ( (LA122_1==NOT) ) {
                    alt122=1;
                }
            }
            switch (alt122) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:45: IF NOT EXISTS
                    {
                    IF327=(Token)match(input,IF,FOLLOW_IF_in_create_table_stmt2851);  
                    stream_IF.add(IF327);


                    NOT328=(Token)match(input,NOT,FOLLOW_NOT_in_create_table_stmt2853);  
                    stream_NOT.add(NOT328);


                    EXISTS329=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_create_table_stmt2855);  
                    stream_EXISTS.add(EXISTS329);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:61: (database_name= id DOT )?
            int alt123=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA123_1 = input.LA(2);

                    if ( (LA123_1==DOT) ) {
                        alt123=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA123_2 = input.LA(2);

                    if ( (LA123_2==DOT) ) {
                        alt123=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA123_3 = input.LA(2);

                    if ( (LA123_3==DOT) ) {
                        alt123=1;
                    }
                    }
                    break;
            }

            switch (alt123) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:403:62: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_create_table_stmt2862);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT330=(Token)match(input,DOT,FOLLOW_DOT_in_create_table_stmt2864);  
                    stream_DOT.add(DOT330);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_create_table_stmt2870);
            table_name=id();

            state._fsp--;

            stream_id.add(table_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:3: ( LPAREN column_def ( COMMA column_def )* ( ( COMMA )? table_constraint )* RPAREN | AS select_stmt )
            int alt127=2;
            int LA127_0 = input.LA(1);

            if ( (LA127_0==LPAREN) ) {
                alt127=1;
            }
            else if ( (LA127_0==AS) ) {
                alt127=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 127, 0, input);

                throw nvae;

            }
            switch (alt127) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:5: LPAREN column_def ( COMMA column_def )* ( ( COMMA )? table_constraint )* RPAREN
                    {
                    LPAREN331=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_create_table_stmt2876);  
                    stream_LPAREN.add(LPAREN331);


                    pushFollow(FOLLOW_column_def_in_create_table_stmt2878);
                    column_def332=column_def();

                    state._fsp--;

                    stream_column_def.add(column_def332.getTree());

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:23: ( COMMA column_def )*
                    loop124:
                    do {
                        int alt124=2;
                        alt124 = dfa124.predict(input);
                        switch (alt124) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:24: COMMA column_def
                    	    {
                    	    COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_create_table_stmt2881);  
                    	    stream_COMMA.add(COMMA333);


                    	    pushFollow(FOLLOW_column_def_in_create_table_stmt2883);
                    	    column_def334=column_def();

                    	    state._fsp--;

                    	    stream_column_def.add(column_def334.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop124;
                        }
                    } while (true);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:43: ( ( COMMA )? table_constraint )*
                    loop126:
                    do {
                        int alt126=2;
                        int LA126_0 = input.LA(1);

                        if ( (LA126_0==CHECK||LA126_0==COMMA||LA126_0==CONSTRAINT||LA126_0==FOREIGN||LA126_0==PRIMARY||LA126_0==UNIQUE) ) {
                            alt126=1;
                        }


                        switch (alt126) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:44: ( COMMA )? table_constraint
                    	    {
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:44: ( COMMA )?
                    	    int alt125=2;
                    	    int LA125_0 = input.LA(1);

                    	    if ( (LA125_0==COMMA) ) {
                    	        alt125=1;
                    	    }
                    	    switch (alt125) {
                    	        case 1 :
                    	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:404:44: COMMA
                    	            {
                    	            COMMA335=(Token)match(input,COMMA,FOLLOW_COMMA_in_create_table_stmt2888);  
                    	            stream_COMMA.add(COMMA335);


                    	            }
                    	            break;

                    	    }


                    	    pushFollow(FOLLOW_table_constraint_in_create_table_stmt2891);
                    	    table_constraint336=table_constraint();

                    	    state._fsp--;

                    	    stream_table_constraint.add(table_constraint336.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop126;
                        }
                    } while (true);


                    RPAREN337=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_create_table_stmt2895);  
                    stream_RPAREN.add(RPAREN337);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:405:5: AS select_stmt
                    {
                    AS338=(Token)match(input,AS,FOLLOW_AS_in_create_table_stmt2901);  
                    stream_AS.add(AS338);


                    pushFollow(FOLLOW_select_stmt_in_create_table_stmt2903);
                    select_stmt339=select_stmt();

                    state._fsp--;

                    stream_select_stmt.add(select_stmt339.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: select_stmt, EXISTS, database_name, table_name, column_def, table_constraint, TEMPORARY
            // token labels: 
            // rule labels: database_name, retval, table_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 406:74: -> ^( CREATE_TABLE ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $table_name ( $database_name)? ) ( ^( COLUMNS ( column_def )+ ) )? ( ^( CONSTRAINTS ( table_constraint )* ) )? ( select_stmt )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:4: ^( CREATE_TABLE ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $table_name ( $database_name)? ) ( ^( COLUMNS ( column_def )+ ) )? ( ^( CONSTRAINTS ( table_constraint )* ) )? ( select_stmt )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CREATE_TABLE, "CREATE_TABLE")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:19: ^( OPTIONS ( TEMPORARY )? ( EXISTS )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:29: ( TEMPORARY )?
                if ( stream_TEMPORARY.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_TEMPORARY.nextNode()
                    );

                }
                stream_TEMPORARY.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:40: ( EXISTS )?
                if ( stream_EXISTS.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_EXISTS.nextNode()
                    );

                }
                stream_EXISTS.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:49: ^( $table_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:406:64: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:3: ( ^( COLUMNS ( column_def )+ ) )?
                if ( stream_column_def.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:3: ^( COLUMNS ( column_def )+ )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(COLUMNS, "COLUMNS")
                    , root_2);

                    if ( !(stream_column_def.hasNext()) ) {
                        throw new RewriteEarlyExitException();
                    }
                    while ( stream_column_def.hasNext() ) {
                        adaptor.addChild(root_2, stream_column_def.nextTree());

                    }
                    stream_column_def.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_column_def.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:27: ( ^( CONSTRAINTS ( table_constraint )* ) )?
                if ( stream_table_constraint.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:27: ^( CONSTRAINTS ( table_constraint )* )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(CONSTRAINTS, "CONSTRAINTS")
                    , root_2);

                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:41: ( table_constraint )*
                    while ( stream_table_constraint.hasNext() ) {
                        adaptor.addChild(root_2, stream_table_constraint.nextTree());

                    }
                    stream_table_constraint.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_table_constraint.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:407:61: ( select_stmt )?
                if ( stream_select_stmt.hasNext() ) {
                    adaptor.addChild(root_1, stream_select_stmt.nextTree());

                }
                stream_select_stmt.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "create_table_stmt"


    public static class column_def_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_def"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:1: column_def : name= id_column_def ( type_name )? ( column_constraint )* -> ^( $name ^( CONSTRAINTS ( column_constraint )* ) ( type_name )? ) ;
    public final SqlParser.column_def_return column_def() throws RecognitionException {
        SqlParser.column_def_return retval = new SqlParser.column_def_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.id_column_def_return name =null;

        SqlParser.type_name_return type_name340 =null;

        SqlParser.column_constraint_return column_constraint341 =null;


        RewriteRuleSubtreeStream stream_column_constraint=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint");
        RewriteRuleSubtreeStream stream_id_column_def=new RewriteRuleSubtreeStream(adaptor,"rule id_column_def");
        RewriteRuleSubtreeStream stream_type_name=new RewriteRuleSubtreeStream(adaptor,"rule type_name");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:11: (name= id_column_def ( type_name )? ( column_constraint )* -> ^( $name ^( CONSTRAINTS ( column_constraint )* ) ( type_name )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:13: name= id_column_def ( type_name )? ( column_constraint )*
            {
            pushFollow(FOLLOW_id_column_def_in_column_def2959);
            name=id_column_def();

            state._fsp--;

            stream_id_column_def.add(name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:32: ( type_name )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==ID) ) {
                alt128=1;
            }
            switch (alt128) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:32: type_name
                    {
                    pushFollow(FOLLOW_type_name_in_column_def2961);
                    type_name340=type_name();

                    state._fsp--;

                    stream_type_name.add(type_name340.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:43: ( column_constraint )*
            loop129:
            do {
                int alt129=2;
                alt129 = dfa129.predict(input);
                switch (alt129) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:409:43: column_constraint
            	    {
            	    pushFollow(FOLLOW_column_constraint_in_column_def2964);
            	    column_constraint341=column_constraint();

            	    state._fsp--;

            	    stream_column_constraint.add(column_constraint341.getTree());

            	    }
            	    break;

            	default :
            	    break loop129;
                }
            } while (true);


            // AST REWRITE
            // elements: name, column_constraint, type_name
            // token labels: 
            // rule labels: retval, name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_name=new RewriteRuleSubtreeStream(adaptor,"rule name",name!=null?name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 410:57: -> ^( $name ^( CONSTRAINTS ( column_constraint )* ) ( type_name )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:410:4: ^( $name ^( CONSTRAINTS ( column_constraint )* ) ( type_name )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_name.nextNode(), root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:410:12: ^( CONSTRAINTS ( column_constraint )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CONSTRAINTS, "CONSTRAINTS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:410:26: ( column_constraint )*
                while ( stream_column_constraint.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_constraint.nextTree());

                }
                stream_column_constraint.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:410:46: ( type_name )?
                if ( stream_type_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_type_name.nextTree());

                }
                stream_type_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_def"


    public static class column_constraint_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:412:1: column_constraint : ( CONSTRAINT name= id )? ( column_constraint_pk | column_constraint_not_null | column_constraint_null | column_constraint_unique | column_constraint_check | column_constraint_default | column_constraint_collate | fk_clause ) -> ^( COLUMN_CONSTRAINT ( column_constraint_pk )? ( column_constraint_not_null )? ( column_constraint_null )? ( column_constraint_unique )? ( column_constraint_check )? ( column_constraint_default )? ( column_constraint_collate )? ( fk_clause )? ( $name)? ) ;
    public final SqlParser.column_constraint_return column_constraint() throws RecognitionException {
        SqlParser.column_constraint_return retval = new SqlParser.column_constraint_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CONSTRAINT342=null;
        SqlParser.id_return name =null;

        SqlParser.column_constraint_pk_return column_constraint_pk343 =null;

        SqlParser.column_constraint_not_null_return column_constraint_not_null344 =null;

        SqlParser.column_constraint_null_return column_constraint_null345 =null;

        SqlParser.column_constraint_unique_return column_constraint_unique346 =null;

        SqlParser.column_constraint_check_return column_constraint_check347 =null;

        SqlParser.column_constraint_default_return column_constraint_default348 =null;

        SqlParser.column_constraint_collate_return column_constraint_collate349 =null;

        SqlParser.fk_clause_return fk_clause350 =null;


        Object CONSTRAINT342_tree=null;
        RewriteRuleTokenStream stream_CONSTRAINT=new RewriteRuleTokenStream(adaptor,"token CONSTRAINT");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_column_constraint_default=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_default");
        RewriteRuleSubtreeStream stream_column_constraint_check=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_check");
        RewriteRuleSubtreeStream stream_column_constraint_pk=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_pk");
        RewriteRuleSubtreeStream stream_column_constraint_null=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_null");
        RewriteRuleSubtreeStream stream_column_constraint_collate=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_collate");
        RewriteRuleSubtreeStream stream_column_constraint_unique=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_unique");
        RewriteRuleSubtreeStream stream_fk_clause=new RewriteRuleSubtreeStream(adaptor,"rule fk_clause");
        RewriteRuleSubtreeStream stream_column_constraint_not_null=new RewriteRuleSubtreeStream(adaptor,"rule column_constraint_not_null");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:412:18: ( ( CONSTRAINT name= id )? ( column_constraint_pk | column_constraint_not_null | column_constraint_null | column_constraint_unique | column_constraint_check | column_constraint_default | column_constraint_collate | fk_clause ) -> ^( COLUMN_CONSTRAINT ( column_constraint_pk )? ( column_constraint_not_null )? ( column_constraint_null )? ( column_constraint_unique )? ( column_constraint_check )? ( column_constraint_default )? ( column_constraint_collate )? ( fk_clause )? ( $name)? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:412:20: ( CONSTRAINT name= id )? ( column_constraint_pk | column_constraint_not_null | column_constraint_null | column_constraint_unique | column_constraint_check | column_constraint_default | column_constraint_collate | fk_clause )
            {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:412:20: ( CONSTRAINT name= id )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==CONSTRAINT) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:412:21: CONSTRAINT name= id
                    {
                    CONSTRAINT342=(Token)match(input,CONSTRAINT,FOLLOW_CONSTRAINT_in_column_constraint2990);  
                    stream_CONSTRAINT.add(CONSTRAINT342);


                    pushFollow(FOLLOW_id_in_column_constraint2994);
                    name=id();

                    state._fsp--;

                    stream_id.add(name.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:413:3: ( column_constraint_pk | column_constraint_not_null | column_constraint_null | column_constraint_unique | column_constraint_check | column_constraint_default | column_constraint_collate | fk_clause )
            int alt131=8;
            switch ( input.LA(1) ) {
            case PRIMARY:
                {
                alt131=1;
                }
                break;
            case NOT:
                {
                alt131=2;
                }
                break;
            case NULL:
                {
                alt131=3;
                }
                break;
            case UNIQUE:
                {
                alt131=4;
                }
                break;
            case CHECK:
                {
                alt131=5;
                }
                break;
            case DEFAULT:
                {
                alt131=6;
                }
                break;
            case COLLATE:
                {
                alt131=7;
                }
                break;
            case REFERENCES:
                {
                alt131=8;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 131, 0, input);

                throw nvae;

            }

            switch (alt131) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:413:5: column_constraint_pk
                    {
                    pushFollow(FOLLOW_column_constraint_pk_in_column_constraint3002);
                    column_constraint_pk343=column_constraint_pk();

                    state._fsp--;

                    stream_column_constraint_pk.add(column_constraint_pk343.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:414:5: column_constraint_not_null
                    {
                    pushFollow(FOLLOW_column_constraint_not_null_in_column_constraint3008);
                    column_constraint_not_null344=column_constraint_not_null();

                    state._fsp--;

                    stream_column_constraint_not_null.add(column_constraint_not_null344.getTree());

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:415:5: column_constraint_null
                    {
                    pushFollow(FOLLOW_column_constraint_null_in_column_constraint3014);
                    column_constraint_null345=column_constraint_null();

                    state._fsp--;

                    stream_column_constraint_null.add(column_constraint_null345.getTree());

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:416:5: column_constraint_unique
                    {
                    pushFollow(FOLLOW_column_constraint_unique_in_column_constraint3020);
                    column_constraint_unique346=column_constraint_unique();

                    state._fsp--;

                    stream_column_constraint_unique.add(column_constraint_unique346.getTree());

                    }
                    break;
                case 5 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:417:5: column_constraint_check
                    {
                    pushFollow(FOLLOW_column_constraint_check_in_column_constraint3026);
                    column_constraint_check347=column_constraint_check();

                    state._fsp--;

                    stream_column_constraint_check.add(column_constraint_check347.getTree());

                    }
                    break;
                case 6 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:418:5: column_constraint_default
                    {
                    pushFollow(FOLLOW_column_constraint_default_in_column_constraint3032);
                    column_constraint_default348=column_constraint_default();

                    state._fsp--;

                    stream_column_constraint_default.add(column_constraint_default348.getTree());

                    }
                    break;
                case 7 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:419:5: column_constraint_collate
                    {
                    pushFollow(FOLLOW_column_constraint_collate_in_column_constraint3038);
                    column_constraint_collate349=column_constraint_collate();

                    state._fsp--;

                    stream_column_constraint_collate.add(column_constraint_collate349.getTree());

                    }
                    break;
                case 8 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:420:5: fk_clause
                    {
                    pushFollow(FOLLOW_fk_clause_in_column_constraint3044);
                    fk_clause350=fk_clause();

                    state._fsp--;

                    stream_fk_clause.add(fk_clause350.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: column_constraint_not_null, column_constraint_pk, column_constraint_default, column_constraint_collate, fk_clause, name, column_constraint_null, column_constraint_check, column_constraint_unique
            // token labels: 
            // rule labels: retval, name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_name=new RewriteRuleSubtreeStream(adaptor,"rule name",name!=null?name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 421:10: -> ^( COLUMN_CONSTRAINT ( column_constraint_pk )? ( column_constraint_not_null )? ( column_constraint_null )? ( column_constraint_unique )? ( column_constraint_check )? ( column_constraint_default )? ( column_constraint_collate )? ( fk_clause )? ( $name)? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:421:4: ^( COLUMN_CONSTRAINT ( column_constraint_pk )? ( column_constraint_not_null )? ( column_constraint_null )? ( column_constraint_unique )? ( column_constraint_check )? ( column_constraint_default )? ( column_constraint_collate )? ( fk_clause )? ( $name)? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMN_CONSTRAINT, "COLUMN_CONSTRAINT")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:422:3: ( column_constraint_pk )?
                if ( stream_column_constraint_pk.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_pk.nextTree());

                }
                stream_column_constraint_pk.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:423:3: ( column_constraint_not_null )?
                if ( stream_column_constraint_not_null.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_not_null.nextTree());

                }
                stream_column_constraint_not_null.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:424:3: ( column_constraint_null )?
                if ( stream_column_constraint_null.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_null.nextTree());

                }
                stream_column_constraint_null.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:425:3: ( column_constraint_unique )?
                if ( stream_column_constraint_unique.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_unique.nextTree());

                }
                stream_column_constraint_unique.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:426:3: ( column_constraint_check )?
                if ( stream_column_constraint_check.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_check.nextTree());

                }
                stream_column_constraint_check.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:427:3: ( column_constraint_default )?
                if ( stream_column_constraint_default.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_default.nextTree());

                }
                stream_column_constraint_default.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:428:3: ( column_constraint_collate )?
                if ( stream_column_constraint_collate.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_constraint_collate.nextTree());

                }
                stream_column_constraint_collate.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:429:3: ( fk_clause )?
                if ( stream_fk_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_fk_clause.nextTree());

                }
                stream_fk_clause.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:430:4: ( $name)?
                if ( stream_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_name.nextTree());

                }
                stream_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint"


    public static class column_constraint_pk_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_pk"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:1: column_constraint_pk : PRIMARY ^ KEY ! ( ASC | DESC )? ( table_conflict_clause )? ( AUTOINCREMENT )? ;
    public final SqlParser.column_constraint_pk_return column_constraint_pk() throws RecognitionException {
        SqlParser.column_constraint_pk_return retval = new SqlParser.column_constraint_pk_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PRIMARY351=null;
        Token KEY352=null;
        Token set353=null;
        Token AUTOINCREMENT355=null;
        SqlParser.table_conflict_clause_return table_conflict_clause354 =null;


        Object PRIMARY351_tree=null;
        Object KEY352_tree=null;
        Object set353_tree=null;
        Object AUTOINCREMENT355_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:21: ( PRIMARY ^ KEY ! ( ASC | DESC )? ( table_conflict_clause )? ( AUTOINCREMENT )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:23: PRIMARY ^ KEY ! ( ASC | DESC )? ( table_conflict_clause )? ( AUTOINCREMENT )?
            {
            root_0 = (Object)adaptor.nil();


            PRIMARY351=(Token)match(input,PRIMARY,FOLLOW_PRIMARY_in_column_constraint_pk3104); 
            PRIMARY351_tree = 
            (Object)adaptor.create(PRIMARY351)
            ;
            root_0 = (Object)adaptor.becomeRoot(PRIMARY351_tree, root_0);


            KEY352=(Token)match(input,KEY,FOLLOW_KEY_in_column_constraint_pk3107); 

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:37: ( ASC | DESC )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==ASC||LA132_0==DESC) ) {
                alt132=1;
            }
            switch (alt132) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
                    {
                    set353=(Token)input.LT(1);

                    if ( input.LA(1)==ASC||input.LA(1)==DESC ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set353)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:51: ( table_conflict_clause )?
            int alt133=2;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==ON) ) {
                alt133=1;
            }
            switch (alt133) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:51: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_column_constraint_pk3119);
                    table_conflict_clause354=table_conflict_clause();

                    state._fsp--;

                    adaptor.addChild(root_0, table_conflict_clause354.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:74: ( AUTOINCREMENT )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==AUTOINCREMENT) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:432:75: AUTOINCREMENT
                    {
                    AUTOINCREMENT355=(Token)match(input,AUTOINCREMENT,FOLLOW_AUTOINCREMENT_in_column_constraint_pk3123); 
                    AUTOINCREMENT355_tree = 
                    (Object)adaptor.create(AUTOINCREMENT355)
                    ;
                    adaptor.addChild(root_0, AUTOINCREMENT355_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_pk"


    public static class column_constraint_not_null_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_not_null"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:1: column_constraint_not_null : NOT NULL ( table_conflict_clause )? -> ^( NOT_NULL ( table_conflict_clause )? ) ;
    public final SqlParser.column_constraint_not_null_return column_constraint_not_null() throws RecognitionException {
        SqlParser.column_constraint_not_null_return retval = new SqlParser.column_constraint_not_null_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token NOT356=null;
        Token NULL357=null;
        SqlParser.table_conflict_clause_return table_conflict_clause358 =null;


        Object NOT356_tree=null;
        Object NULL357_tree=null;
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_NULL=new RewriteRuleTokenStream(adaptor,"token NULL");
        RewriteRuleSubtreeStream stream_table_conflict_clause=new RewriteRuleSubtreeStream(adaptor,"rule table_conflict_clause");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:27: ( NOT NULL ( table_conflict_clause )? -> ^( NOT_NULL ( table_conflict_clause )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:29: NOT NULL ( table_conflict_clause )?
            {
            NOT356=(Token)match(input,NOT,FOLLOW_NOT_in_column_constraint_not_null3132);  
            stream_NOT.add(NOT356);


            NULL357=(Token)match(input,NULL,FOLLOW_NULL_in_column_constraint_not_null3134);  
            stream_NULL.add(NULL357);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:38: ( table_conflict_clause )?
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==ON) ) {
                alt135=1;
            }
            switch (alt135) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:38: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_column_constraint_not_null3136);
                    table_conflict_clause358=table_conflict_clause();

                    state._fsp--;

                    stream_table_conflict_clause.add(table_conflict_clause358.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: table_conflict_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 434:61: -> ^( NOT_NULL ( table_conflict_clause )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:64: ^( NOT_NULL ( table_conflict_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(NOT_NULL, "NOT_NULL")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:434:75: ( table_conflict_clause )?
                if ( stream_table_conflict_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_conflict_clause.nextTree());

                }
                stream_table_conflict_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_not_null"


    public static class column_constraint_null_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_null"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:1: column_constraint_null : NULL ( table_conflict_clause )? -> ^( IS_NULL ( table_conflict_clause )? ) ;
    public final SqlParser.column_constraint_null_return column_constraint_null() throws RecognitionException {
        SqlParser.column_constraint_null_return retval = new SqlParser.column_constraint_null_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token NULL359=null;
        SqlParser.table_conflict_clause_return table_conflict_clause360 =null;


        Object NULL359_tree=null;
        RewriteRuleTokenStream stream_NULL=new RewriteRuleTokenStream(adaptor,"token NULL");
        RewriteRuleSubtreeStream stream_table_conflict_clause=new RewriteRuleSubtreeStream(adaptor,"rule table_conflict_clause");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:23: ( NULL ( table_conflict_clause )? -> ^( IS_NULL ( table_conflict_clause )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:25: NULL ( table_conflict_clause )?
            {
            NULL359=(Token)match(input,NULL,FOLLOW_NULL_in_column_constraint_null3153);  
            stream_NULL.add(NULL359);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:30: ( table_conflict_clause )?
            int alt136=2;
            int LA136_0 = input.LA(1);

            if ( (LA136_0==ON) ) {
                alt136=1;
            }
            switch (alt136) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:30: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_column_constraint_null3155);
                    table_conflict_clause360=table_conflict_clause();

                    state._fsp--;

                    stream_table_conflict_clause.add(table_conflict_clause360.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: table_conflict_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 436:53: -> ^( IS_NULL ( table_conflict_clause )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:56: ^( IS_NULL ( table_conflict_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(IS_NULL, "IS_NULL")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:436:66: ( table_conflict_clause )?
                if ( stream_table_conflict_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_conflict_clause.nextTree());

                }
                stream_table_conflict_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_null"


    public static class column_constraint_unique_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_unique"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:438:1: column_constraint_unique : UNIQUE ^ ( table_conflict_clause )? ;
    public final SqlParser.column_constraint_unique_return column_constraint_unique() throws RecognitionException {
        SqlParser.column_constraint_unique_return retval = new SqlParser.column_constraint_unique_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token UNIQUE361=null;
        SqlParser.table_conflict_clause_return table_conflict_clause362 =null;


        Object UNIQUE361_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:438:25: ( UNIQUE ^ ( table_conflict_clause )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:438:27: UNIQUE ^ ( table_conflict_clause )?
            {
            root_0 = (Object)adaptor.nil();


            UNIQUE361=(Token)match(input,UNIQUE,FOLLOW_UNIQUE_in_column_constraint_unique3172); 
            UNIQUE361_tree = 
            (Object)adaptor.create(UNIQUE361)
            ;
            root_0 = (Object)adaptor.becomeRoot(UNIQUE361_tree, root_0);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:438:35: ( table_conflict_clause )?
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==ON) ) {
                alt137=1;
            }
            switch (alt137) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:438:35: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_column_constraint_unique3175);
                    table_conflict_clause362=table_conflict_clause();

                    state._fsp--;

                    adaptor.addChild(root_0, table_conflict_clause362.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_unique"


    public static class column_constraint_check_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_check"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:440:1: column_constraint_check : CHECK ^ LPAREN ! expr RPAREN !;
    public final SqlParser.column_constraint_check_return column_constraint_check() throws RecognitionException {
        SqlParser.column_constraint_check_return retval = new SqlParser.column_constraint_check_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CHECK363=null;
        Token LPAREN364=null;
        Token RPAREN366=null;
        SqlParser.expr_return expr365 =null;


        Object CHECK363_tree=null;
        Object LPAREN364_tree=null;
        Object RPAREN366_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:440:24: ( CHECK ^ LPAREN ! expr RPAREN !)
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:440:26: CHECK ^ LPAREN ! expr RPAREN !
            {
            root_0 = (Object)adaptor.nil();


            CHECK363=(Token)match(input,CHECK,FOLLOW_CHECK_in_column_constraint_check3183); 
            CHECK363_tree = 
            (Object)adaptor.create(CHECK363)
            ;
            root_0 = (Object)adaptor.becomeRoot(CHECK363_tree, root_0);


            LPAREN364=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_column_constraint_check3186); 

            pushFollow(FOLLOW_expr_in_column_constraint_check3189);
            expr365=expr();

            state._fsp--;

            adaptor.addChild(root_0, expr365.getTree());

            RPAREN366=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_column_constraint_check3191); 

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_check"


    public static class numeric_literal_value_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "numeric_literal_value"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:442:1: numeric_literal_value : ( INTEGER -> ^( INTEGER_LITERAL INTEGER ) | FLOAT -> ^( FLOAT_LITERAL FLOAT ) );
    public final SqlParser.numeric_literal_value_return numeric_literal_value() throws RecognitionException {
        SqlParser.numeric_literal_value_return retval = new SqlParser.numeric_literal_value_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token INTEGER367=null;
        Token FLOAT368=null;

        Object INTEGER367_tree=null;
        Object FLOAT368_tree=null;
        RewriteRuleTokenStream stream_INTEGER=new RewriteRuleTokenStream(adaptor,"token INTEGER");
        RewriteRuleTokenStream stream_FLOAT=new RewriteRuleTokenStream(adaptor,"token FLOAT");

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:443:3: ( INTEGER -> ^( INTEGER_LITERAL INTEGER ) | FLOAT -> ^( FLOAT_LITERAL FLOAT ) )
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==INTEGER) ) {
                alt138=1;
            }
            else if ( (LA138_0==FLOAT) ) {
                alt138=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 138, 0, input);

                throw nvae;

            }
            switch (alt138) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:443:5: INTEGER
                    {
                    INTEGER367=(Token)match(input,INTEGER,FOLLOW_INTEGER_in_numeric_literal_value3202);  
                    stream_INTEGER.add(INTEGER367);


                    // AST REWRITE
                    // elements: INTEGER
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 443:13: -> ^( INTEGER_LITERAL INTEGER )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:443:16: ^( INTEGER_LITERAL INTEGER )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(INTEGER_LITERAL, "INTEGER_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_INTEGER.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:444:5: FLOAT
                    {
                    FLOAT368=(Token)match(input,FLOAT,FOLLOW_FLOAT_in_numeric_literal_value3216);  
                    stream_FLOAT.add(FLOAT368);


                    // AST REWRITE
                    // elements: FLOAT
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 444:11: -> ^( FLOAT_LITERAL FLOAT )
                    {
                        // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:444:14: ^( FLOAT_LITERAL FLOAT )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(FLOAT_LITERAL, "FLOAT_LITERAL")
                        , root_1);

                        adaptor.addChild(root_1, 
                        stream_FLOAT.nextNode()
                        );

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "numeric_literal_value"


    public static class signed_default_number_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "signed_default_number"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:447:1: signed_default_number : ( PLUS | MINUS ) ^ numeric_literal_value ;
    public final SqlParser.signed_default_number_return signed_default_number() throws RecognitionException {
        SqlParser.signed_default_number_return retval = new SqlParser.signed_default_number_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set369=null;
        SqlParser.numeric_literal_value_return numeric_literal_value370 =null;


        Object set369_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:447:22: ( ( PLUS | MINUS ) ^ numeric_literal_value )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:447:24: ( PLUS | MINUS ) ^ numeric_literal_value
            {
            root_0 = (Object)adaptor.nil();


            set369=(Token)input.LT(1);

            set369=(Token)input.LT(1);

            if ( input.LA(1)==MINUS||input.LA(1)==PLUS ) {
                input.consume();
                root_0 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(set369)
                , root_0);
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            pushFollow(FOLLOW_numeric_literal_value_in_signed_default_number3243);
            numeric_literal_value370=numeric_literal_value();

            state._fsp--;

            adaptor.addChild(root_0, numeric_literal_value370.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "signed_default_number"


    public static class column_constraint_default_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_default"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:1: column_constraint_default : DEFAULT ^ ( signed_default_number | literal_value | LPAREN ! expr RPAREN !) ;
    public final SqlParser.column_constraint_default_return column_constraint_default() throws RecognitionException {
        SqlParser.column_constraint_default_return retval = new SqlParser.column_constraint_default_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DEFAULT371=null;
        Token LPAREN374=null;
        Token RPAREN376=null;
        SqlParser.signed_default_number_return signed_default_number372 =null;

        SqlParser.literal_value_return literal_value373 =null;

        SqlParser.expr_return expr375 =null;


        Object DEFAULT371_tree=null;
        Object LPAREN374_tree=null;
        Object RPAREN376_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:26: ( DEFAULT ^ ( signed_default_number | literal_value | LPAREN ! expr RPAREN !) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:28: DEFAULT ^ ( signed_default_number | literal_value | LPAREN ! expr RPAREN !)
            {
            root_0 = (Object)adaptor.nil();


            DEFAULT371=(Token)match(input,DEFAULT,FOLLOW_DEFAULT_in_column_constraint_default3251); 
            DEFAULT371_tree = 
            (Object)adaptor.create(DEFAULT371)
            ;
            root_0 = (Object)adaptor.becomeRoot(DEFAULT371_tree, root_0);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:37: ( signed_default_number | literal_value | LPAREN ! expr RPAREN !)
            int alt139=3;
            switch ( input.LA(1) ) {
            case MINUS:
            case PLUS:
                {
                alt139=1;
                }
                break;
            case BLOB:
            case CURRENT_DATE:
            case CURRENT_TIME:
            case CURRENT_TIMESTAMP:
            case FALSE:
            case FLOAT:
            case INTEGER:
            case NULL:
            case STRING:
            case TRUE:
                {
                alt139=2;
                }
                break;
            case LPAREN:
                {
                alt139=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 139, 0, input);

                throw nvae;

            }

            switch (alt139) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:38: signed_default_number
                    {
                    pushFollow(FOLLOW_signed_default_number_in_column_constraint_default3255);
                    signed_default_number372=signed_default_number();

                    state._fsp--;

                    adaptor.addChild(root_0, signed_default_number372.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:62: literal_value
                    {
                    pushFollow(FOLLOW_literal_value_in_column_constraint_default3259);
                    literal_value373=literal_value();

                    state._fsp--;

                    adaptor.addChild(root_0, literal_value373.getTree());

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:450:78: LPAREN ! expr RPAREN !
                    {
                    LPAREN374=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_column_constraint_default3263); 

                    pushFollow(FOLLOW_expr_in_column_constraint_default3266);
                    expr375=expr();

                    state._fsp--;

                    adaptor.addChild(root_0, expr375.getTree());

                    RPAREN376=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_column_constraint_default3268); 

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_default"


    public static class column_constraint_collate_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_constraint_collate"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:452:1: column_constraint_collate : COLLATE ^collation_name= id ;
    public final SqlParser.column_constraint_collate_return column_constraint_collate() throws RecognitionException {
        SqlParser.column_constraint_collate_return retval = new SqlParser.column_constraint_collate_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COLLATE377=null;
        SqlParser.id_return collation_name =null;


        Object COLLATE377_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:452:26: ( COLLATE ^collation_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:452:28: COLLATE ^collation_name= id
            {
            root_0 = (Object)adaptor.nil();


            COLLATE377=(Token)match(input,COLLATE,FOLLOW_COLLATE_in_column_constraint_collate3278); 
            COLLATE377_tree = 
            (Object)adaptor.create(COLLATE377)
            ;
            root_0 = (Object)adaptor.becomeRoot(COLLATE377_tree, root_0);


            pushFollow(FOLLOW_id_in_column_constraint_collate3283);
            collation_name=id();

            state._fsp--;

            adaptor.addChild(root_0, collation_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_constraint_collate"


    public static class table_constraint_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_constraint"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:454:1: table_constraint : ( CONSTRAINT name= id )? ( table_constraint_pk | table_constraint_unique | table_constraint_check | table_constraint_fk ) -> ^( TABLE_CONSTRAINT ( table_constraint_pk )? ( table_constraint_unique )? ( table_constraint_check )? ( table_constraint_fk )? ( $name)? ) ;
    public final SqlParser.table_constraint_return table_constraint() throws RecognitionException {
        SqlParser.table_constraint_return retval = new SqlParser.table_constraint_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CONSTRAINT378=null;
        SqlParser.id_return name =null;

        SqlParser.table_constraint_pk_return table_constraint_pk379 =null;

        SqlParser.table_constraint_unique_return table_constraint_unique380 =null;

        SqlParser.table_constraint_check_return table_constraint_check381 =null;

        SqlParser.table_constraint_fk_return table_constraint_fk382 =null;


        Object CONSTRAINT378_tree=null;
        RewriteRuleTokenStream stream_CONSTRAINT=new RewriteRuleTokenStream(adaptor,"token CONSTRAINT");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_table_constraint_pk=new RewriteRuleSubtreeStream(adaptor,"rule table_constraint_pk");
        RewriteRuleSubtreeStream stream_table_constraint_fk=new RewriteRuleSubtreeStream(adaptor,"rule table_constraint_fk");
        RewriteRuleSubtreeStream stream_table_constraint_unique=new RewriteRuleSubtreeStream(adaptor,"rule table_constraint_unique");
        RewriteRuleSubtreeStream stream_table_constraint_check=new RewriteRuleSubtreeStream(adaptor,"rule table_constraint_check");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:454:17: ( ( CONSTRAINT name= id )? ( table_constraint_pk | table_constraint_unique | table_constraint_check | table_constraint_fk ) -> ^( TABLE_CONSTRAINT ( table_constraint_pk )? ( table_constraint_unique )? ( table_constraint_check )? ( table_constraint_fk )? ( $name)? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:454:19: ( CONSTRAINT name= id )? ( table_constraint_pk | table_constraint_unique | table_constraint_check | table_constraint_fk )
            {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:454:19: ( CONSTRAINT name= id )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==CONSTRAINT) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:454:20: CONSTRAINT name= id
                    {
                    CONSTRAINT378=(Token)match(input,CONSTRAINT,FOLLOW_CONSTRAINT_in_table_constraint3292);  
                    stream_CONSTRAINT.add(CONSTRAINT378);


                    pushFollow(FOLLOW_id_in_table_constraint3296);
                    name=id();

                    state._fsp--;

                    stream_id.add(name.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:455:3: ( table_constraint_pk | table_constraint_unique | table_constraint_check | table_constraint_fk )
            int alt141=4;
            switch ( input.LA(1) ) {
            case PRIMARY:
                {
                alt141=1;
                }
                break;
            case UNIQUE:
                {
                alt141=2;
                }
                break;
            case CHECK:
                {
                alt141=3;
                }
                break;
            case FOREIGN:
                {
                alt141=4;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 141, 0, input);

                throw nvae;

            }

            switch (alt141) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:455:5: table_constraint_pk
                    {
                    pushFollow(FOLLOW_table_constraint_pk_in_table_constraint3304);
                    table_constraint_pk379=table_constraint_pk();

                    state._fsp--;

                    stream_table_constraint_pk.add(table_constraint_pk379.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:456:5: table_constraint_unique
                    {
                    pushFollow(FOLLOW_table_constraint_unique_in_table_constraint3310);
                    table_constraint_unique380=table_constraint_unique();

                    state._fsp--;

                    stream_table_constraint_unique.add(table_constraint_unique380.getTree());

                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:457:5: table_constraint_check
                    {
                    pushFollow(FOLLOW_table_constraint_check_in_table_constraint3316);
                    table_constraint_check381=table_constraint_check();

                    state._fsp--;

                    stream_table_constraint_check.add(table_constraint_check381.getTree());

                    }
                    break;
                case 4 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:458:5: table_constraint_fk
                    {
                    pushFollow(FOLLOW_table_constraint_fk_in_table_constraint3322);
                    table_constraint_fk382=table_constraint_fk();

                    state._fsp--;

                    stream_table_constraint_fk.add(table_constraint_fk382.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: table_constraint_fk, table_constraint_unique, table_constraint_check, name, table_constraint_pk
            // token labels: 
            // rule labels: retval, name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_name=new RewriteRuleSubtreeStream(adaptor,"rule name",name!=null?name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 459:10: -> ^( TABLE_CONSTRAINT ( table_constraint_pk )? ( table_constraint_unique )? ( table_constraint_check )? ( table_constraint_fk )? ( $name)? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:459:4: ^( TABLE_CONSTRAINT ( table_constraint_pk )? ( table_constraint_unique )? ( table_constraint_check )? ( table_constraint_fk )? ( $name)? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_CONSTRAINT, "TABLE_CONSTRAINT")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:460:3: ( table_constraint_pk )?
                if ( stream_table_constraint_pk.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_constraint_pk.nextTree());

                }
                stream_table_constraint_pk.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:461:3: ( table_constraint_unique )?
                if ( stream_table_constraint_unique.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_constraint_unique.nextTree());

                }
                stream_table_constraint_unique.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:462:3: ( table_constraint_check )?
                if ( stream_table_constraint_check.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_constraint_check.nextTree());

                }
                stream_table_constraint_check.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:463:3: ( table_constraint_fk )?
                if ( stream_table_constraint_fk.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_constraint_fk.nextTree());

                }
                stream_table_constraint_fk.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:464:4: ( $name)?
                if ( stream_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_name.nextTree());

                }
                stream_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_constraint"


    public static class table_constraint_pk_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_constraint_pk"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:466:1: table_constraint_pk : PRIMARY KEY LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )? -> ^( PRIMARY ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? ) ;
    public final SqlParser.table_constraint_pk_return table_constraint_pk() throws RecognitionException {
        SqlParser.table_constraint_pk_return retval = new SqlParser.table_constraint_pk_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PRIMARY383=null;
        Token KEY384=null;
        Token LPAREN385=null;
        Token COMMA386=null;
        Token RPAREN387=null;
        List list_indexed_columns=null;
        SqlParser.table_conflict_clause_return table_conflict_clause388 =null;

        RuleReturnScope indexed_columns = null;
        Object PRIMARY383_tree=null;
        Object KEY384_tree=null;
        Object LPAREN385_tree=null;
        Object COMMA386_tree=null;
        Object RPAREN387_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_PRIMARY=new RewriteRuleTokenStream(adaptor,"token PRIMARY");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_KEY=new RewriteRuleTokenStream(adaptor,"token KEY");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_table_conflict_clause=new RewriteRuleSubtreeStream(adaptor,"rule table_conflict_clause");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:466:20: ( PRIMARY KEY LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )? -> ^( PRIMARY ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:466:22: PRIMARY KEY LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )?
            {
            PRIMARY383=(Token)match(input,PRIMARY,FOLLOW_PRIMARY_in_table_constraint_pk3362);  
            stream_PRIMARY.add(PRIMARY383);


            KEY384=(Token)match(input,KEY,FOLLOW_KEY_in_table_constraint_pk3364);  
            stream_KEY.add(KEY384);


            LPAREN385=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_table_constraint_pk3368);  
            stream_LPAREN.add(LPAREN385);


            pushFollow(FOLLOW_id_in_table_constraint_pk3372);
            indexed_columns=id();

            state._fsp--;

            stream_id.add(indexed_columns.getTree());
            if (list_indexed_columns==null) list_indexed_columns=new ArrayList();
            list_indexed_columns.add(indexed_columns.getTree());


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:467:30: ( COMMA indexed_columns+= id )*
            loop142:
            do {
                int alt142=2;
                int LA142_0 = input.LA(1);

                if ( (LA142_0==COMMA) ) {
                    alt142=1;
                }


                switch (alt142) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:467:31: COMMA indexed_columns+= id
            	    {
            	    COMMA386=(Token)match(input,COMMA,FOLLOW_COMMA_in_table_constraint_pk3375);  
            	    stream_COMMA.add(COMMA386);


            	    pushFollow(FOLLOW_id_in_table_constraint_pk3379);
            	    indexed_columns=id();

            	    state._fsp--;

            	    stream_id.add(indexed_columns.getTree());
            	    if (list_indexed_columns==null) list_indexed_columns=new ArrayList();
            	    list_indexed_columns.add(indexed_columns.getTree());


            	    }
            	    break;

            	default :
            	    break loop142;
                }
            } while (true);


            RPAREN387=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_table_constraint_pk3383);  
            stream_RPAREN.add(RPAREN387);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:467:66: ( table_conflict_clause )?
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==ON) ) {
                alt143=1;
            }
            switch (alt143) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:467:66: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_table_constraint_pk3385);
                    table_conflict_clause388=table_conflict_clause();

                    state._fsp--;

                    stream_table_conflict_clause.add(table_conflict_clause388.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: table_conflict_clause, PRIMARY, indexed_columns
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: indexed_columns
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_indexed_columns=new RewriteRuleSubtreeStream(adaptor,"token indexed_columns",list_indexed_columns);
            root_0 = (Object)adaptor.nil();
            // 468:66: -> ^( PRIMARY ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:468:4: ^( PRIMARY ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_PRIMARY.nextNode()
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:468:14: ^( COLUMNS ( $indexed_columns)+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                if ( !(stream_indexed_columns.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_indexed_columns.hasNext() ) {
                    adaptor.addChild(root_2, stream_indexed_columns.nextTree());

                }
                stream_indexed_columns.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:468:43: ( table_conflict_clause )?
                if ( stream_table_conflict_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_conflict_clause.nextTree());

                }
                stream_table_conflict_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_constraint_pk"


    public static class table_constraint_unique_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_constraint_unique"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:470:1: table_constraint_unique : UNIQUE LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )? -> ^( UNIQUE ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? ) ;
    public final SqlParser.table_constraint_unique_return table_constraint_unique() throws RecognitionException {
        SqlParser.table_constraint_unique_return retval = new SqlParser.table_constraint_unique_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token UNIQUE389=null;
        Token LPAREN390=null;
        Token COMMA391=null;
        Token RPAREN392=null;
        List list_indexed_columns=null;
        SqlParser.table_conflict_clause_return table_conflict_clause393 =null;

        RuleReturnScope indexed_columns = null;
        Object UNIQUE389_tree=null;
        Object LPAREN390_tree=null;
        Object COMMA391_tree=null;
        Object RPAREN392_tree=null;
        RewriteRuleTokenStream stream_UNIQUE=new RewriteRuleTokenStream(adaptor,"token UNIQUE");
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_table_conflict_clause=new RewriteRuleSubtreeStream(adaptor,"rule table_conflict_clause");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:470:24: ( UNIQUE LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )? -> ^( UNIQUE ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:470:26: UNIQUE LPAREN indexed_columns+= id ( COMMA indexed_columns+= id )* RPAREN ( table_conflict_clause )?
            {
            UNIQUE389=(Token)match(input,UNIQUE,FOLLOW_UNIQUE_in_table_constraint_unique3410);  
            stream_UNIQUE.add(UNIQUE389);


            LPAREN390=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_table_constraint_unique3414);  
            stream_LPAREN.add(LPAREN390);


            pushFollow(FOLLOW_id_in_table_constraint_unique3418);
            indexed_columns=id();

            state._fsp--;

            stream_id.add(indexed_columns.getTree());
            if (list_indexed_columns==null) list_indexed_columns=new ArrayList();
            list_indexed_columns.add(indexed_columns.getTree());


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:471:30: ( COMMA indexed_columns+= id )*
            loop144:
            do {
                int alt144=2;
                int LA144_0 = input.LA(1);

                if ( (LA144_0==COMMA) ) {
                    alt144=1;
                }


                switch (alt144) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:471:31: COMMA indexed_columns+= id
            	    {
            	    COMMA391=(Token)match(input,COMMA,FOLLOW_COMMA_in_table_constraint_unique3421);  
            	    stream_COMMA.add(COMMA391);


            	    pushFollow(FOLLOW_id_in_table_constraint_unique3425);
            	    indexed_columns=id();

            	    state._fsp--;

            	    stream_id.add(indexed_columns.getTree());
            	    if (list_indexed_columns==null) list_indexed_columns=new ArrayList();
            	    list_indexed_columns.add(indexed_columns.getTree());


            	    }
            	    break;

            	default :
            	    break loop144;
                }
            } while (true);


            RPAREN392=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_table_constraint_unique3429);  
            stream_RPAREN.add(RPAREN392);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:471:66: ( table_conflict_clause )?
            int alt145=2;
            int LA145_0 = input.LA(1);

            if ( (LA145_0==ON) ) {
                alt145=1;
            }
            switch (alt145) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:471:66: table_conflict_clause
                    {
                    pushFollow(FOLLOW_table_conflict_clause_in_table_constraint_unique3431);
                    table_conflict_clause393=table_conflict_clause();

                    state._fsp--;

                    stream_table_conflict_clause.add(table_conflict_clause393.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: UNIQUE, table_conflict_clause, indexed_columns
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: indexed_columns
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_indexed_columns=new RewriteRuleSubtreeStream(adaptor,"token indexed_columns",list_indexed_columns);
            root_0 = (Object)adaptor.nil();
            // 472:65: -> ^( UNIQUE ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:472:4: ^( UNIQUE ^( COLUMNS ( $indexed_columns)+ ) ( table_conflict_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_UNIQUE.nextNode()
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:472:13: ^( COLUMNS ( $indexed_columns)+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                if ( !(stream_indexed_columns.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_indexed_columns.hasNext() ) {
                    adaptor.addChild(root_2, stream_indexed_columns.nextTree());

                }
                stream_indexed_columns.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:472:42: ( table_conflict_clause )?
                if ( stream_table_conflict_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_table_conflict_clause.nextTree());

                }
                stream_table_conflict_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_constraint_unique"


    public static class table_constraint_check_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_constraint_check"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:474:1: table_constraint_check : CHECK ^ LPAREN ! expr RPAREN !;
    public final SqlParser.table_constraint_check_return table_constraint_check() throws RecognitionException {
        SqlParser.table_constraint_check_return retval = new SqlParser.table_constraint_check_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CHECK394=null;
        Token LPAREN395=null;
        Token RPAREN397=null;
        SqlParser.expr_return expr396 =null;


        Object CHECK394_tree=null;
        Object LPAREN395_tree=null;
        Object RPAREN397_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:474:23: ( CHECK ^ LPAREN ! expr RPAREN !)
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:474:25: CHECK ^ LPAREN ! expr RPAREN !
            {
            root_0 = (Object)adaptor.nil();


            CHECK394=(Token)match(input,CHECK,FOLLOW_CHECK_in_table_constraint_check3456); 
            CHECK394_tree = 
            (Object)adaptor.create(CHECK394)
            ;
            root_0 = (Object)adaptor.becomeRoot(CHECK394_tree, root_0);


            LPAREN395=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_table_constraint_check3459); 

            pushFollow(FOLLOW_expr_in_table_constraint_check3462);
            expr396=expr();

            state._fsp--;

            adaptor.addChild(root_0, expr396.getTree());

            RPAREN397=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_table_constraint_check3464); 

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_constraint_check"


    public static class table_constraint_fk_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_constraint_fk"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:476:1: table_constraint_fk : FOREIGN KEY LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN fk_clause -> ^( FOREIGN ^( COLUMNS ( $column_names)+ ) fk_clause ) ;
    public final SqlParser.table_constraint_fk_return table_constraint_fk() throws RecognitionException {
        SqlParser.table_constraint_fk_return retval = new SqlParser.table_constraint_fk_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token FOREIGN398=null;
        Token KEY399=null;
        Token LPAREN400=null;
        Token COMMA401=null;
        Token RPAREN402=null;
        List list_column_names=null;
        SqlParser.fk_clause_return fk_clause403 =null;

        RuleReturnScope column_names = null;
        Object FOREIGN398_tree=null;
        Object KEY399_tree=null;
        Object LPAREN400_tree=null;
        Object COMMA401_tree=null;
        Object RPAREN402_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_FOREIGN=new RewriteRuleTokenStream(adaptor,"token FOREIGN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_KEY=new RewriteRuleTokenStream(adaptor,"token KEY");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_fk_clause=new RewriteRuleSubtreeStream(adaptor,"rule fk_clause");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:476:20: ( FOREIGN KEY LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN fk_clause -> ^( FOREIGN ^( COLUMNS ( $column_names)+ ) fk_clause ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:476:22: FOREIGN KEY LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN fk_clause
            {
            FOREIGN398=(Token)match(input,FOREIGN,FOLLOW_FOREIGN_in_table_constraint_fk3472);  
            stream_FOREIGN.add(FOREIGN398);


            KEY399=(Token)match(input,KEY,FOLLOW_KEY_in_table_constraint_fk3474);  
            stream_KEY.add(KEY399);


            LPAREN400=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_table_constraint_fk3476);  
            stream_LPAREN.add(LPAREN400);


            pushFollow(FOLLOW_id_in_table_constraint_fk3480);
            column_names=id();

            state._fsp--;

            stream_id.add(column_names.getTree());
            if (list_column_names==null) list_column_names=new ArrayList();
            list_column_names.add(column_names.getTree());


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:476:58: ( COMMA column_names+= id )*
            loop146:
            do {
                int alt146=2;
                int LA146_0 = input.LA(1);

                if ( (LA146_0==COMMA) ) {
                    alt146=1;
                }


                switch (alt146) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:476:59: COMMA column_names+= id
            	    {
            	    COMMA401=(Token)match(input,COMMA,FOLLOW_COMMA_in_table_constraint_fk3483);  
            	    stream_COMMA.add(COMMA401);


            	    pushFollow(FOLLOW_id_in_table_constraint_fk3487);
            	    column_names=id();

            	    state._fsp--;

            	    stream_id.add(column_names.getTree());
            	    if (list_column_names==null) list_column_names=new ArrayList();
            	    list_column_names.add(column_names.getTree());


            	    }
            	    break;

            	default :
            	    break loop146;
                }
            } while (true);


            RPAREN402=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_table_constraint_fk3491);  
            stream_RPAREN.add(RPAREN402);


            pushFollow(FOLLOW_fk_clause_in_table_constraint_fk3493);
            fk_clause403=fk_clause();

            state._fsp--;

            stream_fk_clause.add(fk_clause403.getTree());

            // AST REWRITE
            // elements: fk_clause, column_names, FOREIGN
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: column_names
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_column_names=new RewriteRuleSubtreeStream(adaptor,"token column_names",list_column_names);
            root_0 = (Object)adaptor.nil();
            // 477:50: -> ^( FOREIGN ^( COLUMNS ( $column_names)+ ) fk_clause )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:477:4: ^( FOREIGN ^( COLUMNS ( $column_names)+ ) fk_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_FOREIGN.nextNode()
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:477:14: ^( COLUMNS ( $column_names)+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                if ( !(stream_column_names.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_names.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_names.nextTree());

                }
                stream_column_names.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_fk_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_constraint_fk"


    public static class fk_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "fk_clause"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:1: fk_clause : REFERENCES foreign_table= id ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( fk_clause_action )* ( fk_clause_deferrable )? -> ^( REFERENCES $foreign_table ^( COLUMNS ( $column_names)+ ) ( fk_clause_action )* ( fk_clause_deferrable )? ) ;
    public final SqlParser.fk_clause_return fk_clause() throws RecognitionException {
        SqlParser.fk_clause_return retval = new SqlParser.fk_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REFERENCES404=null;
        Token LPAREN405=null;
        Token COMMA406=null;
        Token RPAREN407=null;
        List list_column_names=null;
        SqlParser.id_return foreign_table =null;

        SqlParser.fk_clause_action_return fk_clause_action408 =null;

        SqlParser.fk_clause_deferrable_return fk_clause_deferrable409 =null;

        RuleReturnScope column_names = null;
        Object REFERENCES404_tree=null;
        Object LPAREN405_tree=null;
        Object COMMA406_tree=null;
        Object RPAREN407_tree=null;
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_REFERENCES=new RewriteRuleTokenStream(adaptor,"token REFERENCES");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_fk_clause_action=new RewriteRuleSubtreeStream(adaptor,"rule fk_clause_action");
        RewriteRuleSubtreeStream stream_fk_clause_deferrable=new RewriteRuleSubtreeStream(adaptor,"rule fk_clause_deferrable");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:10: ( REFERENCES foreign_table= id ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( fk_clause_action )* ( fk_clause_deferrable )? -> ^( REFERENCES $foreign_table ^( COLUMNS ( $column_names)+ ) ( fk_clause_action )* ( fk_clause_deferrable )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:12: REFERENCES foreign_table= id ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )? ( fk_clause_action )* ( fk_clause_deferrable )?
            {
            REFERENCES404=(Token)match(input,REFERENCES,FOLLOW_REFERENCES_in_fk_clause3516);  
            stream_REFERENCES.add(REFERENCES404);


            pushFollow(FOLLOW_id_in_fk_clause3520);
            foreign_table=id();

            state._fsp--;

            stream_id.add(foreign_table.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:40: ( LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN )?
            int alt148=2;
            int LA148_0 = input.LA(1);

            if ( (LA148_0==LPAREN) ) {
                alt148=1;
            }
            switch (alt148) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:41: LPAREN column_names+= id ( COMMA column_names+= id )* RPAREN
                    {
                    LPAREN405=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_fk_clause3523);  
                    stream_LPAREN.add(LPAREN405);


                    pushFollow(FOLLOW_id_in_fk_clause3527);
                    column_names=id();

                    state._fsp--;

                    stream_id.add(column_names.getTree());
                    if (list_column_names==null) list_column_names=new ArrayList();
                    list_column_names.add(column_names.getTree());


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:65: ( COMMA column_names+= id )*
                    loop147:
                    do {
                        int alt147=2;
                        int LA147_0 = input.LA(1);

                        if ( (LA147_0==COMMA) ) {
                            alt147=1;
                        }


                        switch (alt147) {
                    	case 1 :
                    	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:479:66: COMMA column_names+= id
                    	    {
                    	    COMMA406=(Token)match(input,COMMA,FOLLOW_COMMA_in_fk_clause3530);  
                    	    stream_COMMA.add(COMMA406);


                    	    pushFollow(FOLLOW_id_in_fk_clause3534);
                    	    column_names=id();

                    	    state._fsp--;

                    	    stream_id.add(column_names.getTree());
                    	    if (list_column_names==null) list_column_names=new ArrayList();
                    	    list_column_names.add(column_names.getTree());


                    	    }
                    	    break;

                    	default :
                    	    break loop147;
                        }
                    } while (true);


                    RPAREN407=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_fk_clause3538);  
                    stream_RPAREN.add(RPAREN407);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:480:3: ( fk_clause_action )*
            loop149:
            do {
                int alt149=2;
                int LA149_0 = input.LA(1);

                if ( (LA149_0==MATCH||LA149_0==ON) ) {
                    alt149=1;
                }


                switch (alt149) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:480:3: fk_clause_action
            	    {
            	    pushFollow(FOLLOW_fk_clause_action_in_fk_clause3544);
            	    fk_clause_action408=fk_clause_action();

            	    state._fsp--;

            	    stream_fk_clause_action.add(fk_clause_action408.getTree());

            	    }
            	    break;

            	default :
            	    break loop149;
                }
            } while (true);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:480:21: ( fk_clause_deferrable )?
            int alt150=2;
            int LA150_0 = input.LA(1);

            if ( (LA150_0==NOT) ) {
                int LA150_1 = input.LA(2);

                if ( (LA150_1==DEFERRABLE) ) {
                    alt150=1;
                }
            }
            else if ( (LA150_0==DEFERRABLE) ) {
                alt150=1;
            }
            switch (alt150) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:480:21: fk_clause_deferrable
                    {
                    pushFollow(FOLLOW_fk_clause_deferrable_in_fk_clause3547);
                    fk_clause_deferrable409=fk_clause_deferrable();

                    state._fsp--;

                    stream_fk_clause_deferrable.add(fk_clause_deferrable409.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: fk_clause_deferrable, REFERENCES, fk_clause_action, column_names, foreign_table
            // token labels: 
            // rule labels: retval, foreign_table
            // token list labels: 
            // rule list labels: column_names
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_foreign_table=new RewriteRuleSubtreeStream(adaptor,"rule foreign_table",foreign_table!=null?foreign_table.tree:null);
            RewriteRuleSubtreeStream stream_column_names=new RewriteRuleSubtreeStream(adaptor,"token column_names",list_column_names);
            root_0 = (Object)adaptor.nil();
            // 481:98: -> ^( REFERENCES $foreign_table ^( COLUMNS ( $column_names)+ ) ( fk_clause_action )* ( fk_clause_deferrable )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:481:4: ^( REFERENCES $foreign_table ^( COLUMNS ( $column_names)+ ) ( fk_clause_action )* ( fk_clause_deferrable )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                stream_REFERENCES.nextNode()
                , root_1);

                adaptor.addChild(root_1, stream_foreign_table.nextTree());

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:481:32: ^( COLUMNS ( $column_names)+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                if ( !(stream_column_names.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_names.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_names.nextTree());

                }
                stream_column_names.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:481:58: ( fk_clause_action )*
                while ( stream_fk_clause_action.hasNext() ) {
                    adaptor.addChild(root_1, stream_fk_clause_action.nextTree());

                }
                stream_fk_clause_action.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:481:76: ( fk_clause_deferrable )?
                if ( stream_fk_clause_deferrable.hasNext() ) {
                    adaptor.addChild(root_1, stream_fk_clause_deferrable.nextTree());

                }
                stream_fk_clause_deferrable.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "fk_clause"


    public static class fk_clause_action_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "fk_clause_action"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:483:1: fk_clause_action : ( ON ^ ( DELETE | UPDATE | INSERT ) ( SET ! NULL | SET ! DEFAULT | CASCADE | RESTRICT ) | MATCH ^ id );
    public final SqlParser.fk_clause_action_return fk_clause_action() throws RecognitionException {
        SqlParser.fk_clause_action_return retval = new SqlParser.fk_clause_action_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ON410=null;
        Token set411=null;
        Token SET412=null;
        Token NULL413=null;
        Token SET414=null;
        Token DEFAULT415=null;
        Token CASCADE416=null;
        Token RESTRICT417=null;
        Token MATCH418=null;
        SqlParser.id_return id419 =null;


        Object ON410_tree=null;
        Object set411_tree=null;
        Object SET412_tree=null;
        Object NULL413_tree=null;
        Object SET414_tree=null;
        Object DEFAULT415_tree=null;
        Object CASCADE416_tree=null;
        Object RESTRICT417_tree=null;
        Object MATCH418_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:3: ( ON ^ ( DELETE | UPDATE | INSERT ) ( SET ! NULL | SET ! DEFAULT | CASCADE | RESTRICT ) | MATCH ^ id )
            int alt152=2;
            int LA152_0 = input.LA(1);

            if ( (LA152_0==ON) ) {
                alt152=1;
            }
            else if ( (LA152_0==MATCH) ) {
                alt152=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 152, 0, input);

                throw nvae;

            }
            switch (alt152) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:5: ON ^ ( DELETE | UPDATE | INSERT ) ( SET ! NULL | SET ! DEFAULT | CASCADE | RESTRICT )
                    {
                    root_0 = (Object)adaptor.nil();


                    ON410=(Token)match(input,ON,FOLLOW_ON_in_fk_clause_action3581); 
                    ON410_tree = 
                    (Object)adaptor.create(ON410)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(ON410_tree, root_0);


                    set411=(Token)input.LT(1);

                    if ( input.LA(1)==DELETE||input.LA(1)==INSERT||input.LA(1)==UPDATE ) {
                        input.consume();
                        adaptor.addChild(root_0, 
                        (Object)adaptor.create(set411)
                        );
                        state.errorRecovery=false;
                    }
                    else {
                        MismatchedSetException mse = new MismatchedSetException(null,input);
                        throw mse;
                    }


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:36: ( SET ! NULL | SET ! DEFAULT | CASCADE | RESTRICT )
                    int alt151=4;
                    switch ( input.LA(1) ) {
                    case SET:
                        {
                        int LA151_1 = input.LA(2);

                        if ( (LA151_1==NULL) ) {
                            alt151=1;
                        }
                        else if ( (LA151_1==DEFAULT) ) {
                            alt151=2;
                        }
                        else {
                            NoViableAltException nvae =
                                new NoViableAltException("", 151, 1, input);

                            throw nvae;

                        }
                        }
                        break;
                    case CASCADE:
                        {
                        alt151=3;
                        }
                        break;
                    case RESTRICT:
                        {
                        alt151=4;
                        }
                        break;
                    default:
                        NoViableAltException nvae =
                            new NoViableAltException("", 151, 0, input);

                        throw nvae;

                    }

                    switch (alt151) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:37: SET ! NULL
                            {
                            SET412=(Token)match(input,SET,FOLLOW_SET_in_fk_clause_action3597); 

                            NULL413=(Token)match(input,NULL,FOLLOW_NULL_in_fk_clause_action3600); 
                            NULL413_tree = 
                            (Object)adaptor.create(NULL413)
                            ;
                            adaptor.addChild(root_0, NULL413_tree);


                            }
                            break;
                        case 2 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:49: SET ! DEFAULT
                            {
                            SET414=(Token)match(input,SET,FOLLOW_SET_in_fk_clause_action3604); 

                            DEFAULT415=(Token)match(input,DEFAULT,FOLLOW_DEFAULT_in_fk_clause_action3607); 
                            DEFAULT415_tree = 
                            (Object)adaptor.create(DEFAULT415)
                            ;
                            adaptor.addChild(root_0, DEFAULT415_tree);


                            }
                            break;
                        case 3 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:64: CASCADE
                            {
                            CASCADE416=(Token)match(input,CASCADE,FOLLOW_CASCADE_in_fk_clause_action3611); 
                            CASCADE416_tree = 
                            (Object)adaptor.create(CASCADE416)
                            ;
                            adaptor.addChild(root_0, CASCADE416_tree);


                            }
                            break;
                        case 4 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:484:74: RESTRICT
                            {
                            RESTRICT417=(Token)match(input,RESTRICT,FOLLOW_RESTRICT_in_fk_clause_action3615); 
                            RESTRICT417_tree = 
                            (Object)adaptor.create(RESTRICT417)
                            ;
                            adaptor.addChild(root_0, RESTRICT417_tree);


                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:485:5: MATCH ^ id
                    {
                    root_0 = (Object)adaptor.nil();


                    MATCH418=(Token)match(input,MATCH,FOLLOW_MATCH_in_fk_clause_action3622); 
                    MATCH418_tree = 
                    (Object)adaptor.create(MATCH418)
                    ;
                    root_0 = (Object)adaptor.becomeRoot(MATCH418_tree, root_0);


                    pushFollow(FOLLOW_id_in_fk_clause_action3625);
                    id419=id();

                    state._fsp--;

                    adaptor.addChild(root_0, id419.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "fk_clause_action"


    public static class fk_clause_deferrable_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "fk_clause_deferrable"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:1: fk_clause_deferrable : ( NOT )? DEFERRABLE ^ ( INITIALLY ! DEFERRED | INITIALLY ! IMMEDIATE )? ;
    public final SqlParser.fk_clause_deferrable_return fk_clause_deferrable() throws RecognitionException {
        SqlParser.fk_clause_deferrable_return retval = new SqlParser.fk_clause_deferrable_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token NOT420=null;
        Token DEFERRABLE421=null;
        Token INITIALLY422=null;
        Token DEFERRED423=null;
        Token INITIALLY424=null;
        Token IMMEDIATE425=null;

        Object NOT420_tree=null;
        Object DEFERRABLE421_tree=null;
        Object INITIALLY422_tree=null;
        Object DEFERRED423_tree=null;
        Object INITIALLY424_tree=null;
        Object IMMEDIATE425_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:21: ( ( NOT )? DEFERRABLE ^ ( INITIALLY ! DEFERRED | INITIALLY ! IMMEDIATE )? )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:23: ( NOT )? DEFERRABLE ^ ( INITIALLY ! DEFERRED | INITIALLY ! IMMEDIATE )?
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:23: ( NOT )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==NOT) ) {
                alt153=1;
            }
            switch (alt153) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:24: NOT
                    {
                    NOT420=(Token)match(input,NOT,FOLLOW_NOT_in_fk_clause_deferrable3633); 
                    NOT420_tree = 
                    (Object)adaptor.create(NOT420)
                    ;
                    adaptor.addChild(root_0, NOT420_tree);


                    }
                    break;

            }


            DEFERRABLE421=(Token)match(input,DEFERRABLE,FOLLOW_DEFERRABLE_in_fk_clause_deferrable3637); 
            DEFERRABLE421_tree = 
            (Object)adaptor.create(DEFERRABLE421)
            ;
            root_0 = (Object)adaptor.becomeRoot(DEFERRABLE421_tree, root_0);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:42: ( INITIALLY ! DEFERRED | INITIALLY ! IMMEDIATE )?
            int alt154=3;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==INITIALLY) ) {
                int LA154_1 = input.LA(2);

                if ( (LA154_1==DEFERRED) ) {
                    alt154=1;
                }
                else if ( (LA154_1==IMMEDIATE) ) {
                    alt154=2;
                }
            }
            switch (alt154) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:43: INITIALLY ! DEFERRED
                    {
                    INITIALLY422=(Token)match(input,INITIALLY,FOLLOW_INITIALLY_in_fk_clause_deferrable3641); 

                    DEFERRED423=(Token)match(input,DEFERRED,FOLLOW_DEFERRED_in_fk_clause_deferrable3644); 
                    DEFERRED423_tree = 
                    (Object)adaptor.create(DEFERRED423)
                    ;
                    adaptor.addChild(root_0, DEFERRED423_tree);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:487:65: INITIALLY ! IMMEDIATE
                    {
                    INITIALLY424=(Token)match(input,INITIALLY,FOLLOW_INITIALLY_in_fk_clause_deferrable3648); 

                    IMMEDIATE425=(Token)match(input,IMMEDIATE,FOLLOW_IMMEDIATE_in_fk_clause_deferrable3651); 
                    IMMEDIATE425_tree = 
                    (Object)adaptor.create(IMMEDIATE425)
                    ;
                    adaptor.addChild(root_0, IMMEDIATE425_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "fk_clause_deferrable"


    public static class drop_table_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "drop_table_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:1: drop_table_stmt : DROP TABLE ( IF EXISTS )? (database_name= id DOT )? table_name= id -> ^( DROP_TABLE ^( OPTIONS ( EXISTS )? ) ^( $table_name ( $database_name)? ) ) ;
    public final SqlParser.drop_table_stmt_return drop_table_stmt() throws RecognitionException {
        SqlParser.drop_table_stmt_return retval = new SqlParser.drop_table_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DROP426=null;
        Token TABLE427=null;
        Token IF428=null;
        Token EXISTS429=null;
        Token DOT430=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;


        Object DROP426_tree=null;
        Object TABLE427_tree=null;
        Object IF428_tree=null;
        Object EXISTS429_tree=null;
        Object DOT430_tree=null;
        RewriteRuleTokenStream stream_TABLE=new RewriteRuleTokenStream(adaptor,"token TABLE");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_DROP=new RewriteRuleTokenStream(adaptor,"token DROP");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:16: ( DROP TABLE ( IF EXISTS )? (database_name= id DOT )? table_name= id -> ^( DROP_TABLE ^( OPTIONS ( EXISTS )? ) ^( $table_name ( $database_name)? ) ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:18: DROP TABLE ( IF EXISTS )? (database_name= id DOT )? table_name= id
            {
            DROP426=(Token)match(input,DROP,FOLLOW_DROP_in_drop_table_stmt3661);  
            stream_DROP.add(DROP426);


            TABLE427=(Token)match(input,TABLE,FOLLOW_TABLE_in_drop_table_stmt3663);  
            stream_TABLE.add(TABLE427);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:29: ( IF EXISTS )?
            int alt155=2;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==IF) ) {
                int LA155_1 = input.LA(2);

                if ( (LA155_1==EXISTS) ) {
                    alt155=1;
                }
            }
            switch (alt155) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:30: IF EXISTS
                    {
                    IF428=(Token)match(input,IF,FOLLOW_IF_in_drop_table_stmt3666);  
                    stream_IF.add(IF428);


                    EXISTS429=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_drop_table_stmt3668);  
                    stream_EXISTS.add(EXISTS429);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:42: (database_name= id DOT )?
            int alt156=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA156_1 = input.LA(2);

                    if ( (LA156_1==DOT) ) {
                        alt156=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA156_2 = input.LA(2);

                    if ( (LA156_2==DOT) ) {
                        alt156=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA156_3 = input.LA(2);

                    if ( (LA156_3==DOT) ) {
                        alt156=1;
                    }
                    }
                    break;
            }

            switch (alt156) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:490:43: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_drop_table_stmt3675);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT430=(Token)match(input,DOT,FOLLOW_DOT_in_drop_table_stmt3677);  
                    stream_DOT.add(DOT430);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_drop_table_stmt3683);
            table_name=id();

            state._fsp--;

            stream_id.add(table_name.getTree());

            // AST REWRITE
            // elements: EXISTS, database_name, table_name
            // token labels: 
            // rule labels: database_name, retval, table_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 491:67: -> ^( DROP_TABLE ^( OPTIONS ( EXISTS )? ) ^( $table_name ( $database_name)? ) )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:491:4: ^( DROP_TABLE ^( OPTIONS ( EXISTS )? ) ^( $table_name ( $database_name)? ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(DROP_TABLE, "DROP_TABLE")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:491:17: ^( OPTIONS ( EXISTS )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:491:27: ( EXISTS )?
                if ( stream_EXISTS.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_EXISTS.nextNode()
                    );

                }
                stream_EXISTS.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:491:36: ^( $table_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_table_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:491:51: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "drop_table_stmt"


    public static class alter_table_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "alter_table_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:1: alter_table_stmt : ALTER TABLE (database_name= id DOT )? table_name= id ( RENAME TO new_table_name= id | ADD ( COLUMN )? column_def ) ;
    public final SqlParser.alter_table_stmt_return alter_table_stmt() throws RecognitionException {
        SqlParser.alter_table_stmt_return retval = new SqlParser.alter_table_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ALTER431=null;
        Token TABLE432=null;
        Token DOT433=null;
        Token RENAME434=null;
        Token TO435=null;
        Token ADD436=null;
        Token COLUMN437=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.id_return new_table_name =null;

        SqlParser.column_def_return column_def438 =null;


        Object ALTER431_tree=null;
        Object TABLE432_tree=null;
        Object DOT433_tree=null;
        Object RENAME434_tree=null;
        Object TO435_tree=null;
        Object ADD436_tree=null;
        Object COLUMN437_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:17: ( ALTER TABLE (database_name= id DOT )? table_name= id ( RENAME TO new_table_name= id | ADD ( COLUMN )? column_def ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:19: ALTER TABLE (database_name= id DOT )? table_name= id ( RENAME TO new_table_name= id | ADD ( COLUMN )? column_def )
            {
            root_0 = (Object)adaptor.nil();


            ALTER431=(Token)match(input,ALTER,FOLLOW_ALTER_in_alter_table_stmt3713); 
            ALTER431_tree = 
            (Object)adaptor.create(ALTER431)
            ;
            adaptor.addChild(root_0, ALTER431_tree);


            TABLE432=(Token)match(input,TABLE,FOLLOW_TABLE_in_alter_table_stmt3715); 
            TABLE432_tree = 
            (Object)adaptor.create(TABLE432)
            ;
            adaptor.addChild(root_0, TABLE432_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:31: (database_name= id DOT )?
            int alt157=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA157_1 = input.LA(2);

                    if ( (LA157_1==DOT) ) {
                        alt157=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA157_2 = input.LA(2);

                    if ( (LA157_2==DOT) ) {
                        alt157=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA157_3 = input.LA(2);

                    if ( (LA157_3==DOT) ) {
                        alt157=1;
                    }
                    }
                    break;
            }

            switch (alt157) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:32: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_alter_table_stmt3720);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT433=(Token)match(input,DOT,FOLLOW_DOT_in_alter_table_stmt3722); 
                    DOT433_tree = 
                    (Object)adaptor.create(DOT433)
                    ;
                    adaptor.addChild(root_0, DOT433_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_alter_table_stmt3728);
            table_name=id();

            state._fsp--;

            adaptor.addChild(root_0, table_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:69: ( RENAME TO new_table_name= id | ADD ( COLUMN )? column_def )
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( (LA159_0==RENAME) ) {
                alt159=1;
            }
            else if ( (LA159_0==ADD) ) {
                alt159=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 159, 0, input);

                throw nvae;

            }
            switch (alt159) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:70: RENAME TO new_table_name= id
                    {
                    RENAME434=(Token)match(input,RENAME,FOLLOW_RENAME_in_alter_table_stmt3731); 
                    RENAME434_tree = 
                    (Object)adaptor.create(RENAME434)
                    ;
                    adaptor.addChild(root_0, RENAME434_tree);


                    TO435=(Token)match(input,TO,FOLLOW_TO_in_alter_table_stmt3733); 
                    TO435_tree = 
                    (Object)adaptor.create(TO435)
                    ;
                    adaptor.addChild(root_0, TO435_tree);


                    pushFollow(FOLLOW_id_in_alter_table_stmt3737);
                    new_table_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, new_table_name.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:100: ADD ( COLUMN )? column_def
                    {
                    ADD436=(Token)match(input,ADD,FOLLOW_ADD_in_alter_table_stmt3741); 
                    ADD436_tree = 
                    (Object)adaptor.create(ADD436)
                    ;
                    adaptor.addChild(root_0, ADD436_tree);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:104: ( COLUMN )?
                    int alt158=2;
                    int LA158_0 = input.LA(1);

                    if ( (LA158_0==COLUMN) ) {
                        alt158=1;
                    }
                    switch (alt158) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:494:105: COLUMN
                            {
                            COLUMN437=(Token)match(input,COLUMN,FOLLOW_COLUMN_in_alter_table_stmt3744); 
                            COLUMN437_tree = 
                            (Object)adaptor.create(COLUMN437)
                            ;
                            adaptor.addChild(root_0, COLUMN437_tree);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_column_def_in_alter_table_stmt3748);
                    column_def438=column_def();

                    state._fsp--;

                    adaptor.addChild(root_0, column_def438.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "alter_table_stmt"


    public static class create_view_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "create_view_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:1: create_view_stmt : CREATE ( TEMPORARY )? VIEW ( IF NOT EXISTS )? (database_name= id DOT )? view_name= id AS t= select_stmt -> ^( CREATE_VIEW ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $view_name ( $database_name)? ) ^( STATEMENT $t) ) ;
    public final SqlParser.create_view_stmt_return create_view_stmt() throws RecognitionException {
        SqlParser.create_view_stmt_return retval = new SqlParser.create_view_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CREATE439=null;
        Token TEMPORARY440=null;
        Token VIEW441=null;
        Token IF442=null;
        Token NOT443=null;
        Token EXISTS444=null;
        Token DOT445=null;
        Token AS446=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return view_name =null;

        SqlParser.select_stmt_return t =null;


        Object CREATE439_tree=null;
        Object TEMPORARY440_tree=null;
        Object VIEW441_tree=null;
        Object IF442_tree=null;
        Object NOT443_tree=null;
        Object EXISTS444_tree=null;
        Object DOT445_tree=null;
        Object AS446_tree=null;
        RewriteRuleTokenStream stream_AS=new RewriteRuleTokenStream(adaptor,"token AS");
        RewriteRuleTokenStream stream_CREATE=new RewriteRuleTokenStream(adaptor,"token CREATE");
        RewriteRuleTokenStream stream_VIEW=new RewriteRuleTokenStream(adaptor,"token VIEW");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_TEMPORARY=new RewriteRuleTokenStream(adaptor,"token TEMPORARY");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_select_stmt=new RewriteRuleSubtreeStream(adaptor,"rule select_stmt");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:17: ( CREATE ( TEMPORARY )? VIEW ( IF NOT EXISTS )? (database_name= id DOT )? view_name= id AS t= select_stmt -> ^( CREATE_VIEW ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $view_name ( $database_name)? ) ^( STATEMENT $t) ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:19: CREATE ( TEMPORARY )? VIEW ( IF NOT EXISTS )? (database_name= id DOT )? view_name= id AS t= select_stmt
            {
            CREATE439=(Token)match(input,CREATE,FOLLOW_CREATE_in_create_view_stmt3757);  
            stream_CREATE.add(CREATE439);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:26: ( TEMPORARY )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==TEMPORARY) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:26: TEMPORARY
                    {
                    TEMPORARY440=(Token)match(input,TEMPORARY,FOLLOW_TEMPORARY_in_create_view_stmt3759);  
                    stream_TEMPORARY.add(TEMPORARY440);


                    }
                    break;

            }


            VIEW441=(Token)match(input,VIEW,FOLLOW_VIEW_in_create_view_stmt3762);  
            stream_VIEW.add(VIEW441);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:42: ( IF NOT EXISTS )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==IF) ) {
                int LA161_1 = input.LA(2);

                if ( (LA161_1==NOT) ) {
                    alt161=1;
                }
            }
            switch (alt161) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:43: IF NOT EXISTS
                    {
                    IF442=(Token)match(input,IF,FOLLOW_IF_in_create_view_stmt3765);  
                    stream_IF.add(IF442);


                    NOT443=(Token)match(input,NOT,FOLLOW_NOT_in_create_view_stmt3767);  
                    stream_NOT.add(NOT443);


                    EXISTS444=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_create_view_stmt3769);  
                    stream_EXISTS.add(EXISTS444);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:59: (database_name= id DOT )?
            int alt162=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA162_1 = input.LA(2);

                    if ( (LA162_1==DOT) ) {
                        alt162=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA162_2 = input.LA(2);

                    if ( (LA162_2==DOT) ) {
                        alt162=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA162_3 = input.LA(2);

                    if ( (LA162_3==DOT) ) {
                        alt162=1;
                    }
                    }
                    break;
            }

            switch (alt162) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:497:60: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_create_view_stmt3776);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT445=(Token)match(input,DOT,FOLLOW_DOT_in_create_view_stmt3778);  
                    stream_DOT.add(DOT445);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_create_view_stmt3784);
            view_name=id();

            state._fsp--;

            stream_id.add(view_name.getTree());

            AS446=(Token)match(input,AS,FOLLOW_AS_in_create_view_stmt3786);  
            stream_AS.add(AS446);


            pushFollow(FOLLOW_select_stmt_in_create_view_stmt3790);
            t=select_stmt();

            state._fsp--;

            stream_select_stmt.add(t.getTree());

            // AST REWRITE
            // elements: database_name, view_name, TEMPORARY, t, EXISTS
            // token labels: 
            // rule labels: view_name, database_name, retval, t
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_view_name=new RewriteRuleSubtreeStream(adaptor,"rule view_name",view_name!=null?view_name.tree:null);
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_t=new RewriteRuleSubtreeStream(adaptor,"rule t",t!=null?t.tree:null);

            root_0 = (Object)adaptor.nil();
            // 498:94: -> ^( CREATE_VIEW ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $view_name ( $database_name)? ) ^( STATEMENT $t) )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:4: ^( CREATE_VIEW ^( OPTIONS ( TEMPORARY )? ( EXISTS )? ) ^( $view_name ( $database_name)? ) ^( STATEMENT $t) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CREATE_VIEW, "CREATE_VIEW")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:18: ^( OPTIONS ( TEMPORARY )? ( EXISTS )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:28: ( TEMPORARY )?
                if ( stream_TEMPORARY.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_TEMPORARY.nextNode()
                    );

                }
                stream_TEMPORARY.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:39: ( EXISTS )?
                if ( stream_EXISTS.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_EXISTS.nextNode()
                    );

                }
                stream_EXISTS.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:48: ^( $view_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_view_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:62: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:498:78: ^( STATEMENT $t)
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(STATEMENT, "STATEMENT")
                , root_2);

                adaptor.addChild(root_2, stream_t.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "create_view_stmt"


    public static class drop_view_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "drop_view_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:1: drop_view_stmt : DROP VIEW ( IF EXISTS )? (database_name= id DOT )? view_name= id ;
    public final SqlParser.drop_view_stmt_return drop_view_stmt() throws RecognitionException {
        SqlParser.drop_view_stmt_return retval = new SqlParser.drop_view_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DROP447=null;
        Token VIEW448=null;
        Token IF449=null;
        Token EXISTS450=null;
        Token DOT451=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return view_name =null;


        Object DROP447_tree=null;
        Object VIEW448_tree=null;
        Object IF449_tree=null;
        Object EXISTS450_tree=null;
        Object DOT451_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:15: ( DROP VIEW ( IF EXISTS )? (database_name= id DOT )? view_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:17: DROP VIEW ( IF EXISTS )? (database_name= id DOT )? view_name= id
            {
            root_0 = (Object)adaptor.nil();


            DROP447=(Token)match(input,DROP,FOLLOW_DROP_in_drop_view_stmt3831); 
            DROP447_tree = 
            (Object)adaptor.create(DROP447)
            ;
            adaptor.addChild(root_0, DROP447_tree);


            VIEW448=(Token)match(input,VIEW,FOLLOW_VIEW_in_drop_view_stmt3833); 
            VIEW448_tree = 
            (Object)adaptor.create(VIEW448)
            ;
            adaptor.addChild(root_0, VIEW448_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:27: ( IF EXISTS )?
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( (LA163_0==IF) ) {
                int LA163_1 = input.LA(2);

                if ( (LA163_1==EXISTS) ) {
                    alt163=1;
                }
            }
            switch (alt163) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:28: IF EXISTS
                    {
                    IF449=(Token)match(input,IF,FOLLOW_IF_in_drop_view_stmt3836); 
                    IF449_tree = 
                    (Object)adaptor.create(IF449)
                    ;
                    adaptor.addChild(root_0, IF449_tree);


                    EXISTS450=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_drop_view_stmt3838); 
                    EXISTS450_tree = 
                    (Object)adaptor.create(EXISTS450)
                    ;
                    adaptor.addChild(root_0, EXISTS450_tree);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:40: (database_name= id DOT )?
            int alt164=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA164_1 = input.LA(2);

                    if ( (LA164_1==DOT) ) {
                        alt164=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA164_2 = input.LA(2);

                    if ( (LA164_2==DOT) ) {
                        alt164=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA164_3 = input.LA(2);

                    if ( (LA164_3==DOT) ) {
                        alt164=1;
                    }
                    }
                    break;
            }

            switch (alt164) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:502:41: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_drop_view_stmt3845);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT451=(Token)match(input,DOT,FOLLOW_DOT_in_drop_view_stmt3847); 
                    DOT451_tree = 
                    (Object)adaptor.create(DOT451)
                    ;
                    adaptor.addChild(root_0, DOT451_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_drop_view_stmt3853);
            view_name=id();

            state._fsp--;

            adaptor.addChild(root_0, view_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "drop_view_stmt"


    public static class create_index_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "create_index_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:1: create_index_stmt : CREATE ( UNIQUE )? INDEX ( IF NOT EXISTS )? (database_name= id DOT )? index_name= id ON table_name= id LPAREN columns+= indexed_column ( COMMA columns+= indexed_column )* RPAREN -> ^( CREATE_INDEX ^( OPTIONS ( UNIQUE )? ( EXISTS )? ) ^( $index_name ( $database_name)? ) $table_name ( ^( COLUMNS ( $columns)+ ) )? ) ;
    public final SqlParser.create_index_stmt_return create_index_stmt() throws RecognitionException {
        SqlParser.create_index_stmt_return retval = new SqlParser.create_index_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CREATE452=null;
        Token UNIQUE453=null;
        Token INDEX454=null;
        Token IF455=null;
        Token NOT456=null;
        Token EXISTS457=null;
        Token DOT458=null;
        Token ON459=null;
        Token LPAREN460=null;
        Token COMMA461=null;
        Token RPAREN462=null;
        List list_columns=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return index_name =null;

        SqlParser.id_return table_name =null;

        RuleReturnScope columns = null;
        Object CREATE452_tree=null;
        Object UNIQUE453_tree=null;
        Object INDEX454_tree=null;
        Object IF455_tree=null;
        Object NOT456_tree=null;
        Object EXISTS457_tree=null;
        Object DOT458_tree=null;
        Object ON459_tree=null;
        Object LPAREN460_tree=null;
        Object COMMA461_tree=null;
        Object RPAREN462_tree=null;
        RewriteRuleTokenStream stream_INDEX=new RewriteRuleTokenStream(adaptor,"token INDEX");
        RewriteRuleTokenStream stream_ON=new RewriteRuleTokenStream(adaptor,"token ON");
        RewriteRuleTokenStream stream_UNIQUE=new RewriteRuleTokenStream(adaptor,"token UNIQUE");
        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
        RewriteRuleTokenStream stream_CREATE=new RewriteRuleTokenStream(adaptor,"token CREATE");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_indexed_column=new RewriteRuleSubtreeStream(adaptor,"rule indexed_column");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:18: ( CREATE ( UNIQUE )? INDEX ( IF NOT EXISTS )? (database_name= id DOT )? index_name= id ON table_name= id LPAREN columns+= indexed_column ( COMMA columns+= indexed_column )* RPAREN -> ^( CREATE_INDEX ^( OPTIONS ( UNIQUE )? ( EXISTS )? ) ^( $index_name ( $database_name)? ) $table_name ( ^( COLUMNS ( $columns)+ ) )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:20: CREATE ( UNIQUE )? INDEX ( IF NOT EXISTS )? (database_name= id DOT )? index_name= id ON table_name= id LPAREN columns+= indexed_column ( COMMA columns+= indexed_column )* RPAREN
            {
            CREATE452=(Token)match(input,CREATE,FOLLOW_CREATE_in_create_index_stmt3861);  
            stream_CREATE.add(CREATE452);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:27: ( UNIQUE )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( (LA165_0==UNIQUE) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:28: UNIQUE
                    {
                    UNIQUE453=(Token)match(input,UNIQUE,FOLLOW_UNIQUE_in_create_index_stmt3864);  
                    stream_UNIQUE.add(UNIQUE453);


                    }
                    break;

            }


            INDEX454=(Token)match(input,INDEX,FOLLOW_INDEX_in_create_index_stmt3868);  
            stream_INDEX.add(INDEX454);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:43: ( IF NOT EXISTS )?
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( (LA166_0==IF) ) {
                int LA166_1 = input.LA(2);

                if ( (LA166_1==NOT) ) {
                    alt166=1;
                }
            }
            switch (alt166) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:44: IF NOT EXISTS
                    {
                    IF455=(Token)match(input,IF,FOLLOW_IF_in_create_index_stmt3871);  
                    stream_IF.add(IF455);


                    NOT456=(Token)match(input,NOT,FOLLOW_NOT_in_create_index_stmt3873);  
                    stream_NOT.add(NOT456);


                    EXISTS457=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_create_index_stmt3875);  
                    stream_EXISTS.add(EXISTS457);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:60: (database_name= id DOT )?
            int alt167=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA167_1 = input.LA(2);

                    if ( (LA167_1==DOT) ) {
                        alt167=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA167_2 = input.LA(2);

                    if ( (LA167_2==DOT) ) {
                        alt167=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA167_3 = input.LA(2);

                    if ( (LA167_3==DOT) ) {
                        alt167=1;
                    }
                    }
                    break;
            }

            switch (alt167) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:505:61: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_create_index_stmt3882);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT458=(Token)match(input,DOT,FOLLOW_DOT_in_create_index_stmt3884);  
                    stream_DOT.add(DOT458);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_create_index_stmt3890);
            index_name=id();

            state._fsp--;

            stream_id.add(index_name.getTree());

            ON459=(Token)match(input,ON,FOLLOW_ON_in_create_index_stmt3894);  
            stream_ON.add(ON459);


            pushFollow(FOLLOW_id_in_create_index_stmt3898);
            table_name=id();

            state._fsp--;

            stream_id.add(table_name.getTree());

            LPAREN460=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_create_index_stmt3900);  
            stream_LPAREN.add(LPAREN460);


            pushFollow(FOLLOW_indexed_column_in_create_index_stmt3904);
            columns=indexed_column();

            state._fsp--;

            stream_indexed_column.add(columns.getTree());
            if (list_columns==null) list_columns=new ArrayList();
            list_columns.add(columns.getTree());


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:506:51: ( COMMA columns+= indexed_column )*
            loop168:
            do {
                int alt168=2;
                int LA168_0 = input.LA(1);

                if ( (LA168_0==COMMA) ) {
                    alt168=1;
                }


                switch (alt168) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:506:52: COMMA columns+= indexed_column
            	    {
            	    COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_create_index_stmt3907);  
            	    stream_COMMA.add(COMMA461);


            	    pushFollow(FOLLOW_indexed_column_in_create_index_stmt3911);
            	    columns=indexed_column();

            	    state._fsp--;

            	    stream_indexed_column.add(columns.getTree());
            	    if (list_columns==null) list_columns=new ArrayList();
            	    list_columns.add(columns.getTree());


            	    }
            	    break;

            	default :
            	    break loop168;
                }
            } while (true);


            RPAREN462=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_create_index_stmt3915);  
            stream_RPAREN.add(RPAREN462);


            // AST REWRITE
            // elements: UNIQUE, table_name, columns, index_name, EXISTS, database_name
            // token labels: 
            // rule labels: database_name, index_name, retval, table_name
            // token list labels: 
            // rule list labels: columns
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_index_name=new RewriteRuleSubtreeStream(adaptor,"rule index_name",index_name!=null?index_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);
            RewriteRuleSubtreeStream stream_columns=new RewriteRuleSubtreeStream(adaptor,"token columns",list_columns);
            root_0 = (Object)adaptor.nil();
            // 507:111: -> ^( CREATE_INDEX ^( OPTIONS ( UNIQUE )? ( EXISTS )? ) ^( $index_name ( $database_name)? ) $table_name ( ^( COLUMNS ( $columns)+ ) )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:4: ^( CREATE_INDEX ^( OPTIONS ( UNIQUE )? ( EXISTS )? ) ^( $index_name ( $database_name)? ) $table_name ( ^( COLUMNS ( $columns)+ ) )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CREATE_INDEX, "CREATE_INDEX")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:19: ^( OPTIONS ( UNIQUE )? ( EXISTS )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:29: ( UNIQUE )?
                if ( stream_UNIQUE.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_UNIQUE.nextNode()
                    );

                }
                stream_UNIQUE.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:37: ( EXISTS )?
                if ( stream_EXISTS.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_EXISTS.nextNode()
                    );

                }
                stream_EXISTS.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:46: ^( $index_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_index_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:61: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_table_name.nextTree());

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:89: ( ^( COLUMNS ( $columns)+ ) )?
                if ( stream_columns.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:507:89: ^( COLUMNS ( $columns)+ )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(COLUMNS, "COLUMNS")
                    , root_2);

                    if ( !(stream_columns.hasNext()) ) {
                        throw new RewriteEarlyExitException();
                    }
                    while ( stream_columns.hasNext() ) {
                        adaptor.addChild(root_2, stream_columns.nextTree());

                    }
                    stream_columns.reset();

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_columns.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "create_index_stmt"


    public static class indexed_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "indexed_column"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:1: indexed_column : column_name= id ( COLLATE collation_name= id )? ( ASC | DESC )? -> ^( $column_name ( ^( COLLATE $collation_name) )? ( ASC )? ( DESC )? ) ;
    public final SqlParser.indexed_column_return indexed_column() throws RecognitionException {
        SqlParser.indexed_column_return retval = new SqlParser.indexed_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COLLATE463=null;
        Token ASC464=null;
        Token DESC465=null;
        SqlParser.id_return column_name =null;

        SqlParser.id_return collation_name =null;


        Object COLLATE463_tree=null;
        Object ASC464_tree=null;
        Object DESC465_tree=null;
        RewriteRuleTokenStream stream_ASC=new RewriteRuleTokenStream(adaptor,"token ASC");
        RewriteRuleTokenStream stream_DESC=new RewriteRuleTokenStream(adaptor,"token DESC");
        RewriteRuleTokenStream stream_COLLATE=new RewriteRuleTokenStream(adaptor,"token COLLATE");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:15: (column_name= id ( COLLATE collation_name= id )? ( ASC | DESC )? -> ^( $column_name ( ^( COLLATE $collation_name) )? ( ASC )? ( DESC )? ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:17: column_name= id ( COLLATE collation_name= id )? ( ASC | DESC )?
            {
            pushFollow(FOLLOW_id_in_indexed_column3961);
            column_name=id();

            state._fsp--;

            stream_id.add(column_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:32: ( COLLATE collation_name= id )?
            int alt169=2;
            int LA169_0 = input.LA(1);

            if ( (LA169_0==COLLATE) ) {
                alt169=1;
            }
            switch (alt169) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:33: COLLATE collation_name= id
                    {
                    COLLATE463=(Token)match(input,COLLATE,FOLLOW_COLLATE_in_indexed_column3964);  
                    stream_COLLATE.add(COLLATE463);


                    pushFollow(FOLLOW_id_in_indexed_column3968);
                    collation_name=id();

                    state._fsp--;

                    stream_id.add(collation_name.getTree());

                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:61: ( ASC | DESC )?
            int alt170=3;
            int LA170_0 = input.LA(1);

            if ( (LA170_0==ASC) ) {
                alt170=1;
            }
            else if ( (LA170_0==DESC) ) {
                alt170=2;
            }
            switch (alt170) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:62: ASC
                    {
                    ASC464=(Token)match(input,ASC,FOLLOW_ASC_in_indexed_column3973);  
                    stream_ASC.add(ASC464);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:509:68: DESC
                    {
                    DESC465=(Token)match(input,DESC,FOLLOW_DESC_in_indexed_column3977);  
                    stream_DESC.add(DESC465);


                    }
                    break;

            }


            // AST REWRITE
            // elements: collation_name, COLLATE, ASC, column_name, DESC
            // token labels: 
            // rule labels: retval, collation_name, column_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_collation_name=new RewriteRuleSubtreeStream(adaptor,"rule collation_name",collation_name!=null?collation_name.tree:null);
            RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name",column_name!=null?column_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 510:58: -> ^( $column_name ( ^( COLLATE $collation_name) )? ( ASC )? ( DESC )? )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:510:4: ^( $column_name ( ^( COLLATE $collation_name) )? ( ASC )? ( DESC )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_column_name.nextNode(), root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:510:19: ( ^( COLLATE $collation_name) )?
                if ( stream_collation_name.hasNext()||stream_COLLATE.hasNext() ) {
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:510:19: ^( COLLATE $collation_name)
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    stream_COLLATE.nextNode()
                    , root_2);

                    adaptor.addChild(root_2, stream_collation_name.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_collation_name.reset();
                stream_COLLATE.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:510:47: ( ASC )?
                if ( stream_ASC.hasNext() ) {
                    adaptor.addChild(root_1, 
                    stream_ASC.nextNode()
                    );

                }
                stream_ASC.reset();

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:510:52: ( DESC )?
                if ( stream_DESC.hasNext() ) {
                    adaptor.addChild(root_1, 
                    stream_DESC.nextNode()
                    );

                }
                stream_DESC.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "indexed_column"


    public static class drop_index_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "drop_index_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:1: drop_index_stmt : DROP INDEX ( IF EXISTS )? (database_name= id DOT )? index_name= id -> ^( DROP_INDEX ^( OPTIONS ( EXISTS )? ) ^( $index_name ( $database_name)? ) ) ;
    public final SqlParser.drop_index_stmt_return drop_index_stmt() throws RecognitionException {
        SqlParser.drop_index_stmt_return retval = new SqlParser.drop_index_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DROP466=null;
        Token INDEX467=null;
        Token IF468=null;
        Token EXISTS469=null;
        Token DOT470=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return index_name =null;


        Object DROP466_tree=null;
        Object INDEX467_tree=null;
        Object IF468_tree=null;
        Object EXISTS469_tree=null;
        Object DOT470_tree=null;
        RewriteRuleTokenStream stream_INDEX=new RewriteRuleTokenStream(adaptor,"token INDEX");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_DROP=new RewriteRuleTokenStream(adaptor,"token DROP");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:16: ( DROP INDEX ( IF EXISTS )? (database_name= id DOT )? index_name= id -> ^( DROP_INDEX ^( OPTIONS ( EXISTS )? ) ^( $index_name ( $database_name)? ) ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:18: DROP INDEX ( IF EXISTS )? (database_name= id DOT )? index_name= id
            {
            DROP466=(Token)match(input,DROP,FOLLOW_DROP_in_drop_index_stmt4008);  
            stream_DROP.add(DROP466);


            INDEX467=(Token)match(input,INDEX,FOLLOW_INDEX_in_drop_index_stmt4010);  
            stream_INDEX.add(INDEX467);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:29: ( IF EXISTS )?
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( (LA171_0==IF) ) {
                int LA171_1 = input.LA(2);

                if ( (LA171_1==EXISTS) ) {
                    alt171=1;
                }
            }
            switch (alt171) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:30: IF EXISTS
                    {
                    IF468=(Token)match(input,IF,FOLLOW_IF_in_drop_index_stmt4013);  
                    stream_IF.add(IF468);


                    EXISTS469=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_drop_index_stmt4015);  
                    stream_EXISTS.add(EXISTS469);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:42: (database_name= id DOT )?
            int alt172=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA172_1 = input.LA(2);

                    if ( (LA172_1==DOT) ) {
                        alt172=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA172_2 = input.LA(2);

                    if ( (LA172_2==DOT) ) {
                        alt172=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA172_3 = input.LA(2);

                    if ( (LA172_3==DOT) ) {
                        alt172=1;
                    }
                    }
                    break;
            }

            switch (alt172) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:513:43: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_drop_index_stmt4022);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT470=(Token)match(input,DOT,FOLLOW_DOT_in_drop_index_stmt4024);  
                    stream_DOT.add(DOT470);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_drop_index_stmt4030);
            index_name=id();

            state._fsp--;

            stream_id.add(index_name.getTree());

            // AST REWRITE
            // elements: EXISTS, database_name, index_name
            // token labels: 
            // rule labels: index_name, database_name, retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_index_name=new RewriteRuleSubtreeStream(adaptor,"rule index_name",index_name!=null?index_name.tree:null);
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 514:67: -> ^( DROP_INDEX ^( OPTIONS ( EXISTS )? ) ^( $index_name ( $database_name)? ) )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:514:4: ^( DROP_INDEX ^( OPTIONS ( EXISTS )? ) ^( $index_name ( $database_name)? ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(DROP_INDEX, "DROP_INDEX")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:514:17: ^( OPTIONS ( EXISTS )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:514:27: ( EXISTS )?
                if ( stream_EXISTS.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_EXISTS.nextNode()
                    );

                }
                stream_EXISTS.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:514:36: ^( $index_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_index_name.nextNode(), root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:514:51: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "drop_index_stmt"


    public static class create_trigger_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "create_trigger_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:1: create_trigger_stmt : CREATE ( TEMPORARY )? TRIGGER ( IF NOT EXISTS )? (database_name= id DOT )? trigger_name= id ( BEFORE | AFTER | INSTEAD OF )? ( DELETE | INSERT | UPDATE ( OF column_names+= id ( COMMA column_names+= id )* )? ) ON table_name= id ( FOR EACH ROW )? ( WHEN expr )? BEGIN ( ( update_stmt | insert_stmt | delete_stmt | select_stmt ) SEMI )+ END -> ^( CREATE_TRIGGER ^( OPTIONS ( TEMPORARY )? ) ^( $trigger_name $table_name ( $database_name)? ) ) ;
    public final SqlParser.create_trigger_stmt_return create_trigger_stmt() throws RecognitionException {
        SqlParser.create_trigger_stmt_return retval = new SqlParser.create_trigger_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CREATE471=null;
        Token TEMPORARY472=null;
        Token TRIGGER473=null;
        Token IF474=null;
        Token NOT475=null;
        Token EXISTS476=null;
        Token DOT477=null;
        Token BEFORE478=null;
        Token AFTER479=null;
        Token INSTEAD480=null;
        Token OF481=null;
        Token DELETE482=null;
        Token INSERT483=null;
        Token UPDATE484=null;
        Token OF485=null;
        Token COMMA486=null;
        Token ON487=null;
        Token FOR488=null;
        Token EACH489=null;
        Token ROW490=null;
        Token WHEN491=null;
        Token BEGIN493=null;
        Token SEMI498=null;
        Token END499=null;
        List list_column_names=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return trigger_name =null;

        SqlParser.id_return table_name =null;

        SqlParser.expr_return expr492 =null;

        SqlParser.update_stmt_return update_stmt494 =null;

        SqlParser.insert_stmt_return insert_stmt495 =null;

        SqlParser.delete_stmt_return delete_stmt496 =null;

        SqlParser.select_stmt_return select_stmt497 =null;

        RuleReturnScope column_names = null;
        Object CREATE471_tree=null;
        Object TEMPORARY472_tree=null;
        Object TRIGGER473_tree=null;
        Object IF474_tree=null;
        Object NOT475_tree=null;
        Object EXISTS476_tree=null;
        Object DOT477_tree=null;
        Object BEFORE478_tree=null;
        Object AFTER479_tree=null;
        Object INSTEAD480_tree=null;
        Object OF481_tree=null;
        Object DELETE482_tree=null;
        Object INSERT483_tree=null;
        Object UPDATE484_tree=null;
        Object OF485_tree=null;
        Object COMMA486_tree=null;
        Object ON487_tree=null;
        Object FOR488_tree=null;
        Object EACH489_tree=null;
        Object ROW490_tree=null;
        Object WHEN491_tree=null;
        Object BEGIN493_tree=null;
        Object SEMI498_tree=null;
        Object END499_tree=null;
        RewriteRuleTokenStream stream_CREATE=new RewriteRuleTokenStream(adaptor,"token CREATE");
        RewriteRuleTokenStream stream_INSERT=new RewriteRuleTokenStream(adaptor,"token INSERT");
        RewriteRuleTokenStream stream_ROW=new RewriteRuleTokenStream(adaptor,"token ROW");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_WHEN=new RewriteRuleTokenStream(adaptor,"token WHEN");
        RewriteRuleTokenStream stream_BEGIN=new RewriteRuleTokenStream(adaptor,"token BEGIN");
        RewriteRuleTokenStream stream_TRIGGER=new RewriteRuleTokenStream(adaptor,"token TRIGGER");
        RewriteRuleTokenStream stream_ON=new RewriteRuleTokenStream(adaptor,"token ON");
        RewriteRuleTokenStream stream_UPDATE=new RewriteRuleTokenStream(adaptor,"token UPDATE");
        RewriteRuleTokenStream stream_FOR=new RewriteRuleTokenStream(adaptor,"token FOR");
        RewriteRuleTokenStream stream_BEFORE=new RewriteRuleTokenStream(adaptor,"token BEFORE");
        RewriteRuleTokenStream stream_DELETE=new RewriteRuleTokenStream(adaptor,"token DELETE");
        RewriteRuleTokenStream stream_EXISTS=new RewriteRuleTokenStream(adaptor,"token EXISTS");
        RewriteRuleTokenStream stream_NOT=new RewriteRuleTokenStream(adaptor,"token NOT");
        RewriteRuleTokenStream stream_EACH=new RewriteRuleTokenStream(adaptor,"token EACH");
        RewriteRuleTokenStream stream_AFTER=new RewriteRuleTokenStream(adaptor,"token AFTER");
        RewriteRuleTokenStream stream_INSTEAD=new RewriteRuleTokenStream(adaptor,"token INSTEAD");
        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
        RewriteRuleTokenStream stream_END=new RewriteRuleTokenStream(adaptor,"token END");
        RewriteRuleTokenStream stream_OF=new RewriteRuleTokenStream(adaptor,"token OF");
        RewriteRuleTokenStream stream_TEMPORARY=new RewriteRuleTokenStream(adaptor,"token TEMPORARY");
        RewriteRuleTokenStream stream_SEMI=new RewriteRuleTokenStream(adaptor,"token SEMI");
        RewriteRuleTokenStream stream_IF=new RewriteRuleTokenStream(adaptor,"token IF");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_insert_stmt=new RewriteRuleSubtreeStream(adaptor,"rule insert_stmt");
        RewriteRuleSubtreeStream stream_select_stmt=new RewriteRuleSubtreeStream(adaptor,"rule select_stmt");
        RewriteRuleSubtreeStream stream_delete_stmt=new RewriteRuleSubtreeStream(adaptor,"rule delete_stmt");
        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
        RewriteRuleSubtreeStream stream_update_stmt=new RewriteRuleSubtreeStream(adaptor,"rule update_stmt");
        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:20: ( CREATE ( TEMPORARY )? TRIGGER ( IF NOT EXISTS )? (database_name= id DOT )? trigger_name= id ( BEFORE | AFTER | INSTEAD OF )? ( DELETE | INSERT | UPDATE ( OF column_names+= id ( COMMA column_names+= id )* )? ) ON table_name= id ( FOR EACH ROW )? ( WHEN expr )? BEGIN ( ( update_stmt | insert_stmt | delete_stmt | select_stmt ) SEMI )+ END -> ^( CREATE_TRIGGER ^( OPTIONS ( TEMPORARY )? ) ^( $trigger_name $table_name ( $database_name)? ) ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:22: CREATE ( TEMPORARY )? TRIGGER ( IF NOT EXISTS )? (database_name= id DOT )? trigger_name= id ( BEFORE | AFTER | INSTEAD OF )? ( DELETE | INSERT | UPDATE ( OF column_names+= id ( COMMA column_names+= id )* )? ) ON table_name= id ( FOR EACH ROW )? ( WHEN expr )? BEGIN ( ( update_stmt | insert_stmt | delete_stmt | select_stmt ) SEMI )+ END
            {
            CREATE471=(Token)match(input,CREATE,FOLLOW_CREATE_in_create_trigger_stmt4060);  
            stream_CREATE.add(CREATE471);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:29: ( TEMPORARY )?
            int alt173=2;
            int LA173_0 = input.LA(1);

            if ( (LA173_0==TEMPORARY) ) {
                alt173=1;
            }
            switch (alt173) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:29: TEMPORARY
                    {
                    TEMPORARY472=(Token)match(input,TEMPORARY,FOLLOW_TEMPORARY_in_create_trigger_stmt4062);  
                    stream_TEMPORARY.add(TEMPORARY472);


                    }
                    break;

            }


            TRIGGER473=(Token)match(input,TRIGGER,FOLLOW_TRIGGER_in_create_trigger_stmt4065);  
            stream_TRIGGER.add(TRIGGER473);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:48: ( IF NOT EXISTS )?
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==IF) ) {
                int LA174_1 = input.LA(2);

                if ( (LA174_1==NOT) ) {
                    alt174=1;
                }
            }
            switch (alt174) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:49: IF NOT EXISTS
                    {
                    IF474=(Token)match(input,IF,FOLLOW_IF_in_create_trigger_stmt4068);  
                    stream_IF.add(IF474);


                    NOT475=(Token)match(input,NOT,FOLLOW_NOT_in_create_trigger_stmt4070);  
                    stream_NOT.add(NOT475);


                    EXISTS476=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_create_trigger_stmt4072);  
                    stream_EXISTS.add(EXISTS476);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:65: (database_name= id DOT )?
            int alt175=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA175_1 = input.LA(2);

                    if ( (LA175_1==DOT) ) {
                        alt175=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA175_2 = input.LA(2);

                    if ( (LA175_2==DOT) ) {
                        alt175=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA175_3 = input.LA(2);

                    if ( (LA175_3==DOT) ) {
                        alt175=1;
                    }
                    }
                    break;
            }

            switch (alt175) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:517:66: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_create_trigger_stmt4079);
                    database_name=id();

                    state._fsp--;

                    stream_id.add(database_name.getTree());

                    DOT477=(Token)match(input,DOT,FOLLOW_DOT_in_create_trigger_stmt4081);  
                    stream_DOT.add(DOT477);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_create_trigger_stmt4087);
            trigger_name=id();

            state._fsp--;

            stream_id.add(trigger_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:3: ( BEFORE | AFTER | INSTEAD OF )?
            int alt176=4;
            switch ( input.LA(1) ) {
                case BEFORE:
                    {
                    alt176=1;
                    }
                    break;
                case AFTER:
                    {
                    alt176=2;
                    }
                    break;
                case INSTEAD:
                    {
                    alt176=3;
                    }
                    break;
            }

            switch (alt176) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:4: BEFORE
                    {
                    BEFORE478=(Token)match(input,BEFORE,FOLLOW_BEFORE_in_create_trigger_stmt4092);  
                    stream_BEFORE.add(BEFORE478);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:13: AFTER
                    {
                    AFTER479=(Token)match(input,AFTER,FOLLOW_AFTER_in_create_trigger_stmt4096);  
                    stream_AFTER.add(AFTER479);


                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:21: INSTEAD OF
                    {
                    INSTEAD480=(Token)match(input,INSTEAD,FOLLOW_INSTEAD_in_create_trigger_stmt4100);  
                    stream_INSTEAD.add(INSTEAD480);


                    OF481=(Token)match(input,OF,FOLLOW_OF_in_create_trigger_stmt4102);  
                    stream_OF.add(OF481);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:34: ( DELETE | INSERT | UPDATE ( OF column_names+= id ( COMMA column_names+= id )* )? )
            int alt179=3;
            switch ( input.LA(1) ) {
            case DELETE:
                {
                alt179=1;
                }
                break;
            case INSERT:
                {
                alt179=2;
                }
                break;
            case UPDATE:
                {
                alt179=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 179, 0, input);

                throw nvae;

            }

            switch (alt179) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:35: DELETE
                    {
                    DELETE482=(Token)match(input,DELETE,FOLLOW_DELETE_in_create_trigger_stmt4107);  
                    stream_DELETE.add(DELETE482);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:44: INSERT
                    {
                    INSERT483=(Token)match(input,INSERT,FOLLOW_INSERT_in_create_trigger_stmt4111);  
                    stream_INSERT.add(INSERT483);


                    }
                    break;
                case 3 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:53: UPDATE ( OF column_names+= id ( COMMA column_names+= id )* )?
                    {
                    UPDATE484=(Token)match(input,UPDATE,FOLLOW_UPDATE_in_create_trigger_stmt4115);  
                    stream_UPDATE.add(UPDATE484);


                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:60: ( OF column_names+= id ( COMMA column_names+= id )* )?
                    int alt178=2;
                    int LA178_0 = input.LA(1);

                    if ( (LA178_0==OF) ) {
                        alt178=1;
                    }
                    switch (alt178) {
                        case 1 :
                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:61: OF column_names+= id ( COMMA column_names+= id )*
                            {
                            OF485=(Token)match(input,OF,FOLLOW_OF_in_create_trigger_stmt4118);  
                            stream_OF.add(OF485);


                            pushFollow(FOLLOW_id_in_create_trigger_stmt4122);
                            column_names=id();

                            state._fsp--;

                            stream_id.add(column_names.getTree());
                            if (list_column_names==null) list_column_names=new ArrayList();
                            list_column_names.add(column_names.getTree());


                            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:81: ( COMMA column_names+= id )*
                            loop177:
                            do {
                                int alt177=2;
                                int LA177_0 = input.LA(1);

                                if ( (LA177_0==COMMA) ) {
                                    alt177=1;
                                }


                                switch (alt177) {
                            	case 1 :
                            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:518:82: COMMA column_names+= id
                            	    {
                            	    COMMA486=(Token)match(input,COMMA,FOLLOW_COMMA_in_create_trigger_stmt4125);  
                            	    stream_COMMA.add(COMMA486);


                            	    pushFollow(FOLLOW_id_in_create_trigger_stmt4129);
                            	    column_names=id();

                            	    state._fsp--;

                            	    stream_id.add(column_names.getTree());
                            	    if (list_column_names==null) list_column_names=new ArrayList();
                            	    list_column_names.add(column_names.getTree());


                            	    }
                            	    break;

                            	default :
                            	    break loop177;
                                }
                            } while (true);


                            }
                            break;

                    }


                    }
                    break;

            }


            ON487=(Token)match(input,ON,FOLLOW_ON_in_create_trigger_stmt4138);  
            stream_ON.add(ON487);


            pushFollow(FOLLOW_id_in_create_trigger_stmt4142);
            table_name=id();

            state._fsp--;

            stream_id.add(table_name.getTree());

            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:519:20: ( FOR EACH ROW )?
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( (LA180_0==FOR) ) {
                alt180=1;
            }
            switch (alt180) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:519:21: FOR EACH ROW
                    {
                    FOR488=(Token)match(input,FOR,FOLLOW_FOR_in_create_trigger_stmt4145);  
                    stream_FOR.add(FOR488);


                    EACH489=(Token)match(input,EACH,FOLLOW_EACH_in_create_trigger_stmt4147);  
                    stream_EACH.add(EACH489);


                    ROW490=(Token)match(input,ROW,FOLLOW_ROW_in_create_trigger_stmt4149);  
                    stream_ROW.add(ROW490);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:519:36: ( WHEN expr )?
            int alt181=2;
            int LA181_0 = input.LA(1);

            if ( (LA181_0==WHEN) ) {
                alt181=1;
            }
            switch (alt181) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:519:37: WHEN expr
                    {
                    WHEN491=(Token)match(input,WHEN,FOLLOW_WHEN_in_create_trigger_stmt4154);  
                    stream_WHEN.add(WHEN491);


                    pushFollow(FOLLOW_expr_in_create_trigger_stmt4156);
                    expr492=expr();

                    state._fsp--;

                    stream_expr.add(expr492.getTree());

                    }
                    break;

            }


            BEGIN493=(Token)match(input,BEGIN,FOLLOW_BEGIN_in_create_trigger_stmt4162);  
            stream_BEGIN.add(BEGIN493);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:9: ( ( update_stmt | insert_stmt | delete_stmt | select_stmt ) SEMI )+
            int cnt183=0;
            loop183:
            do {
                int alt183=2;
                int LA183_0 = input.LA(1);

                if ( (LA183_0==DELETE||LA183_0==INSERT||LA183_0==REPLACE||LA183_0==SELECT||LA183_0==UPDATE) ) {
                    alt183=1;
                }


                switch (alt183) {
            	case 1 :
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:10: ( update_stmt | insert_stmt | delete_stmt | select_stmt ) SEMI
            	    {
            	    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:10: ( update_stmt | insert_stmt | delete_stmt | select_stmt )
            	    int alt182=4;
            	    switch ( input.LA(1) ) {
            	    case UPDATE:
            	        {
            	        alt182=1;
            	        }
            	        break;
            	    case INSERT:
            	    case REPLACE:
            	        {
            	        alt182=2;
            	        }
            	        break;
            	    case DELETE:
            	        {
            	        alt182=3;
            	        }
            	        break;
            	    case SELECT:
            	        {
            	        alt182=4;
            	        }
            	        break;
            	    default:
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 182, 0, input);

            	        throw nvae;

            	    }

            	    switch (alt182) {
            	        case 1 :
            	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:11: update_stmt
            	            {
            	            pushFollow(FOLLOW_update_stmt_in_create_trigger_stmt4166);
            	            update_stmt494=update_stmt();

            	            state._fsp--;

            	            stream_update_stmt.add(update_stmt494.getTree());

            	            }
            	            break;
            	        case 2 :
            	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:25: insert_stmt
            	            {
            	            pushFollow(FOLLOW_insert_stmt_in_create_trigger_stmt4170);
            	            insert_stmt495=insert_stmt();

            	            state._fsp--;

            	            stream_insert_stmt.add(insert_stmt495.getTree());

            	            }
            	            break;
            	        case 3 :
            	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:39: delete_stmt
            	            {
            	            pushFollow(FOLLOW_delete_stmt_in_create_trigger_stmt4174);
            	            delete_stmt496=delete_stmt();

            	            state._fsp--;

            	            stream_delete_stmt.add(delete_stmt496.getTree());

            	            }
            	            break;
            	        case 4 :
            	            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:520:53: select_stmt
            	            {
            	            pushFollow(FOLLOW_select_stmt_in_create_trigger_stmt4178);
            	            select_stmt497=select_stmt();

            	            state._fsp--;

            	            stream_select_stmt.add(select_stmt497.getTree());

            	            }
            	            break;

            	    }


            	    SEMI498=(Token)match(input,SEMI,FOLLOW_SEMI_in_create_trigger_stmt4181);  
            	    stream_SEMI.add(SEMI498);


            	    }
            	    break;

            	default :
            	    if ( cnt183 >= 1 ) break loop183;
                        EarlyExitException eee =
                            new EarlyExitException(183, input);
                        throw eee;
                }
                cnt183++;
            } while (true);


            END499=(Token)match(input,END,FOLLOW_END_in_create_trigger_stmt4185);  
            stream_END.add(END499);


            // AST REWRITE
            // elements: TEMPORARY, table_name, database_name, trigger_name
            // token labels: 
            // rule labels: database_name, retval, table_name, trigger_name
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_database_name=new RewriteRuleSubtreeStream(adaptor,"rule database_name",database_name!=null?database_name.tree:null);
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_table_name=new RewriteRuleSubtreeStream(adaptor,"rule table_name",table_name!=null?table_name.tree:null);
            RewriteRuleSubtreeStream stream_trigger_name=new RewriteRuleSubtreeStream(adaptor,"rule trigger_name",trigger_name!=null?trigger_name.tree:null);

            root_0 = (Object)adaptor.nil();
            // 521:88: -> ^( CREATE_TRIGGER ^( OPTIONS ( TEMPORARY )? ) ^( $trigger_name $table_name ( $database_name)? ) )
            {
                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:521:4: ^( CREATE_TRIGGER ^( OPTIONS ( TEMPORARY )? ) ^( $trigger_name $table_name ( $database_name)? ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CREATE_TRIGGER, "CREATE_TRIGGER")
                , root_1);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:521:21: ^( OPTIONS ( TEMPORARY )? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(OPTIONS, "OPTIONS")
                , root_2);

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:521:31: ( TEMPORARY )?
                if ( stream_TEMPORARY.hasNext() ) {
                    adaptor.addChild(root_2, 
                    stream_TEMPORARY.nextNode()
                    );

                }
                stream_TEMPORARY.reset();

                adaptor.addChild(root_1, root_2);
                }

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:521:43: ^( $trigger_name $table_name ( $database_name)? )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_trigger_name.nextNode(), root_2);

                adaptor.addChild(root_2, stream_table_name.nextTree());

                // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:521:72: ( $database_name)?
                if ( stream_database_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_database_name.nextTree());

                }
                stream_database_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "create_trigger_stmt"


    public static class drop_trigger_stmt_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "drop_trigger_stmt"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:1: drop_trigger_stmt : DROP TRIGGER ( IF EXISTS )? (database_name= id DOT )? trigger_name= id ;
    public final SqlParser.drop_trigger_stmt_return drop_trigger_stmt() throws RecognitionException {
        SqlParser.drop_trigger_stmt_return retval = new SqlParser.drop_trigger_stmt_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token DROP500=null;
        Token TRIGGER501=null;
        Token IF502=null;
        Token EXISTS503=null;
        Token DOT504=null;
        SqlParser.id_return database_name =null;

        SqlParser.id_return trigger_name =null;


        Object DROP500_tree=null;
        Object TRIGGER501_tree=null;
        Object IF502_tree=null;
        Object EXISTS503_tree=null;
        Object DOT504_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:18: ( DROP TRIGGER ( IF EXISTS )? (database_name= id DOT )? trigger_name= id )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:20: DROP TRIGGER ( IF EXISTS )? (database_name= id DOT )? trigger_name= id
            {
            root_0 = (Object)adaptor.nil();


            DROP500=(Token)match(input,DROP,FOLLOW_DROP_in_drop_trigger_stmt4218); 
            DROP500_tree = 
            (Object)adaptor.create(DROP500)
            ;
            adaptor.addChild(root_0, DROP500_tree);


            TRIGGER501=(Token)match(input,TRIGGER,FOLLOW_TRIGGER_in_drop_trigger_stmt4220); 
            TRIGGER501_tree = 
            (Object)adaptor.create(TRIGGER501)
            ;
            adaptor.addChild(root_0, TRIGGER501_tree);


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:33: ( IF EXISTS )?
            int alt184=2;
            int LA184_0 = input.LA(1);

            if ( (LA184_0==IF) ) {
                int LA184_1 = input.LA(2);

                if ( (LA184_1==EXISTS) ) {
                    alt184=1;
                }
            }
            switch (alt184) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:34: IF EXISTS
                    {
                    IF502=(Token)match(input,IF,FOLLOW_IF_in_drop_trigger_stmt4223); 
                    IF502_tree = 
                    (Object)adaptor.create(IF502)
                    ;
                    adaptor.addChild(root_0, IF502_tree);


                    EXISTS503=(Token)match(input,EXISTS,FOLLOW_EXISTS_in_drop_trigger_stmt4225); 
                    EXISTS503_tree = 
                    (Object)adaptor.create(EXISTS503)
                    ;
                    adaptor.addChild(root_0, EXISTS503_tree);


                    }
                    break;

            }


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:46: (database_name= id DOT )?
            int alt185=2;
            switch ( input.LA(1) ) {
                case ID:
                    {
                    int LA185_1 = input.LA(2);

                    if ( (LA185_1==DOT) ) {
                        alt185=1;
                    }
                    }
                    break;
                case STRING:
                    {
                    int LA185_2 = input.LA(2);

                    if ( (LA185_2==DOT) ) {
                        alt185=1;
                    }
                    }
                    break;
                case ABORT:
                case ADD:
                case AFTER:
                case ALL:
                case ALTER:
                case ANALYZE:
                case AND:
                case AS:
                case ASC:
                case ATTACH:
                case AUTOINCREMENT:
                case BEFORE:
                case BEGIN:
                case BETWEEN:
                case BY:
                case CASCADE:
                case CASE:
                case CAST:
                case CHECK:
                case COLLATE:
                case COLUMN:
                case COMMIT:
                case CONFLICT:
                case CONSTRAINT:
                case CREATE:
                case CROSS:
                case CURRENT_DATE:
                case CURRENT_TIME:
                case CURRENT_TIMESTAMP:
                case DATABASE:
                case DEFAULT:
                case DEFERRABLE:
                case DEFERRED:
                case DELETE:
                case DESC:
                case DETACH:
                case DISTINCT:
                case DROP:
                case EACH:
                case ELSE:
                case END:
                case ESCAPE:
                case EXCEPT:
                case EXCLUSIVE:
                case EXISTS:
                case EXPLAIN:
                case FAIL:
                case FOR:
                case FOREIGN:
                case FROM:
                case GROUP:
                case HAVING:
                case IF:
                case IGNORE:
                case IMMEDIATE:
                case INDEX:
                case INDEXED:
                case INITIALLY:
                case INNER:
                case INSERT:
                case INSTEAD:
                case INTERSECT:
                case INTO:
                case IS:
                case JOIN:
                case KEY:
                case LEFT:
                case LIMIT:
                case NATURAL:
                case NULL:
                case OF:
                case OFFSET:
                case ON:
                case OR:
                case ORDER:
                case OUTER:
                case PLAN:
                case PRAGMA:
                case PRIMARY:
                case QUERY:
                case RAISE:
                case REFERENCES:
                case REINDEX:
                case RELEASE:
                case RENAME:
                case REPLACE:
                case RESTRICT:
                case ROLLBACK:
                case ROW:
                case SAVEPOINT:
                case SELECT:
                case SET:
                case TABLE:
                case TEMPORARY:
                case THEN:
                case TO:
                case TRANSACTION:
                case TRIGGER:
                case UNION:
                case UNIQUE:
                case UPDATE:
                case USING:
                case VACUUM:
                case VALUES:
                case VIEW:
                case VIRTUAL:
                case WHEN:
                case WHERE:
                    {
                    int LA185_3 = input.LA(2);

                    if ( (LA185_3==DOT) ) {
                        alt185=1;
                    }
                    }
                    break;
            }

            switch (alt185) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:524:47: database_name= id DOT
                    {
                    pushFollow(FOLLOW_id_in_drop_trigger_stmt4232);
                    database_name=id();

                    state._fsp--;

                    adaptor.addChild(root_0, database_name.getTree());

                    DOT504=(Token)match(input,DOT,FOLLOW_DOT_in_drop_trigger_stmt4234); 
                    DOT504_tree = 
                    (Object)adaptor.create(DOT504)
                    ;
                    adaptor.addChild(root_0, DOT504_tree);


                    }
                    break;

            }


            pushFollow(FOLLOW_id_in_drop_trigger_stmt4240);
            trigger_name=id();

            state._fsp--;

            adaptor.addChild(root_0, trigger_name.getTree());

            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "drop_trigger_stmt"


    public static class id_core_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "id_core"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:1: id_core : str= ( ID | STRING ) ;
    public final SqlParser.id_core_return id_core() throws RecognitionException {
        SqlParser.id_core_return retval = new SqlParser.id_core_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token str=null;
        Token ID505=null;
        Token STRING506=null;

        Object str_tree=null;
        Object ID505_tree=null;
        Object STRING506_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:8: (str= ( ID | STRING ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:10: str= ( ID | STRING )
            {
            root_0 = (Object)adaptor.nil();


            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:14: ( ID | STRING )
            int alt186=2;
            int LA186_0 = input.LA(1);

            if ( (LA186_0==ID) ) {
                alt186=1;
            }
            else if ( (LA186_0==STRING) ) {
                alt186=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 186, 0, input);

                throw nvae;

            }
            switch (alt186) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:16: ID
                    {
                    ID505=(Token)match(input,ID,FOLLOW_ID_in_id_core4252); 
                    ID505_tree = 
                    new QuotedId(ID505) 
                    ;
                    adaptor.addChild(root_0, ID505_tree);


                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:527:31: STRING
                    {
                    STRING506=(Token)match(input,STRING,FOLLOW_STRING_in_id_core4259); 
                    STRING506_tree = 
                    new QuotedId(STRING506) 
                    ;
                    adaptor.addChild(root_0, STRING506_tree);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "id_core"


    public static class id_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "id"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:531:1: id : ( id_core | keyword );
    public final SqlParser.id_return id() throws RecognitionException {
        SqlParser.id_return retval = new SqlParser.id_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.id_core_return id_core507 =null;

        SqlParser.keyword_return keyword508 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:531:3: ( id_core | keyword )
            int alt187=2;
            int LA187_0 = input.LA(1);

            if ( (LA187_0==ID||LA187_0==STRING) ) {
                alt187=1;
            }
            else if ( ((LA187_0 >= ABORT && LA187_0 <= AFTER)||(LA187_0 >= ALL && LA187_0 <= ALTER)||(LA187_0 >= ANALYZE && LA187_0 <= AND)||(LA187_0 >= AS && LA187_0 <= ASC)||(LA187_0 >= ATTACH && LA187_0 <= AUTOINCREMENT)||(LA187_0 >= BEFORE && LA187_0 <= BETWEEN)||LA187_0==BY||(LA187_0 >= CASCADE && LA187_0 <= COLLATE)||LA187_0==COLUMN||(LA187_0 >= COMMIT && LA187_0 <= CONSTRAINT)||LA187_0==CREATE||(LA187_0 >= CROSS && LA187_0 <= CURRENT_TIMESTAMP)||(LA187_0 >= DATABASE && LA187_0 <= DISTINCT)||LA187_0==DROP||(LA187_0 >= EACH && LA187_0 <= END)||(LA187_0 >= ESCAPE && LA187_0 <= EXPLAIN)||LA187_0==FAIL||(LA187_0 >= FOR && LA187_0 <= FROM)||LA187_0==GROUP||LA187_0==HAVING||(LA187_0 >= IF && LA187_0 <= IMMEDIATE)||(LA187_0 >= INDEX && LA187_0 <= INSTEAD)||(LA187_0 >= INTERSECT && LA187_0 <= INTO)||LA187_0==IS||LA187_0==JOIN||LA187_0==KEY||LA187_0==LEFT||LA187_0==LIMIT||LA187_0==NATURAL||LA187_0==NULL||(LA187_0 >= OF && LA187_0 <= ON)||(LA187_0 >= OR && LA187_0 <= ORDER)||LA187_0==OUTER||LA187_0==PLAN||(LA187_0 >= PRAGMA && LA187_0 <= PRIMARY)||LA187_0==QUERY||(LA187_0 >= RAISE && LA187_0 <= REFERENCES)||(LA187_0 >= REINDEX && LA187_0 <= ROW)||(LA187_0 >= SAVEPOINT && LA187_0 <= SELECT)||LA187_0==SET||LA187_0==TABLE||(LA187_0 >= TEMPORARY && LA187_0 <= THEN)||(LA187_0 >= TO && LA187_0 <= TRIGGER)||(LA187_0 >= UNION && LA187_0 <= USING)||(LA187_0 >= VACUUM && LA187_0 <= VIRTUAL)||(LA187_0 >= WHEN && LA187_0 <= WHERE)) ) {
                alt187=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 187, 0, input);

                throw nvae;

            }
            switch (alt187) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:531:5: id_core
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_id_core_in_id4273);
                    id_core507=id_core();

                    state._fsp--;

                    adaptor.addChild(root_0, id_core507.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:531:15: keyword
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_keyword_in_id4277);
                    keyword508=keyword();

                    state._fsp--;

                    adaptor.addChild(root_0, keyword508.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "id"


    public static class keyword_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "keyword"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:533:1: keyword : ( ABORT | ADD | AFTER | ALL | ALTER | ANALYZE | AND | AS | ASC | ATTACH | AUTOINCREMENT | BEFORE | BEGIN | BETWEEN | BY | CASCADE | CASE | CAST | CHECK | COLLATE | COLUMN | COMMIT | CONFLICT | CONSTRAINT | CREATE | CROSS | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP | DATABASE | DEFAULT | DEFERRABLE | DEFERRED | DELETE | DESC | DETACH | DISTINCT | DROP | EACH | ELSE | END | ESCAPE | EXCEPT | EXCLUSIVE | EXISTS | EXPLAIN | FAIL | FOR | FOREIGN | FROM | GROUP | HAVING | IF | IGNORE | IMMEDIATE | INDEX | INDEXED | INITIALLY | INNER | INSERT | INSTEAD | INTERSECT | INTO | IS | JOIN | KEY | LEFT | LIMIT | NATURAL | NULL | OF | OFFSET | ON | OR | ORDER | OUTER | PLAN | PRAGMA | PRIMARY | QUERY | RAISE | REFERENCES | REINDEX | RELEASE | RENAME | REPLACE | RESTRICT | ROLLBACK | ROW | SAVEPOINT | SELECT | SET | TABLE | TEMPORARY | THEN | TO | TRANSACTION | TRIGGER | UNION | UNIQUE | UPDATE | USING | VACUUM | VALUES | VIEW | VIRTUAL | WHEN | WHERE ) ;
    public final SqlParser.keyword_return keyword() throws RecognitionException {
        SqlParser.keyword_return retval = new SqlParser.keyword_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set509=null;

        Object set509_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:533:8: ( ( ABORT | ADD | AFTER | ALL | ALTER | ANALYZE | AND | AS | ASC | ATTACH | AUTOINCREMENT | BEFORE | BEGIN | BETWEEN | BY | CASCADE | CASE | CAST | CHECK | COLLATE | COLUMN | COMMIT | CONFLICT | CONSTRAINT | CREATE | CROSS | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP | DATABASE | DEFAULT | DEFERRABLE | DEFERRED | DELETE | DESC | DETACH | DISTINCT | DROP | EACH | ELSE | END | ESCAPE | EXCEPT | EXCLUSIVE | EXISTS | EXPLAIN | FAIL | FOR | FOREIGN | FROM | GROUP | HAVING | IF | IGNORE | IMMEDIATE | INDEX | INDEXED | INITIALLY | INNER | INSERT | INSTEAD | INTERSECT | INTO | IS | JOIN | KEY | LEFT | LIMIT | NATURAL | NULL | OF | OFFSET | ON | OR | ORDER | OUTER | PLAN | PRAGMA | PRIMARY | QUERY | RAISE | REFERENCES | REINDEX | RELEASE | RENAME | REPLACE | RESTRICT | ROLLBACK | ROW | SAVEPOINT | SELECT | SET | TABLE | TEMPORARY | THEN | TO | TRANSACTION | TRIGGER | UNION | UNIQUE | UPDATE | USING | VACUUM | VALUES | VIEW | VIRTUAL | WHEN | WHERE ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
            {
            root_0 = (Object)adaptor.nil();


            set509=(Token)input.LT(1);

            if ( (input.LA(1) >= ABORT && input.LA(1) <= AFTER)||(input.LA(1) >= ALL && input.LA(1) <= ALTER)||(input.LA(1) >= ANALYZE && input.LA(1) <= AND)||(input.LA(1) >= AS && input.LA(1) <= ASC)||(input.LA(1) >= ATTACH && input.LA(1) <= AUTOINCREMENT)||(input.LA(1) >= BEFORE && input.LA(1) <= BETWEEN)||input.LA(1)==BY||(input.LA(1) >= CASCADE && input.LA(1) <= COLLATE)||input.LA(1)==COLUMN||(input.LA(1) >= COMMIT && input.LA(1) <= CONSTRAINT)||input.LA(1)==CREATE||(input.LA(1) >= CROSS && input.LA(1) <= CURRENT_TIMESTAMP)||(input.LA(1) >= DATABASE && input.LA(1) <= DISTINCT)||input.LA(1)==DROP||(input.LA(1) >= EACH && input.LA(1) <= END)||(input.LA(1) >= ESCAPE && input.LA(1) <= EXPLAIN)||input.LA(1)==FAIL||(input.LA(1) >= FOR && input.LA(1) <= FROM)||input.LA(1)==GROUP||input.LA(1)==HAVING||(input.LA(1) >= IF && input.LA(1) <= IMMEDIATE)||(input.LA(1) >= INDEX && input.LA(1) <= INSTEAD)||(input.LA(1) >= INTERSECT && input.LA(1) <= INTO)||input.LA(1)==IS||input.LA(1)==JOIN||input.LA(1)==KEY||input.LA(1)==LEFT||input.LA(1)==LIMIT||input.LA(1)==NATURAL||input.LA(1)==NULL||(input.LA(1) >= OF && input.LA(1) <= ON)||(input.LA(1) >= OR && input.LA(1) <= ORDER)||input.LA(1)==OUTER||input.LA(1)==PLAN||(input.LA(1) >= PRAGMA && input.LA(1) <= PRIMARY)||input.LA(1)==QUERY||(input.LA(1) >= RAISE && input.LA(1) <= REFERENCES)||(input.LA(1) >= REINDEX && input.LA(1) <= ROW)||(input.LA(1) >= SAVEPOINT && input.LA(1) <= SELECT)||input.LA(1)==SET||input.LA(1)==TABLE||(input.LA(1) >= TEMPORARY && input.LA(1) <= THEN)||(input.LA(1) >= TO && input.LA(1) <= TRIGGER)||(input.LA(1) >= UNION && input.LA(1) <= USING)||(input.LA(1) >= VACUUM && input.LA(1) <= VIRTUAL)||(input.LA(1) >= WHEN && input.LA(1) <= WHERE) ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set509)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "keyword"


    public static class id_column_def_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "id_column_def"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:652:1: id_column_def : ( id_core | keyword_column_def );
    public final SqlParser.id_column_def_return id_column_def() throws RecognitionException {
        SqlParser.id_column_def_return retval = new SqlParser.id_column_def_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        SqlParser.id_core_return id_core510 =null;

        SqlParser.keyword_column_def_return keyword_column_def511 =null;



        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:652:14: ( id_core | keyword_column_def )
            int alt188=2;
            int LA188_0 = input.LA(1);

            if ( (LA188_0==ID||LA188_0==STRING) ) {
                alt188=1;
            }
            else if ( ((LA188_0 >= ABORT && LA188_0 <= AFTER)||(LA188_0 >= ALL && LA188_0 <= ALTER)||(LA188_0 >= ANALYZE && LA188_0 <= AND)||(LA188_0 >= AS && LA188_0 <= ASC)||(LA188_0 >= ATTACH && LA188_0 <= AUTOINCREMENT)||(LA188_0 >= BEFORE && LA188_0 <= BETWEEN)||LA188_0==BY||(LA188_0 >= CASCADE && LA188_0 <= COLLATE)||(LA188_0 >= COMMIT && LA188_0 <= CONFLICT)||LA188_0==CREATE||(LA188_0 >= CROSS && LA188_0 <= CURRENT_TIMESTAMP)||(LA188_0 >= DATABASE && LA188_0 <= DISTINCT)||LA188_0==DROP||(LA188_0 >= EACH && LA188_0 <= END)||(LA188_0 >= ESCAPE && LA188_0 <= EXPLAIN)||LA188_0==FAIL||(LA188_0 >= FOR && LA188_0 <= FROM)||LA188_0==GLOB||LA188_0==GROUP||LA188_0==HAVING||(LA188_0 >= IF && LA188_0 <= INSTEAD)||(LA188_0 >= INTERSECT && LA188_0 <= INTO)||(LA188_0 >= IS && LA188_0 <= ISNULL)||LA188_0==JOIN||LA188_0==KEY||LA188_0==LEFT||(LA188_0 >= LIKE && LA188_0 <= LIMIT)||LA188_0==MATCH||(LA188_0 >= NATURAL && LA188_0 <= NOTNULL)||LA188_0==NULL||(LA188_0 >= OF && LA188_0 <= ON)||(LA188_0 >= OR && LA188_0 <= ORDER)||LA188_0==OUTER||LA188_0==PLAN||(LA188_0 >= PRAGMA && LA188_0 <= PRIMARY)||LA188_0==QUERY||(LA188_0 >= RAISE && LA188_0 <= ROW)||(LA188_0 >= SAVEPOINT && LA188_0 <= SELECT)||LA188_0==SET||LA188_0==TABLE||(LA188_0 >= TEMPORARY && LA188_0 <= THEN)||(LA188_0 >= TO && LA188_0 <= TRIGGER)||(LA188_0 >= UNION && LA188_0 <= USING)||(LA188_0 >= VACUUM && LA188_0 <= VIRTUAL)||(LA188_0 >= WHEN && LA188_0 <= WHERE)) ) {
                alt188=2;
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 188, 0, input);

                throw nvae;

            }
            switch (alt188) {
                case 1 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:652:16: id_core
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_id_core_in_id_column_def4951);
                    id_core510=id_core();

                    state._fsp--;

                    adaptor.addChild(root_0, id_core510.getTree());

                    }
                    break;
                case 2 :
                    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:652:26: keyword_column_def
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_keyword_column_def_in_id_column_def4955);
                    keyword_column_def511=keyword_column_def();

                    state._fsp--;

                    adaptor.addChild(root_0, keyword_column_def511.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "id_column_def"


    public static class keyword_column_def_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "keyword_column_def"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:654:1: keyword_column_def : ( ABORT | ADD | AFTER | ALL | ALTER | ANALYZE | AND | AS | ASC | ATTACH | AUTOINCREMENT | BEFORE | BEGIN | BETWEEN | BY | CASCADE | CASE | CAST | CHECK | COLLATE | COMMIT | CONFLICT | CREATE | CROSS | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP | DATABASE | DEFAULT | DEFERRABLE | DEFERRED | DELETE | DESC | DETACH | DISTINCT | DROP | EACH | ELSE | END | ESCAPE | EXCEPT | EXCLUSIVE | EXISTS | EXPLAIN | FAIL | FOR | FOREIGN | FROM | GLOB | GROUP | HAVING | IF | IGNORE | IMMEDIATE | IN | INDEX | INDEXED | INITIALLY | INNER | INSERT | INSTEAD | INTERSECT | INTO | IS | ISNULL | JOIN | KEY | LEFT | LIKE | LIMIT | MATCH | NATURAL | NOT | NOTNULL | NULL | OF | OFFSET | ON | OR | ORDER | OUTER | PLAN | PRAGMA | PRIMARY | QUERY | RAISE | REFERENCES | REGEXP | REINDEX | RELEASE | RENAME | REPLACE | RESTRICT | ROLLBACK | ROW | SAVEPOINT | SELECT | SET | TABLE | TEMPORARY | THEN | TO | TRANSACTION | TRIGGER | UNION | UNIQUE | UPDATE | USING | VACUUM | VALUES | VIEW | VIRTUAL | WHEN | WHERE ) ;
    public final SqlParser.keyword_column_def_return keyword_column_def() throws RecognitionException {
        SqlParser.keyword_column_def_return retval = new SqlParser.keyword_column_def_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set512=null;

        Object set512_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:654:19: ( ( ABORT | ADD | AFTER | ALL | ALTER | ANALYZE | AND | AS | ASC | ATTACH | AUTOINCREMENT | BEFORE | BEGIN | BETWEEN | BY | CASCADE | CASE | CAST | CHECK | COLLATE | COMMIT | CONFLICT | CREATE | CROSS | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP | DATABASE | DEFAULT | DEFERRABLE | DEFERRED | DELETE | DESC | DETACH | DISTINCT | DROP | EACH | ELSE | END | ESCAPE | EXCEPT | EXCLUSIVE | EXISTS | EXPLAIN | FAIL | FOR | FOREIGN | FROM | GLOB | GROUP | HAVING | IF | IGNORE | IMMEDIATE | IN | INDEX | INDEXED | INITIALLY | INNER | INSERT | INSTEAD | INTERSECT | INTO | IS | ISNULL | JOIN | KEY | LEFT | LIKE | LIMIT | MATCH | NATURAL | NOT | NOTNULL | NULL | OF | OFFSET | ON | OR | ORDER | OUTER | PLAN | PRAGMA | PRIMARY | QUERY | RAISE | REFERENCES | REGEXP | REINDEX | RELEASE | RENAME | REPLACE | RESTRICT | ROLLBACK | ROW | SAVEPOINT | SELECT | SET | TABLE | TEMPORARY | THEN | TO | TRANSACTION | TRIGGER | UNION | UNIQUE | UPDATE | USING | VACUUM | VALUES | VIEW | VIRTUAL | WHEN | WHERE ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
            {
            root_0 = (Object)adaptor.nil();


            set512=(Token)input.LT(1);

            if ( (input.LA(1) >= ABORT && input.LA(1) <= AFTER)||(input.LA(1) >= ALL && input.LA(1) <= ALTER)||(input.LA(1) >= ANALYZE && input.LA(1) <= AND)||(input.LA(1) >= AS && input.LA(1) <= ASC)||(input.LA(1) >= ATTACH && input.LA(1) <= AUTOINCREMENT)||(input.LA(1) >= BEFORE && input.LA(1) <= BETWEEN)||input.LA(1)==BY||(input.LA(1) >= CASCADE && input.LA(1) <= COLLATE)||(input.LA(1) >= COMMIT && input.LA(1) <= CONFLICT)||input.LA(1)==CREATE||(input.LA(1) >= CROSS && input.LA(1) <= CURRENT_TIMESTAMP)||(input.LA(1) >= DATABASE && input.LA(1) <= DISTINCT)||input.LA(1)==DROP||(input.LA(1) >= EACH && input.LA(1) <= END)||(input.LA(1) >= ESCAPE && input.LA(1) <= EXPLAIN)||input.LA(1)==FAIL||(input.LA(1) >= FOR && input.LA(1) <= FROM)||input.LA(1)==GLOB||input.LA(1)==GROUP||input.LA(1)==HAVING||(input.LA(1) >= IF && input.LA(1) <= INSTEAD)||(input.LA(1) >= INTERSECT && input.LA(1) <= INTO)||(input.LA(1) >= IS && input.LA(1) <= ISNULL)||input.LA(1)==JOIN||input.LA(1)==KEY||input.LA(1)==LEFT||(input.LA(1) >= LIKE && input.LA(1) <= LIMIT)||input.LA(1)==MATCH||(input.LA(1) >= NATURAL && input.LA(1) <= NOTNULL)||input.LA(1)==NULL||(input.LA(1) >= OF && input.LA(1) <= ON)||(input.LA(1) >= OR && input.LA(1) <= ORDER)||input.LA(1)==OUTER||input.LA(1)==PLAN||(input.LA(1) >= PRAGMA && input.LA(1) <= PRIMARY)||input.LA(1)==QUERY||(input.LA(1) >= RAISE && input.LA(1) <= ROW)||(input.LA(1) >= SAVEPOINT && input.LA(1) <= SELECT)||input.LA(1)==SET||input.LA(1)==TABLE||(input.LA(1) >= TEMPORARY && input.LA(1) <= THEN)||(input.LA(1) >= TO && input.LA(1) <= TRIGGER)||(input.LA(1) >= UNION && input.LA(1) <= USING)||(input.LA(1) >= VACUUM && input.LA(1) <= VIRTUAL)||(input.LA(1) >= WHEN && input.LA(1) <= WHERE) ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set512)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "keyword_column_def"


    public static class bool_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "bool"
    // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:960:1: bool : ( TRUE | FALSE ) ;
    public final SqlParser.bool_return bool() throws RecognitionException {
        SqlParser.bool_return retval = new SqlParser.bool_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token set513=null;

        Object set513_tree=null;

        try {
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:960:5: ( ( TRUE | FALSE ) )
            // /home/alex/sqljet-1.1.x/sqljet/src/main/antlr/org/tmatesoft/sqljet/core/internal/lang/Sql.g:
            {
            root_0 = (Object)adaptor.nil();


            set513=(Token)input.LT(1);

            if ( input.LA(1)==FALSE||input.LA(1)==TRUE ) {
                input.consume();
                adaptor.addChild(root_0, 
                (Object)adaptor.create(set513)
                );
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

            retval.stop = input.LT(-1);


            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "bool"

    // Delegated rules


    protected DFA10 dfa10 = new DFA10(this);
    protected DFA11 dfa11 = new DFA11(this);
    protected DFA12 dfa12 = new DFA12(this);
    protected DFA26 dfa26 = new DFA26(this);
    protected DFA14 dfa14 = new DFA14(this);
    protected DFA18 dfa18 = new DFA18(this);
    protected DFA33 dfa33 = new DFA33(this);
    protected DFA44 dfa44 = new DFA44(this);
    protected DFA34 dfa34 = new DFA34(this);
    protected DFA71 dfa71 = new DFA71(this);
    protected DFA80 dfa80 = new DFA80(this);
    protected DFA79 dfa79 = new DFA79(this);
    protected DFA78 dfa78 = new DFA78(this);
    protected DFA124 dfa124 = new DFA124(this);
    protected DFA129 dfa129 = new DFA129(this);
    static final String DFA10_eotS =
        "\151\uffff";
    static final String DFA10_eofS =
        "\1\1\35\uffff\1\1\112\uffff";
    static final String DFA10_minS =
        "\1\5\35\uffff\1\5\2\uffff\2\5\1\36\1\11\2\103\1\36\1\103\100\uffff";
    static final String DFA10_maxS =
        "\1\u00eb\35\uffff\1\u00eb\2\uffff\2\u00eb\1\103\3\u00c1\1\103\1"+
        "\173\100\uffff";
    static final String DFA10_acceptS =
        "\1\uffff\1\2\52\uffff\1\1\74\uffff";
    static final String DFA10_specialS =
        "\151\uffff}>";
    static final String[] DFA10_transitionS = {
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\2\uffff\2\1\2\uffff"+
            "\3\1\4\uffff\1\1\1\uffff\5\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\3\1\1\uffff\1\1\4\uffff\4\1\1\uffff\10\1\3\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\1\1\4\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\6\1\2\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\7\uffff"+
            "\1\1\5\uffff\1\1\1\uffff\3\1\1\uffff\1\36\1\1\1\uffff\1\1\3"+
            "\uffff\1\1\1\uffff\2\1\1\uffff\1\1\4\uffff\2\1\1\uffff\10\1"+
            "\2\uffff\2\1\1\uffff\2\1\4\uffff\1\1\11\uffff\1\1\1\uffff\2"+
            "\1\1\uffff\3\1\5\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\3\54\1\uffff\2\54\1\uffff\2\54\1\uffff\2\54\1\uffff\3\54\2"+
            "\uffff\3\54\2\uffff\1\54\1\uffff\1\54\1\uffff\7\54\3\uffff\1"+
            "\1\1\uffff\3\54\1\uffff\1\54\4\uffff\4\54\1\uffff\10\54\3\uffff"+
            "\1\54\3\uffff\3\54\2\uffff\1\54\1\46\3\54\1\uffff\3\54\2\uffff"+
            "\2\54\1\41\6\uffff\1\43\1\uffff\1\54\1\uffff\1\54\12\uffff\3"+
            "\54\1\uffff\7\54\1\uffff\1\45\1\54\2\uffff\1\54\4\uffff\1\54"+
            "\1\uffff\1\54\1\uffff\1\54\3\uffff\1\50\1\uffff\1\54\3\uffff"+
            "\1\54\1\uffff\2\54\4\uffff\1\54\1\uffff\3\54\1\uffff\1\54\1"+
            "\47\1\uffff\1\54\3\uffff\4\54\1\uffff\2\54\3\uffff\2\54\1\uffff"+
            "\7\54\1\1\2\uffff\2\54\1\uffff\1\1\1\54\4\uffff\1\54\11\uffff"+
            "\1\54\1\uffff\7\54\4\uffff\1\44\3\54\1\uffff\4\54\1\uffff\1"+
            "\54\1\42",
            "",
            "",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\2\uffff\2\1\2\uffff"+
            "\3\1\4\uffff\1\1\1\uffff\5\1\1\uffff\1\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\54\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\1\1\4\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\6\1\2\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\5\uffff\1\1\5\uffff\1\1\1\uffff\3\1\1\uffff\2\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\1\1\4\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\2\1\1\uffff\3\1\5\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\1\uffff\3\1\2\uffff"+
            "\3\1\2\uffff\1\1\1\uffff\1\1\1\uffff\7\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\54\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\3\1\2\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\7\1\1\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\4\uffff\1\1\1\uffff\3\1\1\uffff"+
            "\2\1\1\uffff\1\1\3\uffff\4\1\1\uffff\2\1\3\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\7\1\4\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\1\1\44\uffff\1\54",
            "\1\1\71\uffff\1\54\175\uffff\1\1",
            "\1\54\175\uffff\1\1",
            "\1\54\175\uffff\1\1",
            "\1\1\44\uffff\1\54",
            "\1\54\67\uffff\1\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA10_eot = DFA.unpackEncodedString(DFA10_eotS);
    static final short[] DFA10_eof = DFA.unpackEncodedString(DFA10_eofS);
    static final char[] DFA10_min = DFA.unpackEncodedStringToUnsignedChars(DFA10_minS);
    static final char[] DFA10_max = DFA.unpackEncodedStringToUnsignedChars(DFA10_maxS);
    static final short[] DFA10_accept = DFA.unpackEncodedString(DFA10_acceptS);
    static final short[] DFA10_special = DFA.unpackEncodedString(DFA10_specialS);
    static final short[][] DFA10_transition;

    static {
        int numStates = DFA10_transitionS.length;
        DFA10_transition = new short[numStates][];
        for (int i=0; i ^( match_op $match_expr ( NOT )? ( ^( ESCAPE $escape_expr) )? ) | ( NOT )? IN LPAREN expr ( COMMA expr )* RPAREN -> ^( IN_VALUES ( NOT )? ^( IN ( expr )+ ) ) | ( NOT )? IN (database_name= id DOT )? table_name= id -> ^( IN_TABLE ( NOT )? ^( IN ^( $table_name ( $database_name)? ) ) ) | ( NOT )? IN ^ LPAREN ! ( select_stmt )? RPAREN !| ( NOT )? EQUALS ^ LPAREN ! ( select_stmt )? RPAREN !| ( ISNULL -> IS_NULL | NOTNULL -> NOT_NULL | IS NULL -> IS_NULL | NOT NULL -> NOT_NULL | IS NOT NULL -> NOT_NULL ) | IS NOT ^ eq_subexpr | ( NOT )? BETWEEN e1= eq_subexpr AND e2= eq_subexpr -> ^( BETWEEN ( NOT )? ^( AND $e1 $e2) ) | ( ( EQUALS | EQUALS2 | NOT_EQUALS | NOT_EQUALS2 ) ^ eq_subexpr )+ );";
        }
    }
    static final String DFA14_eotS =
        "\153\uffff";
    static final String DFA14_eofS =
        "\2\2\151\uffff";
    static final String DFA14_minS =
        "\2\5\63\uffff\1\5\2\uffff\1\5\1\36\1\11\2\103\1\36\1\103\54\uffff";
    static final String DFA14_maxS =
        "\2\u00eb\63\uffff\1\u00eb\2\uffff\1\u00eb\1\103\3\u00c1\1\103\1"+
        "\173\54\uffff";
    static final String DFA14_acceptS =
        "\2\uffff\1\2\37\uffff\1\1\110\uffff";
    static final String DFA14_specialS =
        "\153\uffff}>";
    static final String[] DFA14_transitionS = {
            "\3\2\1\uffff\2\2\1\uffff\2\2\1\uffff\2\2\2\uffff\2\2\2\uffff"+
            "\3\2\4\uffff\1\2\1\uffff\5\2\1\uffff\1\2\3\uffff\1\2\1\uffff"+
            "\3\2\1\uffff\1\2\4\uffff\4\2\1\uffff\10\2\3\uffff\1\2\3\uffff"+
            "\3\2\2\uffff\1\1\4\2\1\uffff\1\2\4\uffff\3\2\6\uffff\1\2\1\uffff"+
            "\1\2\1\uffff\1\2\12\uffff\3\2\1\uffff\6\2\2\uffff\2\2\2\uffff"+
            "\1\2\4\uffff\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\1\2\7\uffff"+
            "\1\2\5\uffff\1\2\1\uffff\3\2\1\uffff\2\2\1\uffff\1\2\3\uffff"+
            "\1\2\1\uffff\2\2\1\uffff\1\2\4\uffff\2\2\1\uffff\10\2\2\uffff"+
            "\2\2\1\uffff\2\2\4\uffff\1\2\11\uffff\1\2\1\uffff\2\2\1\uffff"+
            "\3\2\5\uffff\4\2\1\uffff\4\2\1\uffff\2\2",
            "\3\42\1\uffff\2\42\1\uffff\2\42\1\uffff\2\42\1\uffff\3\42\2"+
            "\uffff\3\42\2\uffff\1\42\1\uffff\1\42\1\uffff\7\42\3\uffff\1"+
            "\2\1\uffff\3\42\1\uffff\1\42\4\uffff\4\42\1\uffff\10\42\3\uffff"+
            "\1\42\3\uffff\3\42\2\uffff\1\42\1\74\3\42\1\uffff\3\42\2\uffff"+
            "\2\42\1\65\6\uffff\1\71\1\uffff\1\42\1\uffff\1\42\12\uffff\3"+
            "\42\1\uffff\7\42\1\uffff\1\73\1\42\2\uffff\1\42\4\uffff\1\42"+
            "\1\uffff\1\42\1\uffff\1\42\3\uffff\1\76\1\uffff\1\42\3\uffff"+
            "\1\42\1\uffff\2\42\4\uffff\1\42\1\uffff\3\42\1\uffff\1\42\1"+
            "\75\1\uffff\1\42\3\uffff\4\42\1\uffff\2\42\3\uffff\2\42\1\uffff"+
            "\7\42\1\2\2\uffff\2\42\1\uffff\1\2\1\42\4\uffff\1\42\11\uffff"+
            "\1\42\1\uffff\7\42\4\uffff\1\72\3\42\1\uffff\4\42\1\uffff\1"+
            "\42\1\70",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\3\2\1\uffff\2\2\1\uffff\2\2\1\uffff\2\2\2\uffff\2\2\2\uffff"+
            "\3\2\4\uffff\1\2\1\uffff\5\2\1\uffff\1\2\5\uffff\3\2\1\uffff"+
            "\1\2\4\uffff\4\2\1\uffff\10\2\1\uffff\1\42\1\uffff\1\2\3\uffff"+
            "\3\2\2\uffff\5\2\1\uffff\1\2\4\uffff\3\2\6\uffff\1\2\1\uffff"+
            "\1\2\1\uffff\1\2\12\uffff\3\2\1\uffff\6\2\2\uffff\2\2\2\uffff"+
            "\1\2\4\uffff\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\1\2\1\uffff"+
            "\1\2\5\uffff\1\2\5\uffff\1\2\1\uffff\3\2\1\uffff\2\2\1\uffff"+
            "\1\2\3\uffff\1\2\1\uffff\2\2\1\uffff\1\2\4\uffff\2\2\1\uffff"+
            "\7\2\3\uffff\2\2\2\uffff\1\2\4\uffff\1\2\11\uffff\1\2\1\uffff"+
            "\2\2\1\uffff\3\2\5\uffff\4\2\1\uffff\4\2\1\uffff\2\2",
            "",
            "",
            "\3\2\1\uffff\2\2\1\uffff\2\2\1\uffff\2\2\1\uffff\3\2\2\uffff"+
            "\3\2\2\uffff\1\2\1\uffff\1\2\1\uffff\7\2\5\uffff\3\2\1\uffff"+
            "\1\2\4\uffff\4\2\1\uffff\10\2\1\uffff\1\42\1\uffff\1\2\3\uffff"+
            "\3\2\2\uffff\5\2\1\uffff\3\2\2\uffff\3\2\6\uffff\1\2\1\uffff"+
            "\1\2\1\uffff\1\2\12\uffff\3\2\1\uffff\7\2\1\uffff\2\2\2\uffff"+
            "\1\2\4\uffff\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\1\2\1\uffff"+
            "\1\2\3\uffff\1\2\1\uffff\2\2\4\uffff\1\2\1\uffff\3\2\1\uffff"+
            "\2\2\1\uffff\1\2\3\uffff\4\2\1\uffff\2\2\3\uffff\2\2\1\uffff"+
            "\7\2\3\uffff\2\2\2\uffff\1\2\4\uffff\1\2\11\uffff\1\2\1\uffff"+
            "\7\2\4\uffff\4\2\1\uffff\4\2\1\uffff\2\2",
            "\1\2\44\uffff\1\42",
            "\1\2\71\uffff\1\42\175\uffff\1\2",
            "\1\42\175\uffff\1\2",
            "\1\42\175\uffff\1\2",
            "\1\2\44\uffff\1\42",
            "\1\42\67\uffff\1\2",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA14_eot = DFA.unpackEncodedString(DFA14_eotS);
    static final short[] DFA14_eof = DFA.unpackEncodedString(DFA14_eofS);
    static final char[] DFA14_min = DFA.unpackEncodedStringToUnsignedChars(DFA14_minS);
    static final char[] DFA14_max = DFA.unpackEncodedStringToUnsignedChars(DFA14_maxS);
    static final short[] DFA14_accept = DFA.unpackEncodedString(DFA14_acceptS);
    static final short[] DFA14_special = DFA.unpackEncodedString(DFA14_specialS);
    static final short[][] DFA14_transition;

    static {
        int numStates = DFA14_transitionS.length;
        DFA14_transition = new short[numStates][];
        for (int i=0; i ^( COLUMN_EXPRESSION ^( $column_name ( ^( $table_name ( $database_name)? ) )? ) ) |name= ID LPAREN ( ( DISTINCT )? args+= expr ( COMMA args+= expr )* | ASTERISK )? RPAREN -> ^( FUNCTION_EXPRESSION $name ( DISTINCT )? ( $args)* ( ASTERISK )? ) | LPAREN ! expr RPAREN !| CAST ^ LPAREN ! expr AS ! type_name RPAREN !| ( ( NOT )? EXISTS )? LPAREN select_stmt RPAREN | CASE (case_expr= expr )? ( when_expr )+ ( ELSE else_expr= expr )? END -> ^( CASE ( $case_expr)? ( when_expr )+ ( $else_expr)? ) | raise_function );";
        }
    }
    static final String DFA34_eotS =
        "\u00a3\uffff";
    static final String DFA34_eofS =
        "\7\uffff\1\21\2\uffff\1\21\2\uffff\1\21\u0095\uffff";
    static final String DFA34_minS =
        "\1\5\3\103\4\5\2\uffff\1\5\2\uffff\1\5\u0095\uffff";
    static final String DFA34_maxS =
        "\1\u00eb\3\103\4\u00eb\2\uffff\1\u00eb\2\uffff\1\u00eb\u0095\uffff";
    static final String DFA34_acceptS =
        "\10\uffff\1\1\10\uffff\1\2\u0091\uffff";
    static final String DFA34_specialS =
        "\u00a3\uffff}>";
    static final String[] DFA34_transitionS = {
            "\3\3\1\uffff\2\3\1\uffff\2\3\1\uffff\2\3\2\uffff\2\3\2\uffff"+
            "\3\3\4\uffff\1\3\1\uffff\5\3\1\uffff\1\3\5\uffff\3\3\1\uffff"+
            "\1\3\4\uffff\4\3\1\uffff\10\3\3\uffff\1\3\3\uffff\3\3\2\uffff"+
            "\5\3\1\uffff\1\3\4\uffff\3\3\6\uffff\1\3\1\uffff\1\3\1\uffff"+
            "\1\1\12\uffff\3\3\1\uffff\6\3\2\uffff\2\3\2\uffff\1\3\4\uffff"+
            "\1\3\1\uffff\1\3\1\uffff\1\3\3\uffff\1\3\7\uffff\1\3\5\uffff"+
            "\1\3\1\uffff\3\3\1\uffff\2\3\1\uffff\1\3\3\uffff\1\3\1\uffff"+
            "\2\3\1\uffff\1\3\4\uffff\2\3\1\uffff\7\3\3\uffff\2\3\2\uffff"+
            "\1\3\4\uffff\1\2\11\uffff\1\3\1\uffff\2\3\1\uffff\3\3\5\uffff"+
            "\4\3\1\uffff\4\3\1\uffff\2\3",
            "\1\4",
            "\1\5",
            "\1\6",
            "\3\10\1\uffff\2\10\1\uffff\2\10\1\uffff\2\10\2\uffff\2\10\2"+
            "\uffff\3\10\4\uffff\1\10\1\uffff\5\10\1\uffff\1\10\5\uffff\3"+
            "\10\1\uffff\1\10\4\uffff\4\10\1\uffff\10\10\3\uffff\1\10\3\uffff"+
            "\3\10\2\uffff\5\10\1\uffff\1\10\4\uffff\3\10\6\uffff\1\10\1"+
            "\uffff\1\10\1\uffff\1\7\12\uffff\3\10\1\uffff\6\10\2\uffff\2"+
            "\10\2\uffff\1\10\4\uffff\1\10\1\uffff\1\10\1\uffff\1\10\3\uffff"+
            "\1\10\7\uffff\1\10\5\uffff\1\10\1\uffff\3\10\1\uffff\2\10\1"+
            "\uffff\1\10\3\uffff\1\10\1\uffff\2\10\1\uffff\1\10\4\uffff\2"+
            "\10\1\uffff\7\10\3\uffff\2\10\2\uffff\1\10\4\uffff\1\10\11\uffff"+
            "\1\10\1\uffff\2\10\1\uffff\3\10\5\uffff\4\10\1\uffff\4\10\1"+
            "\uffff\2\10",
            "\3\10\1\uffff\2\10\1\uffff\2\10\1\uffff\2\10\2\uffff\2\10\2"+
            "\uffff\3\10\4\uffff\1\10\1\uffff\5\10\1\uffff\1\10\5\uffff\3"+
            "\10\1\uffff\1\10\4\uffff\4\10\1\uffff\10\10\3\uffff\1\10\3\uffff"+
            "\3\10\2\uffff\5\10\1\uffff\1\10\4\uffff\3\10\6\uffff\1\10\1"+
            "\uffff\1\10\1\uffff\1\12\12\uffff\3\10\1\uffff\6\10\2\uffff"+
            "\2\10\2\uffff\1\10\4\uffff\1\10\1\uffff\1\10\1\uffff\1\10\3"+
            "\uffff\1\10\7\uffff\1\10\5\uffff\1\10\1\uffff\3\10\1\uffff\2"+
            "\10\1\uffff\1\10\3\uffff\1\10\1\uffff\2\10\1\uffff\1\10\4\uffff"+
            "\2\10\1\uffff\7\10\3\uffff\2\10\2\uffff\1\10\4\uffff\1\10\11"+
            "\uffff\1\10\1\uffff\2\10\1\uffff\3\10\5\uffff\4\10\1\uffff\4"+
            "\10\1\uffff\2\10",
            "\3\10\1\uffff\2\10\1\uffff\2\10\1\uffff\2\10\2\uffff\2\10\2"+
            "\uffff\3\10\4\uffff\1\10\1\uffff\5\10\1\uffff\1\10\5\uffff\3"+
            "\10\1\uffff\1\10\4\uffff\4\10\1\uffff\10\10\3\uffff\1\10\3\uffff"+
            "\3\10\2\uffff\5\10\1\uffff\1\10\4\uffff\3\10\6\uffff\1\10\1"+
            "\uffff\1\10\1\uffff\1\15\12\uffff\3\10\1\uffff\6\10\2\uffff"+
            "\2\10\2\uffff\1\10\4\uffff\1\10\1\uffff\1\10\1\uffff\1\10\3"+
            "\uffff\1\10\7\uffff\1\10\5\uffff\1\10\1\uffff\3\10\1\uffff\2"+
            "\10\1\uffff\1\10\3\uffff\1\10\1\uffff\2\10\1\uffff\1\10\4\uffff"+
            "\2\10\1\uffff\7\10\3\uffff\2\10\2\uffff\1\10\4\uffff\1\10\11"+
            "\uffff\1\10\1\uffff\2\10\1\uffff\3\10\5\uffff\4\10\1\uffff\4"+
            "\10\1\uffff\2\10",
            "\3\21\1\uffff\5\21\1\uffff\3\21\1\uffff\2\21\2\uffff\3\21\4"+
            "\uffff\1\21\1\uffff\5\21\1\uffff\1\21\3\uffff\1\21\1\uffff\3"+
            "\21\1\uffff\1\21\4\uffff\4\21\1\uffff\10\21\1\uffff\1\10\2\21"+
            "\3\uffff\12\21\1\uffff\1\21\4\uffff\3\21\3\uffff\4\21\1\uffff"+
            "\1\21\1\uffff\1\21\12\uffff\12\21\2\uffff\2\21\2\uffff\2\21"+
            "\3\uffff\1\21\1\uffff\1\21\1\uffff\5\21\4\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\1\uffff\3\21\1\uffff\2\21\1\uffff\1\21\1"+
            "\uffff\6\21\1\uffff\1\21\4\uffff\13\21\2\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\11\uffff\1\21\1\uffff\2\21\1\uffff\3\21\5"+
            "\uffff\4\21\1\uffff\4\21\1\uffff\2\21",
            "",
            "",
            "\3\21\1\uffff\5\21\1\uffff\3\21\1\uffff\2\21\2\uffff\3\21\4"+
            "\uffff\1\21\1\uffff\5\21\1\uffff\1\21\3\uffff\1\21\1\uffff\3"+
            "\21\1\uffff\1\21\4\uffff\4\21\1\uffff\10\21\1\uffff\1\10\2\21"+
            "\3\uffff\12\21\1\uffff\1\21\4\uffff\3\21\3\uffff\4\21\1\uffff"+
            "\1\21\1\uffff\1\21\12\uffff\12\21\2\uffff\2\21\2\uffff\2\21"+
            "\3\uffff\1\21\1\uffff\1\21\1\uffff\5\21\4\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\1\uffff\3\21\1\uffff\2\21\1\uffff\1\21\1"+
            "\uffff\6\21\1\uffff\1\21\4\uffff\13\21\2\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\11\uffff\1\21\1\uffff\2\21\1\uffff\3\21\5"+
            "\uffff\4\21\1\uffff\4\21\1\uffff\2\21",
            "",
            "",
            "\3\21\1\uffff\5\21\1\uffff\3\21\1\uffff\2\21\2\uffff\3\21\4"+
            "\uffff\1\21\1\uffff\5\21\1\uffff\1\21\3\uffff\1\21\1\uffff\3"+
            "\21\1\uffff\1\21\4\uffff\4\21\1\uffff\10\21\1\uffff\1\10\2\21"+
            "\3\uffff\12\21\1\uffff\1\21\4\uffff\3\21\3\uffff\4\21\1\uffff"+
            "\1\21\1\uffff\1\21\12\uffff\12\21\2\uffff\2\21\2\uffff\2\21"+
            "\3\uffff\1\21\1\uffff\1\21\1\uffff\5\21\4\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\1\uffff\3\21\1\uffff\2\21\1\uffff\1\21\1"+
            "\uffff\6\21\1\uffff\1\21\4\uffff\13\21\2\uffff\2\21\1\uffff"+
            "\5\21\1\uffff\1\21\11\uffff\1\21\1\uffff\2\21\1\uffff\3\21\5"+
            "\uffff\4\21\1\uffff\4\21\1\uffff\2\21",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA34_eot = DFA.unpackEncodedString(DFA34_eotS);
    static final short[] DFA34_eof = DFA.unpackEncodedString(DFA34_eofS);
    static final char[] DFA34_min = DFA.unpackEncodedStringToUnsignedChars(DFA34_minS);
    static final char[] DFA34_max = DFA.unpackEncodedStringToUnsignedChars(DFA34_maxS);
    static final short[] DFA34_accept = DFA.unpackEncodedString(DFA34_acceptS);
    static final short[] DFA34_special = DFA.unpackEncodedString(DFA34_specialS);
    static final short[][] DFA34_transition;

    static {
        int numStates = DFA34_transitionS.length;
        DFA34_transition = new short[numStates][];
        for (int i=0; i ^( ASTERISK $table_name) | expr ( ( AS )? column_alias= id )? -> ^( ALIAS expr ( $column_alias)? ) );";
        }
    }
    static final String DFA79_eotS =
        "\u00e1\uffff";
    static final String DFA79_eofS =
        "\1\5\3\uffff\1\1\1\uffff\7\1\u00d4\uffff";
    static final String DFA79_minS =
        "\1\5\3\uffff\1\5\1\uffff\1\5\1\36\1\11\2\52\1\36\1\52\5\uffff\2"+
        "\5\1\36\1\11\2\103\1\36\1\103\10\uffff\2\5\1\36\1\11\2\103\1\36"+
        "\1\103\u00b7\uffff";
    static final String DFA79_maxS =
        "\1\u00eb\3\uffff\1\u00eb\1\uffff\7\u00eb\5\uffff\2\u00eb\1\103\3"+
        "\u00c1\1\103\1\173\10\uffff\2\u00eb\1\103\3\u00c1\1\103\1\173\u00b7"+
        "\uffff";
    static final String DFA79_acceptS =
        "\1\uffff\1\1\3\uffff\1\2\u00db\uffff";
    static final String DFA79_specialS =
        "\u00e1\uffff}>";
    static final String[] DFA79_transitionS = {
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\2\uffff\2\1\2\uffff"+
            "\3\1\4\uffff\1\1\1\uffff\5\1\1\uffff\1\1\3\uffff\1\5\1\uffff"+
            "\3\1\1\uffff\1\1\4\uffff\4\1\1\uffff\10\1\3\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\1\1\1\12\3\1\1\uffff\1\1\4\uffff\2\1\1\4\6\uffff"+
            "\1\7\1\uffff\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\6\1\2\uffff"+
            "\1\11\1\1\2\uffff\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3"+
            "\uffff\1\14\7\uffff\1\1\5\uffff\1\1\1\uffff\3\1\1\uffff\1\1"+
            "\1\13\1\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\1\1\4\uffff"+
            "\2\1\1\uffff\7\1\1\5\2\uffff\2\1\1\uffff\1\5\1\1\4\uffff\1\1"+
            "\11\uffff\1\1\1\uffff\2\1\1\uffff\3\1\5\uffff\1\10\3\1\1\uffff"+
            "\4\1\1\uffff\1\1\1\6",
            "",
            "",
            "",
            "\3\5\1\uffff\2\5\1\uffff\2\5\1\uffff\2\5\2\uffff\2\5\2\uffff"+
            "\3\5\4\uffff\1\5\1\uffff\5\5\1\uffff\1\5\3\uffff\1\1\1\uffff"+
            "\3\5\1\uffff\1\5\4\uffff\4\5\1\uffff\10\5\3\uffff\1\5\3\uffff"+
            "\3\5\2\uffff\1\5\1\27\3\5\1\uffff\1\5\4\uffff\2\5\1\22\6\uffff"+
            "\1\24\1\uffff\1\5\1\uffff\1\5\12\uffff\3\5\1\uffff\6\5\2\uffff"+
            "\1\26\1\5\2\uffff\1\5\4\uffff\1\5\1\uffff\1\5\1\uffff\1\5\3"+
            "\uffff\1\31\1\uffff\1\5\5\uffff\1\5\5\uffff\1\5\1\uffff\3\5"+
            "\1\uffff\1\5\1\30\1\uffff\1\5\3\uffff\1\5\1\uffff\2\5\1\uffff"+
            "\1\5\4\uffff\2\5\1\uffff\7\5\1\1\2\uffff\2\5\1\uffff\1\1\1\5"+
            "\4\uffff\1\5\11\uffff\1\5\1\uffff\2\5\1\uffff\3\5\5\uffff\1"+
            "\25\3\5\1\uffff\4\5\1\uffff\1\5\1\23",
            "",
            "\3\5\1\uffff\2\5\1\uffff\2\5\1\uffff\2\5\1\uffff\3\5\2\uffff"+
            "\3\5\2\uffff\1\5\1\uffff\1\5\1\uffff\7\5\3\uffff\1\1\1\uffff"+
            "\3\5\1\uffff\1\5\4\uffff\4\5\1\uffff\10\5\3\uffff\1\5\3\uffff"+
            "\3\5\2\uffff\1\5\1\47\3\5\1\uffff\3\5\2\uffff\2\5\1\42\6\uffff"+
            "\1\44\1\uffff\1\5\1\uffff\1\5\12\uffff\3\5\1\uffff\7\5\1\uffff"+
            "\1\46\1\5\2\uffff\1\5\4\uffff\1\5\1\uffff\1\5\1\uffff\1\5\3"+
            "\uffff\1\51\1\uffff\1\5\3\uffff\1\5\1\uffff\2\5\4\uffff\1\5"+
            "\1\uffff\3\5\1\uffff\1\5\1\50\1\uffff\1\5\3\uffff\4\5\1\uffff"+
            "\2\5\3\uffff\2\5\1\uffff\7\5\1\1\2\uffff\2\5\1\uffff\1\1\1\5"+
            "\4\uffff\1\5\11\uffff\1\5\1\uffff\7\5\4\uffff\1\45\3\5\1\uffff"+
            "\4\5\1\uffff\1\5\1\43",
            "\1\5\13\uffff\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\32"+
            "\uffff\1\1\20\uffff\1\1\24\uffff\1\1\31\uffff\1\1\5\uffff\1"+
            "\1\34\uffff\1\1\12\uffff\1\1",
            "\1\5\40\uffff\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\32"+
            "\uffff\1\1\20\uffff\1\1\24\uffff\1\1\31\uffff\1\1\3\uffff\1"+
            "\5\1\uffff\1\1\34\uffff\1\1\12\uffff\1\1",
            "\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\32\uffff\1\1\20"+
            "\uffff\1\1\24\uffff\1\1\31\uffff\1\1\3\uffff\1\5\1\uffff\1\1"+
            "\34\uffff\1\1\12\uffff\1\1",
            "\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\32\uffff\1\1\20"+
            "\uffff\1\1\24\uffff\1\1\31\uffff\1\1\3\uffff\1\5\1\uffff\1\1"+
            "\34\uffff\1\1\12\uffff\1\1",
            "\1\5\13\uffff\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\32"+
            "\uffff\1\1\20\uffff\1\1\24\uffff\1\1\31\uffff\1\1\5\uffff\1"+
            "\1\34\uffff\1\1\12\uffff\1\1",
            "\1\1\44\uffff\1\1\13\uffff\1\1\6\uffff\1\1\30\uffff\1\5\1\uffff"+
            "\1\1\20\uffff\1\1\24\uffff\1\1\31\uffff\1\1\5\uffff\1\1\34\uffff"+
            "\1\1\12\uffff\1\1",
            "",
            "",
            "",
            "",
            "",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\2\uffff\2\1\2\uffff"+
            "\3\1\4\uffff\1\1\1\uffff\5\1\1\uffff\1\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\5\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\1\1\4\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\6\1\2\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\5\uffff\1\1\5\uffff\1\1\1\uffff\3\1\1\uffff\2\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\1\1\4\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\2\1\1\uffff\3\1\5\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\1\uffff\3\1\2\uffff"+
            "\3\1\2\uffff\1\1\1\uffff\1\1\1\uffff\7\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\5\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\3\1\2\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\7\1\1\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\4\uffff\1\1\1\uffff\3\1\1\uffff"+
            "\2\1\1\uffff\1\1\3\uffff\4\1\1\uffff\2\1\3\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\7\1\4\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\1\1\44\uffff\1\5",
            "\1\1\71\uffff\1\5\175\uffff\1\1",
            "\1\5\175\uffff\1\1",
            "\1\5\175\uffff\1\1",
            "\1\1\44\uffff\1\5",
            "\1\5\67\uffff\1\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\2\uffff\2\1\2\uffff"+
            "\3\1\4\uffff\1\1\1\uffff\5\1\1\uffff\1\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\5\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\1\1\4\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\6\1\2\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\5\uffff\1\1\5\uffff\1\1\1\uffff\3\1\1\uffff\2\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\1\1\4\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\2\1\1\uffff\3\1\5\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\3\1\1\uffff\2\1\1\uffff\2\1\1\uffff\2\1\1\uffff\3\1\2\uffff"+
            "\3\1\2\uffff\1\1\1\uffff\1\1\1\uffff\7\1\5\uffff\3\1\1\uffff"+
            "\1\1\4\uffff\4\1\1\uffff\10\1\1\uffff\1\5\1\uffff\1\1\3\uffff"+
            "\3\1\2\uffff\5\1\1\uffff\3\1\2\uffff\3\1\6\uffff\1\1\1\uffff"+
            "\1\1\1\uffff\1\1\12\uffff\3\1\1\uffff\7\1\1\uffff\2\1\2\uffff"+
            "\1\1\4\uffff\1\1\1\uffff\1\1\1\uffff\1\1\3\uffff\1\1\1\uffff"+
            "\1\1\3\uffff\1\1\1\uffff\2\1\4\uffff\1\1\1\uffff\3\1\1\uffff"+
            "\2\1\1\uffff\1\1\3\uffff\4\1\1\uffff\2\1\3\uffff\2\1\1\uffff"+
            "\7\1\3\uffff\2\1\2\uffff\1\1\4\uffff\1\1\11\uffff\1\1\1\uffff"+
            "\7\1\4\uffff\4\1\1\uffff\4\1\1\uffff\2\1",
            "\1\1\44\uffff\1\5",
            "\1\1\71\uffff\1\5\175\uffff\1\1",
            "\1\5\175\uffff\1\1",
            "\1\5\175\uffff\1\1",
            "\1\1\44\uffff\1\5",
            "\1\5\67\uffff\1\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA79_eot = DFA.unpackEncodedString(DFA79_eotS);
    static final short[] DFA79_eof = DFA.unpackEncodedString(DFA79_eofS);
    static final char[] DFA79_min = DFA.unpackEncodedStringToUnsignedChars(DFA79_minS);
    static final char[] DFA79_max = DFA.unpackEncodedStringToUnsignedChars(DFA79_maxS);
    static final short[] DFA79_accept = DFA.unpackEncodedString(DFA79_acceptS);
    static final short[] DFA79_special = DFA.unpackEncodedString(DFA79_specialS);
    static final short[][] DFA79_transition;

    static {
        int numStates = DFA79_transitionS.length;
        DFA79_transition = new short[numStates][];
        for (int i=0; i 

Ads help maintain this website.