Ejemplo n.º 1
0
        /// <exception cref="System.SqlSyntaxErrorException" />
        public static void Main(string[] args)
        {
            var sql =
                "   ( ( select union select union select)  as j join    (((select union (select)) as t    )   join t2 ) ,(select)as d), t3)";

            // String sql =
            // "((select) as s1, ((((   select  union select          ) as t2)) join (((t2),t4 as t))) ), t1 aS T1";
            // String sql =
            // "  (( select union select union select)  as j  ,(select)as d), t3";
            Console.Out.WriteLine(sql);
            var lexer = new MySqlLexer(sql);

            lexer.NextToken();
            var p    = new SoloParser(lexer);
            var refs = p.Refs();

            Console.Out.WriteLine(refs);
        }
Ejemplo n.º 2
0
        /// <returns>
        ///     type of
        ///     <see cref="Tup.Cobar4Net.Parser.Ast.Expression.Primary.Wildcard" />
        ///     is possible. never null
        /// </returns>
        /// <exception cref="System.SqlSyntaxErrorException">
        ///     if identifier dose not matched
        /// </exception>
        protected internal virtual Identifier Identifier()
        {
            if (lexer.Token() == MySqlToken.None)
            {
                lexer.NextToken();
            }
            Identifier id;

            switch (lexer.Token())
            {
            case MySqlToken.OpAsterisk:
            {
                lexer.NextToken();
                var wc = new Wildcard(null);
                wc.SetCacheEvalRst(cacheEvalRst);
                return(wc);
            }

            case MySqlToken.Identifier:
            {
                id = new Identifier(null, lexer.GetStringValue(), lexer.GetStringValueUppercase());
                id.SetCacheEvalRst(cacheEvalRst);
                lexer.NextToken();
                break;
            }

            default:
            {
                throw Err("expect id or * after '.'");
            }
            }
            for (; lexer.Token() == MySqlToken.PuncDot;)
            {
                switch (lexer.NextToken())
                {
                case MySqlToken.OpAsterisk:
                {
                    lexer.NextToken();
                    var wc_1 = new Wildcard(id);
                    wc_1.SetCacheEvalRst(cacheEvalRst);
                    return(wc_1);
                }

                case MySqlToken.Identifier:
                {
                    id = new Identifier(id, lexer.GetStringValue(), lexer.GetStringValueUppercase());
                    id.SetCacheEvalRst(cacheEvalRst);
                    lexer.NextToken();
                    break;
                }

                default:
                {
                    throw Err("expect id or * after '.'");
                }
                }
            }
            return(id);
        }
Ejemplo n.º 3
0
        /// <exception cref="System.SqlSyntaxErrorException" />
        public static ISqlStatement Parse(string sql, MySqlLexer lexer, string charset)
        {
            try
            {
                ISqlStatement stmt       = null;
                var           isEof      = true;
                var           exprParser = new MySqlExprParser(lexer, charset);
                switch (lexer.Token())
                {
                case MySqlToken.KwDesc:
                case MySqlToken.KwDescribe:
                {
                    stmt = new MySqlDalParser(lexer, exprParser).Desc();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwSelect:
                case MySqlToken.PuncLeftParen:
                {
                    stmt = new MySqlDmlSelectParser(lexer, exprParser).SelectUnion();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwDelete:
                {
                    stmt = new MySqlDmlDeleteParser(lexer, exprParser).Delete();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwInsert:
                {
                    stmt = new MySqlDmlInsertParser(lexer, exprParser).Insert();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwReplace:
                {
                    stmt = new MySqlDmlReplaceParser(lexer, exprParser).Replace();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwUpdate:
                {
                    stmt = new MySqlDmlUpdateParser(lexer, exprParser).Update();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwCall:
                {
                    stmt = new MySqlDmlCallParser(lexer, exprParser).Call();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwSet:
                {
                    stmt = new MySqlDalParser(lexer, exprParser).Set();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwShow:
                {
                    stmt = new MySqlDalParser(lexer, exprParser).Show();
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwAlter:
                case MySqlToken.KwCreate:
                case MySqlToken.KwDrop:
                case MySqlToken.KwRename:
                {
                    stmt  = new MySqlDdlParser(lexer, exprParser).DdlStmt();
                    isEof = IsEOFedDdl(stmt);
                    goto stmtSwitch_break;
                }

                case MySqlToken.KwRelease:
                {
                    stmt = new MySqlMtsParser(lexer).Release();
                    goto stmtSwitch_break;
                }

                case MySqlToken.Identifier:
                {
                    var si = SpecialIdentifier.None;
                    if ((si = SpecialIdentifiers[lexer.GetStringValueUppercase()]) != SpecialIdentifier.None)
                    {
                        switch (si)
                        {
                        case SpecialIdentifier.Truncate:
                        {
                            stmt = new MySqlDdlParser(lexer, exprParser).Truncate();
                            goto stmtSwitch_break;
                        }

                        case SpecialIdentifier.Savepoint:
                        {
                            stmt = new MySqlMtsParser(lexer).Savepoint();
                            goto stmtSwitch_break;
                        }

                        case SpecialIdentifier.Rollback:
                        {
                            stmt = new MySqlMtsParser(lexer).Rollback();
                            goto stmtSwitch_break;
                        }
                        }
                    }
                    goto default;
                }

                default:
                {
                    throw new SqlSyntaxErrorException("sql is not a supported statement");
                }
                }
stmtSwitch_break:
                ;
                if (isEof)
                {
                    while (lexer.Token() == MySqlToken.PuncSemicolon)
                    {
                        lexer.NextToken();
                    }
                    if (lexer.Token() != MySqlToken.Eof)
                    {
                        throw new SqlSyntaxErrorException("Sql syntax error!");
                    }
                }
                return(stmt);
            }
            catch (Exception e)
            {
                throw new SqlSyntaxErrorException(BuildErrorMsg(e, lexer, sql), e);
            }
        }