diff --git a/dialects/postgresql/builder_test.go b/dialects/postgresql/builder_test.go index efdd33a..4db1e4a 100644 --- a/dialects/postgresql/builder_test.go +++ b/dialects/postgresql/builder_test.go @@ -71,6 +71,26 @@ func TestAlterTableAddColumn(t *testing.T) { expectedSQL := "ALTER TABLE \"user\" ADD COLUMN \"updated_at\" TIMESTAMP(6);" returnedSQL := sqlBuilder.AlterTableAddColumn(userTableName, updatedAtColumn) testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + createdAtColumn := testutils.FakeCreatedAtColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"created_at\" TIMESTAMPZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, createdAtColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + priceColumn := testutils.FakePriceColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"price\" NUMERIC(17,2) NOT NULL DEFAULT 0.0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, priceColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + scoreColumn := testutils.FakeScoreColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"score\" BIGINT NOT NULL DEFAULT 0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, scoreColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + nameColumn := testutils.FakeNameColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"name\" VARCHAR(50) NOT NULL DEFAULT '';" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") } func TestAlterTableDropColumn(t *testing.T) { diff --git a/dialects/sqlite/builder_test.go b/dialects/sqlite/builder_test.go index acc5a5c..856082a 100644 --- a/dialects/sqlite/builder_test.go +++ b/dialects/sqlite/builder_test.go @@ -51,6 +51,26 @@ func TestAlterTableAddColumn(t *testing.T) { expectedSQL := "ALTER TABLE \"user\" ADD COLUMN \"updated_at\" DATETIME;" returnedSQL := sqlBuilder.AlterTableAddColumn(userTableName, updatedAtColumn) testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + createdAtColumn := testutils.FakeCreatedAtColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"created_at\" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, createdAtColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + priceColumn := testutils.FakePriceColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"price\" REAL NOT NULL DEFAULT 0.0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, priceColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + scoreColumn := testutils.FakeScoreColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"score\" INTEGER NOT NULL DEFAULT 0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, scoreColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + nameColumn := testutils.FakeNameColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"name\" TEXT NOT NULL DEFAULT '';" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") } func TestAlterTableDropColumn(t *testing.T) { diff --git a/dialects/sqlserver/builder_test.go b/dialects/sqlserver/builder_test.go index 9112d3d..7b86e6c 100644 --- a/dialects/sqlserver/builder_test.go +++ b/dialects/sqlserver/builder_test.go @@ -51,6 +51,26 @@ func TestAlterTableAddColumn(t *testing.T) { expectedSQL := "ALTER TABLE [user] ADD COLUMN [updated_at] DATETIME2(6);" returnedSQL := sqlBuilder.AlterTableAddColumn(userTableName, updatedAtColumn) testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + createdAtColumn := testutils.FakeCreatedAtColumn(t) + expectedSQL = "ALTER TABLE [user] ADD COLUMN [created_at] DATETIMEOFFSET(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, createdAtColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + priceColumn := testutils.FakePriceColumn(t) + expectedSQL = "ALTER TABLE [user] ADD COLUMN [price] MONEY NOT NULL DEFAULT 0.0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, priceColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + scoreColumn := testutils.FakeScoreColumn(t) + expectedSQL = "ALTER TABLE [user] ADD COLUMN [score] BIGINT NOT NULL DEFAULT 0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, scoreColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + nameColumn := testutils.FakeNameColumn(t) + expectedSQL = "ALTER TABLE [user] ADD COLUMN [name] VARCHAR(50) NOT NULL DEFAULT '';" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") } func TestAlterTableDropColumn(t *testing.T) { diff --git a/internal/builder_generic.go b/internal/builder_generic.go index 1bcd96b..9daf675 100644 --- a/internal/builder_generic.go +++ b/internal/builder_generic.go @@ -64,7 +64,21 @@ func (sb *genericSQLBuilder) DropTable(table string) string { } func (sb *genericSQLBuilder) AlterTableAddColumn(table string, column schema.Column) string { - return fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s;", sb.QuoteIdentifier(table), sb.columnDefinition(column)) + defaultValue := "" + if column.NotNull() { + defaultValue = " DEFAULT " + switch column.Type() { + case schema.Boolean, schema.Integer: + defaultValue += "0" + case schema.DateTime, schema.DateTimeOffSet: + defaultValue += "CURRENT_TIMESTAMP" + case schema.Monetary, schema.Decimal: + defaultValue += "0.0" + default: + defaultValue += "''" + } + } + return fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s%s;", sb.QuoteIdentifier(table), sb.columnDefinition(column), defaultValue) } func (sb *genericSQLBuilder) AlterTableDropColumn(table, column string) string { diff --git a/internal/builder_generic_test.go b/internal/builder_generic_test.go index 854ea19..6cbbcac 100644 --- a/internal/builder_generic_test.go +++ b/internal/builder_generic_test.go @@ -39,10 +39,31 @@ func TestAlterTableAddColumn(t *testing.T) { sqlBuilder := internal.NewGenericSQLBuilder(nil, nil, nil) userTableName := testutils.FakeUserTableName(t) + updatedAtColumn := testutils.FakeUpdatedAtColumn(t) expectedSQL := "ALTER TABLE \"user\" ADD COLUMN \"updated_at\" <>;" returnedSQL := sqlBuilder.AlterTableAddColumn(userTableName, updatedAtColumn) testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + createdAtColumn := testutils.FakeCreatedAtColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"created_at\" <> DEFAULT CURRENT_TIMESTAMP;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, createdAtColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + priceColumn := testutils.FakePriceColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"price\" <> DEFAULT 0.0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, priceColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + scoreColumn := testutils.FakeScoreColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"score\" <> DEFAULT 0;" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, scoreColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") + + nameColumn := testutils.FakeNameColumn(t) + expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"name\" <> DEFAULT '';" + returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn) + testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn") } func TestAlterTableDropColumn(t *testing.T) { diff --git a/internal/testutils/fake.go b/internal/testutils/fake.go index 1c90bc5..25691dc 100644 --- a/internal/testutils/fake.go +++ b/internal/testutils/fake.go @@ -157,6 +157,47 @@ func FakeUpdatedAtColumn(t *testing.T) schema.Column { return updatedAtColumn } +func FakeCreatedAtColumn(t *testing.T) schema.Column { + return schema.NewColumn(schema.NewColumnParams{ + Name: "created_at", + Type: schema.DateTimeOffSet, + PrimaryKey: false, + NotNull: true, + AutoIncrement: false, + }) +} + +func FakeScoreColumn(t *testing.T) schema.Column { + return schema.NewColumn(schema.NewColumnParams{ + Name: "score", + Type: schema.Integer, + PrimaryKey: false, + NotNull: true, + AutoIncrement: false, + }) +} + +func FakePriceColumn(t *testing.T) schema.Column { + return schema.NewColumn(schema.NewColumnParams{ + Name: "price", + Type: schema.Monetary, + PrimaryKey: false, + NotNull: true, + AutoIncrement: false, + }) +} + +func FakeNameColumn(t *testing.T) schema.Column { + return schema.NewColumn(schema.NewColumnParams{ + Name: "name", + Type: schema.Varchar, + Size: 50, + PrimaryKey: false, + NotNull: true, + AutoIncrement: false, + }) +} + func FakeUpdatedAtColumnName(t *testing.T) string { return "updated_at" }