/// <summary>
        /// Visits the given <paramref name="alterTableNode"/>.
        /// </summary>
        /// <param name="alterTableNode"></param>
        public override void Visit(IAlterTableNode alterTableNode)
        {
            ITableDefinition table = Environment.Schema.GetTable(alterTableNode.Name);

            foreach(IAstNode node in alterTableNode.ChildNodes)
            {
                if(node is IRemoveColumnNode)
                    table.RemoveColumn(((IRemoveColumnNode)node).Name);
                else if(node is IAddColumnNode)
                {
                    IAddColumnNode addColumnNode = (IAddColumnNode)node;
                    table.AddColumn(BindAddColumn(addColumnNode));
                    addColumnNode.Table = table.Name;
                } // else
                else if(node is IAlterColumnNode)
                {
                    IColumnDefinition columnDefinition = table.GetColumn(((IAlterColumnNode)node).Name);
                    IColumnNode columnNode = (IColumnNode)node;
                    columnNode.Type = columnDefinition.Type;
                    columnNode.Length = columnDefinition.Length;
                    BindColumnProperties(columnNode, columnDefinition);

                    AlterColumn(columnDefinition, (IAlterColumnNode)node);

                } // else if
                
                node.Accept(this);
            } // foreach
        }
 /// <summary>
 /// Visits the given <paramref name="alterTableNode"/>.
 /// </summary>
 /// <param name="alterTableNode"></param>
 public override void Visit(IAlterTableNode alterTableNode)
 {
     Visit(alterTableNode.ChildNodes);
 }
        /// <summary>
        ///  Visits the given <paramref name="alterTableNode" />.
        /// </summary>
        /// <param name="alterTableNode"></param>
        public override void Visit(IAlterTableNode alterTableNode)
        {
            textWriter.Write("alter table {0}", GetIdentifier(alterTableNode.Name));

            WriteProperties(alterTableNode);
            VisitBlock(alterTableNode);
        }
 public override void Visit(IAlterTableNode alterTableNode)
 {
     IncludeTemplates(alterTableNode);
 }
 protected override void AlterTableAlterColumn(IAlterTableNode alterTableNode, IAlterColumnNode alterColumnNode)
 {
 }
 protected override void AlterTableRemoveColumn(IAlterTableNode alterTableNode, IRemoveColumnNode removeColumnNode)
 {
 }
 protected virtual void AlterTableRemoveColumn(IAlterTableNode alterTableNode, IRemoveColumnNode removeColumnNode)
 {
     TextWriter.WriteLine("alter table {0} drop column {1};",
                          Platform.Dialect.EscapeIdentifier(alterTableNode.Name),
                          Platform.Dialect.EscapeIdentifier(removeColumnNode.Name));
 }
 protected virtual void AlterTableAlterColumn(IAlterTableNode alterTableNode, IAlterColumnNode alterColumnNode)
 {
     TextWriter.WriteLine("alter table {0} alter column {1};",
                          Platform.Dialect.EscapeIdentifier(alterTableNode.Name),
                          GetAlterColumnDefinition(alterColumnNode));
 }
        public override void Visit(IAlterTableNode alterTableNode)
        {
            foreach(IAstNode astNode in alterTableNode.ChildNodes)
            {
                if(astNode is IAddColumnNode)
                {
                    //
                    // Here's the situation: when downgrading, we potentially may encounter
                    // a situation when we restore a previously deleted column. If table
                    // in question contains data and column being added is non-nullable,
                    // we won't be able to do so. To circumvent this problem, enforce
                    // column to be nullable.
                    var addColumnNode = (IAddColumnNode)astNode;
                    TextWriter.WriteLine("alter table {0} add {1};",
                        Platform.Dialect.EscapeIdentifier(alterTableNode.Name), 
                        GetColumnDefinition(addColumnNode, alterTableNode.Parent is IDowngradeNode));
                } // if
                
                if(astNode is IRemoveColumnNode)
                {
                    var removeColumnNode = (IRemoveColumnNode)astNode;
                    AlterTableRemoveColumn(alterTableNode, removeColumnNode);
                } // if

                if(astNode is IAlterColumnNode)
                {
                    var alterColumnNode = (IAlterColumnNode)astNode;
                    AlterTableAlterColumn(alterTableNode, alterColumnNode);
                } // if
            } // foreach
        }