示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        public override TableReference VisitJoinedTableReference(JoinedTableReference node)
        {
            if (node.JoinType != JoinType.Inner)
            {
                _containsOuterJoin = true;
            }

            return(base.VisitJoinedTableReference(node));
        }
示例#4
0
        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);
        }
示例#5
0
		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;
		}
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
		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;
		}
示例#9
0
文件: Parser.cs 项目: chenzuo/nquery
        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;
        }
示例#10
0
文件: Parser.cs 项目: chenzuo/nquery
        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;
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#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);
        }
示例#14
0
        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;
        }
示例#15
0
		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;
		}
示例#16
0
		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;
		}
示例#17
0
		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);
		}
示例#19
0
		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;
		}