Пример #1
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="SqlParser.select_core"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitSelect_core([NotNull] SqlParser.Select_coreContext context)
 {
     return(VisitChildren(context));
 }
Пример #2
0
        public override object VisitSelect_core([NotNull] SqlParser.Select_coreContext context)
        {
            SelectStatement select = null;

            select = new SelectStatement();

            if (context.table_or_subquery() != null)
            {
                if (context.table_or_subquery().Length > 1)
                {
                    select.Table      = (TableName)VisitTable_or_subquery(context.table_or_subquery(0));
                    select.IsJoin     = true;
                    select.JoinTables = new List <JoinTable>();
                    for (int i = 1; i < context.table_or_subquery().Length; i++)
                    {
                        select.JoinTables.Add((new JoinTable()
                        {
                            JoinType = JoinType.Unknown,
                            Table = (TableName)VisitTable_or_subquery(context.table_or_subquery(i))
                        }));
                    }
                }
                else if (context.table_or_subquery().Length == 1)
                {
                    select.Table = (TableName)VisitTable_or_subquery(context.table_or_subquery(0));
                }
            }

            if (context.join_clause() != null)
            {
                select.IsJoin = true;
                select.Table  = (TableName)VisitTable_or_subquery(context.join_clause().table_or_subquery());

                var noAlias = false;;
                if (select.Table.Alias.ToUpper() == "INNER" || select.Table.Alias.ToUpper() == "CROSS")
                {
                    noAlias = true;
                }

                select.JoinTables = new List <JoinTable>();
                foreach (var item in context.join_clause().join_right())
                {
                    var joinTable = (JoinTable)VisitJoin_right(item);
                    if (noAlias)
                    {
                        joinTable.JoinType = select.Table.Alias.ToUpper() == "INNER" ? JoinType.Inner : JoinType.Cross;
                        select.Table.Alias = "";
                    }
                    select.JoinTables.Add(joinTable);
                }
            }

            if (context.result_column() != null)
            {
                select.Columns = new List <ColumnExpression>();
                foreach (var item in context.result_column())
                {
                    select.Columns.Add((ColumnExpression)VisitResult_column(item));
                }
            }

            if (context.where_clause() != null)
            {
                select.Where = (IExpression)VisitWhere_clause(context.where_clause());
                if (select.Where is LiteralValueExpression)
                {
                    throw new SQLParseException($"Incorrect syntax near '{context.where_clause().GetChild(0)}'");
                }
            }

            if (context.groupby_clause() != null)
            {
                select.Groupby = (GroupbyClause)VisitGroupby_clause(context.groupby_clause());
            }

            return(select);
        }