diff --git a/models/Grammars/BaseGrammar.cfc b/models/Grammars/BaseGrammar.cfc index f449eb0a..4ea5a9e2 100644 --- a/models/Grammars/BaseGrammar.cfc +++ b/models/Grammars/BaseGrammar.cfc @@ -735,6 +735,10 @@ component displayname="Grammar" accessors="true" { } function compileCreateColumn( column ) { + if ( utils.isExpression( column ) ) { + return column.getSql(); + } + return arrayToList( arrayFilter( [ wrapColumn( column.getName() ), generateType( column ), diff --git a/models/Schema/Blueprint.cfc b/models/Schema/Blueprint.cfc index 9b899254..7142e013 100644 --- a/models/Schema/Blueprint.cfc +++ b/models/Schema/Blueprint.cfc @@ -36,6 +36,11 @@ component accessors="true" { } ); } + function raw( sql ) { + variables.columns.append( new qb.models.Query.Expression( sql ) ); + return this; + } + function addColumn() { var newColumn = new Column( this ); var indexMetadata = getMetadata( newColumn ); diff --git a/tests/specs/Schema/SchemaBuilder+GrammarSpec.cfc b/tests/specs/Schema/SchemaBuilder+GrammarSpec.cfc index 5d96677c..05301810 100644 --- a/tests/specs/Schema/SchemaBuilder+GrammarSpec.cfc +++ b/tests/specs/Schema/SchemaBuilder+GrammarSpec.cfc @@ -362,8 +362,15 @@ component extends="testbox.system.BaseSpec" { expect( statements[ 1 ] ).toBeWithCase( "CREATE TABLE ""tags"" (""taggable_id"" INTEGER(10) UNSIGNED, ""taggable_type"" VARCHAR(255), INDEX ""taggable_index"" (""taggable_id"",""taggable_type""))" ); } ); - xit( "raw", function() { - fail( "test not implemented yet" ); + it( "raw", function() { + var schema = getBuilder(); + var blueprint = schema.create( "users", function( table ) { + table.raw( "id BLOB NOT NULL" ); + }, {}, false ); + var statements = blueprint.toSql(); + expect( statements ).toBeArray(); + expect( statements ).toHaveLength( 1 ); + expect( statements[ 1 ] ).toBeWithCase( "CREATE TABLE ""users"" (id BLOB NOT NULL)" ); } ); it( "smallIncrements", function() { @@ -715,8 +722,10 @@ component extends="testbox.system.BaseSpec" { } private function getBuilder() { + var utils = getMockBox().createMock( "qb.models.Query.QueryUtils" ); var grammar = getMockBox() - .createMock( "qb.models.Grammars.BaseGrammar" ); + .createMock( "qb.models.Grammars.BaseGrammar" ) + .init( utils ); var builder = getMockBox().createMock( "qb.models.Schema.SchemaBuilder" ) .init( grammar ); return builder; diff --git a/tests/specs/Schema/SchemaBuilder+MySQLGrammarSpec.cfc b/tests/specs/Schema/SchemaBuilder+MySQLGrammarSpec.cfc index e69cc6c1..adeb9f96 100644 --- a/tests/specs/Schema/SchemaBuilder+MySQLGrammarSpec.cfc +++ b/tests/specs/Schema/SchemaBuilder+MySQLGrammarSpec.cfc @@ -42,8 +42,10 @@ component extends="testbox.system.BaseSpec" { } private function getBuilder() { + var utils = getMockBox().createMock( "qb.models.Query.QueryUtils" ); var grammar = getMockBox() - .createMock( "qb.models.Grammars.MySQLGrammar" ); + .createMock( "qb.models.Grammars.MySQLGrammar" ) + .init( utils ); var builder = getMockBox().createMock( "qb.models.Schema.SchemaBuilder" ) .init( grammar ); return builder; diff --git a/tests/specs/Schema/SchemaBuilder+OracleGrammarSpec.cfc b/tests/specs/Schema/SchemaBuilder+OracleGrammarSpec.cfc index 25410a7e..5b674c4a 100644 --- a/tests/specs/Schema/SchemaBuilder+OracleGrammarSpec.cfc +++ b/tests/specs/Schema/SchemaBuilder+OracleGrammarSpec.cfc @@ -31,8 +31,10 @@ component extends="testbox.system.BaseSpec" { } private function getBuilder() { + var utils = getMockBox().createMock( "qb.models.Query.QueryUtils" ); var grammar = getMockBox() - .createMock( "qb.models.Grammars.OracleGrammar" ); + .createMock( "qb.models.Grammars.OracleGrammar" ) + .init( utils ); var builder = getMockBox().createMock( "qb.models.Schema.SchemaBuilder" ) .init( grammar ); return builder;