Example #1
0
        /// <exception cref="System.SqlSyntaxErrorException" />
        protected virtual void ScanString()
        {
            var dq = false;
            if (ch == '\'')
            {
            }
            else
            {
                if (ch == '"')
                {
                    dq = true;
                }
                else
                {
                    throw Err("first char must be \" or '");
                }
            }
            offsetCache = curIndex;
            var 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 loop_break;
                        }

                        default:
                        {
                            if (Eof())
                            {
                                throw Err("unclosed string");
                            }
                            PutChar(ch, size++);
                            continue;
                        }
                    }
                    // loop_continue:;
                }
                loop_break:
                ;
            }
            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 loop_break;
                        }

                        default:
                        {
                            if (Eof())
                            {
                                throw Err("unclosed string");
                            }
                            PutChar(ch, size++);
                            continue;
                        }
                    }
                    //loop_continue:;
                }
                loop_break:
                ;
            }
            sizeCache = size;
            stringValue = new string(sbuf, 0, size);
            token = MySqlToken.LiteralChars;
        }
Example #2
0
 /// <param name="quoteMode">
 ///     if false: first <code>0x</code> has been skipped; if
 ///     true: first <code>x'</code> has been skipped
 /// </param>
 /// <exception cref="System.SqlSyntaxErrorException" />
 protected virtual void ScanHexaDecimal(bool quoteMode)
 {
     offsetCache = curIndex;
     for (; CharTypes.IsHex(ch); ScanChar())
     {
     }
     sizeCache = curIndex - offsetCache;
     // if (sizeCache <= 0) {
     // throw err("expect at least one hexdigit");
     // }
     if (quoteMode)
     {
         if (ch != '\'')
         {
             throw Err("invalid char for hex: " + ch);
         }
         ScanChar();
     }
     else
     {
         if (CharTypes.IsIdentifierChar(ch))
         {
             ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2);
             return;
         }
     }
     token = MySqlToken.LiteralHex;
 }
Example #3
0
        /// <summary>first <code>@</code> is included</summary>
        /// <exception cref="System.SqlSyntaxErrorException" />
        protected virtual void ScanUserVariable()
        {
            if (ch != '@')
            {
                throw Err("first char must be @");
            }
            offsetCache = curIndex;
            sizeCache = 1;
            var dq = false;
            switch (ScanChar())
            {
                case '"':
                {
                    dq = true;
                    goto case '\'';
                }

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

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

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

                case '`':
                {
                    for (++sizeCache;; ++sizeCache)
                    {
                        switch (ScanChar())
                        {
                            case '`':
                            {
                                ++sizeCache;
                                if (ScanChar() == '`')
                                {
                                    break;
                                }
                                goto loop1_break;
                            }
                        }
                        //loop1_continue:;
                    }
                    loop1_break:
                    ;
                    break;
                }

                default:
                {
                    for (; CharTypes.IsIdentifierChar(ch) || ch == '.'; ++sizeCache)
                    {
                        ScanChar();
                    }
                    break;
                }
            }
            stringValue = new string(sql, offsetCache, sizeCache);
            token = MySqlToken.UsrVar;
        }
Example #4
0
 /// <summary>first <code>@@</code> is included</summary>
 /// <exception cref="System.SqlSyntaxErrorException" />
 protected virtual void ScanSystemVariable()
 {
     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.SysVar;
 }
Example #5
0
        /// <exception cref="System.SqlSyntaxErrorException" />
        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;
                        }
                    }
                    goto case '1';
                }

                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.PuncDot;
                    }
                    return token;
                }

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

                case 'n':
                case 'N':
                {
                    if (sql[curIndex + 1] == '\'')
                    {
                        ScanChar();
                        ScanString();
                        token = MySqlToken.LiteralNchars;
                        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.QuestionMark;
                    ++paramIndex;
                    return token;
                }

                case '(':
                {
                    ScanChar();
                    token = MySqlToken.PuncLeftParen;
                    return token;
                }

                case ')':
                {
                    ScanChar();
                    token = MySqlToken.PuncRightParen;
                    return token;
                }

                case '[':
                {
                    ScanChar();
                    token = MySqlToken.PuncLeftBracket;
                    return token;
                }

                case ']':
                {
                    ScanChar();
                    token = MySqlToken.PuncRightBracket;
                    return token;
                }

                case '{':
                {
                    ScanChar();
                    token = MySqlToken.PuncLeftBrace;
                    return token;
                }

                case '}':
                {
                    ScanChar();
                    token = MySqlToken.PuncRightBrace;
                    return token;
                }

                case ',':
                {
                    ScanChar();
                    token = MySqlToken.PuncComma;
                    return token;
                }

                case ';':
                {
                    ScanChar();
                    token = MySqlToken.PuncSemicolon;
                    return token;
                }

                case ':':
                {
                    if (sql[curIndex + 1] == '=')
                    {
                        ScanChar(2);
                        token = MySqlToken.OpAssign;
                        return token;
                    }
                    ScanChar();
                    token = MySqlToken.PuncColon;
                    return token;
                }

                case '=':
                {
                    ScanChar();
                    token = MySqlToken.OpEquals;
                    return token;
                }

                case '~':
                {
                    ScanChar();
                    token = MySqlToken.OpTilde;
                    return token;
                }

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

                case '-':
                {
                    ScanChar();
                    token = MySqlToken.OpMinus;
                    return token;
                }

                case '+':
                {
                    ScanChar();
                    token = MySqlToken.OpPlus;
                    return token;
                }

                case '^':
                {
                    ScanChar();
                    token = MySqlToken.OpCaret;
                    return token;
                }

                case '/':
                {
                    ScanChar();
                    token = MySqlToken.OpSlash;
                    return token;
                }

                case '%':
                {
                    ScanChar();
                    token = MySqlToken.OpPercent;
                    return token;
                }

                case '&':
                {
                    if (sql[curIndex + 1] == '&')
                    {
                        ScanChar(2);
                        token = MySqlToken.OpLogicalAnd;
                        return token;
                    }
                    ScanChar();
                    token = MySqlToken.OpAmpersand;
                    return token;
                }

                case '|':
                {
                    if (sql[curIndex + 1] == '|')
                    {
                        ScanChar(2);
                        token = MySqlToken.OpLogicalOr;
                        return token;
                    }
                    ScanChar();
                    token = MySqlToken.OpVerticalBar;
                    return token;
                }

                case '!':
                {
                    if (sql[curIndex + 1] == '=')
                    {
                        ScanChar(2);
                        token = MySqlToken.OpNotEquals;
                        return token;
                    }
                    ScanChar();
                    token = MySqlToken.OpExclamation;
                    return token;
                }

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

                        case '>':
                        {
                            ScanChar(2);
                            token = MySqlToken.OpRightShift;
                            return token;
                        }

                        default:
                        {
                            ScanChar();
                            token = MySqlToken.OpGreaterThan;
                            return token;
                        }
                    }
                    //goto case '<';
                }

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

                        case '>':
                        {
                            ScanChar(2);
                            token = MySqlToken.OpLessOrGreater;
                            return token;
                        }

                        case '<':
                        {
                            ScanChar(2);
                            token = MySqlToken.OpLeftShift;
                            return token;
                        }

                        default:
                        {
                            ScanChar();
                            token = MySqlToken.OpLessThan;
                            return token;
                        }
                    }
                    //goto case '`';
                }

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

                default:
                {
                    if (CharTypes.IsIdentifierChar(ch))
                    {
                        ScanIdentifier();
                    }
                    else
                    {
                        if (Eof())
                        {
                            token = MySqlToken.Eof;
                            curIndex = eofIndex;
                        }
                        else
                        {
                            // tokenPos = curIndex;
                            throw Err("unsupported character: " + ch);
                        }
                    }
                    return token;
                }
            }
        }
Example #6
0
 /// <exception cref="System.SqlSyntaxErrorException" />
 public MySqlToken NextToken()
 {
     if (tokenCache2 != MySqlToken.None)
     {
         tokenCache2 = MySqlToken.None;
         return tokenCache;
     }
     if (tokenCache != MySqlToken.None)
     {
         tokenCache = MySqlToken.None;
         return token;
     }
     if (token == MySqlToken.Eof)
     {
         throw new SqlSyntaxErrorException("eof for sql is already reached, cannot get new token");
     }
     MySqlToken t;
     do
     {
         SkipSeparator();
         t = NextTokenInternal();
     } while (inCStyleComment && inCStyleCommentIgnore || MySqlToken.PuncCStyleCommentEnd
              == t);
     return t;
 }
Example #7
0
 /// <summary>id is included in <code>`</code>.</summary>
 /// <remarks>id is included in <code>`</code>. first <code>`</code> is included</remarks>
 /// <exception cref="System.SqlSyntaxErrorException" />
 protected virtual void ScanIdentifierWithAccent()
 {
     offsetCache = curIndex;
     for (; ScanChar() != Eoi;)
     {
         if (ch == '`' && ScanChar() != '`')
         {
             break;
         }
     }
     UpdateStringValue(sql, offsetCache, sizeCache = curIndex - offsetCache);
     token = MySqlToken.Identifier;
 }
Example #8
0
 /// <param name="token">must be a keyword</param>
 public void AddCacheToke(MySqlToken token)
 {
     if (tokenCache != MySqlToken.None)
     {
         tokenCache2 = token;
     }
     else
     {
         tokenCache = token;
     }
 }
Example #9
0
 /// <summary>not Sql syntax</summary>
 /// <exception cref="System.SqlSyntaxErrorException" />
 protected virtual void ScanPlaceHolder()
 {
     offsetCache = curIndex + 1;
     sizeCache = 0;
     for (ScanChar(); ch != '}' && !Eof(); ++sizeCache)
     {
         ScanChar();
     }
     if (ch == '}')
     {
         ScanChar();
     }
     UpdateStringValue(sql, offsetCache, sizeCache);
     token = MySqlToken.PlaceHolder;
 }
Example #10
0
 /// <summary>
 ///     NOTE:
 ///     <see cref="MySqlToken.Identifier">id</see>
 ///     dosn't include <code>'.'</code>
 ///     for sake of performance issue (based on <i>shaojin.wensj</i>'s design).
 ///     However, it is not convenient for MySql compatibility. e.g.
 ///     <code>".123f"</code> will be regarded as <code>".123"</code> and
 ///     <code>"f"</code> in MySql, but in this
 ///     <see cref="MySqlLexer" />
 ///     , it will be
 ///     <code>"."</code> and <code>"123f"</code> because <code>".123f"</code> may
 ///     be part of <code>"db1.123f"</code> and <code>"123f"</code> is the table
 ///     name.
 /// </summary>
 /// <param name="initSize">how many char has already been consumed</param>
 /// <exception cref="System.SqlSyntaxErrorException" />
 private void ScanIdentifierFromNumber(int initOffset, int initSize)
 {
     offsetCache = initOffset;
     sizeCache = initSize;
     for (; CharTypes.IsIdentifierChar(ch); ++sizeCache)
     {
         ScanChar();
     }
     UpdateStringValue(sql, offsetCache, sizeCache);
     var tok = keywods.GetKeyword(stringValueUppercase);
     token = tok == MySqlToken.None ? MySqlToken.Identifier : tok;
 }
Example #11
0
        /// <summary>
        ///     if first char is <code>.</code>, token may be
        ///     <see cref="MySqlToken.PuncDot" />
        ///     if invalid char is presented after <code>.</code>
        /// </summary>
        /// <exception cref="System.SqlSyntaxErrorException" />
        protected virtual void ScanNumber()
        {
            offsetCache = curIndex;
            sizeCache = 1;
            var fstDot = ch == '.';
            var dot = fstDot;
            var sign = false;
            var state = fstDot ? 1 : 0;
            for (; ScanChar() != 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;
                                    }
                                    token = MySqlToken.LiteralNumPureDigit;
                                    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.PuncDot;
                                    return;
                                }
                                token = MySqlToken.LiteralNumMixDigit;
                                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.PuncDot;
                                    return;
                                }
                                token = MySqlToken.LiteralNumMixDigit;
                                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.PuncDot;
                                    return;
                                }
                                if (!dot)
                                {
                                    if (CharTypes.IsIdentifierChar(ch))
                                    {
                                        ScanIdentifierFromNumber(offsetCache, sizeCache);
                                    }
                                    else
                                    {
                                        UpdateStringValue(sql, offsetCache, sizeCache);
                                        var tok = keywods.GetKeyword(stringValueUppercase);
                                        token = tok == MySqlToken.None ? MySqlToken.Identifier : tok;
                                    }
                                    return;
                                }
                                throw Err("invalid char after '.' and 'e' for as part of number: " + ch);
                            }
                        }
                        break;
                    }

                    case 4:
                    {
                        if (CharTypes.IsDigit(ch))
                        {
                            state = 5;
                            break;
                        }
                        if (fstDot)
                        {
                            sizeCache = 1;
                            ch = sql[curIndex = offsetCache + 1];
                            token = MySqlToken.PuncDot;
                        }
                        else
                        {
                            if (!dot)
                            {
                                ch = sql[--curIndex];
                                --sizeCache;
                                UpdateStringValue(sql, offsetCache, sizeCache);
                                var tok = keywods.GetKeyword(stringValueUppercase);
                                token = tok == MySqlToken.None ? MySqlToken.Identifier : tok;
                            }
                            else
                            {
                                throw Err("expect digit char after SIGN for 'e': " + ch);
                            }
                        }
                        return;
                    }

                    case 5:
                    {
                        if (CharTypes.IsDigit(ch))
                        {
                            break;
                        }
                        if (CharTypes.IsIdentifierChar(ch))
                        {
                            if (fstDot)
                            {
                                sizeCache = 1;
                                ch = sql[curIndex = offsetCache + 1];
                                token = MySqlToken.PuncDot;
                            }
                            else
                            {
                                if (!dot)
                                {
                                    if (sign)
                                    {
                                        ch = sql[curIndex = offsetCache];
                                        ScanIdentifierFromNumber(curIndex, 0);
                                    }
                                    else
                                    {
                                        ScanIdentifierFromNumber(offsetCache, sizeCache);
                                    }
                                }
                                else
                                {
                                    token = MySqlToken.LiteralNumMixDigit;
                                }
                            }
                        }
                        else
                        {
                            token = MySqlToken.LiteralNumMixDigit;
                        }
                        return;
                    }
                }
            }
            switch (state)
            {
                case 0:
                {
                    token = MySqlToken.LiteralNumPureDigit;
                    return;
                }

                case 1:
                {
                    if (fstDot)
                    {
                        token = MySqlToken.PuncDot;
                        return;
                    }
                    goto case 2;
                }

                case 2:
                case 5:
                {
                    token = MySqlToken.LiteralNumMixDigit;
                    return;
                }

                case 3:
                {
                    if (fstDot)
                    {
                        sizeCache = 1;
                        ch = sql[curIndex = offsetCache + 1];
                        token = MySqlToken.PuncDot;
                    }
                    else
                    {
                        if (!dot)
                        {
                            UpdateStringValue(sql, offsetCache, sizeCache);
                            var tok = keywods.GetKeyword(stringValueUppercase);
                            token = tok == MySqlToken.None ? MySqlToken.Identifier : tok;
                        }
                        else
                        {
                            throw Err("expect digit char after SIGN for 'e': " + ch);
                        }
                    }
                    return;
                }

                case 4:
                {
                    if (fstDot)
                    {
                        sizeCache = 1;
                        ch = sql[curIndex = offsetCache + 1];
                        token = MySqlToken.PuncDot;
                    }
                    else
                    {
                        if (!dot)
                        {
                            ch = sql[--curIndex];
                            --sizeCache;
                            UpdateStringValue(sql, offsetCache, sizeCache);
                            var tok = keywods.GetKeyword(stringValueUppercase);
                            token = tok == MySqlToken.None ? MySqlToken.Identifier : tok;
                        }
                        else
                        {
                            throw Err("expect digit char after SIGN for 'e': " + ch);
                        }
                    }
                    return;
                }
            }
        }
Example #12
0
 /// <param name="quoteMode">
 ///     if false: first <code>0b</code> has been skipped; if
 ///     true: first <code>b'</code> has been skipped
 /// </param>
 /// <exception cref="System.SqlSyntaxErrorException" />
 protected virtual void ScanBitField(bool quoteMode)
 {
     offsetCache = curIndex;
     for (; ch == '0' || ch == '1'; ScanChar())
     {
     }
     sizeCache = curIndex - offsetCache;
     // if (sizeCache <= 0) {
     // throw err("expect at least one bit");
     // }
     if (quoteMode)
     {
         if (ch != '\'')
         {
             throw Err("invalid char for bit: " + ch);
         }
         ScanChar();
     }
     else
     {
         if (CharTypes.IsIdentifierChar(ch))
         {
             ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2);
             return;
         }
     }
     token = MySqlToken.LiteralBit;
     stringValue = new string(sql, offsetCache, sizeCache);
 }
Example #13
0
        // /** &#64; */
        // OP_AT,
        public static string KeyWordToString(this MySqlToken token)
        {
            switch (token)
            {
            case MySqlToken.KwAccessible:
            {
                return("ACCESSIBLE");
            }

            case MySqlToken.KwAdd:
            {
                return("ADD");
            }

            case MySqlToken.KwAll:
            {
                return("ALL");
            }

            case MySqlToken.KwAlter:
            {
                return("ALTER");
            }

            case MySqlToken.KwAnalyze:
            {
                return("ANALYZE");
            }

            case MySqlToken.KwAnd:
            {
                return("AND");
            }

            case MySqlToken.KwAs:
            {
                return("AS");
            }

            case MySqlToken.KwAsc:
            {
                return("ASC");
            }

            case MySqlToken.KwAsensitive:
            {
                return("ASENSITIVE");
            }

            case MySqlToken.KwBefore:
            {
                return("BEFORE");
            }

            case MySqlToken.KwBetween:
            {
                return("BETWEEN");
            }

            case MySqlToken.KwBigint:
            {
                return("BIGINT");
            }

            case MySqlToken.KwBinary:
            {
                return("BINARY");
            }

            case MySqlToken.KwBlob:
            {
                return("BLOB");
            }

            case MySqlToken.KwBoth:
            {
                return("BOTH");
            }

            case MySqlToken.KwBy:
            {
                return("BY");
            }

            case MySqlToken.KwCall:
            {
                return("CALL");
            }

            case MySqlToken.KwCascade:
            {
                return("CASCADE");
            }

            case MySqlToken.KwCase:
            {
                return("CASE");
            }

            case MySqlToken.KwChange:
            {
                return("CHANGE");
            }

            case MySqlToken.KwChar:
            {
                return("CHAR");
            }

            case MySqlToken.KwCharacter:
            {
                return("CHARACTER");
            }

            case MySqlToken.KwCheck:
            {
                return("CHECK");
            }

            case MySqlToken.KwCollate:
            {
                return("COLLATE");
            }

            case MySqlToken.KwColumn:
            {
                return("COLUMN");
            }

            case MySqlToken.KwCondition:
            {
                return("CONDITION");
            }

            case MySqlToken.KwConstraint:
            {
                return("CONSTRAINT");
            }

            case MySqlToken.KwContinue:
            {
                return("CONTINUE");
            }

            case MySqlToken.KwConvert:
            {
                return("CONVERT");
            }

            case MySqlToken.KwCreate:
            {
                return("CREATE");
            }

            case MySqlToken.KwCross:
            {
                return("CROSS");
            }

            case MySqlToken.KwCurrentDate:
            {
                return("CURRENT_DATE");
            }

            case MySqlToken.KwCurrentTime:
            {
                return("CURRENT_TIME");
            }

            case MySqlToken.KwCurrentTimestamp:
            {
                return("CURRENT_TIMESTAMP");
            }

            case MySqlToken.KwCurrentUser:
            {
                return("CURRENT_USER");
            }

            case MySqlToken.KwCursor:
            {
                return("CURSOR");
            }

            case MySqlToken.KwDatabase:
            {
                return("DATABASE");
            }

            case MySqlToken.KwDatabases:
            {
                return("DATABASES");
            }

            case MySqlToken.KwDayHour:
            {
                return("DAY_HOUR");
            }

            case MySqlToken.KwDayMicrosecond:
            {
                return("DAY_MICROSECOND");
            }

            case MySqlToken.KwDayMinute:
            {
                return("DAY_MINUTE");
            }

            case MySqlToken.KwDaySecond:
            {
                return("DAY_SECOND");
            }

            case MySqlToken.KwDec:
            {
                return("DEC");
            }

            case MySqlToken.KwDecimal:
            {
                return("DECIMAL");
            }

            case MySqlToken.KwDeclare:
            {
                return("DECLARE");
            }

            case MySqlToken.KwDefault:
            {
                return("DEFAULT");
            }

            case MySqlToken.KwDelayed:
            {
                return("DELAYED");
            }

            case MySqlToken.KwDelete:
            {
                return("DELETE");
            }

            case MySqlToken.KwDesc:
            {
                return("DESC");
            }

            case MySqlToken.KwDescribe:
            {
                return("DESCRIBE");
            }

            case MySqlToken.KwDeterministic:
            {
                return("DETERMINISTIC");
            }

            case MySqlToken.KwDistinct:
            {
                return("DISTINCT");
            }

            case MySqlToken.KwDistinctrow:
            {
                return("DISTINCTROW");
            }

            case MySqlToken.KwDiv:
            {
                return("DIV");
            }

            case MySqlToken.KwDouble:
            {
                return("DOUBLE");
            }

            case MySqlToken.KwDrop:
            {
                return("DROP");
            }

            case MySqlToken.KwDual:
            {
                return("DUAL");
            }

            case MySqlToken.KwEach:
            {
                return("EACH");
            }

            case MySqlToken.KwElse:
            {
                return("ELSE");
            }

            case MySqlToken.KwElseif:
            {
                return("ELSEIF");
            }

            case MySqlToken.KwEnclosed:
            {
                return("ENCLOSED");
            }

            case MySqlToken.KwEscaped:
            {
                return("ESCAPED");
            }

            case MySqlToken.KwExists:
            {
                return("EXISTS");
            }

            case MySqlToken.KwExit:
            {
                return("EXIT");
            }

            case MySqlToken.KwExplain:
            {
                return("EXPLAIN");
            }

            case MySqlToken.KwFetch:
            {
                return("FETCH");
            }

            case MySqlToken.KwFloat:
            {
                return("FLOAT");
            }

            case MySqlToken.KwFloat4:
            {
                return("FLOAT4");
            }

            case MySqlToken.KwFloat8:
            {
                return("FLOAT8");
            }

            case MySqlToken.KwFor:
            {
                return("FOR");
            }

            case MySqlToken.KwForce:
            {
                return("FORCE");
            }

            case MySqlToken.KwForeign:
            {
                return("FOREIGN");
            }

            case MySqlToken.KwFrom:
            {
                return("FROM");
            }

            case MySqlToken.KwFulltext:
            {
                return("FULLTEXT");
            }

            case MySqlToken.KwGeneral:
            {
                return("GENERAL");
            }

            case MySqlToken.KwGrant:
            {
                return("GRANT");
            }

            case MySqlToken.KwGroup:
            {
                return("GROUP");
            }

            case MySqlToken.KwHaving:
            {
                return("HAVING");
            }

            case MySqlToken.KwHighPriority:
            {
                return("HIGH_PRIORITY");
            }

            case MySqlToken.KwHourMicrosecond:
            {
                return("HOUR_MICROSECOND");
            }

            case MySqlToken.KwHourMinute:
            {
                return("HOUR_MINUTE");
            }

            case MySqlToken.KwHourSecond:
            {
                return("HOUR_SECOND");
            }

            case MySqlToken.KwIf:
            {
                return("IF");
            }

            case MySqlToken.KwIgnore:
            {
                return("IGNORE");
            }

            case MySqlToken.KwIgnoreServerIds:
            {
                return("IGNORE_SERVER_IDS");
            }

            case MySqlToken.KwIn:
            {
                return("IN");
            }

            case MySqlToken.KwIndex:
            {
                return("INDEX");
            }

            case MySqlToken.KwInfile:
            {
                return("INFILE");
            }

            case MySqlToken.KwInner:
            {
                return("INNER");
            }

            case MySqlToken.KwInout:
            {
                return("INOUT");
            }

            case MySqlToken.KwInsensitive:
            {
                return("INSENSITIVE");
            }

            case MySqlToken.KwInsert:
            {
                return("INSERT");
            }

            case MySqlToken.KwInt:
            {
                return("INT");
            }

            case MySqlToken.KwInt1:
            {
                return("INT1");
            }

            case MySqlToken.KwInt2:
            {
                return("INT2");
            }

            case MySqlToken.KwInt3:
            {
                return("INT3");
            }

            case MySqlToken.KwInt4:
            {
                return("INT4");
            }

            case MySqlToken.KwInt8:
            {
                return("INT8");
            }

            case MySqlToken.KwInteger:
            {
                return("INTEGER");
            }

            case MySqlToken.KwInterval:
            {
                return("INTERVAL");
            }

            case MySqlToken.KwInto:
            {
                return("INTO");
            }

            case MySqlToken.KwIs:
            {
                return("IS");
            }

            case MySqlToken.KwIterate:
            {
                return("ITERATE");
            }

            case MySqlToken.KwJoin:
            {
                return("JOIN");
            }

            case MySqlToken.KwKey:
            {
                return("KEY");
            }

            case MySqlToken.KwKeys:
            {
                return("KEYS");
            }

            case MySqlToken.KwKill:
            {
                return("KILL");
            }

            case MySqlToken.KwLeading:
            {
                return("LEADING");
            }

            case MySqlToken.KwLeave:
            {
                return("LEAVE");
            }

            case MySqlToken.KwLeft:
            {
                return("LEFT");
            }

            case MySqlToken.KwLike:
            {
                return("LIKE");
            }

            case MySqlToken.KwLimit:
            {
                return("LIMIT");
            }

            case MySqlToken.KwLinear:
            {
                return("LINEAR");
            }

            case MySqlToken.KwLines:
            {
                return("LINES");
            }

            case MySqlToken.KwLoad:
            {
                return("LOAD");
            }

            case MySqlToken.KwLocaltime:
            {
                return("LOCALTIME");
            }

            case MySqlToken.KwLocaltimestamp:
            {
                return("LOCALTIMESTAMP");
            }

            case MySqlToken.KwLock:
            {
                return("LOCK");
            }

            case MySqlToken.KwLong:
            {
                return("LONG");
            }

            case MySqlToken.KwLongblob:
            {
                return("LONGBLOB");
            }

            case MySqlToken.KwLongtext:
            {
                return("LONGTEXT");
            }

            case MySqlToken.KwLoop:
            {
                return("LOOP");
            }

            case MySqlToken.KwLowPriority:
            {
                return("LOW_PRIORITY");
            }

            case MySqlToken.KwMasterHeartbeatPeriod:
            {
                return("MASTER_HEARTBEAT_PERIOD");
            }

            case MySqlToken.KwMasterSslVerifyServerCert:
            {
                return("MASTER_SSL_VERIFY_SERVER_CERT");
            }

            case MySqlToken.KwMatch:
            {
                return("MATCH");
            }

            case MySqlToken.KwMaxvalue:
            {
                return("MAXVALUE");
            }

            case MySqlToken.KwMediumblob:
            {
                return("MEDIUMBLOB");
            }

            case MySqlToken.KwMediumint:
            {
                return("MEDIUMINT");
            }

            case MySqlToken.KwMediumtext:
            {
                return("MEDIUMTEXT");
            }

            case MySqlToken.KwMiddleint:
            {
                return("MIDdlEINT");
            }

            case MySqlToken.KwMinuteMicrosecond:
            {
                return("MINUTE_MICROSECOND");
            }

            case MySqlToken.KwMinuteSecond:
            {
                return("MINUTE_SECOND");
            }

            case MySqlToken.KwMod:
            {
                return("MOD");
            }

            case MySqlToken.KwModifies:
            {
                return("MODIFIES");
            }

            case MySqlToken.KwNatural:
            {
                return("NATURAL");
            }

            case MySqlToken.KwNot:
            {
                return("NOT");
            }

            case MySqlToken.KwNoWriteToBinlog:
            {
                return("NO_WRITE_TO_BINLOG");
            }

            case MySqlToken.KwNumeric:
            {
                return("NUMERIC");
            }

            case MySqlToken.KwOn:
            {
                return("ON");
            }

            case MySqlToken.KwOptimize:
            {
                return("OPTIMIZE");
            }

            case MySqlToken.KwOption:
            {
                return("OPTION");
            }

            case MySqlToken.KwOptionally:
            {
                return("OPTIONALLY");
            }

            case MySqlToken.KwOr:
            {
                return("OR");
            }

            case MySqlToken.KwOrder:
            {
                return("ORDER");
            }

            case MySqlToken.KwOut:
            {
                return("OUT");
            }

            case MySqlToken.KwOuter:
            {
                return("OUTER");
            }

            case MySqlToken.KwOutfile:
            {
                return("OUTFILE");
            }

            case MySqlToken.KwPrecision:
            {
                return("PRECISION");
            }

            case MySqlToken.KwPrimary:
            {
                return("PRIMARY");
            }

            case MySqlToken.KwProcedure:
            {
                return("PROCEDURE");
            }

            case MySqlToken.KwPurge:
            {
                return("PURGE");
            }

            case MySqlToken.KwRange:
            {
                return("RANGE");
            }

            case MySqlToken.KwRead:
            {
                return("READ");
            }

            case MySqlToken.KwReads:
            {
                return("READS");
            }

            case MySqlToken.KwReadWrite:
            {
                return("READ_WRITE");
            }

            case MySqlToken.KwReal:
            {
                return("REAL");
            }

            case MySqlToken.KwReferences:
            {
                return("REFERENCES");
            }

            case MySqlToken.KwRegexp:
            {
                return("REGEXP");
            }

            case MySqlToken.KwRelease:
            {
                return("RELEASE");
            }

            case MySqlToken.KwRename:
            {
                return("RENAME");
            }

            case MySqlToken.KwRepeat:
            {
                return("REPEAT");
            }

            case MySqlToken.KwReplace:
            {
                return("REPLACE");
            }

            case MySqlToken.KwRequire:
            {
                return("REQUIRE");
            }

            case MySqlToken.KwResignal:
            {
                return("RESIGNAL");
            }

            case MySqlToken.KwRestrict:
            {
                return("RESTRICT");
            }

            case MySqlToken.KwReturn:
            {
                return("RETURN");
            }

            case MySqlToken.KwRevoke:
            {
                return("REVOKE");
            }

            case MySqlToken.KwRight:
            {
                return("RIGHT");
            }

            case MySqlToken.KwRlike:
            {
                return("RLIKE");
            }

            case MySqlToken.KwSchema:
            {
                return("SCHEMA");
            }

            case MySqlToken.KwSchemas:
            {
                return("SCHEMAS");
            }

            case MySqlToken.KwSecondMicrosecond:
            {
                return("SECOND_MICROSECOND");
            }

            case MySqlToken.KwSelect:
            {
                return("SELECT");
            }

            case MySqlToken.KwSensitive:
            {
                return("SENSITIVE");
            }

            case MySqlToken.KwSeparator:
            {
                return("SEPARATOR");
            }

            case MySqlToken.KwSet:
            {
                return("SET");
            }

            case MySqlToken.KwShow:
            {
                return("SHOW");
            }

            case MySqlToken.KwSignal:
            {
                return("SIGNAL");
            }

            case MySqlToken.KwSlow:
            {
                return("SLOW");
            }

            case MySqlToken.KwSmallint:
            {
                return("SMALLINT");
            }

            case MySqlToken.KwSpatial:
            {
                return("SPATIAL");
            }

            case MySqlToken.KwSpecific:
            {
                return("SPECIFIC");
            }

            case MySqlToken.KwSql:
            {
                return("Sql");
            }

            case MySqlToken.KwSqlexception:
            {
                return("SQLEXCEPTION");
            }

            case MySqlToken.KwSqlstate:
            {
                return("SQLSTATE");
            }

            case MySqlToken.KwSqlwarning:
            {
                return("SQLWARNING");
            }

            case MySqlToken.KwSqlBigResult:
            {
                return("SQL_BIG_RESULT");
            }

            case MySqlToken.KwSqlCalcFoundRows:
            {
                return("SQL_CALC_FOUND_ROWS");
            }

            case MySqlToken.KwSqlSmallResult:
            {
                return("SQL_SMALL_RESULT");
            }

            case MySqlToken.KwSsl:
            {
                return("SSL");
            }

            case MySqlToken.KwStarting:
            {
                return("STARTING");
            }

            case MySqlToken.KwStraightJoin:
            {
                return("STRAIGHT_JOIN");
            }

            case MySqlToken.KwTable:
            {
                return("TABLE");
            }

            case MySqlToken.KwTerminated:
            {
                return("TERMINATED");
            }

            case MySqlToken.KwThen:
            {
                return("THEN");
            }

            case MySqlToken.KwTinyblob:
            {
                return("TINYBLOB");
            }

            case MySqlToken.KwTinyint:
            {
                return("TINYINT");
            }

            case MySqlToken.KwTinytext:
            {
                return("TINYTEXT");
            }

            case MySqlToken.KwTo:
            {
                return("TO");
            }

            case MySqlToken.KwTrailing:
            {
                return("TRAILING");
            }

            case MySqlToken.KwTrigger:
            {
                return("TRIGGER");
            }

            case MySqlToken.KwUndo:
            {
                return("UNDO");
            }

            case MySqlToken.KwUnion:
            {
                return("UNION");
            }

            case MySqlToken.KwUnique:
            {
                return("UNIQUE");
            }

            case MySqlToken.KwUnlock:
            {
                return("UNLOCK");
            }

            case MySqlToken.KwUnsigned:
            {
                return("UNSIGNED");
            }

            case MySqlToken.KwUpdate:
            {
                return("UPDATE");
            }

            case MySqlToken.KwUsage:
            {
                return("USAGE");
            }

            case MySqlToken.KwUse:
            {
                return("USE");
            }

            case MySqlToken.KwUsing:
            {
                return("USING");
            }

            case MySqlToken.KwUtcDate:
            {
                return("UTC_DATE");
            }

            case MySqlToken.KwUtcTime:
            {
                return("UTC_TIME");
            }

            case MySqlToken.KwUtcTimestamp:
            {
                return("UTC_TIMESTAMP");
            }

            case MySqlToken.KwValues:
            {
                return("VALUES");
            }

            case MySqlToken.KwVarbinary:
            {
                return("VARBINARY");
            }

            case MySqlToken.KwVarchar:
            {
                return("VARCHAR");
            }

            case MySqlToken.KwVarcharacter:
            {
                return("VARCHARACTER");
            }

            case MySqlToken.KwVarying:
            {
                return("VARYING");
            }

            case MySqlToken.KwWhen:
            {
                return("WHEN");
            }

            case MySqlToken.KwWhere:
            {
                return("WHERE");
            }

            case MySqlToken.KwWhile:
            {
                return("WHILE");
            }

            case MySqlToken.KwWith:
            {
                return("WITH");
            }

            case MySqlToken.KwWrite:
            {
                return("WRITE");
            }

            case MySqlToken.KwXor:
            {
                return("XOR");
            }

            case MySqlToken.KwYearMonth:
            {
                return("YEAR_MONTH");
            }

            case MySqlToken.KwZerofill:
            {
                return("ZEROFILL");
            }

            default:
            {
                throw new ArgumentException("token is not keyword: " + token);
            }
            }
        }