public StringBuilder Visit(DefaultConstraintNode defaultConstraintNode) { var sb = new StringBuilder(); sb.Append("DEFAULT "); sb.Append(defaultConstraintNode.Value); return(sb); }
private CreateTableNode IncorporateAlterationsInCreateNode(AlterTableCommand command, CreateTableNode createTableNode) { foreach (TableCommand alterCommand in command.TableCommands) { if (alterCommand is AddColumnCommand) { var addColumn = alterCommand as AddColumnCommand; createTableNode.ColumnDefinitions.Add(addColumn.CreateColumnDefNode()); } else if (alterCommand is DropColumnCommand) { var dropColumn = alterCommand as DropColumnCommand; ColumnDefNode result = createTableNode.ColumnDefinitions.FirstOrDefault(i => i.ColumnName == dropColumn.ColumnName); if (result == null) { //bad!! throw new InvalidColumnException <DropColumnCommand>(String.Format("Altering column {0} failed. No such column exists on table {1}.", dropColumn.ColumnName, dropColumn.TableName), dropColumn); } else { //remove our column createTableNode.ColumnDefinitions.Remove(result); } } else if (alterCommand is AlterColumnCommand) { var alterColumn = alterCommand as AlterColumnCommand; ColumnDefNode columnDef = createTableNode.ColumnDefinitions.FirstOrDefault(i => i.ColumnName == alterColumn.ColumnName); if (columnDef == null) { //throw!!!! throw new InvalidColumnException <AlterColumnCommand>(String.Format("Altering column {0} failed. No such column exists on table {1}.", alterColumn.ColumnName, alterColumn.TableName), alterColumn); } //modify the type name if (!String.IsNullOrEmpty(alterColumn.DbType)) { columnDef.TypeNameNode = SQLiteParseVisitor.ParseString <TypeNameNode>(alterColumn.DbType, i => i.type_name()); } if (alterColumn.Default != null) { //modify the default DefaultConstraintNode defaultConstraint = columnDef.ColumnConstraints.OfType <DefaultConstraintNode>().FirstOrDefault(); if (defaultConstraint == null) { //we'll create our own defaultConstraint = new DefaultConstraintNode { Value = DbUtils.ConvertToSqlValue(alterColumn.Default) }; //and add it! columnDef.ColumnConstraints.Add(defaultConstraint); } else { //we modify the one that exists defaultConstraint.Value = DbUtils.ConvertToSqlValue(alterColumn.Default); } } } else if (alterCommand is CreateForeignKeyCommand) { var foreignKeyCommand = alterCommand as CreateForeignKeyCommand; var keyNode = new TableConstraintForeignKeyNode { FieldNames = foreignKeyCommand.SrcColumns, ConstraintName = foreignKeyCommand.Name, ForeignKeyClauseNode = new ForeignKeyClauseNode { TableName = foreignKeyCommand.DestTable, FieldList = foreignKeyCommand.DestColumns, ForeignDeferrable = new ForeignDeferrableNode().SetToTrulyDeferrable() } }; createTableNode.TableConstraints.Add(keyNode); } else if (alterCommand is DropForeignKeyCommand) { var foreignKeyCommand = alterCommand as DropForeignKeyCommand; TableConstraintForeignKeyNode foreignKeyDrop = createTableNode.TableConstraints .OfType <TableConstraintForeignKeyNode>() .FirstOrDefault(n => n.ConstraintName == foreignKeyCommand.Name); if (foreignKeyDrop == null) { throw new InvalidForeignKeyException(String.Format("No foreign key {0} exists.", foreignKeyCommand.Name), foreignKeyCommand); } createTableNode.TableConstraints.Remove(foreignKeyDrop); } } return(createTableNode); }
public override SQLiteParseTreeNode VisitColumn_constraint__postfix(SQLiteParserSimpleParser.Column_constraint__postfixContext context) { if (context.NOT() != null) { return(new NotNullConstraintNode(context) { ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode }); } if (context.PRIMARY() != null) { var ret = new PrimaryKeyConstraintNode(context); if (context.ASC() != null) { ret.Order = SortOrder.Asc; } else if (context.DESC() != null) { ret.Order = SortOrder.Desc; } ret.ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode; if (context.AUTOINCREMENT() != null) { ret.AutoIncrement = true; } return(ret); } if (context.UNIQUE() != null) { return(new UniqueConstraintNode(context) { ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode }); } if (context.CHECK_C() != null) { return(new CheckConstraintNode(context) { Expr = context.expr().GetText() }); } if (context.DEFAULT() != null) { var ret = new DefaultConstraintNode(context); if (context.signed_number() != null) { ret.Value = context.signed_number().GetText(); } else if (context.literal_value() != null) { ret.Value = context.literal_value().GetText(); } else if (context.expr() != null) { ret.Value = "( " + context.expr().GetText() + " )"; } return(ret); } if (context.NULL() != null) { //it's a default null but sqlite allows it and says it's null var ret = new DefaultConstraintNode(context) { Value = "NULL" }; return(ret); } if (context.COLLATE() != null) { return(new CollateConstraintNode(context) { CollationName = context.collation_name().GetText() }); } if (context.foreign_key_clause() != null) { return(context.foreign_key_clause().Accept(this) as ColumnConstraintNode); } throw new Exception("we should never get here."); }