private static JoinNode FormJoinNode(IContext context, PlSqlParser.JoinClauseContext joinClause)
                {
                    JoinType joinType;

                    if (joinClause.INNER() != null)
                    {
                        joinType = JoinType.Inner;
                    }
                    else if (joinClause.outerJoinType() != null)
                    {
                        if (joinClause.outerJoinType().FULL() != null)
                        {
                            joinType = JoinType.Full;
                        }
                        else if (joinClause.outerJoinType().LEFT() != null)
                        {
                            joinType = JoinType.Left;
                        }
                        else if (joinClause.outerJoinType().RIGHT() != null)
                        {
                            joinType = JoinType.Right;
                        }
                        else
                        {
                            throw new ParseCanceledException("Invalid outer join type");
                        }
                    }
                    else
                    {
                        throw new ParseCanceledException("Invalid join type");
                    }

                    var onPart = joinClause.joinOnPart();

                    if (onPart.IsEmpty)
                    {
                        throw new ParseCanceledException("None ON expression found in JOIN clause");
                    }

                    var onExp  = new PlSqlExpressionVisitor(context).Visit(onPart.condition());
                    var source = FormSource(context, joinClause.queryExpressionClause());

                    return(new JoinNode {
                        JoinType = joinType,
                        OnExpression = onExp,
                        Source = source
                    });
                }
Exemple #2
0
        internal static SqlExpressionParseResult ParseExpression(IContext context, string text)
        {
            var messages    = new List <SqlParseMessage>();
            var plSqlParser = MakeParser(text, message => messages.Add(message));

            //var plSqlParser = MakeParser(text, null);
            var parseResult = plSqlParser.expressionUnit();

            var visitor = new PlSqlExpressionVisitor(context);
            var result  = visitor.Visit(parseResult);

            var errors = messages.Where(x => x.Level == SqlParseMessageLevel.Error).Select(x => x.Message).ToArray();

            if (errors.Length > 0)
            {
                return(SqlExpressionParseResult.Fail(errors));
            }

            return(SqlExpressionParseResult.Success(result));
        }