public override ISqlNode VisitSelectStatementNode(SelectStatementNode node, object parameter)
        {
            if (Processed)
            {
                return(node);
            }

            Processed = true;
            var subStatement = new SelectStatementNode();

            subStatement.SelectClauseNode  = node.SelectClauseNode;
            subStatement.FromClauseNode    = node.FromClauseNode;
            subStatement.WhereClauseNode   = node.WhereClauseNode;
            subStatement.GroupByClauseNode = node.GroupByClauseNode;
            subStatement.HavingClauseNode  = node.HavingClauseNode;

            var selectNode = new SelectClauseNode("select");

            selectNode.AddNode(new FragmentNode(" count(*) "));
            var fromNode = new FromClauseNode("from");

            fromNode.AddNode(new FragmentNode(" ( "));
            fromNode.AddNode(subStatement);
            fromNode.AddNode(new FragmentNode(") t_"));

            var result = new SelectStatementNode();

            result.SelectClauseNode = selectNode;
            result.FromClauseNode   = fromNode;
            result.OptionClauseNode = node.OptionClauseNode;
            return(result);
        }
Exemple #2
0
        public override ISqlNode VisitSelectStatementNode(SelectStatementNode node, object parameter)
        {
            if (Processed)
            {
                return(node);
            }

            if (RowNumberColumnSpecified)
            {
                return(base.VisitSelectStatementNode(node, parameter));
            }

            Processed = true;
            var subStatement = new SelectStatementNode();

            subStatement.SelectClauseNode  = node.SelectClauseNode;
            subStatement.FromClauseNode    = node.FromClauseNode;
            subStatement.WhereClauseNode   = node.WhereClauseNode;
            subStatement.GroupByClauseNode = node.GroupByClauseNode;
            subStatement.HavingClauseNode  = node.HavingClauseNode;
            subStatement.OrderByClauseNode = node.OrderByClauseNode;

            var selectNode = new SelectClauseNode("select");

            selectNode.AddNode(new FragmentNode(" * "));
            var fromNode = new FromClauseNode("from");

            fromNode.AddNode(new FragmentNode($" ( select temp_.*, rownum {RowNumberColumnName} from ( "));
            fromNode.AddNode(subStatement);
            fromNode.AddNode(new FragmentNode(" ) temp_ ) "));
            var whereNode = new WhereClauseNode("where");

            whereNode.AddNode(new FragmentNode(" "));
            if (Offset >= 0)
            {
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} > "));
                whereNode.AddNode(new FragmentNode(Offset.ToString()));
            }

            if (Limit > 0)
            {
                if (Offset >= 0)
                {
                    whereNode.AddNode(new FragmentNode(" and "));
                }
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} <= "));
                var bias = Offset < 0 ? 0 : Offset;
                whereNode.AddNode(new FragmentNode((bias + Limit).ToString()));
            }

            var result = new SelectStatementNode();

            result.SelectClauseNode    = selectNode;
            result.FromClauseNode      = fromNode;
            result.WhereClauseNode     = whereNode;
            result.ForUpdateClauseNode = node.ForUpdateClauseNode;
            result.OptionClauseNode    = node.OptionClauseNode;
            return(result);
        }
        public object VisitFromClauseNode(FromClauseNode node, Context parameter)
        {
            var wordNode = node.WordNode;

            wordNode.Accept(this, parameter);
            foreach (var child in node.Children)
            {
                child.Accept(this, parameter);
            }

            return(null);
        }
Exemple #4
0
        private void ParseFromWord()
        {
            Validate();
            var node = new FromClauseNode(_token);

            if (IsInSelectStatementNode())
            {
                RemoveNodesTo <SelectStatementNode>();
                var selectStatementNode = (SelectStatementNode)Peek();
                selectStatementNode.FromClauseNode = node;
            }
            else
            {
                AppendNode(node);
            }
            _nodeStack.Push(node);
        }
        public override ISqlNode VisitSelectStatementNode(SelectStatementNode node, object parameter)
        {
            if (Processed)
            {
                return(node);
            }

            Processed = true;

            var originalOrderBy = node.OrderByClauseNode;

            if (originalOrderBy == null)
            {
                throw new SqlTransformException(ExceptionMessageId.Esp2201);
            }

            var subStatement = new SelectStatementNode();

            subStatement.SelectClauseNode  = node.SelectClauseNode;
            subStatement.FromClauseNode    = node.FromClauseNode;
            subStatement.WhereClauseNode   = node.WhereClauseNode;
            subStatement.GroupByClauseNode = node.GroupByClauseNode;
            subStatement.HavingClauseNode  = node.HavingClauseNode;

            var orderBy = new OrderByClauseNode(originalOrderBy.WordNode);

            foreach (var child in originalOrderBy.Children)
            {
                if (child is WordNode wordNode)
                {
                    var word  = wordNode.Word;
                    var names = word.Split('.');
                    if (names.Length == 2)
                    {
                        orderBy.AddNode(new WordNode("temp_." + names[1]));
                    }
                    else
                    {
                        orderBy.AddNode(child);
                    }
                }
                else
                {
                    orderBy.AddNode(child);
                }
            }

            var selectNode = new SelectClauseNode("select");

            selectNode.AddNode(new FragmentNode(" * "));
            var fromNode = new FromClauseNode("from");

            fromNode.AddNode(new FragmentNode(" ( select temp_.*, row_number() over( "));
            fromNode.AddNode(orderBy);
            fromNode.AddNode(new FragmentNode($" ) as {RowNumberColumnName} from ( "));
            fromNode.AddNode(subStatement);
            fromNode.AddNode(new FragmentNode(") as temp_ ) as temp2_ "));
            var whereNode = new WhereClauseNode("where");

            whereNode.AddNode(new FragmentNode(" "));
            if (Offset >= 0)
            {
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} > "));
                whereNode.AddNode(new FragmentNode(Offset.ToString()));
            }

            if (Limit > 0)
            {
                if (Offset >= 0)
                {
                    whereNode.AddNode(new FragmentNode(" and "));
                }

                var bias = Offset < 0 ? 0 : Offset;
                whereNode.AddNode(new FragmentNode($"{RowNumberColumnName} <= "));
                whereNode.AddNode(new FragmentNode((bias + Limit).ToString()));
            }

            var result = new SelectStatementNode();

            result.SelectClauseNode    = selectNode;
            result.FromClauseNode      = fromNode;
            result.WhereClauseNode     = whereNode;
            result.ForUpdateClauseNode = node.ForUpdateClauseNode;
            result.OptionClauseNode    = node.OptionClauseNode;
            return(result);
        }