function DriverSpecificSchemaTestBase::testChangePrimaryKeyToSerial

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php \Drupal\KernelTests\Core\Database\DriverSpecificSchemaTestBase::testChangePrimaryKeyToSerial()

Tests converting an int to a serial when the int column has data.

File

core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php, line 693

Class

DriverSpecificSchemaTestBase
Tests table creation and modification via the schema API.

Namespace

Drupal\KernelTests\Core\Database

Code

public function testChangePrimaryKeyToSerial() : void {
  // Test making an invalid field the primary key of the table upon creation.
  $table_name = 'test_table';
  $table_spec = [
    'fields' => [
      'test_field' => [
        'type' => 'int',
        'not null' => TRUE,
      ],
      'test_field_string' => [
        'type' => 'varchar',
        'length' => 20,
      ],
    ],
    'primary key' => [
      'test_field',
    ],
  ];
  $this->schema
    ->createTable($table_name, $table_spec);
  $this->tryInsertExpectsIntegrityConstraintViolationException($table_name);
  // @todo https://www.drupal.org/project/drupal/issues/3222127 Change the
  //   first item to 0 to test changing a field with 0 to a serial.
  // Create 8 rows in the table. Note that the 5 value is deliberately
  // omitted.
  foreach ([
    1,
    2,
    3,
    4,
    6,
    7,
    8,
    9,
  ] as $value) {
    $this->connection
      ->insert($table_name)
      ->fields([
      'test_field' => $value,
    ])
      ->execute();
  }
  $this->schema
    ->changeField($table_name, 'test_field', 'test_field', [
    'type' => 'serial',
    'not null' => TRUE,
  ]);
  $data = $this->connection
    ->select($table_name)
    ->fields($table_name, [
    'test_field',
  ])
    ->execute()
    ->fetchCol();
  $this->assertEquals([
    1,
    2,
    3,
    4,
    6,
    7,
    8,
    9,
  ], array_values($data));
  try {
    $this->connection
      ->insert($table_name)
      ->fields([
      'test_field' => 1,
    ])
      ->execute();
    $this->fail('Expected IntegrityConstraintViolationException not thrown');
  } catch (IntegrityConstraintViolationException $e) {
  }
  // Ensure auto numbering now works.
  // We use a >= assertion to allow non-core drivers, that may have specific
  // strategies on automatic incrementing, to run core tests. For example,
  // Oracle will allocate a 10 id with the previous insert that was meant to
  // fail; that id will be discarded, and the insert here will get a new 11
  // id instead.
  $id = $this->connection
    ->insert($table_name)
    ->fields([
    'test_field_string' => 'test',
  ])
    ->execute();
  $this->assertGreaterThanOrEqual(10, $id);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.