示例#1
0
文件: Name.cs 项目: deveel/deveeldb
        public static ObjectName Object(PlSqlParser.ObjectNameContext context)
        {
            if (context == null)
                return null;

            var parts = context.id().Select(x => x.GetText()).ToArray();
            var realParts = new List<string>();

            foreach (var part in parts) {
                if (!String.IsNullOrEmpty(part)) {
                    var sp = part.Split('.');
                    foreach (var s in sp) {
                        realParts.Add(s);
                    }
                }
            }

            parts = realParts.ToArray();

            ObjectName name = null;

            for (int i = 0; i < parts.Length; i++) {
                var part = InputString.AsNotQuoted(parts[i]);

                if (name == null) {
                    name = new ObjectName(part);
                } else {
                    name = new ObjectName(name, part);
                }
            }

            return name;
        }
示例#2
0
文件: Name.cs 项目: deveel/deveeldb
        public static string Simple(PlSqlParser.IdContext context)
        {
            if (context == null)
                return null;

            return InputString.AsNotQuoted(context.GetText());
        }
示例#3
0
        public static SqlStatement Statement(PlSqlParser.AssignmentStatementContext context)
        {
            SqlExpression varRef;

            if (context.general_element() != null) {
                var element = ElementNode.Form(context.general_element());
                if (element.Argument != null &&
                    element.Argument.Length > 0)
                    throw new ParseCanceledException("Invalid assignment: cannot assign a function");

                var name = element.Id;
                if (name.Parent != null)
                    throw new ParseCanceledException("Invalid assignment.");

                varRef = SqlExpression.VariableReference(name.ToString());
            } else if (context.bind_variable() != null) {
                var varName = Name.Variable(context.bind_variable());
                varRef = SqlExpression.VariableReference(varName);
            } else {
                throw new ParseCanceledException("Invalid assignment syntax");
            }

            var valueExp = Expression.Build(context.expression());
            return new AssignVariableStatement(varRef, valueExp);
        }
示例#4
0
        public static RoutineParameter Routine(PlSqlParser.ParameterContext context)
        {
            var paramName = Name.Simple(context.parameter_name());
            var paramType = SqlTypeParser.Parse(context.datatype());

            var paramDir = ParameterDirection.Input;
            if (context.IN() != null) {
                if (context.OUT() != null) {
                    paramDir = ParameterDirection.InputOutput;
                } else {
                    paramDir = ParameterDirection.Input;
                }
            } else if (context.OUT() != null) {
                paramDir = ParameterDirection.Output;
            } else if (context.INOUT() != null) {
                paramDir = ParameterDirection.InputOutput;
            }

            SqlExpression defaultValue = null;
            var defaultPart = context.defaultValuePart();
            if (defaultPart != null) {
                defaultValue = Expression.Build(defaultPart.expression());
            }

            // TODO: Support default in RoutineParameter
            return new RoutineParameter(paramName, paramType, paramDir);
        }
示例#5
0
文件: Cursor.cs 项目: deveel/deveeldb
            public static CursorParameter Form(PlSqlParser.ParameterSpecContext context)
            {
                var paramName = Name.Simple(context.parameter_name());
                var type = SqlTypeParser.Parse(context.datatype());

                return new CursorParameter(paramName, type);
            }
示例#6
0
        public static SqlStatement Alter(PlSqlParser.AlterUserStatementContext context)
        {
            var userName = context.userName().GetText();

            var actions = new List<IAlterUserAction>();

            foreach (var actionContext in context.alterUserAction()) {
                if (actionContext.alterUserIdAction() != null) {
                    actions.Add(SetPassword(actionContext.alterUserIdAction()));
                } else if (actionContext.setAccountAction() != null) {
                    actions.Add(SetAccount(actionContext.setAccountAction()));
                } else if (actionContext.setRoleAction() != null) {
                    actions.Add(SetRole(actionContext.setRoleAction()));
                }
            }

            if (actions.Count == 1)
                return new AlterUserStatement(userName, actions[0]);

            var seq = new SequenceOfStatements();
            foreach (var action in actions) {
                seq.Statements.Add(new AlterUserStatement(userName, action));
            }

            return seq;
        }
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (messages != null)
                {
                    messages.Clear();
                }

                if (lexer != null)
                {
                    lexer.Interpreter.ClearDFA();
                    lexer.Reset();
                    lexer.Interpreter = new LexerATNSimulator(new ATN(ATNType.Lexer, 2));
                }

                if (plSqlParser != null)
                {
                    plSqlParser.Interpreter.ClearDFA();
                    plSqlParser.Reset();
                    plSqlParser.Interpreter = new ParserATNSimulator(new ATN(ATNType.Parser, 2));
                }
            }

            lexer       = null;
            plSqlParser = null;
            messages    = null;
        }
示例#8
0
文件: Name.cs 项目: deveel/deveeldb
 public static ObjectName Select(PlSqlParser.ObjectNameContext context, bool glob)
 {
     var name = Object(context);
     if (glob)
         name = new ObjectName(name, "*");
     return name;
 }
示例#9
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);
        }
示例#10
0
 public static void analyze(TextReader file)
 {
     var input  = new AntlrInputStream(file);
     var lexer  = new PlSqlLexer(input);
     var tokens = new CommonTokenStream(lexer);
     var parser = new PlSqlParser(tokens);
     var tree   = parser.sql_script();
 }
示例#11
0
        public void processPackage(string inputFilePath)
        {
            #region ANTLR4 necessary stuff



            var input = new AntlrInputStream(new StreamReader(inputFilePath));


            var lexer = new PlSqlLexer(input);

            var tokens = new CommonTokenStream(lexer);

            var parser = new PlSqlParser(tokens);

            PlSqlParser.Create_package_bodyContext context1 = parser.create_package_body();

            ParseTreeWalker walker = new ParseTreeWalker();

            var bListener = new BODYlistener();

            walker.Walk(bListener, context1);
            #endregion

            //you can start making changes from this point

            var converter   = new JoinLinksConverter(bListener.joinsList);
            var uniqueLinks = converter.MakeUniqueLinksList();



            using (var storage = new StorageContext(StorageContext.constr))
            {
                Dictionary <string, string> linkToText = new Dictionary <string, string>();

                foreach (var link in storage.links.ToList())
                {
                    linkToText.Add(link.toText, "");
                }



                List <Link> linkListToConvert = new List <Link>();

                linkListToConvert.AddRange(uniqueLinks.Where(link => dbObjectNames.ContainsKey(link.firstTable) && dbObjectNames.ContainsKey(link.secondTable) && !linkToText.ContainsKey(link.ToText())));

                LinkDBFormatConverter linkConverter = new LinkDBFormatConverter(linkListToConvert);

                foreach (var link in linkConverter.Result)
                {
                    storage.links.Add(link);
                }


                storage.SaveChanges();
            }
        }
示例#12
0
        public static SqlTableConstraint Form(PlSqlParser.TableConstraintContext context)
        {
            string constraintName = Name.Simple(context.id());

            ConstraintType type;
            string[] columns = null;
            string refTable = null;
            string[] refColumns = null;
            SqlExpression checkExp =  null;
            ForeignKeyAction? onDelete = null;
            ForeignKeyAction? onUpdate = null;

            if (context.primaryKeyConstraint() != null) {
                type = ConstraintType.PrimaryKey;

                columns = context.primaryKeyConstraint().columnList().columnName().Select(Name.Simple).ToArray();
            } else if (context.uniqueKeyConstraint() != null) {
                type = ConstraintType.Unique;
                columns = context.uniqueKeyConstraint().columnList().columnName().Select(Name.Simple).ToArray();
            } else if (context.checkConstraint() != null) {
                type = ConstraintType.Check;
                checkExp = Expression.Build(context.checkConstraint().expression());
            } else if (context.foreignKeyConstraint() != null) {
                type = ConstraintType.ForeignKey;
                columns = context.foreignKeyConstraint().columns.columnName().Select(Name.Simple).ToArray();
                refColumns = context.foreignKeyConstraint().refColumns.columnName().Select(Name.Simple).ToArray();
                refTable = Name.Object(context.foreignKeyConstraint().objectName()).ToString();
                var refActions = context.foreignKeyConstraint().referentialAction();
                if (refActions != null && refActions.Length > 0) {
                    foreach (var action in refActions) {
                        if (action.onDelete() != null) {
                            var actionType = GetForeignKeyAction(action.onDelete().referentialActionType().GetText());
                            onDelete = actionType;
                        } else if (action.onUpdate() != null) {
                            var actionType = GetForeignKeyAction(action.onUpdate().referentialActionType().GetText());
                            onUpdate = actionType;
                        }
                    }
                }
            } else {
                throw new ParseCanceledException("Invalid ");
            }

            var constraint = new SqlTableConstraint(constraintName, type, columns);

            if (type == ConstraintType.ForeignKey) {
                constraint.ReferenceTable = refTable;
                constraint.ReferenceColumns = refColumns;
                constraint.OnUpdate = onUpdate ?? ForeignKeyAction.NoAction;
                constraint.OnDelete = onDelete ?? ForeignKeyAction.NoAction;
            } else if (type == ConstraintType.Check) {
                constraint.CheckExpression = checkExp;
            }

            return constraint;
        }
示例#13
0
        public static WhereClause Form(PlSqlParser.WhereClauseContext context)
        {
            if (context.current_of_clause() != null) {
                return new WhereClause {CurrentOf = context.current_of_clause().cursor_name().GetText()};
            }

            return new WhereClause {
                Expression = new SqlExpressionVisitor().Visit(context.conditionWrapper())
            };
        }
示例#14
0
        public static SqlStatement Build(PlSqlParser.CreateTableStatementContext context)
        {
            var tableName = Name.Object(context.objectName());
            var columnOrConstraints = context.columnOrConstraintList().columnOrConstraint();

            bool ifNotExists = context.IF() != null && context.NOT() != null && context.EXISTS() != null;
            bool temporary = context.TEMPORARY() != null;

            var tableColumns = new List<SqlTableColumn>();
            var tableConstraints = new List<SqlTableConstraint>();
            var columnConstraints = new List<ColumnConstraint>();

            foreach (var columnOrConstraint in columnOrConstraints) {
                if (columnOrConstraint.tableColumn() != null) {
                    tableColumns.Add(TableColumn.Form(columnOrConstraint.tableColumn(), columnConstraints));
                } else if (columnOrConstraint.tableConstraint() != null) {
                    tableConstraints.Add(TableConstraint.Form(columnOrConstraint.tableConstraint()));
                }
            }

            if (columnConstraints.Count > 0) {
                var constraintGroups = columnConstraints.GroupBy(x => x.Type);

                foreach (var constraintGroup in constraintGroups) {
                    var columnNames = constraintGroup.Select(x => x.ColumnName).ToArray();
                    var index = tableConstraints.FindIndex(x => String.IsNullOrEmpty(x.ConstraintName) &&
                                                         x.ConstraintType == constraintGroup.Key);
                    if (index != -1) {
                        var unnamedConstraint = tableConstraints[index];
                        var columns = new List<string>(unnamedConstraint.Columns);
                        foreach (var columnName in columnNames) {
                            if (!columns.Contains(columnName))
                                columns.Add(columnName);
                        }

                        // TODO: set the new columns
                    } else {
                        tableConstraints.Add(new SqlTableConstraint(constraintGroup.Key, columnNames));
                    }
                }
            }

            var block = new SequenceOfStatements();
            block.Statements.Add(new CreateTableStatement(tableName, tableColumns) {
                IfNotExists = ifNotExists,
                Temporary = temporary
            });

            foreach (var constraint in tableConstraints) {
                block.Statements.Add(new AlterTableStatement(tableName, new AddConstraintAction(constraint)));
            }

            return block;
        }
示例#15
0
文件: Cursor.cs 项目: deveel/deveeldb
        public static SqlStatement Open(PlSqlParser.OpenStatementContext context)
        {
            var cursorName = Name.Simple(context.cursor_name());
            SqlExpression[] args = null;

            if (context.expression_list() != null) {
                args = context.expression_list().expression().Select(Expression.Build).ToArray();
            }

            return new OpenStatement(cursorName, args);
        }
示例#16
0
文件: Cursor.cs 项目: deveel/deveeldb
        public static SqlStatement Declare(PlSqlParser.CursorDeclarationContext context)
        {
            var cursorName = Name.Simple(context.cursor_name());
            var query = Subquery.Form(context.subquery());

            CursorParameter[] parameters = null;
            if (context.parameterSpec() != null) {
                parameters = context.parameterSpec().Select(Parameter.Form).ToArray();
            }

            return new DeclareCursorStatement(cursorName, parameters, query);
        }
示例#17
0
文件: Number.cs 项目: deveel/deveeldb
        public static int? Integer(PlSqlParser.NumericContext context)
        {
            if (context == null)
                return null;

            var text = context.GetText();
            int value;
            if (!Int32.TryParse(text, out value))
                throw new ParseCanceledException(String.Format("Numeric '{0}' is not an integer.", text));

            return value;
        }
示例#18
0
        public static FunctionArgument Form(PlSqlParser.ArgumentContext context)
        {
            if (context == null)
                return null;

            var id = Name.Simple(context.id());
            var exp = Compile.Expression.Build(context.expressionWrapper());

            return new FunctionArgument {
                Id = id,
                Expression = exp
            };
        }
示例#19
0
        private void MakeParser(string input, Action <SqlCompileMessage> messageReceiver)
        {
            using (var reader = new StringReader(input)) {
                var inputStream = new AntlrInputStream(reader);
                lexer = new PlSqlLexer(inputStream);

                var commonTokenStream = new CommonTokenStream(lexer);

                plSqlParser = new PlSqlParser(commonTokenStream);
                plSqlParser.RemoveErrorListeners();
                plSqlParser.AddErrorListener(new ErrorHandler(messageReceiver));
            }
        }
示例#20
0
        private static IAlterUserAction SetAccount(PlSqlParser.SetAccountActionContext context)
        {
            UserStatus status;
            if (context.LOCK() != null) {
                status = UserStatus.Locked;
            } else if (context.UNLOCK() != null) {
                status = UserStatus.Unlocked;
            } else {
                throw new ParseCanceledException();
            }

            return new SetAccountStatusAction(status);
        }
示例#21
0
        private static LoopControlStatement Build(LoopControlType controlType, PlSqlParser.LabelNameContext labelContext, PlSqlParser.ConditionContext conditionContext)
        {
            string label = null;
            SqlExpression whenExpression = null;

            if (labelContext != null)
                label = Name.Simple(labelContext);

            if (conditionContext != null)
                whenExpression = Expression.Build(conditionContext.expression());

            return new LoopControlStatement(controlType, label, whenExpression);
        }
示例#22
0
        public static SqlStatement Build(PlSqlParser.SelectStatementContext context)
        {
            IntoClause into;
            var query = Subquery.Form(context.subquery(), out into);

            if (into != null) {
                SqlExpression reference;
                if (into.TableName != null) {
                    reference = SqlExpression.Reference(into.TableName);
                } else {
                    var vars = into.Variables;
                    reference = SqlExpression.Tuple(vars.Select(SqlExpression.VariableReference).Cast<SqlExpression>().ToArray());
                }

                return new SelectIntoStatement(query, reference);
            }

            var statement = new SelectStatement(query);

            var orderBy = context.orderByClause();
            var forUpdate = context.forUpdateClause();

            if (orderBy != null) {
                var sortColumns = orderBy.orderByElements().orderByElement().Select(x => {
                    bool asc = x.DESC() == null;
                    var exp = Expression.Build(x.expression());
                    return new SortColumn(exp, asc);
                });

                statement.OrderBy = sortColumns;
            }

            statement.ForUpdate = forUpdate != null;

            var limit = context.queryLimitClause();
            if (limit != null) {
                var n1 = Number.PositiveInteger(limit.n1);
                var n2 = Number.PositiveInteger(limit.n2);

                if (n1 == null)
                    throw new ParseCanceledException("Invalid LIMIT clause");

                if (n2 != null) {
                    statement.Limit = new QueryLimit(n1.Value, n2.Value);
                } else {
                    statement.Limit = new QueryLimit(n1.Value);
                }
            }

            return statement;
        }
示例#23
0
        public static ElementNode Form(PlSqlParser.General_elementContext context)
        {
            var id = Name.Object(context.objectName());
            var arg = context.function_argument();
            IEnumerable<FunctionArgument> argNodes = null;
            if (arg != null) {
                argNodes = arg.argument().Select(FunctionArgument.Form);
            }

            return new ElementNode {
                Id = id,
                Argument = argNodes != null ? argNodes.ToArray() : null
            };
        }
示例#24
0
        public static SqlStatement Drop(PlSqlParser.DropSequenceStatementContext context)
        {
            var names = context.objectName().Select(Name.Object).ToArray();
            var ifExists = context.IF() != null && context.EXISTS() != null;

            if (names.Length == 1)
                return new DropSequenceStatement(names[0]);

            var sequence = new SequenceOfStatements();
            foreach (var name in names) {
                sequence.Statements.Add(new DropSequenceStatement(name));
            }

            return sequence;
        }
示例#25
0
        public static SqlStatement Build(PlSqlParser.DropTableStatementContext context)
        {
            var tableNames = context.objectName().Select(Name.Object).ToArray();
            bool ifExists = context.IF() != null && context.EXISTS() != null;

            if (tableNames.Length == 1)
                return new DropTableStatement(tableNames[0], ifExists);

            var list = new SequenceOfStatements();
            foreach (var tableName in tableNames) {
                list.Statements.Add(new DropTableStatement(tableName, ifExists));
            }

            return list;
        }
示例#26
0
        public static CreateViewStatement Create(PlSqlParser.CreateViewStatementContext context)
        {
            var orReplace = context.OR() != null && context.REPLACE() != null;

            var viewName = Name.Object(context.objectName());
            var query = (SqlQueryExpression) Expression.Build(context.subquery());

            string[] columnNames = null;
            if (context.columnList() != null) {
                columnNames = context.columnList().columnName().Select(Name.Simple).ToArray();
            }

            return new CreateViewStatement(viewName, columnNames, query) {
                ReplaceIfExists = orReplace
            };
        }
示例#27
0
        public static SqlStatement Build(PlSqlParser.AlterTableStatementContext context)
        {
            var tableName = Name.Object(context.objectName());

            var actions = context.alterTableAction().Select(ActionBuilder.Build).ToArray();

            if (actions.Length == 1)
                return new AlterTableStatement(tableName, actions[0]);

            var list = new SequenceOfStatements();
            foreach (var action in actions) {
                list.Statements.Add(new AlterTableStatement(tableName, action));
            }

            return list;
        }
示例#28
0
        public static UpdateStatement Build(PlSqlParser.UpdateStatementContext context)
        {
            var tableName = Name.Object(context.objectName());
            var setClause = context.updateSetClause();
            var limitClause = context.updateLimitClause();

            if (setClause != null) {
                var assignments = new List<SqlColumnAssignment>();
                var whereClause = context.whereClause();
                int limit = -1;

                if (limitClause != null)
                    limit = Number.PositiveInteger(limitClause.numeric()) ?? -1;

                SqlExpression whereExpression = null;
                if (whereClause != null)
                    whereExpression = Expression.Build(whereClause.conditionWrapper());

                if (setClause.VALUE() != null) {
                    var columnName = Name.Simple(setClause.columnName());
                    var value = Expression.Build(setClause.expression());

                    assignments.Add(new SqlColumnAssignment(columnName, value));
                } else {
                    var pairs = setClause.columnBasedUpdateClause().Select(x => new {
                        columnName = Name.Simple(x.columnName()),
                        value = Expression.Build(x.expression())
                    });

                    assignments = pairs.Select(x => new SqlColumnAssignment(x.columnName, x.value)).ToList();
                }

                return new UpdateStatement(tableName, whereExpression, assignments) {
                    Limit = limit
                };
            }
            if (context.updateFromClause() != null) {
                var query = Subquery.Form(context.updateFromClause().subquery());
            }

            throw new NotSupportedException();
        }
示例#29
0
        public static SqlStatement Build(PlSqlParser.DeleteStatementContext context)
        {
            var tableName = Name.Object(context.objectName());
            var whereClause = WhereClause.Form(context.whereClause());

            if (whereClause.CurrentOf != null)
                return new DeleteCurrentStatement(tableName, whereClause.CurrentOf);

            var statement = new DeleteStatement(tableName, whereClause.Expression);

            if (context.deleteLimit() != null) {
                var limit = Number.PositiveInteger(context.deleteLimit().numeric());
                if (limit == null)
                    throw new ParseCanceledException("Invalid delete limit.");

                statement.Limit = limit.Value;
            }

            return statement;
        }
示例#30
0
        public static SqlQueryExpression Form(PlSqlParser.SubqueryContext context, out IntoClause into)
        {
            var query = Form(context.subqueryBasicElements(), out into);

            var opPart = context.subquery_operation_part();

            if (opPart.Length > 0) {
                if (into != null)
                    throw new InvalidOperationException("Cannot SELECT INTO in a composite query.");

                foreach (var part in opPart) {
                    CompositeFunction function;
                    if (part.MINUS() != null || part.EXCEPT() != null) {
                        function = CompositeFunction.Except;
                    } else if (part.UNION() != null) {
                        function = CompositeFunction.Union;
                    } else if (part.INTERSECT() != null) {
                        function = CompositeFunction.Intersect;
                    } else {
                        throw new ParseCanceledException("Invalid composite function.");
                    }

                    bool isAll = part.ALL() != null;

                    var next = Form(part.subqueryBasicElements());
                    var prev = query.NextComposite;

                    if (prev == null) {
                        prev = next;
                    } else {
                        prev.NextComposite = next;
                    }

                    query.IsCompositeAll = isAll;
                    query.CompositeFunction = function;
                    query.NextComposite = prev;
                }
            }

            return query;
        }
示例#31
0
        public static SqlStatement Create(PlSqlParser.CreateUserStatementContext context)
        {
            var userName = context.userName().GetText();
            SqlExpression arg;
            SqlIdentificationType type;
            if (context.byPassword() != null) {
                arg = SqlExpression.Constant(InputString.AsNotQuoted(context.byPassword().CHAR_STRING().GetText()));
                type = SqlIdentificationType.Password;
            } else if (context.externalId() != null) {
                arg = SqlExpression.Constant(InputString.AsNotQuoted(context.externalId().CHAR_STRING()));
                type = SqlIdentificationType.External;
            } else if (context.globalId() != null) {
                arg = SqlExpression.Constant(InputString.AsNotQuoted(context.globalId().CHAR_STRING()));
                type = SqlIdentificationType.Global;
            } else {
                throw new ParseCanceledException();
            }

            var id = new SqlUserIdentifier(type, arg);
            return new CreateUserStatement(userName, id);
        }
示例#32
0
        public static SqlStatement Create(PlSqlParser.CreateSequenceStatementContext context)
        {
            var seqName = Name.Object(context.objectName());

            var statement = new CreateSequenceStatement(seqName);

            var startWith = context.sequenceStartClause();
            if (startWith != null) {
                statement.StartWith = SqlExpression.Constant(Number.PositiveInteger(startWith.UNSIGNED_INTEGER()));
            }

            var specs = context.sequenceSpec();
            if (specs != null && specs.Length > 0) {
                foreach (var spec in specs) {
                    if (spec.INCREMENT() != null &&
                        spec.BY() != null) {
                        statement.IncrementBy = SqlExpression.Constant(Number.PositiveInteger(spec.UNSIGNED_INTEGER()));
                    } else if (spec.MAXVALUE() != null) {
                        statement.MaxValue = SqlExpression.Constant(Number.PositiveInteger(spec.UNSIGNED_INTEGER()));
                    } else if (spec.NOMAXVALUE() != null) {
                        statement.MaxValue = SqlExpression.Constant(null);
                    } else if (spec.MINVALUE() != null) {
                        statement.MinValue = SqlExpression.Constant(Number.PositiveInteger(spec.UNSIGNED_INTEGER()));
                    } else if (spec.NOMINVALUE() != null) {
                        statement.MinValue = SqlExpression.Constant(null);
                    } else if (spec.CACHE() != null) {
                        statement.Cache = SqlExpression.Constant(Number.PositiveInteger(spec.UNSIGNED_INTEGER()));
                    } else if (spec.NOCACHE() != null) {
                        statement.Cache = SqlExpression.Constant(null);
                    } else if (spec.CYCLE() != null) {
                        statement.Cycle = true;
                    } else if (spec.NOCYCLE() != null) {
                        statement.Cycle = false;
                    }
                }
            }

            return statement;
        }
示例#33
0
            public static IAlterTableAction Build(PlSqlParser.AlterTableActionContext context)
            {
                if (context.addColumnAction() != null) {
                    var column = TableColumn.Form(context.addColumnAction().tableColumn(), new List<ColumnConstraint>());
                    return new AddColumnAction(column);
                }
                if (context.addConstraintAction() != null) {
                    var constraint = TableConstraint.Form(context.addConstraintAction().tableConstraint());
                    return new AddConstraintAction(constraint);
                }

                if (context.dropColumnAction() != null) {
                    var columnName = context.dropColumnAction().id().GetText();
                    return new DropColumnAction(columnName);
                }

                if (context.dropConstraintAction() != null) {
                    var constraintName = context.dropConstraintAction().id().GetText();
                    return new DropConstraintAction(constraintName);
                }

                if (context.dropPrimaryKeyAction() != null) {
                    return new DropPrimaryKeyAction();
                }

                if (context.dropDefaultAction() != null) {
                    var columnName = Name.Simple(context.dropDefaultAction().columnName());
                    return new DropDefaultAction(columnName);
                }

                if (context.setDefaultAction() != null) {
                    var columnName = Name.Simple(context.setDefaultAction().columnName());
                    var defaultValue = Expression.Build(context.setDefaultAction().expressionWrapper());
                    return new SetDefaultAction(columnName, defaultValue);
                }

                throw new ParseCanceledException("The ALTER TABLE action is not supported");
            }
        public SqlType Parse(IContext context, string s)
        {
            var typeInfo = PlSqlParser.ParseType(s);

            if (PrimitiveTypes.IsPrimitive(typeInfo.TypeName))
            {
                return(PrimitiveTypes.Resolver.Resolve(typeInfo));
            }

            if (context == null)
            {
                throw new Exception($"Type {typeInfo.TypeName} is not primitive and no context is provided");
            }

            var resolver = context.Scope.Resolve <ISqlTypeResolver>();

            if (resolver == null)
            {
                throw new InvalidOperationException($"The type {typeInfo.TypeName} is not primitive and no resolver was found in context");
            }

            return(resolver.Resolve(typeInfo));
        }
 public SqlExpressionParseResult Parse(IContext context, string expression)
 {
     return(PlSqlParser.ParseExpression(context, expression));
 }
示例#36
0
        private void MakeParser(string input, Action<SqlCompileMessage> messageReceiver)
        {
            using (var reader = new StringReader(input)) {
                var inputStream = new AntlrInputStream(reader);
                lexer = new PlSqlLexer(inputStream);

                var commonTokenStream = new CommonTokenStream(lexer);

                plSqlParser = new PlSqlParser(commonTokenStream);
                plSqlParser.RemoveErrorListeners();
                plSqlParser.AddErrorListener(new ErrorHandler(messageReceiver));
            }
        }