From d3bd89f0a65642df86e0ec41fb486915eaa247f8 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 25 Nov 2025 10:10:22 -0600 Subject: [PATCH] add support for instant column additions --- .../Database/Schema/ColumnDefinition.php | 1 + .../Database/Schema/Grammars/MySqlGrammar.php | 13 +++++++++--- .../DatabaseMySqlSchemaGrammarTest.php | 20 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Schema/ColumnDefinition.php b/src/Illuminate/Database/Schema/ColumnDefinition.php index 255ddabd5873..ab1e902bb523 100644 --- a/src/Illuminate/Database/Schema/ColumnDefinition.php +++ b/src/Illuminate/Database/Schema/ColumnDefinition.php @@ -15,6 +15,7 @@ * @method $this default(mixed $value) Specify a "default" value for the column * @method $this first() Place the column "first" in the table (MySQL) * @method $this from(int $startingValue) Set the starting value of an auto-incrementing field (MySQL / PostgreSQL) + * @method $this instant() Specify that algorithm=instant should be used for the column operation (MySQL) * @method $this generatedAs(string|\Illuminate\Contracts\Database\Query\Expression $expression = null) Create a SQL compliant identity column (PostgreSQL) * @method $this index(bool|string $indexName = null) Add an index * @method $this invisible() Specify that the column should be invisible to "SELECT *" (MySQL) diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 16e8634d3e6b..fcc73dd017f6 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -310,9 +310,10 @@ protected function compileCreateEngine($sql, Blueprint $blueprint) */ public function compileAdd(Blueprint $blueprint, Fluent $command) { - return sprintf('alter table %s add %s', + return sprintf('alter table %s add %s%s', $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column) + $this->getColumn($blueprint, $command->column), + $command->column->instant ? ', algorithm=instant' : '' ); } @@ -403,7 +404,13 @@ public function compileChange(Blueprint $blueprint, Fluent $command) $this->getType($column) ); - return $this->addModifiers($sql, $blueprint, $column); + $sql = $this->addModifiers($sql, $blueprint, $column); + + if ($column->instant) { + $sql .= ', algorithm=instant'; + } + + return $sql; } /** diff --git a/tests/Database/DatabaseMySqlSchemaGrammarTest.php b/tests/Database/DatabaseMySqlSchemaGrammarTest.php index d7cd2e8ea59b..26a67aaca286 100755 --- a/tests/Database/DatabaseMySqlSchemaGrammarTest.php +++ b/tests/Database/DatabaseMySqlSchemaGrammarTest.php @@ -1604,6 +1604,26 @@ protected function getConnection( ->getMock(); } + public function testAddingColumnWithAlgorithm() + { + $blueprint = new Blueprint($this->getConnection(), 'users'); + $blueprint->string('name')->instant(); + $statements = $blueprint->toSql(); + + $this->assertCount(1, $statements); + $this->assertSame('alter table `users` add `name` varchar(255) not null, algorithm=instant', $statements[0]); + } + + public function testChangingColumnWithAlgorithm() + { + $blueprint = new Blueprint($this->getConnection(), 'users'); + $blueprint->string('name', 100)->change()->instant(); + $statements = $blueprint->toSql(); + + $this->assertCount(1, $statements); + $this->assertSame('alter table `users` modify `name` varchar(100) not null, algorithm=instant', $statements[0]); + } + public function getGrammar(?Connection $connection = null) { return new MySqlGrammar($connection ?? $this->getConnection());