INode MakeSubstring(FunctionCall substringCall) { if (substringCall == null) { throw new ArgumentNullException("substringCall"); } substringCall.Name = TailorUtil.GetCapitalized(TailorUtil.MID); ExpressionItem val = substringCall.ExpressionArguments; if (val == null) { throw new InvalidOperationException("No parameters for SUBSTRING."); } ExpressionItem start = val.Next; if (start == null) { throw new InvalidOperationException("Too few parameters for SUBSTRING."); } ExpressionItem len = start.Next; INode cond = MakeNotNullCheck(start); // Mid actually handles NULL // in the first parameter if (len == null) { // We don't need to add length in the normal case, but it's // useful when the start position is too large and the call // ought to fail (which Mid doesn't, unless it's called with // a negative length). IExpression argument = TailorUtil.MakeLenArg(start.Expression, val.Expression, "Len"); start.Add(new ExpressionItem(argument)); } else { if (len.Next != null) { throw new InvalidOperationException("Too many parameters for SUBSTRING."); } } if (cond == null) { return(substringCall); } else { FunctionCall iifCall = new FunctionCall("Iif"); iifCall.ExpressionArguments = new ExpressionItem(cond); iifCall.ExpressionArguments.Add(new ExpressionItem(NullValue.Value)); iifCall.ExpressionArguments.Add(new ExpressionItem(substringCall)); return(iifCall); } }
public INode Clone() { ExpressionItem expressionItem = new ExpressionItem(m_expression.Clone()); if (m_next != null) { expressionItem.Add((ExpressionItem)(m_next.Clone())); } return(expressionItem); }
public void Add(ExpressionItem tail) { if (tail == null) { throw new ArgumentNullException("tail"); } if (m_next == null) { m_next = tail; } else { m_next.Add(tail); } }
INode MakeSubstring(FunctionCall substringCall) { if (substringCall == null) { throw new ArgumentNullException("substringCall"); } if (TailorUtil.HasNullArgument(substringCall)) { return(NullValue.Value); } ExpressionItem val = substringCall.ExpressionArguments; if (val == null) { throw new InvalidOperationException("No parameters for SUBSTRING."); } ExpressionItem start = val.Next; if (start == null) { throw new InvalidOperationException("Too few parameters for SUBSTRING."); } ExpressionItem len = start.Next; // before adding len to the list Expression when = MakeNotNullCheck(substringCall.ExpressionArguments); if (len == null) { IExpression argument = TailorUtil.MakeLenArg(start.Expression, val.Expression, "LEN"); start.Add(new ExpressionItem(argument)); } else { if (len.Next != null) { throw new InvalidOperationException("Too many parameters for SUBSTRING."); } } if (when != null) { CaseExpression caseExpression = new CaseExpression(); caseExpression.Alternatives = new CaseAlternative(when, substringCall); Expression elseExpr = new Expression(); elseExpr.Left = NullValue.Value; caseExpression.Else = elseExpr; return(caseExpression); } else { return(substringCall); } }