Example #1
0
 private static bool VisitNamedTableReference(NamedTableReference node1, NamedTableReference node2)
 {
     return(node2 != null &&
            node1.TableName == node2.TableName &&
            node1.CorrelationName == node2.CorrelationName &&
            node1.TableRefBinding == node2.TableRefBinding);
 }
Example #2
0
        public override TableReference VisitNamedTableReference(NamedTableReference node)
        {
            _xmlWriter.WriteStartElement("namedTableReference");
            _xmlWriter.WriteAttributeString("table", node.TableName.ToSource());
            _xmlWriter.WriteEndElement();

            return(node);
        }
Example #3
0
		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;
		}
Example #4
0
        private bool IsTableReferenceToCurrentCommonTableBinding(TableReference tableReference)
        {
            NamedTableReference namedTableReference = tableReference as NamedTableReference;

            if (namedTableReference == null)
            {
                return(false);
            }

            return(namedTableReference.TableRefBinding.TableBinding == _currentCommonTableBinding);
        }
Example #5
0
        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);
        }
Example #6
0
        public override TableReference VisitNamedTableReference(NamedTableReference node)
        {
            _writer.WriteIdentifier(node.TableName);

            if (node.CorrelationName != null)
            {
                _writer.Write(" AS ");
                _writer.WriteIdentifier(node.CorrelationName);
            }

            return(node);
        }
Example #7
0
        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);
        }
Example #8
0
            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);
            }
Example #9
0
        public override TableReference VisitNamedTableReference(NamedTableReference node)
        {
            if (node.TableName.Matches(_commonTableName))
            {
                if (_subqueryContextCounter > 0)
                {
                    _recursiveReferenceInSubquery = true;
                }
                else
                {
                    _recursiveReferences++;
                }
            }

            return(node);
        }
Example #10
0
        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;
        }
Example #11
0
		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;
		}
Example #13
0
        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);
        }
Example #14
0
 public override TableReference VisitNamedTableReference(NamedTableReference node)
 {
     _nameTableReferenceList.Add(node);
     return node;
 }
Example #15
0
		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;
		}
Example #16
0
			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;
			}
Example #17
0
 public override TableReference VisitNamedTableReference(NamedTableReference node)
 {
     AddTable(node.TableRefBinding);
     return(node);
 }
Example #18
0
		public override TableReference VisitNamedTableReference(NamedTableReference node)
		{
			_writer.WriteIdentifier(node.TableName);

			if (node.CorrelationName != null)
			{
				_writer.Write(" AS ");
				_writer.WriteIdentifier(node.CorrelationName);
			}

			return node;
		}
Example #19
0
 public override TableReference VisitNamedTableReference(NamedTableReference node)
 {
     _tableRefBindingList.Add(node.TableRefBinding);
     return(node);
 }
Example #20
0
 public override TableReference VisitNamedTableReference(NamedTableReference node)
 {
     _tableRefBindingList.Add(node.TableRefBinding);
     return node;
 }
Example #21
0
 public virtual TableReference VisitNamedTableReference(NamedTableReference node)
 {
     return(node);
 }
Example #22
0
		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;
		}
Example #23
0
		public override TableReference VisitNamedTableReference(NamedTableReference node)
		{
			_xmlWriter.WriteStartElement("namedTableReference");
			_xmlWriter.WriteAttributeString("table", node.TableName.ToSource());
			_xmlWriter.WriteEndElement();

			return node;
		}
Example #24
0
		public virtual TableReference VisitNamedTableReference(NamedTableReference node)
		{
			return node;
		}
Example #25
0
		public override TableReference VisitNamedTableReference(NamedTableReference node)
		{
			AddTable(node.TableRefBinding);
			return node;
		}