public DataTypeInfo ParseDataType(string s) { SetInput(s); //var plSqlParser = MakeParser(s, null); var parseResult = plSqlParser.datatype(); var visitor = new DataTypeVisitor(); return(visitor.Visit(parseResult)); }
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 override SqlStatement VisitCreateFunctionStatement(PlSqlParser.CreateFunctionStatementContext context) { var functionName = Name.Object(context.objectName()); bool orReplace = context.OR() != null && context.REPLACE() != null; var body = context.body(); var call = context.callSpec(); SqlType returnType; var returnTypeSpec = context.functionReturnType(); if (returnTypeSpec.TABLE() != null) { returnType = new TabularType(); } else if (returnTypeSpec.DETERMINISTIC() != null) { returnType = Function.DynamicType; } else { var typeInfo = new DataTypeVisitor().Visit(returnTypeSpec.primitive_type()); if (!typeInfo.IsPrimitive) { throw new NotSupportedException(String.Format("The return type of function '{0}' ('{1}') is not primitive.", functionName, typeInfo)); } returnType = PrimitiveTypes.Resolve(typeInfo.TypeName, typeInfo.Metadata); } RoutineParameter[] parameters = null; if (context.parameter() != null && context.parameter().Length > 0) { parameters = context.parameter().Select(Parameter.Routine).ToArray(); } if (body != null) { var functionBody = Visit(body); if (!(functionBody is PlSqlBody)) { throw new ParseCanceledException("Invalid function body."); } var plsqlBody = ((PlSqlBody)functionBody).AsPlSqlStatement(); var declarationArray = context.declaration(); if (declarationArray != null && declarationArray.Length > 0) { foreach (var declContext in declarationArray) { var declaration = Visit(declContext); plsqlBody.Declarations.Add(declaration); } } return(new CreateFunctionStatement(functionName, returnType, parameters, plsqlBody) { ReplaceIfExists = orReplace }); } var typeString = InputString.AsNotQuoted(call.dotnetSpec().typeString.Text); var assemblyToken = InputString.AsNotQuoted(call.dotnetSpec().assemblyString); if (assemblyToken != null) { typeString = String.Format("{0}, {1}", typeString, assemblyToken); } return(new CreateExternalFunctionStatement(functionName, returnType, parameters, typeString)); }