コード例 #1
0
        public DataTypeInfo ParseDataType(string s)
        {
            SetInput(s);
            //var plSqlParser = MakeParser(s, null);
            var parseResult = plSqlParser.datatype();

            var visitor = new DataTypeVisitor();

            return(visitor.Visit(parseResult));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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));
        }