From 7ba802813d7575455003e397b2af1b6d8e7ecf08 Mon Sep 17 00:00:00 2001 From: Frode Knutsen Date: Sat, 28 Dec 2019 13:12:23 +0100 Subject: [PATCH 1/2] Add generated columns (virtual/stored) support for PostgreSQL --- .../Schema/Grammars/PostgresGrammar.php | 30 ++++++++++++++++++- .../DatabasePostgresSchemaGrammarTest.php | 20 +++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index f157a0f97f42..2b2d381b5f03 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -19,7 +19,7 @@ class PostgresGrammar extends Grammar * * @var array */ - protected $modifiers = ['Collate', 'Increment', 'Nullable', 'Default']; + protected $modifiers = ['Collate', 'Increment', 'Nullable', 'Default', 'VirtualAs', 'StoredAs']; /** * The columns available as serials. @@ -952,4 +952,32 @@ protected function modifyIncrement(Blueprint $blueprint, Fluent $column) return ' primary key'; } } + + /** + * Get the SQL for a generated virtual column modifier. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $column + * @return string|null + */ + protected function modifyVirtualAs(Blueprint $blueprint, Fluent $column) + { + if ($column->virtualAs !== null) { + return " generated always as ({$column->virtualAs})"; + } + } + + /** + * Get the SQL for a generated stored column modifier. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $column + * @return string|null + */ + protected function modifyStoredAs(Blueprint $blueprint, Fluent $column) + { + if ($column->storedAs !== null) { + return " generated always as ({$column->storedAs}) stored"; + } + } } diff --git a/tests/Database/DatabasePostgresSchemaGrammarTest.php b/tests/Database/DatabasePostgresSchemaGrammarTest.php index 89ed57313be8..3fb7c9090321 100755 --- a/tests/Database/DatabasePostgresSchemaGrammarTest.php +++ b/tests/Database/DatabasePostgresSchemaGrammarTest.php @@ -742,6 +742,26 @@ public function testAddingGeneratedAs() $this->assertSame('alter table "users" add column "foo" integer generated by default as identity not null', $statements[0]); } + public function testAddingVirtualAs() + { + $blueprint = new Blueprint('users'); + $blueprint->integer('foo')->nullable(); + $blueprint->boolean('bar')->virtualAs("foo is not null"); + $statements = $blueprint->toSql($this->getConnection(), $this->getGrammar()); + $this->assertCount(1, $statements); + $this->assertSame('alter table "users" add column "foo" integer null, add column "bar" boolean not null generated always as (foo is not null)', $statements[0]); + } + + public function testAddingStoredAs() + { + $blueprint = new Blueprint('users'); + $blueprint->integer('foo')->nullable(); + $blueprint->boolean('bar')->storedAs("foo is not null"); + $statements = $blueprint->toSql($this->getConnection(), $this->getGrammar()); + $this->assertCount(1, $statements); + $this->assertSame('alter table "users" add column "foo" integer null, add column "bar" boolean not null generated always as (foo is not null) stored', $statements[0]); + } + public function testAddingIpAddress() { $blueprint = new Blueprint('users'); From e34b48141cc448b7825768662ecf17848fcaac55 Mon Sep 17 00:00:00 2001 From: Frode Knutsen Date: Sat, 28 Dec 2019 13:45:18 +0100 Subject: [PATCH 2/2] Fix StyleCI issue --- tests/Database/DatabasePostgresSchemaGrammarTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Database/DatabasePostgresSchemaGrammarTest.php b/tests/Database/DatabasePostgresSchemaGrammarTest.php index 3fb7c9090321..9ac0d0bfa9d8 100755 --- a/tests/Database/DatabasePostgresSchemaGrammarTest.php +++ b/tests/Database/DatabasePostgresSchemaGrammarTest.php @@ -746,7 +746,7 @@ public function testAddingVirtualAs() { $blueprint = new Blueprint('users'); $blueprint->integer('foo')->nullable(); - $blueprint->boolean('bar')->virtualAs("foo is not null"); + $blueprint->boolean('bar')->virtualAs('foo is not null'); $statements = $blueprint->toSql($this->getConnection(), $this->getGrammar()); $this->assertCount(1, $statements); $this->assertSame('alter table "users" add column "foo" integer null, add column "bar" boolean not null generated always as (foo is not null)', $statements[0]); @@ -756,7 +756,7 @@ public function testAddingStoredAs() { $blueprint = new Blueprint('users'); $blueprint->integer('foo')->nullable(); - $blueprint->boolean('bar')->storedAs("foo is not null"); + $blueprint->boolean('bar')->storedAs('foo is not null'); $statements = $blueprint->toSql($this->getConnection(), $this->getGrammar()); $this->assertCount(1, $statements); $this->assertSame('alter table "users" add column "foo" integer null, add column "bar" boolean not null generated always as (foo is not null) stored', $statements[0]);