public static SqlType Parse(PlSqlParser.DatatypeContext context)
        {
            var typeInfo = new DataTypeVisitor().Visit(context);

            if (!typeInfo.IsPrimitive)
            {
                throw new NotSupportedException();
            }

            return(PrimitiveTypes.Resolve(typeInfo.TypeName, typeInfo.Metadata));
        }
Exemple #2
0
 public static SqlTypeResolveInfo GetResolveInfo(PlSqlParser.DatatypeContext context)
 {
     return(new SqlTypeVisitor().Visit(context));
 }
Exemple #3
0
        public static SqlType Parse(PlSqlParser.DatatypeContext context)
        {
            var typeInfo = GetResolveInfo(context);

            return(PrimitiveTypes.Resolver.Resolve(typeInfo));
        }
Exemple #4
0
        /// <summary>
        /// datatype
        ///     : native_datatype_element precision_part? (WITH LOCAL? TIME ZONE | CHARACTER SET char_set_name)?
        ///     | INTERVAL(YEAR | DAY) ('(' expression ')')? TO(MONTH | SECOND) ('(' expression ')')?
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override object VisitDatatype([NotNull] PlSqlParser.DatatypeContext context)
        {
            var result = new OracleType()
            {
            };

            var native_datatype_element = context.native_datatype_element();

            if (native_datatype_element != null)
            {
                result.Name = (string)native_datatype_element.Accept <object>(this);

                var precision_part = context.precision_part();
                if (precision_part != null)
                {
                    //  '(' numeric (',' numeric)? (CHAR | BYTE)? ')'

                    var values = precision_part.numeric().Select(c => c.Accept <object>(this)).Cast <int>().ToList();

                    if (values.Count == 1)
                    {
                        result.DataPrecision = values[0];
                    }
                    else if (values.Count == 2)
                    {
                        var _dec  = (System.Math.Pow(10, (double)values[1].ToString().Length));
                        var _dec2 = (values[1]) / _dec;
                        result.DataPrecision = new decimal(values[0]) + new decimal(_dec2);
                    }
                    else
                    {
                        Stop();
                    }
                }

                if (context.WITH() != null)
                {
                    result.Name += " WITH";
                    if (context.LOCAL() != null)
                    {
                        result.Name += " LOCAL";
                    }

                    if (context.TIME() != null && context.ZONE() != null)
                    {
                        result.Name += " TIME ZONE";
                    }
                }
                else if (context.CHARACTER() != null && context.SET() != null)
                {
                    Stop();
                    context.char_set_name();
                }
            }
            else
            {
                Stop();

                if (context.INTERVAL() != null)
                {
                    var day  = context.DAY() != null;
                    var year = context.YEAR() != null;
                }

                PlSqlParser.ExpressionContext expression1 = null;
                PlSqlParser.ExpressionContext expression2 = null;

                var expressions = context.expression();

                var to     = context.TO();
                var month  = context.MONTH();
                var second = context.SECOND();

                if (expressions.Length == 2)
                {
                    Stop();
                    expression1 = expressions[0];
                    expression2 = expressions[1];
                }
                if (expressions.Length == 1)
                {
                    Stop();
                    expression1 = expressions[0];
                    if (expression1.Start.StartIndex > to.Symbol.StartIndex)
                    {
                        expression2 = expression1;
                        expression1 = null;
                    }
                }
                else
                {
                    Stop();
                }
            }

            return(result);
        }