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