private TableReference ParseTableReferences() { TableReference lastTableReference = null; do { TableReference tableReference = ParseTableReference(); if (lastTableReference == null) { lastTableReference = tableReference; } else { JoinedTableReference crossJoinReference = new JoinedTableReference(); crossJoinReference.Left = lastTableReference; crossJoinReference.Right = tableReference; crossJoinReference.JoinType = JoinType.Inner; lastTableReference = crossJoinReference; } if (_token.Id != TokenId.Comma) { break; } NextToken(); } while (_token.Id != TokenId.Eof); return(lastTableReference); }
private static bool VisitJoinedTableReference(JoinedTableReference node1, JoinedTableReference node2) { if (node2 == null) { return(false); } if (node1.JoinType != node2.JoinType || (node1.Condition == null) != (node2.Condition == null)) { return(false); } if (node1.Condition != null) { if (!Visit(node1.Condition, node2.Condition)) { return(false); } } if (!Visit(node1.Left, node2.Left)) { return(false); } if (!Visit(node1.Right, node2.Right)) { return(false); } return(true); }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { if (node.JoinType != JoinType.Inner) { _containsOuterJoin = true; } return(base.VisitJoinedTableReference(node)); }
public virtual TableReference VisitJoinedTableReference(JoinedTableReference node) { node.Left = VisitTableReference(node.Left); node.Right = VisitTableReference(node.Right); if (node.Condition != null) { node.Condition = VisitExpression(node.Condition); } return(node); }
public override AstElement Clone(Dictionary<AstElement, AstElement> alreadyClonedElements) { JoinedTableReference result = new JoinedTableReference(); result.Left = (TableReference)_left.Clone(alreadyClonedElements); result.JoinType = _joinType; result.Right = (TableReference)_right.Clone(alreadyClonedElements); if (_condition != null) result.Condition = (ExpressionNode)_condition.Clone(alreadyClonedElements); return result; }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { _xmlWriter.WriteStartElement("joinedTableReference"); _xmlWriter.WriteAttributeString("joinType", node.JoinType.ToString()); WriteAstNode("condition", node.Condition); WriteAstNode("left", node.Left); WriteAstNode("right", node.Right); _xmlWriter.WriteEndElement(); return(node); }
public override AstElement Clone(Dictionary <AstElement, AstElement> alreadyClonedElements) { JoinedTableReference result = new JoinedTableReference(); result.Left = (TableReference)_left.Clone(alreadyClonedElements); result.JoinType = _joinType; result.Right = (TableReference)_right.Clone(alreadyClonedElements); if (_condition != null) { result.Condition = (ExpressionNode)_condition.Clone(alreadyClonedElements); } return(result); }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { if (node.Left is NamedTableReference) { Visit(node.Left); } else { _writer.Write("("); Visit(node.Left); _writer.Write(")"); } _writer.Write(" "); switch (node.JoinType) { case JoinType.Inner: if (node.Condition == null) _writer.Write("CROSS JOIN"); else _writer.Write("INNER JOIN"); break; case JoinType.LeftOuter: _writer.Write("LEFT OUTER JOIN"); break; case JoinType.RightOuter: _writer.Write("RIGHT OUTER JOIN"); break; case JoinType.FullOuter: _writer.Write("FULL OUTER JOIN"); break; } _writer.Write(" "); if (node.Right is NamedTableReference) { Visit(node.Right); } else { _writer.Write("("); Visit(node.Right); _writer.Write(")"); } if (node.Condition != null) { _writer.Write(" ON ("); Visit(node.Condition); _writer.Write(")"); } return node; }
private TableReference ParseTableReferences() { TableReference lastTableReference = null; do { TableReference tableReference = ParseTableReference(); if (lastTableReference == null) lastTableReference = tableReference; else { JoinedTableReference crossJoinReference = new JoinedTableReference(); crossJoinReference.Left = lastTableReference; crossJoinReference.Right = tableReference; crossJoinReference.JoinType = JoinType.Inner; lastTableReference = crossJoinReference; } if (_token.Id != TokenId.Comma) break; NextToken(); } while (_token.Id != TokenId.Eof); return lastTableReference; }
private TableReference ParseTableReference() { TableReference left; switch (_token.Id) { case TokenId.LeftParentheses: { if (_lookahead.Id == TokenId.SELECT) left = ParseDerivedTableReference(); else { NextToken(); left = ParseTableReference(); Match(TokenId.RightParentheses); } break; } case TokenId.Identifier: { _rangeRecorder.Begin(); Identifier tableName = ParseIdentifier(); SourceRange tableNameSourceRange = _rangeRecorder.End(); _rangeRecorder.Begin(); Identifier correlationName = ParseOptionalAlias(); SourceRange correlationNameSourceRange = _rangeRecorder.End(); NamedTableReference namedTableReference = new NamedTableReference(); namedTableReference.TableName = tableName; namedTableReference.TableNameSourceRange = tableNameSourceRange; namedTableReference.CorrelationName = correlationName; namedTableReference.CorrelationNameSourceRange = correlationNameSourceRange; left = namedTableReference; break; } default: _errorReporter.TableReferenceExpected(_token.Range, _token.Text); return null; } while (_token.Id != TokenId.Eof) { JoinType joinType = JoinType.Inner; bool isCrossJoin = false; switch (_token.Id) { case TokenId.CROSS: NextToken(); isCrossJoin = true; goto case TokenId.JOIN; case TokenId.INNER: NextToken(); goto case TokenId.JOIN; case TokenId.LEFT: NextToken(); if (_token.Id == TokenId.OUTER) NextToken(); joinType = JoinType.LeftOuter; goto case TokenId.JOIN; case TokenId.RIGHT: NextToken(); if (_token.Id == TokenId.OUTER) NextToken(); joinType = JoinType.RightOuter; goto case TokenId.JOIN; case TokenId.FULL: NextToken(); if (_token.Id == TokenId.OUTER) NextToken(); joinType = JoinType.FullOuter; goto case TokenId.JOIN; case TokenId.JOIN: Match(TokenId.JOIN); JoinedTableReference joinedTableReference = new JoinedTableReference(); joinedTableReference.JoinType = joinType; joinedTableReference.Left = left; joinedTableReference.Right = ParseTableReference(); if (!isCrossJoin) { Match(TokenId.ON); joinedTableReference.Condition = ParseExpression(); } left = joinedTableReference; break; default: goto exitLoop; } } exitLoop: return left; }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { if (node.Left is NamedTableReference) { Visit(node.Left); } else { _writer.Write("("); Visit(node.Left); _writer.Write(")"); } _writer.Write(" "); switch (node.JoinType) { case JoinType.Inner: if (node.Condition == null) { _writer.Write("CROSS JOIN"); } else { _writer.Write("INNER JOIN"); } break; case JoinType.LeftOuter: _writer.Write("LEFT OUTER JOIN"); break; case JoinType.RightOuter: _writer.Write("RIGHT OUTER JOIN"); break; case JoinType.FullOuter: _writer.Write("FULL OUTER JOIN"); break; } _writer.Write(" "); if (node.Right is NamedTableReference) { Visit(node.Right); } else { _writer.Write("("); Visit(node.Right); _writer.Write(")"); } if (node.Condition != null) { _writer.Write(" ON ("); Visit(node.Condition); _writer.Write(")"); } return(node); }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { TableReference nonCteTableRef; if (IsTableReferenceToCurrentCommonTableBinding(node.Left)) { nonCteTableRef = node.Right; } else if (IsTableReferenceToCurrentCommonTableBinding(node.Right)) { nonCteTableRef = node.Left; } else { nonCteTableRef = null; } if (nonCteTableRef != null) { Debug.Assert(node.JoinType == JoinType.Inner); AlgebraNode algebrizedPath = ConvertAstNode(nonCteTableRef); SetLastAlgebraNode(algebrizedPath); if (node.Condition != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = node.Condition; SetLastAlgebraNode(filterAlgebraNode); } return(node); } JoinAlgebraNode algebraNode = new JoinAlgebraNode(); algebraNode.Left = ConvertAstNode(node.Left); algebraNode.Right = ConvertAstNode(node.Right); algebraNode.Predicate = node.Condition; switch (node.JoinType) { case JoinType.Inner: algebraNode.Op = JoinAlgebraNode.JoinOperator.InnerJoin; break; case JoinType.LeftOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.LeftOuterJoin; break; case JoinType.RightOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.RightOuterJoin; break; case JoinType.FullOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.FullOuterJoin; break; } SetLastAlgebraNode(algebraNode); return(node); }
private TableReference ParseTableReference() { TableReference left; switch (_token.Id) { case TokenId.LeftParentheses: { if (_lookahead.Id == TokenId.SELECT) { left = ParseDerivedTableReference(); } else { NextToken(); left = ParseTableReference(); Match(TokenId.RightParentheses); } break; } case TokenId.Identifier: { _rangeRecorder.Begin(); Identifier tableName = ParseIdentifier(); SourceRange tableNameSourceRange = _rangeRecorder.End(); _rangeRecorder.Begin(); Identifier correlationName = ParseOptionalAlias(); SourceRange correlationNameSourceRange = _rangeRecorder.End(); NamedTableReference namedTableReference = new NamedTableReference(); namedTableReference.TableName = tableName; namedTableReference.TableNameSourceRange = tableNameSourceRange; namedTableReference.CorrelationName = correlationName; namedTableReference.CorrelationNameSourceRange = correlationNameSourceRange; left = namedTableReference; break; } default: _errorReporter.TableReferenceExpected(_token.Range, _token.Text); return(null); } while (_token.Id != TokenId.Eof) { JoinType joinType = JoinType.Inner; bool isCrossJoin = false; switch (_token.Id) { case TokenId.CROSS: NextToken(); isCrossJoin = true; goto case TokenId.JOIN; case TokenId.INNER: NextToken(); goto case TokenId.JOIN; case TokenId.LEFT: NextToken(); if (_token.Id == TokenId.OUTER) { NextToken(); } joinType = JoinType.LeftOuter; goto case TokenId.JOIN; case TokenId.RIGHT: NextToken(); if (_token.Id == TokenId.OUTER) { NextToken(); } joinType = JoinType.RightOuter; goto case TokenId.JOIN; case TokenId.FULL: NextToken(); if (_token.Id == TokenId.OUTER) { NextToken(); } joinType = JoinType.FullOuter; goto case TokenId.JOIN; case TokenId.JOIN: Match(TokenId.JOIN); JoinedTableReference joinedTableReference = new JoinedTableReference(); joinedTableReference.JoinType = joinType; joinedTableReference.Left = left; joinedTableReference.Right = ParseTableReference(); if (!isCrossJoin) { Match(TokenId.ON); joinedTableReference.Condition = ParseExpression(); } left = joinedTableReference; break; default: goto exitLoop; } } exitLoop: return(left); }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { // Resolve children node.Left = VisitTableReference(node.Left); node.Right = VisitTableReference(node.Right); if (node.Condition != null) { node.Condition = VisitExpression(node.Condition); // Get all tables that are referenced by node.Condition. MetaInfo metaInfo = AstUtil.GetMetaInfo(node.Condition); // Now get a list with all tables are really introduced by one of the node's // children. TableDeclarationFinder tableDeclarationFinder = new TableDeclarationFinder(); tableDeclarationFinder.Visit(node.Left); tableDeclarationFinder.Visit(node.Right); TableRefBinding[] declaredTables = tableDeclarationFinder.GetDeclaredTables(); // Any tables that are not declared by children of node are inaccessible in the // current context and referencing them in node.Condition is invalid. // // NOTE: This is only partially true. It could also be an outer reference. Therefore // we also check that the scope is the same. foreach (TableRefBinding referencedTable in metaInfo.TableDependencies) { if (referencedTable.Scope == CurrentScope) { if (!ArrayHelpers.Contains(declaredTables, referencedTable)) ErrorReporter.TableRefInaccessible(referencedTable); } } } return node; }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { TableReference nonCteTableRef; if (IsTableReferenceToCurrentCommonTableBinding(node.Left)) nonCteTableRef = node.Right; else if (IsTableReferenceToCurrentCommonTableBinding(node.Right)) nonCteTableRef = node.Left; else nonCteTableRef = null; if (nonCteTableRef != null) { Debug.Assert(node.JoinType == JoinType.Inner); AlgebraNode algebrizedPath = ConvertAstNode(nonCteTableRef); SetLastAlgebraNode(algebrizedPath); if (node.Condition != null) { FilterAlgebraNode filterAlgebraNode = new FilterAlgebraNode(); filterAlgebraNode.Input = GetLastAlgebraNode(); filterAlgebraNode.Predicate = node.Condition; SetLastAlgebraNode(filterAlgebraNode); } return node; } JoinAlgebraNode algebraNode = new JoinAlgebraNode(); algebraNode.Left = ConvertAstNode(node.Left); algebraNode.Right = ConvertAstNode(node.Right); algebraNode.Predicate = node.Condition; switch (node.JoinType) { case JoinType.Inner: algebraNode.Op = JoinAlgebraNode.JoinOperator.InnerJoin; break; case JoinType.LeftOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.LeftOuterJoin; break; case JoinType.RightOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.RightOuterJoin; break; case JoinType.FullOuter: algebraNode.Op = JoinAlgebraNode.JoinOperator.FullOuterJoin; break; } SetLastAlgebraNode(algebraNode); return node; }
private static bool VisitJoinedTableReference(JoinedTableReference node1, JoinedTableReference node2) { if (node2 == null) return false; if (node1.JoinType != node2.JoinType || (node1.Condition == null) != (node2.Condition == null)) return false; if (node1.Condition != null) if (!Visit(node1.Condition, node2.Condition)) return false; if (!Visit(node1.Left, node2.Left)) return false; if (!Visit(node1.Right, node2.Right)) return false; return true; }
public virtual TableReference VisitJoinedTableReference(JoinedTableReference node) { node.Left = VisitTableReference(node.Left); node.Right = VisitTableReference(node.Right); if (node.Condition != null) node.Condition = VisitExpression(node.Condition); return node; }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { if (node.JoinType != JoinType.Inner) _containsOuterJoin = true; return base.VisitJoinedTableReference(node); }
public override TableReference VisitJoinedTableReference(JoinedTableReference node) { _xmlWriter.WriteStartElement("joinedTableReference"); _xmlWriter.WriteAttributeString("joinType", node.JoinType.ToString()); WriteAstNode("condition", node.Condition); WriteAstNode("left", node.Left); WriteAstNode("right", node.Right); _xmlWriter.WriteEndElement(); return node; }