diff --git a/models/Grammars/MySQLGrammar.cfc b/models/Grammars/MySQLGrammar.cfc index 9c09c7a5..b9027f30 100644 --- a/models/Grammars/MySQLGrammar.cfc +++ b/models/Grammars/MySQLGrammar.cfc @@ -112,10 +112,13 @@ component extends="qb.models.Grammars.BaseGrammar" singleton { function generateDefault( column ) { if ( column.getDefault() == "" && - column.getType().findNoCase( "TIMESTAMP" ) > 0 && - !column.getNullable() + column.getType().findNoCase( "TIMESTAMP" ) > 0 ) { - column.withCurrent(); + if ( column.getNullable() ) { + return "NULL DEFAULT NULL"; + } else { + column.withCurrent(); + } } return super.generateDefault( column ); } diff --git a/tests/resources/AbstractSchemaBuilderSpec.cfc b/tests/resources/AbstractSchemaBuilderSpec.cfc index f7186a21..87ca2ccb 100644 --- a/tests/resources/AbstractSchemaBuilderSpec.cfc +++ b/tests/resources/AbstractSchemaBuilderSpec.cfc @@ -747,6 +747,19 @@ component extends="testbox.system.BaseSpec" { }, timestamp() ); } ); + it( "timestampWithNullable", function() { + testCase( function( schema ) { + return schema.create( + "posts", + function( table ) { + table.timestamp( "posted_date" ).nullable(); + }, + {}, + false + ); + }, timestampWithNullable() ); + } ); + it( "timestampTz", function() { testCase( function( schema ) { return schema.create( diff --git a/tests/specs/Schema/MySQLSchemaBuilderSpec.cfc b/tests/specs/Schema/MySQLSchemaBuilderSpec.cfc index 519bb9f1..9bc48988 100644 --- a/tests/specs/Schema/MySQLSchemaBuilderSpec.cfc +++ b/tests/specs/Schema/MySQLSchemaBuilderSpec.cfc @@ -165,7 +165,9 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { } function nullableTimestamps() { - return [ "CREATE TABLE `posts` (`createdDate` TIMESTAMP, `modifiedDate` TIMESTAMP)" ]; + return [ + "CREATE TABLE `posts` (`createdDate` TIMESTAMP NULL DEFAULT NULL, `modifiedDate` TIMESTAMP NULL DEFAULT NULL)" + ]; } function point() { @@ -201,11 +203,11 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { } function softDeletes() { - return [ "CREATE TABLE `posts` (`deletedDate` TIMESTAMP)" ]; + return [ "CREATE TABLE `posts` (`deletedDate` TIMESTAMP NULL DEFAULT NULL)" ]; } function softDeletesTz() { - return [ "CREATE TABLE `posts` (`deletedDate` TIMESTAMP)" ]; + return [ "CREATE TABLE `posts` (`deletedDate` TIMESTAMP NULL DEFAULT NULL)" ]; } function string() { @@ -240,6 +242,10 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { return [ "CREATE TABLE `posts` (`posted_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)" ]; } + function timestampWithNullable() { + return [ "CREATE TABLE `posts` (`posted_date` TIMESTAMP NULL DEFAULT NULL)" ]; + } + function timestamps() { return [ "CREATE TABLE `posts` (`createdDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `modifiedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)" @@ -472,7 +478,7 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { function renameMultipleColumns() { return [ "ALTER TABLE `users` CHANGE `name` `username` NVARCHAR(255) NOT NULL", - "ALTER TABLE `users` CHANGE `purchase_date` `purchased_at` TIMESTAMP" + "ALTER TABLE `users` CHANGE `purchase_date` `purchased_at` TIMESTAMP NULL DEFAULT NULL" ]; } @@ -483,7 +489,7 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { function modifyMultipleColumns() { return [ "ALTER TABLE `users` CHANGE `name` `name` TEXT NOT NULL", - "ALTER TABLE `users` CHANGE `purchase_date` `purchased_date` TIMESTAMP" + "ALTER TABLE `users` CHANGE `purchase_date` `purchased_date` TIMESTAMP NULL DEFAULT NULL" ]; } @@ -503,7 +509,7 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { "ALTER TABLE `users` DROP COLUMN `is_active`", "ALTER TABLE `users` ADD `tshirt_size` ENUM('S', 'M', 'L', 'XL', 'XXL') NOT NULL", "ALTER TABLE `users` CHANGE `name` `username` NVARCHAR(255) NOT NULL", - "ALTER TABLE `users` CHANGE `purchase_date` `purchase_date` TIMESTAMP", + "ALTER TABLE `users` CHANGE `purchase_date` `purchase_date` TIMESTAMP NULL DEFAULT NULL", "ALTER TABLE `users` ADD CONSTRAINT `unq_users_username` UNIQUE (`username`)", "ALTER TABLE `users` ADD CONSTRAINT `unq_users_email` UNIQUE (`email`)", "ALTER TABLE `users` DROP INDEX `idx_users_created_date`", diff --git a/tests/specs/Schema/OracleSchemaBuilderSpec.cfc b/tests/specs/Schema/OracleSchemaBuilderSpec.cfc index e6b88784..e728544c 100644 --- a/tests/specs/Schema/OracleSchemaBuilderSpec.cfc +++ b/tests/specs/Schema/OracleSchemaBuilderSpec.cfc @@ -357,6 +357,10 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { return [ "CREATE TABLE ""POSTS"" (""POSTED_DATE"" DATE DEFAULT CURRENT_TIMESTAMP NOT NULL)" ]; } + function timestampWithNullable() { + return [ "CREATE TABLE ""POSTS"" (""POSTED_DATE"" DATE)" ]; + } + function nullable() { return [ "CREATE TABLE ""USERS"" (""ID"" CHAR(36))" ]; } diff --git a/tests/specs/Schema/PostgresSchemaBuilderSpec.cfc b/tests/specs/Schema/PostgresSchemaBuilderSpec.cfc index 0350ad11..1a34f52f 100644 --- a/tests/specs/Schema/PostgresSchemaBuilderSpec.cfc +++ b/tests/specs/Schema/PostgresSchemaBuilderSpec.cfc @@ -336,6 +336,10 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { return [ "CREATE TABLE ""posts"" (""posted_date"" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)" ]; } + function timestampWithNullable() { + return [ "CREATE TABLE ""posts"" (""posted_date"" TIMESTAMP)" ]; + } + function nullable() { return [ "CREATE TABLE ""users"" (""id"" CHAR(36))" ]; } diff --git a/tests/specs/Schema/SqlServerSchemaBuilderSpec.cfc b/tests/specs/Schema/SqlServerSchemaBuilderSpec.cfc index 5d8fb6c9..dca17222 100644 --- a/tests/specs/Schema/SqlServerSchemaBuilderSpec.cfc +++ b/tests/specs/Schema/SqlServerSchemaBuilderSpec.cfc @@ -328,6 +328,10 @@ component extends="tests.resources.AbstractSchemaBuilderSpec" { ]; } + function timestampWithNullable() { + return [ "CREATE TABLE [posts] ([posted_date] DATETIME2)" ]; + } + function defaultForNumber() { return [ "CREATE TABLE [users] ([experience] INTEGER NOT NULL CONSTRAINT [df_users_experience] DEFAULT 100)" ]; }