private static bool VisitNamedTableReference(NamedTableReference node1, NamedTableReference node2) { return(node2 != null && node1.TableName == node2.TableName && node1.CorrelationName == node2.CorrelationName && node1.TableRefBinding == node2.TableRefBinding); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _xmlWriter.WriteStartElement("namedTableReference"); _xmlWriter.WriteAttributeString("table", node.TableName.ToSource()); _xmlWriter.WriteEndElement(); return(node); }
public override AstElement Clone(Dictionary<AstElement, AstElement> alreadyClonedElements) { NamedTableReference result = new NamedTableReference(); result.TableName = _tableName; result.TableNameSourceRange = _tableNameSourceRange; result.CorrelationName = _correlationName; result.CorrelationNameSourceRange = _correlationNameSourceRange; result.TableRefBinding = _tableRefBinding; return result; }
private bool IsTableReferenceToCurrentCommonTableBinding(TableReference tableReference) { NamedTableReference namedTableReference = tableReference as NamedTableReference; if (namedTableReference == null) { return(false); } return(namedTableReference.TableRefBinding.TableBinding == _currentCommonTableBinding); }
public override AstElement Clone(Dictionary <AstElement, AstElement> alreadyClonedElements) { NamedTableReference result = new NamedTableReference(); result.TableName = _tableName; result.TableNameSourceRange = _tableNameSourceRange; result.CorrelationName = _correlationName; result.CorrelationNameSourceRange = _correlationNameSourceRange; result.TableRefBinding = _tableRefBinding; return(result); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _writer.WriteIdentifier(node.TableName); if (node.CorrelationName != null) { _writer.Write(" AS "); _writer.WriteIdentifier(node.CorrelationName); } return(node); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { CommonTableBinding tableBindingAsCommonTable = node.TableRefBinding.TableBinding as CommonTableBinding; if (tableBindingAsCommonTable == null) { // It is a regular table reference. Emit just a table node. List <ColumnValueDefinition> definedValues = new List <ColumnValueDefinition>(); foreach (ColumnRefBinding columnRefBinding in node.TableRefBinding.ColumnRefs) { definedValues.Add(columnRefBinding.ValueDefinition); } TableAlgebraNode algebraNode = new TableAlgebraNode(); algebraNode.TableRefBinding = node.TableRefBinding; algebraNode.DefinedValues = definedValues.ToArray(); SetLastAlgebraNode(algebraNode); } else { // It is a reference to a CTE. Instead of emitting a table node we have to replace the // reference to the CTE by the algebrized representation of the CTE. One could speak // of "inlining" the CTE. if (tableBindingAsCommonTable == _currentCommonTableBinding) { // This should never happen. The JoinAlgebraNode should ignore these table references. Debug.Fail("The current common table binding should never be reached as a table reference."); } AlgebraNode algebrizedCte; if (tableBindingAsCommonTable.IsRecursive) { algebrizedCte = AlgebrizeRecursiveCte(tableBindingAsCommonTable); } else { algebrizedCte = Convert(tableBindingAsCommonTable.AnchorMember); } // In order to use the CTE we have to instantiate it. See commonets in InstantiateCte() for // details. AlgebraNode computeScalarAlgebraNode = InstantiateCte(algebrizedCte, tableBindingAsCommonTable, node.TableRefBinding); SetLastAlgebraNode(computeScalarAlgebraNode); } return(node); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { if (node.TableRefBinding.TableBinding == _commonTableBinding) { for (int i = 0; i < node.TableRefBinding.ColumnRefs.Length; i++) { CteColumnMapping columnMapping = new CteColumnMapping(); columnMapping.VirtualBufferEntry = node.TableRefBinding.ColumnRefs[i].ValueDefinition.Target; columnMapping.SpoolBufferEntry = _spoolBufferEntries[i]; _mappings.Add(columnMapping); } } return(node); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { if (node.TableName.Matches(_commonTableName)) { if (_subqueryContextCounter > 0) { _recursiveReferenceInSubquery = true; } else { _recursiveReferences++; } } 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; }
private static bool VisitNamedTableReference(NamedTableReference node1, NamedTableReference node2) { return node2 != null && node1.TableName == node2.TableName && node1.CorrelationName == node2.CorrelationName && node1.TableRefBinding == node2.TableRefBinding; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { if (node.TableName.Matches(_commonTableName)) { if (_subqueryContextCounter > 0) _recursiveReferenceInSubquery = true; else _recursiveReferences++; } 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 VisitNamedTableReference(NamedTableReference node) { _nameTableReferenceList.Add(node); return node; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { CommonTableBinding tableBindingAsCommonTable = node.TableRefBinding.TableBinding as CommonTableBinding; if (tableBindingAsCommonTable == null) { // It is a regular table reference. Emit just a table node. List<ColumnValueDefinition> definedValues = new List<ColumnValueDefinition>(); foreach (ColumnRefBinding columnRefBinding in node.TableRefBinding.ColumnRefs) definedValues.Add(columnRefBinding.ValueDefinition); TableAlgebraNode algebraNode = new TableAlgebraNode(); algebraNode.TableRefBinding = node.TableRefBinding; algebraNode.DefinedValues = definedValues.ToArray(); SetLastAlgebraNode(algebraNode); } else { // It is a reference to a CTE. Instead of emitting a table node we have to replace the // reference to the CTE by the algebrized representation of the CTE. One could speak // of "inlining" the CTE. if (tableBindingAsCommonTable == _currentCommonTableBinding) { // This should never happen. The JoinAlgebraNode should ignore these table references. Debug.Fail("The current common table binding should never be reached as a table reference."); } AlgebraNode algebrizedCte; if (tableBindingAsCommonTable.IsRecursive) algebrizedCte = AlgebrizeRecursiveCte(tableBindingAsCommonTable); else algebrizedCte = Convert(tableBindingAsCommonTable.AnchorMember); // In order to use the CTE we have to instantiate it. See commonets in InstantiateCte() for // details. AlgebraNode computeScalarAlgebraNode = InstantiateCte(algebrizedCte, tableBindingAsCommonTable, node.TableRefBinding); SetLastAlgebraNode(computeScalarAlgebraNode); } return node; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { if (node.TableRefBinding.TableBinding == _commonTableBinding) { for (int i = 0; i < node.TableRefBinding.ColumnRefs.Length; i++) { CteColumnMapping columnMapping = new CteColumnMapping(); columnMapping.VirtualBufferEntry = node.TableRefBinding.ColumnRefs[i].ValueDefinition.Target; columnMapping.SpoolBufferEntry = _spoolBufferEntries[i]; _mappings.Add(columnMapping); } } return node; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { AddTable(node.TableRefBinding); return(node); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _writer.WriteIdentifier(node.TableName); if (node.CorrelationName != null) { _writer.Write(" AS "); _writer.WriteIdentifier(node.CorrelationName); } return node; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _tableRefBindingList.Add(node.TableRefBinding); return(node); }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _tableRefBindingList.Add(node.TableRefBinding); return node; }
public virtual TableReference VisitNamedTableReference(NamedTableReference node) { return(node); }
private NamedTableReference ParseTableReference() { // Read table name (unlike regular SQL the name cannot be qualified) Identifier tableIdentifier = Identifier.InternalFromSource(_tokenStream.Token.Text); // The default correlation name is the table name Identifier correlationName = tableIdentifier; // Override this default by the real correlation name (if present) _tokenStream.ReadNext(); if (_tokenStream.Token.Id != TokenId.AS && _tokenStream.Token.Id != TokenId.Identifier) { _tokenStream.ReadPrevious(); } else { if (_tokenStream.Token.Id == TokenId.AS) _tokenStream.ReadNext(); if (_tokenStream.Token.Id == TokenId.Identifier) correlationName = Identifier.InternalFromSource(_tokenStream.Token.Text); } NamedTableReference namedTableReference = new NamedTableReference(); namedTableReference.CorrelationName = correlationName; namedTableReference.TableName = tableIdentifier; return namedTableReference; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { _xmlWriter.WriteStartElement("namedTableReference"); _xmlWriter.WriteAttributeString("table", node.TableName.ToSource()); _xmlWriter.WriteEndElement(); return node; }
public virtual TableReference VisitNamedTableReference(NamedTableReference node) { return node; }
public override TableReference VisitNamedTableReference(NamedTableReference node) { AddTable(node.TableRefBinding); return node; }