internal ColumnDefNode CreateColumnDefNode() { var ret = new ColumnDefNode { ColumnName = this.ColumnName, ColumnConstraints = new List <ColumnConstraintNode>() }; //dialect converts DbType.Int16-64 to "INT" not "INTEGER" and only INTEGER columns can be autoincremented. This fixes that. string correctType = this.IsIdentity ? "INTEGER" : this.DbType; ret.TypeNameNode = SQLiteParseVisitor.ParseString <TypeNameNode>(correctType, i => i.type_name()); //not quite right but should work if (this.IsIdentity || this.IsPrimaryKey) { var primKey = new PrimaryKeyConstraintNode(); if (this.IsIdentity) { primKey.AutoIncrement = true; } ret.ColumnConstraints.Add(primKey); } if (this.Default != null) { ret.ColumnConstraints.Add(new DefaultConstraintNode { Value = DbUtils.ConvertToSqlValue(Default) }); } if (this.IsNotNull) { ret.ColumnConstraints.Add(new NotNullConstraintNode()); } else if (this.Default == null && !this.IsPrimaryKey && !this.IsUnique) { ret.ColumnConstraints.Add(new DefaultConstraintNode { Value = "NULL" }); } if (this.IsUnique) { ret.ColumnConstraints.Add(new UniqueConstraintNode()); } return(ret); }
public override SQLiteParseTreeNode VisitColumn_def(SQLiteParserSimpleParser.Column_defContext context) { var ret = new ColumnDefNode(context) { ColumnName = context.name().GetText() }; var typeName = context.type_name(); if (typeName != null) { ret.TypeNameNode = typeName.Accept(this) as TypeNameNode; } ret.ColumnConstraints = context.column_constraint().Select(c => c.Accept(this)).Cast <ColumnConstraintNode>().ToList(); return(ret); }
public StringBuilder Visit(ColumnDefNode columnDefNode) { var sb = new StringBuilder(); sb.Append(columnDefNode.ColumnName); if (columnDefNode.TypeNameNode != null) { sb.Append(" "); sb.Append(columnDefNode.TypeNameNode.Accept(this)); } if (columnDefNode.ColumnConstraints != null && columnDefNode.ColumnConstraints.Any()) { foreach (var constraint in columnDefNode.ColumnConstraints) { sb.Append(" "); sb.Append(constraint.Accept(this)); } } return(sb); }
public void ParsePartOfAString() { string parseOnlyAnArgument = "id INTEGER primary key autoincrement"; SQLiteParseTreeNode statementNodes = SQLiteParseVisitor.ParseString(parseOnlyAnArgument, i => i.column_def()); var expected = new ColumnDefNode() { ColumnName = "id", ColumnConstraints = new[] { new PrimaryKeyConstraintNode { AutoIncrement = true } }, TypeNameNode = new TypeNameNode() { TypeName = "INTEGER" } }.ToExpectedObject().AddTreeNode(); expected.ShouldMatch(statementNodes); }
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); }