コード例 #1
0
        protected void ScanBitField(bool quoteMode)
        {
            offsetCache = curIndex;
            for (; ch == '0' || ch == '1'; ScanChar())
            {
                ;
            }
            sizeCache = curIndex - offsetCache;

            if (quoteMode)
            {
                if (ch != '\'')
                {
                    throw new Exception("invalid char for bit: " + ch);
                }
                ScanChar();
            }
            else if (CharTypes.IsIdentifierChar(ch))
            {
                ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2);
                return;
            }
            token       = MySQLToken.LITERAL_BIT;
            stringValue = new string(sql, offsetCache, sizeCache);
        }
コード例 #2
0
 protected void ScanSystemVeriable()
 {
     if (ch != '@' || sql[curIndex + 1] != '@')
     {
         throw err("first char must be @@");
     }
     offsetCache = curIndex + 2;
     sizeCache   = 0;
     ScanChar(2);
     if (ch == '`')
     {
         for (++sizeCache; ; ++sizeCache)
         {
             if (ScanChar() == '`')
             {
                 ++sizeCache;
                 if (ScanChar() != '`')
                 {
                     break;
                 }
             }
         }
     }
     else
     {
         for (; CharTypes.IsIdentifierChar(ch); ++sizeCache)
         {
             ScanChar();
         }
     }
     UpdateStringValue(sql, offsetCache, sizeCache);
     token = MySQLToken.SYS_VAR;
 }
コード例 #3
0
 protected void ScanIdentifierWithAccent()
 {
     offsetCache = curIndex;
     for (; ScanChar() != MySQLLexer.EOI;)
     {
         if (ch == '`' && ScanChar() != '`')
         {
             break;
         }
     }
     UpdateStringValue(sql, offsetCache, sizeCache = curIndex - offsetCache);
     token = MySQLToken.IDENTIFIER;
 }
コード例 #4
0
        private void ScanIdentifierFromNumber(int initOffset, int initSize)
        {
            this.offsetCache = initOffset;
            this.sizeCache   = initSize;

            for (; CharTypes.IsIdentifierChar(ch); ++sizeCache)
            {
                ScanChar();
            }
            UpdateStringValue(sql, offsetCache, sizeCache);
            MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase);

            this.token = tok == MySQLToken.NONE ? MySQLToken.IDENTIFIER ? tok;
        }
コード例 #5
0
 protected void ScanPlaceHolder()
 {
     this.offsetCache = curIndex + 1;
     this.sizeCache   = 0;
     for (ScanChar(); ch != '}' && !IsEof(); ++sizeCache)
     {
         ScanChar();
     }
     if (ch == '}')
     {
         ScanChar();
     }
     UpdateStringValue(sql, offsetCache, sizeCache);
     token = MySQLToken.PLACE_HOLDER;
 }
コード例 #6
0
        public IExpression Expression()
        {
            MySQLToken token = lexer.Token();

            if (token == null)
            {
                token = lexer.NextToken();
            }
            if (token == MySQLToken.EOF)
            {
                throw new ArgumentException("unexpected EOF");
            }

            IExpression left =
        }
コード例 #7
0
 protected void ScanHexaDecimal(bool quoteMode)
 {
     this.offsetCache = this.curIndex;
     this.sizeCache   = this.curIndex - this.offsetCache;
     if (quoteMode)
     {
         if (ch != '\'')
         {
             throw new ArgumentException("invalid char for hex: " + ch);
         }
         ScanChar();
     }
     else if (CharTypes.IsIdentifierChar(ch))
     {
         ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2);
         return;
     }
     this.token = MySQLToken.LITERAL_HEX;
 }
コード例 #8
0
        protected int Match(params MySQLToken[] expectToken)
        {
            if (expectToken == null || expectToken.Length <= 0)
            {
                throw new ArgumentException("at least one expect token");
            }
            MySQLToken token = lexer.Token();

            for (int i = 0; i < expectToken.Length; ++i)
            {
                if (token == expectToken[i])
                {
                    if (token != MySQLToken.EOF || i < expectToken.Length - 1)
                    {
                        lexer.NextToken();
                    }
                    return(i);
                }
            }
            throw new ArgumentException("expect " + expectToken);
        }
コード例 #9
0
        private MySQLToken NextTokenInternal()
        {
            switch (ch)
            {
            case '0':
                switch (sql[curIndex + 1])
                {
                case 'x':
                    ScanChar(2);
                    ScanHexaDecimal(false);
                    return(token);

                case 'b':
                    ScanChar(2);
                    ScanBitField(false);
                    return(token);
                }

            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                ScanNumber();
                return(token);

            case '.':
                if (CharTypes.IsDigit(sql[curIndex + 1]))
                {
                    ScanNumber();
                }
                else
                {
                    ScanChar();
                    token = MySQLToken.PUNC_DOT;
                }
                return(token);

            case '\'':
            case '"':
                ScanString();
                return(token);

            case 'n':
            case 'N':
                if (sql[curIndex + 1] == '\'')
                {
                    ScanChar();
                    ScanString();
                    token = MySQLToken.LITERAL_NCHARS;
                    return(token);
                }
                ScanIdentifier();
                return(token);

            case 'x':
            case 'X':
                if (sql[curIndex + 1] == '\'')
                {
                    ScanChar(2);
                    ScanHexaDecimal(true);
                    return(token);
                }
                ScanIdentifier();
                return(token);

            case 'b':
            case 'B':
                if (sql[curIndex + 1] == '\'')
                {
                    ScanChar(2);
                    ScanBitField(true);
                    return(token);
                }
                ScanIdentifier();
                return(token);

            case '@':
                if (sql[curIndex + 1] == '@')
                {
                    ScanSystemVariable();
                    return(token);
                }
                ScanUserVariable();
                return(token);

            case '?':
                ScanChar();
                token = MySQLToken.QUESTION_MARK;
                ++paramIndex;
                return(token);

            case '(':
                ScanChar();
                token = MySQLToken.PUNC_LEFT_PAREN;
                return(token);

            case ')':
                ScanChar();
                token = MySQLToken.PUNC_RIGHT_PAREN;
                return(token);

            case '[':
                ScanChar();
                token = MySQLToken.PUNC_LEFT_BRACKET;
                return(token);

            case ']':
                ScanChar();
                token = MySQLToken.PUNC_RIGHT_BRACKET;
                return(token);

            case '{':
                ScanChar();
                token = MySQLToken.PUNC_LEFT_BRACE;
                return(token);

            case '}':
                ScanChar();
                token = MySQLToken.PUNC_RIGHT_BRACE;
                return(token);

            case ',':
                ScanChar();
                token = MySQLToken.PUNC_COMMA;
                return(token);

            case ';':
                ScanChar();
                token = MySQLToken.PUNC_SEMICOLON;
                return(token);

            case ':':
                if (sql[curIndex + 1] == '=')
                {
                    ScanChar(2);
                    token = MySQLToken.OP_ASSIGN;
                    return(token);
                }
                ScanChar();
                token = MySQLToken.PUNC_COLON;
                return(token);

            case '=':
                ScanChar();
                token = MySQLToken.OP_EQUALS;
                return(token);

            case '~':
                ScanChar();
                token = MySQLToken.OP_TILDE;
                return(token);

            case '*':
                if (inCStyleComment && sql[curIndex + 1] == '/')
                {
                    inCStyleComment       = false;
                    inCStyleCommentIgnore = false;
                    ScanChar(2);
                    token = MySQLToken.PUNC_C_STYLE_COMMENT_END;
                    return(token);
                }
                ScanChar();
                token = MySQLToken.OP_ASTERISK;
                return(token);

            case '-':
                ScanChar();
                token = MySQLToken.OP_MINUS;
                return(token);

            case '+':
                ScanChar();
                token = MySQLToken.OP_PLUS;
                return(token);

            case '^':
                ScanChar();
                token = MySQLToken.OP_CARET;
                return(token);

            case '/':
                ScanChar();
                token = MySQLToken.OP_SLASH;
                return(token);

            case '%':
                ScanChar();
                token = MySQLToken.OP_PERCENT;
                return(token);

            case '&':
                if (sql[curIndex + 1] == '&')
                {
                    ScanChar(2);
                    token = MySQLToken.OP_LOGICAL_AND;
                    return(token);
                }
                ScanChar();
                token = MySQLToken.OP_AMPERSAND;
                return(token);

            case '|':
                if (sql[curIndex + 1] == '|')
                {
                    ScanChar(2);
                    token = MySQLToken.OP_LOGICAL_OR;
                    return(token);
                }
                ScanChar();
                token = MySQLToken.OP_VERTICAL_BAR;
                return(token);

            case '!':
                if (sql[curIndex + 1] == '=')
                {
                    ScanChar(2);
                    token = MySQLToken.OP_NOT_EQUALS;
                    return(token);
                }
                ScanChar();
                token = MySQLToken.OP_EXCLAMATION;
                return(token);

            case '>':
                switch (sql[curIndex + 1])
                {
                case '=':
                    ScanChar(2);
                    token = MySQLToken.OP_GREATER_OR_EQUALS;
                    return(token);

                case '>':
                    ScanChar(2);
                    token = MySQLToken.OP_RIGHT_SHIFT;
                    return(token);

                default:
                    ScanChar();
                    token = MySQLToken.OP_GREATER_THAN;
                    return(token);
                }

            case '<':
                switch (sql[curIndex + 1])
                {
                case '=':
                    if (sql[curIndex + 2] == '>')
                    {
                        ScanChar(3);
                        token = MySQLToken.OP_NULL_SAFE_EQUALS;
                        return(token);
                    }
                    ScanChar(2);
                    token = MySQLToken.OP_LESS_OR_EQUALS;
                    return(token);

                case '>':
                    ScanChar(2);
                    token = MySQLToken.OP_LESS_OR_GREATER;
                    return(token);

                case '<':
                    ScanChar(2);
                    token = MySQLToken.OP_LEFT_SHIFT;
                    return(token);

                default:
                    ScanChar();
                    token = MySQLToken.OP_LESS_THAN;
                    return(token);
                }

            case '`':
                ScanIdentifierWithAccent();
                return(token);

            default:
                if (CharTypes.IsIdentifierChar(ch))
                {
                    ScanIdentifier();
                }
                else if (IsEof())
                {
                    token    = MySQLToken.EOF;
                    curIndex = eofIndex;
                    //tokenPos = curIndex;
                }
                else
                {
                    throw new ArgumentException("unsupported character: " + ch);
                }
                return(token);
            }
        }
コード例 #10
0
        protected void ScanUserVeriable()
        {
            if (ch != '@')
            {
                throw new ArgumentException("first char must be @");
            }
            offsetCache = curIndex;
            sizeCache   = 1;

            bool dq = false;

            switch (ScanChar())
            {
            case '"':
                dq = true;
                break;

            case '\'':
                for (++sizeCache; ; ++sizeCache)
                {
                    switch (ScanChar())
                    {
                    case '\\':
                        ++sizeCache;
                        ScanChar();
                        break;

                    case '"':
                        if (dq)
                        {
                            ++sizeCache;
                            if (ScanChar() == '"')
                            {
                                break;
                            }
                            goto label3;
                        }
                        break;

                    case '\'':
                        if (!dq)
                        {
                            ++sizeCache;
                            if (ScanChar() == '\'')
                            {
                                break;
                            }
                            goto label3;
                        }
                        break;
                    }
                }
label3:
                break;

            case '`':
                loop1 : for (++sizeCache; ; ++sizeCache)
                {
                    switch (ScanChar())
                    {
                    case '`':
                        ++sizeCache;
                        if (ScanChar() == '`')
                        {
                            break;
                        }
                        goto label4;
                    }
                }
label4:
                break;

            default:
                for (; CharTypes.IsIdentifierChar(ch) || ch == '.'; ++sizeCache)
                {
                    ScanChar();
                }
                break;
            }

            stringValue = new String(sql, offsetCache, sizeCache);
            token       = MySQLToken.USR_VAR;
        }
コード例 #11
0
        protected void ScanString()
        {
            bool dq = false;

            if (ch == '\'')
            {
            }
            else if (ch == '"')
            {
                dq = true;
            }
            else
            {
                throw new ArgumentException("first char must be \" or '");
            }

            offsetCache = curIndex;
            int size = 1;

            sbuf[0] = '\'';
            if (dq)
            {
                while (true)
                {
                    switch (ScanChar())
                    {
                    case '\'':
                        PutChar('\\', size++);
                        PutChar('\'', size++);
                        break;

                    case '\\':
                        PutChar('\\', size++);
                        PutChar(ScanChar(), size++);
                        continue;

                    case '"':
                        if (sql[curIndex + 1] == '"')
                        {
                            PutChar('"', size++);
                            ScanChar();
                            continue;
                        }
                        PutChar('\'', size++);
                        ScanChar();
                        goto label1;

                    default:
                        if (IsEof())
                        {
                            throw new ArgumentException("unclosed string");
                        }
                        PutChar(ch, size++);
                        continue;
                    }
                }
label1:
                ;
            }
            else
            {
                while (true)
                {
                    switch (ScanChar())
                    {
                    case '\\':
                        PutChar('\\', size++);
                        PutChar(ScanChar(), size++);
                        continue;

                    case '\'':
                        if (sql[curIndex + 1] == '\'')
                        {
                            PutChar('\\', size++);
                            PutChar(ScanChar(), size++);
                            continue;
                        }
                        PutChar('\'', size++);
                        ScanChar();
                        goto label2;

                    default:
                        if (IsEof())
                        {
                            throw new ArgumentException("unclosed string");
                        }
                        PutChar(ch, size++);
                        continue;
                    }
                }
label2:
                ;
            }
            sizeCache   = size;
            stringValue = new String(sbuf, 0, size);
            token       = MySQLToken.LITERAL_CHARS;
        }
コード例 #12
0
        protected void ScanNumber()
        {
            offsetCache = curIndex;
            sizeCache   = 1;

            bool fstDot = ch == '.';
            bool dot    = fstDot;
            bool sign   = false;
            int  state  = fstDot ? 1 : 0;

            for (; ScanChar() != MySQLLexer.EOI; ++sizeCache)
            {
                switch (state)
                {
                case 0:
                    if (CharTypes.IsDigit(ch))
                    {
                    }
                    else if (ch == '.')
                    {
                        dot   = true;
                        state = 1;
                    }
                    else if (ch == 'e' || ch == 'E')
                    {
                        state = 3;
                    }
                    else if (CharTypes.IsIdentifierChar(ch))
                    {
                        ScanIdentifierFromNumber(offsetCache, sizeCache);
                        return;
                    }
                    else
                    {
                        token = MySQLToken.LITERAL_NUM_PURE_DIGIT;
                        return;
                    }
                    break;

                case 1:
                    if (CharTypes.IsDigit(ch))
                    {
                        state = 2;
                    }
                    else if (ch == 'e' || ch == 'E')
                    {
                        state = 3;
                    }
                    else if (CharTypes.IsIdentifierChar(ch) && fstDot)
                    {
                        sizeCache = 1;
                        ch        = sql[curIndex = offsetCache + 1];
                        token     = MySQLToken.PUNC_DOT;
                        return;
                    }
                    else
                    {
                        token = MySQLToken.LITERAL_NUM_MIX_DIGIT;
                        return;
                    }
                    break;

                case 2:
                    if (CharTypes.IsDigit(ch))
                    {
                    }
                    else if (ch == 'e' || ch == 'E')
                    {
                        state = 3;
                    }
                    else if (CharTypes.IsIdentifierChar(ch) && fstDot)
                    {
                        sizeCache = 1;
                        ch        = sql[curIndex = offsetCache + 1];
                        token     = MySQLToken.PUNC_DOT;
                        return;
                    }
                    else
                    {
                        token = MySQLToken.LITERAL_NUM_MIX_DIGIT;
                        return;
                    }
                    break;

                case 3:
                    if (CharTypes.IsDigit(ch))
                    {
                        state = 5;
                    }
                    else if (ch == '+' || ch == '-')
                    {
                        sign  = true;
                        state = 4;
                    }
                    else if (fstDot)
                    {
                        sizeCache = 1;
                        ch        = sql[curIndex = offsetCache + 1];
                        token     = MySQLToken.PUNC_DOT;
                        return;
                    }
                    else if (!dot)
                    {
                        if (CharTypes.IsIdentifierChar(ch))
                        {
                            ScanIdentifierFromNumber(offsetCache, sizeCache);
                        }
                        else
                        {
                            UpdateStringValue(sql, offsetCache, sizeCache);
                            MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase);
                            token = tok == null ? MySQLToken.IDENTIFIER : tok;
                        }
                        return;
                    }
                    else
                    {
                        throw new ArgumentException("invalid char after '.' and 'e' for as part of number: " + ch);
                    }
                    break;

                case 4:
                    if (CharTypes.IsDigit(ch))
                    {
                        state = 5;
                        break;
                    }
                    else if (fstDot)
                    {
                        sizeCache = 1;
                        ch        = sql[curIndex = offsetCache + 1];
                        token     = MySQLToken.PUNC_DOT;
                    }
                    else if (!dot)
                    {
                        ch = sql[--curIndex];
                        --sizeCache;
                        UpdateStringValue(sql, offsetCache, sizeCache);
                        MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase);
                        token = tok == null ? MySQLToken.IDENTIFIER : tok;
                    }
                    else
                    {
                        throw new ArgumentException("expect digit char after SIGN for 'e': " + ch);
                    }
                    return;

                case 5:
                    if (CharTypes.IsDigit(ch))
                    {
                        break;
                    }
                    else if (CharTypes.IsIdentifierChar(ch))
                    {
                        if (fstDot)
                        {
                            sizeCache = 1;
                            ch        = sql[curIndex = offsetCache + 1];
                            token     = MySQLToken.PUNC_DOT;
                        }
                        else if (!dot)
                        {
                            if (sign)
                            {
                                ch = sql[curIndex = offsetCache];
                                ScanIdentifierFromNumber(curIndex, 0);
                            }
                            else
                            {
                                ScanIdentifierFromNumber(offsetCache, sizeCache);
                            }
                        }
                        else
                        {
                            token = MySQLToken.LITERAL_NUM_MIX_DIGIT;
                        }
                    }
                    else
                    {
                        token = MySQLToken.LITERAL_NUM_MIX_DIGIT;
                    }
                    return;
                }
            }

            switch (state)
            {
            case 0:
                token = MySQLToken.LITERAL_NUM_PURE_DIGIT;
                return;

            case 1:
                if (fstDot)
                {
                    token = MySQLToken.PUNC_DOT;
                    return;
                }
                break;

            case 2:
            case 5:
                token = MySQLToken.LITERAL_NUM_MIX_DIGIT;
                return;

            case 3:
                if (fstDot)
                {
                    sizeCache = 1;
                    ch        = sql[curIndex = offsetCache + 1];
                    token     = MySQLToken.PUNC_DOT;
                }
                else if (!dot)
                {
                    UpdateStringValue(sql, offsetCache, sizeCache);
                    MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase);
                    token = tok == null ? MySQLToken.IDENTIFIER : tok;
                }
                else
                {
                    throw new ArgumentException("expect digit char after SIGN for 'e': " + ch);
                }
                return;

            case 4:
                if (fstDot)
                {
                    sizeCache = 1;
                    ch        = sql[curIndex = offsetCache + 1];
                    token     = MySQLToken.PUNC_DOT;
                }
                else if (!dot)
                {
                    ch = sql[--curIndex];
                    --sizeCache;
                    UpdateStringValue(sql, offsetCache, sizeCache);
                    MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase);
                    token = tok == null ? MySQLToken.IDENTIFIER : tok;
                }
                else
                {
                    throw new ArgumentException("expect digit char after SIGN for 'e': " + ch);
                }
                return;
            }
        }
コード例 #13
0
        public static string ToValue(this MySQLToken token)
        {
            switch (token)
            {
            case MySQLToken.KW_ACCESSIBLE:
                return("ACCESSIBLE");

            case MySQLToken.KW_ADD:
                return("ADD");

            case MySQLToken.KW_ALL:
                return("ALL");

            case MySQLToken.KW_ALTER:
                return("ALTER");

            case MySQLToken.KW_ANALYZE:
                return("ANALYZE");

            case MySQLToken.KW_AND:
                return("AND");

            case MySQLToken.KW_AS:
                return("AS");

            case MySQLToken.KW_ASC:
                return("ASC");

            case MySQLToken.KW_ASENSITIVE:
                return("ASENSITIVE");

            case MySQLToken.KW_BEFORE:
                return("BEFORE");

            case MySQLToken.KW_BETWEEN:
                return("BETWEEN");

            case MySQLToken.KW_BIGINT:
                return("BIGINT");

            case MySQLToken.KW_BINARY:
                return("BINARY");

            case MySQLToken.KW_BLOB:
                return("BLOB");

            case MySQLToken.KW_BOTH:
                return("BOTH");

            case MySQLToken.KW_BY:
                return("BY");

            case MySQLToken.KW_CALL:
                return("CALL");

            case MySQLToken.KW_CASCADE:
                return("CASCADE");

            case MySQLToken.KW_CASE:
                return("CASE");

            case MySQLToken.KW_CHANGE:
                return("CHANGE");

            case MySQLToken.KW_CHAR:
                return("CHAR");

            case MySQLToken.KW_CHARACTER:
                return("CHARACTER");

            case MySQLToken.KW_CHECK:
                return("CHECK");

            case MySQLToken.KW_COLLATE:
                return("COLLATE");

            case MySQLToken.KW_COLUMN:
                return("COLUMN");

            case MySQLToken.KW_CONDITION:
                return("CONDITION");

            case MySQLToken.KW_CONSTRAINT:
                return("CONSTRAINT");

            case MySQLToken.KW_CONTINUE:
                return("CONTINUE");

            case MySQLToken.KW_CONVERT:
                return("CONVERT");

            case MySQLToken.KW_CREATE:
                return("CREATE");

            case MySQLToken.KW_CROSS:
                return("CROSS");

            case MySQLToken.KW_CURRENT_DATE:
                return("CURRENT_DATE");

            case MySQLToken.KW_CURRENT_TIME:
                return("CURRENT_TIME");

            case MySQLToken.KW_CURRENT_TIMESTAMP:
                return("CURRENT_TIMESTAMP");

            case MySQLToken.KW_CURRENT_USER:
                return("CURRENT_USER");

            case MySQLToken.KW_CURSOR:
                return("CURSOR");

            case MySQLToken.KW_DATABASE:
                return("DATABASE");

            case MySQLToken.KW_DATABASES:
                return("DATABASES");

            case MySQLToken.KW_DAY_HOUR:
                return("DAY_HOUR");

            case MySQLToken.KW_DAY_MICROSECOND:
                return("DAY_MICROSECOND");

            case MySQLToken.KW_DAY_MINUTE:
                return("DAY_MINUTE");

            case MySQLToken.KW_DAY_SECOND:
                return("DAY_SECOND");

            case MySQLToken.KW_DEC:
                return("DEC");

            case MySQLToken.KW_DECIMAL:
                return("DECIMAL");

            case MySQLToken.KW_DECLARE:
                return("DECLARE");

            case MySQLToken.KW_DEFAULT:
                return("DEFAULT");

            case MySQLToken.KW_DELAYED:
                return("DELAYED");

            case MySQLToken.KW_DELETE:
                return("DELETE");

            case MySQLToken.KW_DESC:
                return("DESC");

            case MySQLToken.KW_DESCRIBE:
                return("DESCRIBE");

            case MySQLToken.KW_DETERMINISTIC:
                return("DETERMINISTIC");

            case MySQLToken.KW_DISTINCT:
                return("DISTINCT");

            case MySQLToken.KW_DISTINCTROW:
                return("DISTINCTROW");

            case MySQLToken.KW_DIV:
                return("DIV");

            case MySQLToken.KW_DOUBLE:
                return("DOUBLE");

            case MySQLToken.KW_DROP:
                return("DROP");

            case MySQLToken.KW_DUAL:
                return("DUAL");

            case MySQLToken.KW_EACH:
                return("EACH");

            case MySQLToken.KW_ELSE:
                return("ELSE");

            case MySQLToken.KW_ELSEIF:
                return("ELSEIF");

            case MySQLToken.KW_ENCLOSED:
                return("ENCLOSED");

            case MySQLToken.KW_ESCAPED:
                return("ESCAPED");

            case MySQLToken.KW_EXISTS:
                return("EXISTS");

            case MySQLToken.KW_EXIT:
                return("EXIT");

            case MySQLToken.KW_EXPLAIN:
                return("EXPLAIN");

            case MySQLToken.KW_FETCH:
                return("FETCH");

            case MySQLToken.KW_FLOAT:
                return("FLOAT");

            case MySQLToken.KW_FLOAT4:
                return("FLOAT4");

            case MySQLToken.KW_FLOAT8:
                return("FLOAT8");

            case MySQLToken.KW_FOR:
                return("FOR");

            case MySQLToken.KW_FORCE:
                return("FORCE");

            case MySQLToken.KW_FOREIGN:
                return("FOREIGN");

            case MySQLToken.KW_FROM:
                return("FROM");

            case MySQLToken.KW_FULLTEXT:
                return("FULLTEXT");

            case MySQLToken.KW_GENERAL:
                return("GENERAL");

            case MySQLToken.KW_GRANT:
                return("GRANT");

            case MySQLToken.KW_GROUP:
                return("GROUP");

            case MySQLToken.KW_HAVING:
                return("HAVING");

            case MySQLToken.KW_HIGH_PRIORITY:
                return("HIGH_PRIORITY");

            case MySQLToken.KW_HOUR_MICROSECOND:
                return("HOUR_MICROSECOND");

            case MySQLToken.KW_HOUR_MINUTE:
                return("HOUR_MINUTE");

            case MySQLToken.KW_HOUR_SECOND:
                return("HOUR_SECOND");

            case MySQLToken.KW_IF:
                return("IF");

            case MySQLToken.KW_IGNORE:
                return("IGNORE");

            case MySQLToken.KW_IGNORE_SERVER_IDS:
                return("IGNORE_SERVER_IDS");

            case MySQLToken.KW_IN:
                return("IN");

            case MySQLToken.KW_INDEX:
                return("INDEX");

            case MySQLToken.KW_INFILE:
                return("INFILE");

            case MySQLToken.KW_INNER:
                return("INNER");

            case MySQLToken.KW_INOUT:
                return("INOUT");

            case MySQLToken.KW_INSENSITIVE:
                return("INSENSITIVE");

            case MySQLToken.KW_INSERT:
                return("INSERT");

            case MySQLToken.KW_INT:
                return("INT");

            case MySQLToken.KW_INT1:
                return("INT1");

            case MySQLToken.KW_INT2:
                return("INT2");

            case MySQLToken.KW_INT3:
                return("INT3");

            case MySQLToken.KW_INT4:
                return("INT4");

            case MySQLToken.KW_INT8:
                return("INT8");

            case MySQLToken.KW_INTEGER:
                return("INTEGER");

            case MySQLToken.KW_INTERVAL:
                return("INTERVAL");

            case MySQLToken.KW_INTO:
                return("INTO");

            case MySQLToken.KW_IS:
                return("IS");

            case MySQLToken.KW_ITERATE:
                return("ITERATE");

            case MySQLToken.KW_JOIN:
                return("JOIN");

            case MySQLToken.KW_KEY:
                return("KEY");

            case MySQLToken.KW_KEYS:
                return("KEYS");

            case MySQLToken.KW_KILL:
                return("KILL");

            case MySQLToken.KW_LEADING:
                return("LEADING");

            case MySQLToken.KW_LEAVE:
                return("LEAVE");

            case MySQLToken.KW_LEFT:
                return("LEFT");

            case MySQLToken.KW_LIKE:
                return("LIKE");

            case MySQLToken.KW_LIMIT:
                return("LIMIT");

            case MySQLToken.KW_LINEAR:
                return("LINEAR");

            case MySQLToken.KW_LINES:
                return("LINES");

            case MySQLToken.KW_LOAD:
                return("LOAD");

            case MySQLToken.KW_LOCALTIME:
                return("LOCALTIME");

            case MySQLToken.KW_LOCALTIMESTAMP:
                return("LOCALTIMESTAMP");

            case MySQLToken.KW_LOCK:
                return("LOCK");

            case MySQLToken.KW_LONG:
                return("LONG");

            case MySQLToken.KW_LONGBLOB:
                return("LONGBLOB");

            case MySQLToken.KW_LONGTEXT:
                return("LONGTEXT");

            case MySQLToken.KW_LOOP:
                return("LOOP");

            case MySQLToken.KW_LOW_PRIORITY:
                return("LOW_PRIORITY");

            case MySQLToken.KW_MASTER_HEARTBEAT_PERIOD:
                return("MASTER_HEARTBEAT_PERIOD");

            case MySQLToken.KW_MASTER_SSL_VERIFY_SERVER_CERT:
                return("MASTER_SSL_VERIFY_SERVER_CERT");

            case MySQLToken.KW_MATCH:
                return("MATCH");

            case MySQLToken.KW_MAXVALUE:
                return("MAXVALUE");

            case MySQLToken.KW_MEDIUMBLOB:
                return("MEDIUMBLOB");

            case MySQLToken.KW_MEDIUMINT:
                return("MEDIUMINT");

            case MySQLToken.KW_MEDIUMTEXT:
                return("MEDIUMTEXT");

            case MySQLToken.KW_MIDDLEINT:
                return("MIDDLEINT");

            case MySQLToken.KW_MINUTE_MICROSECOND:
                return("MINUTE_MICROSECOND");

            case MySQLToken.KW_MINUTE_SECOND:
                return("MINUTE_SECOND");

            case MySQLToken.KW_MOD:
                return("MOD");

            case MySQLToken.KW_MODIFIES:
                return("MODIFIES");

            case MySQLToken.KW_NATURAL:
                return("NATURAL");

            case MySQLToken.KW_NOT:
                return("NOT");

            case MySQLToken.KW_NO_WRITE_TO_BINLOG:
                return("NO_WRITE_TO_BINLOG");

            case MySQLToken.KW_NUMERIC:
                return("NUMERIC");

            case MySQLToken.KW_ON:
                return("ON");

            case MySQLToken.KW_OPTIMIZE:
                return("OPTIMIZE");

            case MySQLToken.KW_OPTION:
                return("OPTION");

            case MySQLToken.KW_OPTIONALLY:
                return("OPTIONALLY");

            case MySQLToken.KW_OR:
                return("OR");

            case MySQLToken.KW_ORDER:
                return("ORDER");

            case MySQLToken.KW_OUT:
                return("OUT");

            case MySQLToken.KW_OUTER:
                return("OUTER");

            case MySQLToken.KW_OUTFILE:
                return("OUTFILE");

            case MySQLToken.KW_PRECISION:
                return("PRECISION");

            case MySQLToken.KW_PRIMARY:
                return("PRIMARY");

            case MySQLToken.KW_PROCEDURE:
                return("PROCEDURE");

            case MySQLToken.KW_PURGE:
                return("PURGE");

            case MySQLToken.KW_RANGE:
                return("RANGE");

            case MySQLToken.KW_READ:
                return("READ");

            case MySQLToken.KW_READS:
                return("READS");

            case MySQLToken.KW_READ_WRITE:
                return("READ_WRITE");

            case MySQLToken.KW_REAL:
                return("REAL");

            case MySQLToken.KW_REFERENCES:
                return("REFERENCES");

            case MySQLToken.KW_REGEXP:
                return("REGEXP");

            case MySQLToken.KW_RELEASE:
                return("RELEASE");

            case MySQLToken.KW_RENAME:
                return("RENAME");

            case MySQLToken.KW_REPEAT:
                return("REPEAT");

            case MySQLToken.KW_REPLACE:
                return("REPLACE");

            case MySQLToken.KW_REQUIRE:
                return("REQUIRE");

            case MySQLToken.KW_RESIGNAL:
                return("RESIGNAL");

            case MySQLToken.KW_RESTRICT:
                return("RESTRICT");

            case MySQLToken.KW_RETURN:
                return("RETURN");

            case MySQLToken.KW_REVOKE:
                return("REVOKE");

            case MySQLToken.KW_RIGHT:
                return("RIGHT");

            case MySQLToken.KW_RLIKE:
                return("RLIKE");

            case MySQLToken.KW_SCHEMA:
                return("SCHEMA");

            case MySQLToken.KW_SCHEMAS:
                return("SCHEMAS");

            case MySQLToken.KW_SECOND_MICROSECOND:
                return("SECOND_MICROSECOND");

            case MySQLToken.KW_SELECT:
                return("SELECT");

            case MySQLToken.KW_SENSITIVE:
                return("SENSITIVE");

            case MySQLToken.KW_SEPARATOR:
                return("SEPARATOR");

            case MySQLToken.KW_SET:
                return("SET");

            case MySQLToken.KW_SHOW:
                return("SHOW");

            case MySQLToken.KW_SIGNAL:
                return("SIGNAL");

            case MySQLToken.KW_SLOW:
                return("SLOW");

            case MySQLToken.KW_SMALLINT:
                return("SMALLINT");

            case MySQLToken.KW_SPATIAL:
                return("SPATIAL");

            case MySQLToken.KW_SPECIFIC:
                return("SPECIFIC");

            case MySQLToken.KW_SQL:
                return("SQL");

            case MySQLToken.KW_SQLEXCEPTION:
                return("SQLEXCEPTION");

            case MySQLToken.KW_SQLSTATE:
                return("SQLSTATE");

            case MySQLToken.KW_SQLWARNING:
                return("SQLWARNING");

            case MySQLToken.KW_SQL_BIG_RESULT:
                return("SQL_BIG_RESULT");

            case MySQLToken.KW_SQL_CALC_FOUND_ROWS:
                return("SQL_CALC_FOUND_ROWS");

            case MySQLToken.KW_SQL_SMALL_RESULT:
                return("SQL_SMALL_RESULT");

            case MySQLToken.KW_SSL:
                return("SSL");

            case MySQLToken.KW_STARTING:
                return("STARTING");

            case MySQLToken.KW_STRAIGHT_JOIN:
                return("STRAIGHT_JOIN");

            case MySQLToken.KW_TABLE:
                return("TABLE");

            case MySQLToken.KW_TERMINATED:
                return("TERMINATED");

            case MySQLToken.KW_THEN:
                return("THEN");

            case MySQLToken.KW_TINYBLOB:
                return("TINYBLOB");

            case MySQLToken.KW_TINYINT:
                return("TINYINT");

            case MySQLToken.KW_TINYTEXT:
                return("TINYTEXT");

            case MySQLToken.KW_TO:
                return("TO");

            case MySQLToken.KW_TRAILING:
                return("TRAILING");

            case MySQLToken.KW_TRIGGER:
                return("TRIGGER");

            case MySQLToken.KW_UNDO:
                return("UNDO");

            case MySQLToken.KW_UNION:
                return("UNION");

            case MySQLToken.KW_UNIQUE:
                return("UNIQUE");

            case MySQLToken.KW_UNLOCK:
                return("UNLOCK");

            case MySQLToken.KW_UNSIGNED:
                return("UNSIGNED");

            case MySQLToken.KW_UPDATE:
                return("UPDATE");

            case MySQLToken.KW_USAGE:
                return("USAGE");

            case MySQLToken.KW_USE:
                return("USE");

            case MySQLToken.KW_USING:
                return("USING");

            case MySQLToken.KW_UTC_DATE:
                return("UTC_DATE");

            case MySQLToken.KW_UTC_TIME:
                return("UTC_TIME");

            case MySQLToken.KW_UTC_TIMESTAMP:
                return("UTC_TIMESTAMP");

            case MySQLToken.KW_VALUES:
                return("VALUES");

            case MySQLToken.KW_VARBINARY:
                return("VARBINARY");

            case MySQLToken.KW_VARCHAR:
                return("VARCHAR");

            case MySQLToken.KW_VARCHARACTER:
                return("VARCHARACTER");

            case MySQLToken.KW_VARYING:
                return("VARYING");

            case MySQLToken.KW_WHEN:
                return("WHEN");

            case MySQLToken.KW_WHERE:
                return("WHERE");

            case MySQLToken.KW_WHILE:
                return("WHILE");

            case MySQLToken.KW_WITH:
                return("WITH");

            case MySQLToken.KW_WRITE:
                return("WRITE");

            case MySQLToken.KW_XOR:
                return("XOR");

            case MySQLToken.KW_YEAR_MONTH:
                return("YEAR_MONTH");

            case MySQLToken.KW_ZEROFILL:
                return("ZEROFILL");

            default:
                throw new ArgumentException("token is not keyword: " + token);
            }
        }
コード例 #14
0
        private SelectStatement.SelectOption SelectOption()
        {
            SelectStatement.SelectOption option = new SelectStatement.SelectOption();
            MySQLToken token = MySQLToken.NONE;

            for (; ; lexer.NextToken())
            {
                token = lexer.Token();
                if (token == MySQLToken.KW_ALL)
                {
                    option.resultDup = SelectStatement.SelectDuplicationStrategy.All;
                }
                else if (token == MySQLToken.KW_DISTINCT)
                {
                    option.resultDup = SelectStatement.SelectDuplicationStrategy.Distinct;
                }
                else if (token == MySQLToken.KW_DISTINCTROW)
                {
                    option.resultDup = SelectStatement.SelectDuplicationStrategy.DistinctRow;
                }
                else if (token == MySQLToken.KW_HIGH_PRIORITY)
                {
                    option.highPriority = true;
                }
                else if (token == MySQLToken.KW_STRAIGHT_JOIN)
                {
                    option.straightJoin = true;
                }
                else if (token == MySQLToken.KW_SQL_SMALL_RESULT)
                {
                    option.resultSize = SelectStatement.SmallOrBigResult.SqlSmallResult;
                }
                else if (token == MySQLToken.KW_SQL_BIG_RESULT)
                {
                    option.resultSize = SelectStatement.SmallOrBigResult.SqlBigResult;
                }
                else if (token == MySQLToken.KW_SQL_CALC_FOUND_ROWS)
                {
                    option.sqlCalcFoundRows = true;
                }
                else if (token == MySQLToken.IDENTIFIER)
                {
                    string            optionStringUp = lexer.StringValueUppercase;
                    SpecialIdentifier specialId      = SpecialIdentifier.SqlBufferResult;
                    if (Enum.TryParse <SpecialIdentifier>(optionStringUp, out specialId))
                    {
                        switch (specialId)
                        {
                        case SpecialIdentifier.SqlBufferResult:
                            if (option.sqlBufferResult)
                            {
                                return(option);
                            }
                            option.sqlBufferResult = true;
                            break;

                        case SpecialIdentifier.SqlCache:
                            if (option.queryCache != SelectStatement.QueryCacheStrategy.Undefine)
                            {
                                return(option);
                            }
                            option.queryCache = SelectStatement.QueryCacheStrategy.SqlCache;
                            break;

                        case SpecialIdentifier.SqlNoCache:
                            if (option.queryCache != SelectStatement.QueryCacheStrategy.Undefine)
                            {
                                return(option);
                            }
                            option.queryCache = SelectStatement.QueryCacheStrategy.SqlNoCache;
                            break;
                        }
                    }
                }
                else
                {
                    return(option);
                }
            }
        }