예제 #1
0
 private void FormatDerivedJoin(DerivedJoin derivedJoin)
 {
     NewLine(2);
     IndentAppend(derivedJoin.Value);
     NewLine(2);
     using (new IndentScope(this))
     {
         var formatter = new SelectStatementFormatter(this, _sql, derivedJoin.SelectStatement);
         formatter.Execute();
     }
     NewLine(2);
     IndentAppend(String.Format("){0}", derivedJoin.Alias.Value));
     NewLine();
     IndentAppendFormat(
         "  ON {0}",
         derivedJoin.Condition.FormattedValue(4, this)
         );
 }
예제 #2
0
        public void Select_With_Derived_Join()
        {
            // Exercise
            SelectStatement statement = ParserFactory.Execute <SelectStatement>(@"
                select * from table t join ( select field from other o ) as o1 on o.a = t.a
            ").First();

            // Verify outcome
            Assert.IsNotNull(statement);
            Assert.AreEqual(1, statement.From.Count);
            Assert.AreEqual("t", statement.From[0].Alias.Name);
            Assert.IsTrue(statement.From[0].Joins[0] is DerivedJoin);

            DerivedJoin derivedJoin = (DerivedJoin)statement.From[0].Joins[0];

            Assert.AreEqual("field", derivedJoin.SelectStatement.Fields[0].Expression.Value);
            Assert.AreEqual("other", derivedJoin.SelectStatement.From[0].Name);
            Assert.AreEqual("o", derivedJoin.SelectStatement.From[0].Alias.Name);
            Assert.AreEqual("o1", derivedJoin.Alias.Name);
        }
예제 #3
0
        private void ProcessJoins(Table table)
        {
            if (!Tokenizer.HasMoreTokens)
            {
                return;
            }
            do
            {
                JoinType?joinType = GetJoinType();
                if (joinType == null)
                {
                    return;
                }

                ExpectToken(Constants.Join);

                Join join = null;
                if (Tokenizer.IsNextToken(Constants.OpenBracket))
                {
                    using (Tokenizer.ExpectBrackets())
                    {
                        join = new DerivedJoin {
                            Type = joinType.Value
                        };
                        Tokenizer.ExpectToken(Constants.Select);
                        var parser = new SelectStatementParser(Tokenizer);
                        ((DerivedJoin)join).SelectStatement = (SelectStatement)parser.Execute();
                    }
                }
                else
                {
                    join = new Join {
                        Type = joinType.Value
                    };
                    join.Name = GetTableName();
                }

                Debug.Assert(join != null);

                Alias alias = new Alias(null);
                if (Tokenizer.IsNextToken(Constants.As))
                {
                    alias.Type = AliasType.As;
                    Tokenizer.ReadNextToken();
                }
                if (alias.Type != AliasType.Implicit || !Tokenizer.IsNextToken(Constants.On))
                {
                    alias.Name = GetIdentifier();
                    join.Alias = alias;
                }

                ProcessTableHints(join);
                ExpectToken(Constants.On);
                Expression expr = ProcessExpression();

                if (!(expr is CriteriaExpression) && !(expr is NestedExpression && (expr as NestedExpression).Expression is CriteriaExpression))
                {
                    throw new SyntaxException("Expected Criteria Expression");
                }

                join.Condition = expr;

                table.Joins.Add(join);
            }while (Tokenizer.HasMoreTokens && !Tokenizer.IsNextToken(Constants.Order, Constants.Group));
        }