Example #1
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;
        }
Example #2
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
            };
        }
Example #3
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;
        }
Example #4
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;
        }
Example #5
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;
        }
Example #6
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
            };
        }
Example #7
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();
        }
Example #8
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;
        }
Example #9
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;
        }
Example #10
0
            private static FromSource FormSource(PlSqlParser.Dml_table_expression_clauseContext context)
            {
                var tableName = Name.Object(context.objectName());
                var query = context.subquery();

                var source = new FromSource();

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

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

                return source;
            }