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 }); }
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)); }