Exemple #1
0
        public override SqlExpression VisitNextValueFunction(PlSqlParser.NextValueFunctionContext context)
        {
            var seqName = SqlParseName.Object(context.objectName());

            return(SqlExpression.Function("NEXTVAL",
                                          new SqlExpression[] { SqlExpression.Constant(SqlObject.String(seqName.ToString())) }));
        }
Exemple #2
0
            public override SqlTypeResolveInfo VisitRowRefType(PlSqlParser.RowRefTypeContext context)
            {
                var objName = SqlParseName.Object(context.objectName());

                return(new SqlTypeResolveInfo("%ROWTYPE",
                                              new Dictionary <string, object> {
                    { "ObjectName", objName.FullName }
                }));
            }
Exemple #3
0
            public override SqlTypeResolveInfo VisitColumnRefType(PlSqlParser.ColumnRefTypeContext context)
            {
                var fieldName = SqlParseName.Object(context.objectName());

                return(new SqlTypeResolveInfo("%TYPE",
                                              new Dictionary <string, object> {
                    { "FieldName", fieldName.FullName }
                }));
            }
Exemple #4
0
            public override SqlTypeResolveInfo VisitUserDataType(PlSqlParser.UserDataTypeContext context)
            {
                var name = SqlParseName.Object(context.objectName());
                var args = context.typeArgument();

                if (args != null && args.typeArgumentSpec().Length > 0)
                {
                    throw new NotSupportedException("Arguments to user-defined type are not supported yet.");
                }

                return(new SqlTypeResolveInfo(name.FullName));
            }
Exemple #5
0
        public override SqlExpression VisitInvokedFunction(PlSqlParser.InvokedFunctionContext context)
        {
            var name = SqlParseName.Object(context.objectName());

            InvokeArgument[] args = null;

            if (context.argument() != null)
            {
                args = context.argument().Select(SqlParseFunctionArgument.Form)
                       .Select(x => new InvokeArgument(x.Id, x.Expression)).ToArray();
            }

            return(SqlExpression.Function(name, args));
        }
        public static SqlParseElementNode Form(IContext context, PlSqlParser.General_elementContext element)
        {
            var id  = SqlParseName.Object(element.objectName());
            var arg = element.function_argument();
            IEnumerable <SqlParseFunctionArgument> argNodes = null;

            if (arg != null)
            {
                argNodes = arg.argument().Select(x => SqlParseFunctionArgument.Form(context, x));
            }

            return(new SqlParseElementNode {
                Id = id,
                Argument = argNodes != null?argNodes.ToArray() : null
            });
        }
            private static FromSource FormSource(IContext context, PlSqlParser.QueryExpressionClauseContext clause)
            {
                var tableName = SqlParseName.Object(clause.objectName());
                var query     = clause.subquery();

                var source = new FromSource();

                if (tableName != null)
                {
                    source.TableName = ObjectName.Parse(tableName.ToString());
                }
                else if (!query.IsEmpty)
                {
                    source.SubQuery = Form(context, query);
                }

                if (clause.alias != null && !clause.alias.IsEmpty)
                {
                    source.Alias = clause.alias.GetText();
                }

                return(source);
            }
        private static SqlQueryExpression Form(IContext context, PlSqlParser.QueryBlockContext queryBlock, out SqlParseIntoClause into)
        {
            var fromClause = FromClauseBuilder.Build(context, queryBlock.fromClause());

            SqlQueryExpressionItem[] columns;

            if (queryBlock.all != null)
            {
                columns = new[] { new SqlQueryExpressionItem(SqlExpression.Reference(new ObjectName("*"))) };
            }
            else
            {
                columns = queryBlock.selectedElement().Select(x => SelectElement.BuildColumn(context, x)).ToArray();
            }

            var query = new SqlQueryExpression();

            foreach (var column in columns)
            {
                query.Items.Add(column);
            }

            into = null;

            if (queryBlock.DISTINCT() != null ||
                queryBlock.UNIQUE() != null)
            {
                query.Distinct = true;
            }

            var intoClause = queryBlock.into_clause();

            if (intoClause != null)
            {
                into = new SqlParseIntoClause();

                if (intoClause.objectName() != null)
                {
                    into.TableName = SqlParseName.Object(intoClause.objectName());
                }
                else if (intoClause.variable_name() != null)
                {
                    into.Variables = intoClause.variable_name().Select(SqlParseName.Variable).ToArray();
                }
            }

            if (fromClause != null)
            {
                query.From = fromClause;
            }

            var groupBy = queryBlock.groupByClause();

            if (groupBy != null && !groupBy.IsEmpty)
            {
                query.GroupBy = groupBy.groupByElements().expression().Select(x => new SqlExpressionVisitor(context).Visit(x)).ToList();

                var having = groupBy.havingClause();
                if (having != null)
                {
                    query.Having = new SqlExpressionVisitor(context).Visit(having.condition());
                }
            }

            var groupMax = queryBlock.groupMaxClause();

            if (groupMax != null && !groupMax.IsEmpty)
            {
                var maxColumn = SqlParseName.Object(groupMax.objectName());
                query.GroupMax = maxColumn;
            }

            var whereClause = queryBlock.whereClause();

            if (whereClause != null && !whereClause.IsEmpty)
            {
                var currentOf = whereClause.current_of_clause();
                if (currentOf != null && !currentOf.IsEmpty)
                {
                    var cursorName = SqlParseName.Simple(currentOf.cursor_name());
                    throw new NotImplementedException();
                }
                else
                {
                    query.Where = new SqlExpressionVisitor(context).Visit(whereClause.conditionWrapper());
                }
            }

            //TODO: in case of a SELECT INTO cause create a statement

            return(query);
        }