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)); }
public static SqlTypeResolveInfo GetResolveInfo(PlSqlParser.DatatypeContext context) { return(new SqlTypeVisitor().Visit(context)); }
public static SqlType Parse(PlSqlParser.DatatypeContext context) { var typeInfo = GetResolveInfo(context); return(PrimitiveTypes.Resolver.Resolve(typeInfo)); }
/// <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); }