コード例 #1
0
 public override ISqlNode VisitDataType(SqlDataTypeNode n)
 {
     _result.AssertNotNull(n, nameof(n.DataType), n.DataType);
     if (n.Size == null)
     {
     }
     else if (n.Size is SqlKeywordNode isMax)
     {
         _result.AssertIsValue(n, nameof(n.Size), isMax.Keyword, "MAX");
     }
     else if (n.Size is SqlNumberNode asNumber)
     {
         _result.AssertIsPositiveNumber(n, nameof(n.Size), asNumber.Numeric);
     }
     else if (n.Size is SqlListNode <SqlNumberNode> asList)
     {
         _result.AssertIsNotEmpty(n, nameof(n.Size), asList);
         asList.Select((i, x) => _result.AssertIsPositiveNumber(asList, x.ToString(), i.Numeric)).All(x => x);
     }
     else
     {
         _result.UnexpectedNodeType(n, nameof(n.Size), n.Size);
     }
     return(base.VisitDataType(n));
 }
コード例 #2
0
        public virtual ISqlNode VisitDataType(SqlDataTypeNode n)
        {
            var d = Visit(n.DataType) as SqlKeywordNode;
            var s = Visit(n.Size);

            return(n.Update(d, s));
        }
コード例 #3
0
        public ISqlNode VisitDataType(SqlDataTypeNode n)
        {
            Visit(n.DataType);
            if (n.Size != null)
            {
                Append("(", n.Size, ")");
            }

            return(n);
        }
コード例 #4
0
        private SqlDataTypeNode ParseDataType(ITokenizer t)
        {
            // <Keyword> ("(" ("MAX" | <SizeList>)? ")")?
            var next = t.GetNext();

            // TODO: Array types
            // TODO: Should we add TABLE declaration parsing?
            if (next.IsKeyword("TABLE"))
            {
                return(null);
            }

            var dataType = new SqlDataTypeNode
            {
                Location = next.Location,
                DataType = new SqlKeywordNode(next),
            };

            if (t.Peek().IsSymbol("("))
            {
                t.GetNext();
                var lookahead = t.Peek();
                if (lookahead.IsKeyword("MAX"))
                {
                    dataType.Size = new SqlKeywordNode(t.GetNext());
                }
                else if (lookahead.IsType(SqlTokenType.Number))
                {
                    dataType.Size = ParseList(t, ParseNumber);
                }
                else
                {
                    throw ParsingException.CouldNotParseRule(nameof(ParseDataType), lookahead);
                }
                t.Expect(SqlTokenType.Symbol, ")");
            }
            return(dataType);
        }