From 19ecc5bf04a2250e1e2544d55c893eb6ec7eaab5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Wed, 19 Apr 2023 22:37:35 +0200 Subject: [PATCH 01/57] I --- .github/workflows/pr.yml | 43 ++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index cafe6e6e..89a6cf56 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,7 +11,6 @@ env: PHPUNIT_SKIP_CLASS: '[ "Drupal\\KernelTests\\Core\\Cache\\ApcuBackendTest", "Drupal\\Tests\\file\\Functional\\FileAddPermissionsUpdateTest", - "Drupal\\Tests\\file\\Functional\\DownloadTest", "Drupal\\KernelTests\\Core\\Database\\SchemaUniquePrefixedKeysIndexTest" ]' @@ -19,22 +18,35 @@ jobs: ################################# - sqlite-pdo: - name: "SQLite with PDO" + oracle-oci8: + name: "Oracle on Oci8" runs-on: ubuntu-20.04 env: - DRUDBAL_ENV: "dbal/sqlite/file" - DBAL_URL: "sqlite://localhost/sites/drudbal.sqlite" - SIMPLETEST_DB: "dbal://localhost/sites/drudbal.sqlite?module=drudbal&dbal_driver=pdo_sqlite" + DRUDBAL_ENV: "dbal/oci8" + DBAL_URL: "oci8://DRUDBAL:ORACLE@0.0.0.0:1521/XE" + SIMPLETEST_DB: "dbal://DRUDBAL:ORACLE@0.0.0.0:1521/XE?module=drudbal&dbal_driver=oci8#dru" + + services: + oracle: + image: gvenzl/oracle-xe:21 + env: + ORACLE_PASSWORD: oracle + ports: + - "1521:1521" + options: >- + --health-cmd healthcheck.sh + --health-interval 20s + --health-timeout 10s + --health-retries 10 strategy: fail-fast: false matrix: php-version: - "8.1" -# - "8.2" test-args: - - "--group Database" + - "-v modules/contrib/drudbal/tests/src/Kernel/dbal/SchemaTest.php" +# - "--group Database" # - "--group Entity" # - "--group Cache,Config" # - "--group field,Field" @@ -47,6 +59,7 @@ jobs: with: php-version: "${{ matrix.php-version }}" coverage: "none" + extensions: "oci8" ini-values: "zend.assertions=1" - name: Checkout Drupal @@ -63,6 +76,7 @@ jobs: - name: Install Composer dependencies run: | composer install --no-progress --ansi + composer config --no-plugins allow-plugins.composer/package-versions-deprecated true - name: Composer require DruDbal from local staging run: | @@ -70,14 +84,23 @@ jobs: composer config repositories.test-run '{"type": "path", "url": "drudbal_staging", "options": {"symlink": false}}' composer require "mondrake/drudbal:dev-test-run-branch" --no-progress --ansi - - name: Install Drupal + - name: Patch doctrine/dbal + run: | + curl https://patch-diff.githubusercontent.com/raw/mondrake/dbal/pull/6.diff | patch -d vendor/doctrine/dbal -p1 + + - name: Create Oracle schema run: | cp modules/contrib/drudbal/tests/github/install_* . + php install_oracle.php + + - name: Install Drupal + run: | vendor/bin/drush site-install standard --db-url=$SIMPLETEST_DB -y vendor/bin/drush runserver localhost:8080 --default-server=localhost:8080 & - sleep 1s + sleep 5s - name: Report installation + continue-on-error: true run: | php install_report.php vendor/bin/drush core:status From 37500a7a360a593cc5312389ef09388af0aa212d Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 15:30:16 +0200 Subject: [PATCH 02/57] II --- .../dbal/DbalExtension/Oci8Extension.php | 69 +++++++++++++------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 8d32cec9..ae6e5ec1 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -821,13 +821,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem $sql[] = "ALTER TABLE $db_table ADD $db_field $column_definition"; if ($drupal_field_specs['type'] === 'serial') { - /** @var OraclePlatform $platform */ - $platform = $this->connection->getDbalPlatform(); - $autoincrement_sql = $platform->getCreateAutoincrementSql($db_field, $db_table); - // Remove the auto primary key generation, which is the first element in - // the array. - array_shift($autoincrement_sql); - $sql = array_merge($sql, $autoincrement_sql); + $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($db_field, $db_table)); } if (!$has_primary_key && $db_primary_key_columns) { @@ -931,21 +925,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - /** @var OraclePlatform $platform */ - $platform = $this->connection->getDbalPlatform(); - $autoincrement_sql = $platform->getCreateAutoincrementSql($new_db_field, $db_table); - // Remove the auto primary key generation, which is the first element in - // the array. - array_shift($autoincrement_sql); - // Get the the sequence generation, which is the second element in the - // array. - $sequence_sql = array_shift($autoincrement_sql); - if ($prev_max_sequence) { - $sql[] = str_replace('START WITH 1', 'START WITH ' . $prev_max_sequence, $sequence_sql); - } - else { - $sql[] = $sequence_sql; - } + $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence); $sql = array_merge($sql, $autoincrement_sql); } @@ -998,4 +978,49 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, return TRUE; } + /** @return array */ + protected function getCreateOrUpdateAutoincrementSql(string $name, string $table, int $start = 1): array + { + $quotedTableName = "\"" . $table . "\""; + $unquotedTableName = $table; + + $quotedName = "\"" . $name . "\""; + $unquotedName = $name; + + $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; + + $sql = []; + + $unquotedSequenceName = $unquotedTableName . "_SEQ"; + $sequenceName = "\"" . $unquotedSequenceName . "\""; + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + ' START WITH ' . $start . + ' MINVALUE ' . $start . + ' INCREMENT BY 1'; + + $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + BEFORE INSERT + ON ' . $quotedTableName . ' + FOR EACH ROW +DECLARE + last_Sequence NUMBER; + last_InsertID NUMBER; +BEGIN + IF (:NEW.' . $quotedName . ' IS NULL OR :NEW.' . $quotedName . ' = 0) THEN + SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; + ELSE + SELECT NVL(Last_Number, 0) INTO last_Sequence + FROM User_Sequences + WHERE Sequence_Name = \'' . $unquotedSequenceName . '\'; + SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; + WHILE (last_InsertID > last_Sequence) LOOP + SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; + END LOOP; + SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; + END IF; +END;'; + + return $sql; + } + } From d9a3178aba6045028d4b0c1a39f52384556de96b Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 16:09:32 +0200 Subject: [PATCH 03/57] IV --- src/Driver/Database/dbal/Schema.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Driver/Database/dbal/Schema.php b/src/Driver/Database/dbal/Schema.php index 29afa36b..4630b2e6 100644 --- a/src/Driver/Database/dbal/Schema.php +++ b/src/Driver/Database/dbal/Schema.php @@ -716,9 +716,11 @@ public function changeField($table, $field, $field_new, $spec, $keys_new = []) { // fallback to platform specific syntax. // @see https://github.com/doctrine/dbal/issues/1033 $primary_key_processed_by_extension = FALSE; + $this->dbalExtension->setDebugging(TRUE); if (!$this->dbalExtension->delegateChangeField($primary_key_processed_by_extension, $this->dbalSchema(), $table, $field, $field_new, $spec, $keys_new, $dbal_column_options)) { return; } + $this->dbalExtension->setDebugging(FALSE); // We need to reload the schema at next get. $this->dbalSchemaForceReload(); // @todo can we just replace the column object in the dbal schema?? From 1c5009ea47c59238008d80305f3b8d3534efd24f Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 16:23:13 +0200 Subject: [PATCH 04/57] V --- .../Database/dbal/DbalExtension/Oci8Extension.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index ae6e5ec1..f73c5be8 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -979,15 +979,15 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(string $name, string $table, int $start = 1): array - { - $quotedTableName = "\"" . $table . "\""; - $unquotedTableName = $table; + protected function getCreateOrUpdateAutoincrementSql(string $name, string $table, int $start = 1): array { +dump([__METHOD__, $name, $table, $start]); + $unquotedTableName = $table; + $quotedTableName = "\"" . $table . "\""; - $quotedName = "\"" . $name . "\""; - $unquotedName = $name; + $unquotedName = $name; + $quotedName = "\"" . $name . "\""; - $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; + $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; $sql = []; From 920e5fd0c45b26bba186964db0071c620995cbe6 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 18:16:40 +0200 Subject: [PATCH 05/57] Update Oci8Extension.php --- .../Database/dbal/DbalExtension/Oci8Extension.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index f73c5be8..150a7f9b 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -925,7 +925,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence); + $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); $sql = array_merge($sql, $autoincrement_sql); } @@ -979,17 +979,13 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(string $name, string $table, int $start = 1): array { + protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { dump([__METHOD__, $name, $table, $start]); - $unquotedTableName = $table; - $quotedTableName = "\"" . $table . "\""; - - $unquotedName = $name; - $quotedName = "\"" . $name . "\""; - + $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); + $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; - $sql = []; + $sql = []; $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; From 01689c78924984d3ae40cff760c97fc1427f8931 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 18:28:28 +0200 Subject: [PATCH 06/57] Update Oci8Extension.php --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 150a7f9b..3d6cdb37 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -980,10 +980,10 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, /** @return array */ protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { -dump([__METHOD__, $name, $table, $start]); $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; +dump([__METHOD__, $quotedName, $quotedTableName, $start, $unquotedName, $unquotedTableName]); $sql = []; From 122dfdc9985423f4bc771bff05ef2af361056849 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 19:03:42 +0200 Subject: [PATCH 07/57] Update Oci8Extension.php --- .../dbal/DbalExtension/Oci8Extension.php | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 3d6cdb37..233f1e87 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -821,7 +821,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem $sql[] = "ALTER TABLE $db_table ADD $db_field $column_definition"; if ($drupal_field_specs['type'] === 'serial') { - $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($db_field, $db_table)); + $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($db_field, $db_table, 1, $dbal_schema)); } if (!$has_primary_key && $db_primary_key_columns) { @@ -925,7 +925,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); + $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1, $dbal_schema); $sql = array_merge($sql, $autoincrement_sql); } @@ -979,20 +979,27 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { + protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1, DbalSchema $dbal_schema): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; -dump([__METHOD__, $quotedName, $quotedTableName, $start, $unquotedName, $unquotedTableName]); $sql = []; - $unquotedSequenceName = $unquotedTableName . "_SEQ"; - $sequenceName = "\"" . $unquotedSequenceName . "\""; - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . - ' START WITH ' . $start . - ' MINVALUE ' . $start . - ' INCREMENT BY 1'; + $unquotedSequenceName = $unquotedTableName . "_SEQ"; + $sequenceName = "\"" . $unquotedSequenceName . "\""; + if ($dbal_schema->hasSequence($sequenceName)) { + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + ' START WITH ' . $start . + ' MINVALUE ' . $start . + ' INCREMENT BY 1'; + } + else { + $sql[] = 'ALTER SEQUENCE ' . $sequenceName . + ' START WITH ' . $start . + ' MINVALUE ' . $start . + ' INCREMENT BY 1'; + } $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT From 0c2b444b598af2d99fc1212ce7e22fdd9b0aee66 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 19:39:23 +0200 Subject: [PATCH 08/57] Update Oci8Extension.php --- .../dbal/DbalExtension/Oci8Extension.php | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 233f1e87..b23c8991 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -821,7 +821,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem $sql[] = "ALTER TABLE $db_table ADD $db_field $column_definition"; if ($drupal_field_specs['type'] === 'serial') { - $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($db_field, $db_table, 1, $dbal_schema)); + $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($dbal_schema, $db_field, $db_table)); } if (!$has_primary_key && $db_primary_key_columns) { @@ -925,7 +925,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1, $dbal_schema); + $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($dbal_schema, $new_db_field, $db_table, $prev_max_sequence + 1); $sql = array_merge($sql, $autoincrement_sql); } @@ -979,7 +979,7 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1, DbalSchema $dbal_schema): array { + protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; @@ -989,17 +989,12 @@ protected function getCreateOrUpdateAutoincrementSql(string $quotedName, string $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; if ($dbal_schema->hasSequence($sequenceName)) { - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . - ' START WITH ' . $start . - ' MINVALUE ' . $start . - ' INCREMENT BY 1'; - } - else { - $sql[] = 'ALTER SEQUENCE ' . $sequenceName . - ' START WITH ' . $start . - ' MINVALUE ' . $start . - ' INCREMENT BY 1'; + $sql[] = 'DROP SEQUENCE ' . $sequenceName; } + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + ' START WITH ' . $start . + ' MINVALUE ' . $start . + ' INCREMENT BY 1'; $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT From 9c65905e13f452f1a962b00dda10963058c2ff69 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 20:01:13 +0200 Subject: [PATCH 09/57] VI --- .../dbal/DbalExtension/Oci8Extension.php | 36 ++++++++++--------- src/Driver/Database/dbal/Schema.php | 2 -- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index b23c8991..820e3496 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -978,23 +978,25 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, return TRUE; } - /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { - $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); - $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); - $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; - - $sql = []; - - $unquotedSequenceName = $unquotedTableName . "_SEQ"; - $sequenceName = "\"" . $unquotedSequenceName . "\""; - if ($dbal_schema->hasSequence($sequenceName)) { - $sql[] = 'DROP SEQUENCE ' . $sequenceName; - } - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . - ' START WITH ' . $start . - ' MINVALUE ' . $start . - ' INCREMENT BY 1'; + /** @return array */ + protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { + $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); + $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); + $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; + + $sql = []; + + $unquotedSequenceName = $unquotedTableName . "_SEQ"; + $sequenceName = "\"" . $unquotedSequenceName . "\""; +dump($dbal_schema->getSequences(),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)); + if ($dbal_schema->hasSequence($sequenceName)) { +dump('HAS SEQ'); + $sql[] = 'DROP SEQUENCE ' . $sequenceName; + } + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + ' START WITH ' . $start . + ' MINVALUE ' . $start . + ' INCREMENT BY 1'; $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT diff --git a/src/Driver/Database/dbal/Schema.php b/src/Driver/Database/dbal/Schema.php index 4630b2e6..29afa36b 100644 --- a/src/Driver/Database/dbal/Schema.php +++ b/src/Driver/Database/dbal/Schema.php @@ -716,11 +716,9 @@ public function changeField($table, $field, $field_new, $spec, $keys_new = []) { // fallback to platform specific syntax. // @see https://github.com/doctrine/dbal/issues/1033 $primary_key_processed_by_extension = FALSE; - $this->dbalExtension->setDebugging(TRUE); if (!$this->dbalExtension->delegateChangeField($primary_key_processed_by_extension, $this->dbalSchema(), $table, $field, $field_new, $spec, $keys_new, $dbal_column_options)) { return; } - $this->dbalExtension->setDebugging(FALSE); // We need to reload the schema at next get. $this->dbalSchemaForceReload(); // @todo can we just replace the column object in the dbal schema?? From de3602ef31397d92d9f15af7c9581975cbb05e09 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 20:28:35 +0200 Subject: [PATCH 10/57] VII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 820e3496..25a323f8 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -988,11 +988,11 @@ protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, st $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; -dump($dbal_schema->getSequences(),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)); - if ($dbal_schema->hasSequence($sequenceName)) { -dump('HAS SEQ'); +//dump($dbal_schema->getSequences(),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)); +// if ($dbal_schema->hasSequence($sequenceName)) { +//dump('HAS SEQ'); $sql[] = 'DROP SEQUENCE ' . $sequenceName; - } +// } $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . From 98abb388348e07486e348b5b227300207fac10db Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 21:40:22 +0200 Subject: [PATCH 11/57] VIII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 25a323f8..619ead02 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -988,11 +988,13 @@ protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, st $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; -//dump($dbal_schema->getSequences(),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)); +dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); // if ($dbal_schema->hasSequence($sequenceName)) { //dump('HAS SEQ'); - $sql[] = 'DROP SEQUENCE ' . $sequenceName; +// $sql[] = 'DROP SEQUENCE ' . $sequenceName; // } +$xx = $this->getDbalConnection()->createSchemaManager()->introspectSchema(); +dump(['xx', array_keys($xx->getSequences())]); $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . From a9b7594e7acde2732685aac44bc81bdc1bfbf255 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 21:52:45 +0200 Subject: [PATCH 12/57] iX --- .../dbal/DbalExtension/Oci8Extension.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 619ead02..454a5eca 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -979,7 +979,7 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { + private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; @@ -989,18 +989,19 @@ protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, st $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); -// if ($dbal_schema->hasSequence($sequenceName)) { -//dump('HAS SEQ'); -// $sql[] = 'DROP SEQUENCE ' . $sequenceName; -// } $xx = $this->getDbalConnection()->createSchemaManager()->introspectSchema(); dump(['xx', array_keys($xx->getSequences())]); + if ($xx->hasSequence($sequenceName)) { +dump('HAS SEQ'); + $sql[] = 'DROP SEQUENCE ' . $sequenceName; + } + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . ' INCREMENT BY 1'; - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1022,7 +1023,7 @@ protected function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, st END IF; END;'; - return $sql; - } + return $sql; + } } From 42dc0e66d6a6bbf00f877c2d4b5e1dd491608f1f Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 22:28:20 +0200 Subject: [PATCH 13/57] X --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 454a5eca..8ae38dae 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -993,7 +993,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); - $sql[] = 'DROP SEQUENCE ' . $sequenceName; +// $sql[] = 'DROP SEQUENCE ' . $sequenceName; } $sql[] = 'CREATE SEQUENCE ' . $sequenceName . From 404d00197d9c458996f19d1acb65be6e3a7a9dab Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 22:42:26 +0200 Subject: [PATCH 14/57] XI --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 8ae38dae..4563150d 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -993,6 +993,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); + $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); // $sql[] = 'DROP SEQUENCE ' . $sequenceName; } From 6f2c574a3ec436761328190d27195bb180df38ba Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 23:05:04 +0200 Subject: [PATCH 15/57] XII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 4563150d..3cd21329 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -993,14 +993,15 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); - $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); +// $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); // $sql[] = 'DROP SEQUENCE ' . $sequenceName; } - - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + else { + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . ' INCREMENT BY 1'; + } $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT From cb96fb6bd150e35ba27fdd50e9cfdd76e106408e Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 23:20:24 +0200 Subject: [PATCH 16/57] XIII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 3cd21329..d6c76abc 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1001,7 +1001,6 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri ' START WITH ' . $start . ' MINVALUE ' . $start . ' INCREMENT BY 1'; - } $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT @@ -1024,6 +1023,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; END;'; +} return $sql; } From c44ed74b5d49e69a9f06591b90df2d8001d92083 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 23:34:27 +0200 Subject: [PATCH 17/57] Revert "XIII" This reverts commit cb96fb6bd150e35ba27fdd50e9cfdd76e106408e. --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index d6c76abc..3cd21329 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1001,6 +1001,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri ' START WITH ' . $start . ' MINVALUE ' . $start . ' INCREMENT BY 1'; + } $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT @@ -1023,7 +1024,6 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; END;'; -} return $sql; } From 6b33e129a2adb2c17c9ed3b4533fd6b73ba8b4f0 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 23:34:50 +0200 Subject: [PATCH 18/57] Revert "XII" This reverts commit 6f2c574a3ec436761328190d27195bb180df38ba. --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 3cd21329..4563150d 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -993,15 +993,14 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); -// $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); + $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); // $sql[] = 'DROP SEQUENCE ' . $sequenceName; } - else { - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . + + $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . ' INCREMENT BY 1'; - } $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT From e4ad2adaf701150820c44f60219775d9cd9ec57c Mon Sep 17 00:00:00 2001 From: mondrake Date: Sat, 22 Apr 2023 23:36:26 +0200 Subject: [PATCH 19/57] Revert "XI" This reverts commit 404d00197d9c458996f19d1acb65be6e3a7a9dab. --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 4563150d..8ae38dae 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -993,7 +993,6 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); - $this->getDbalConnection()->executeStatement('DROP SEQUENCE ' . $sequenceName); // $sql[] = 'DROP SEQUENCE ' . $sequenceName; } From d3b6d6c91871909815653e9d9313b798a753868a Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 11:19:06 +0200 Subject: [PATCH 20/57] XIV --- README.md | 1 + tests/github/drupal_patch.sh | 3 +++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 7602db0d..7ebdd84e 100644 --- a/README.md +++ b/README.md @@ -95,3 +95,4 @@ tbd | UpdateTestBase [#2992274](https://www.drupal.org/project/drupal/issues/2992274) | Installer tests fail if contrib driver hides database credentials form fields | [#3256642](https://www.drupal.org/project/drupal/issues/3256642) | Autoload classes of database drivers modules' dependencies | [#3347497](https://www.drupal.org/project/drupal/issues/3347497) | Introduce a FetchModeTrait to allow emulating PDO fetch modes | +[#3355841](https://www.drupal.org/project/drupal/issues/3355841) | Allow DriverSpecificSchemaTestBase::testChangePrimaryKeyToSerial to execute for non-core drivers | diff --git a/tests/github/drupal_patch.sh b/tests/github/drupal_patch.sh index 7134eadb..5fc5b309 100755 --- a/tests/github/drupal_patch.sh +++ b/tests/github/drupal_patch.sh @@ -12,3 +12,6 @@ git apply -v ./drudbal_staging/tests/github/2992274-local.patch #3347497 Introduce a FetchModeTrait to allow emulating PDO fetch modes curl https://git.drupalcode.org/project/drupal/-/merge_requests/3676.diff | git apply -v + +#3355841 Allow DriverSpecificSchemaTestBase::testChangePrimaryKeyToSerial to execute for non-core drivers +curl https://www.drupal.org/files/issues/2023-04-23/3355841-2.patch | git apply -v From cdafb6f773c836fa4fbcdd4b78c34534e5013fdb Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 14:30:59 +0200 Subject: [PATCH 21/57] XVI --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 8ae38dae..e79e7496 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -988,11 +988,13 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri $unquotedSequenceName = $unquotedTableName . "_SEQ"; $sequenceName = "\"" . $unquotedSequenceName . "\""; -dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); -$xx = $this->getDbalConnection()->createSchemaManager()->introspectSchema(); +//dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); +$sm = $this->getDbalConnection()->createSchemaManager(); +$xx = $sm->introspectSchema(); dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); +dump($sm->listSequences()); // $sql[] = 'DROP SEQUENCE ' . $sequenceName; } From 355b0e05f73a6d2f11accfee36f2761dca4fb6dc Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 14:53:36 +0200 Subject: [PATCH 22/57] XVII --- .../Database/dbal/DbalExtension/Oci8Extension.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index e79e7496..5ef8977d 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -940,7 +940,8 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc } foreach ($sql as $exec) { - if ($this->getDebugging()) dump($exec); + //if ($this->getDebugging()) + dump($exec); $this->getDbalConnection()->executeStatement($exec); } @@ -982,20 +983,22 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); + $unquotedSequenceName = $unquotedTableName . "_SEQ"; + $sequenceName = "\"" . $unquotedSequenceName . "\""; $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; $sql = []; - $unquotedSequenceName = $unquotedTableName . "_SEQ"; - $sequenceName = "\"" . $unquotedSequenceName . "\""; //dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); $sm = $this->getDbalConnection()->createSchemaManager(); $xx = $sm->introspectSchema(); dump(['xx', array_keys($xx->getSequences())]); if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); -dump($sm->listSequences()); -// $sql[] = 'DROP SEQUENCE ' . $sequenceName; +//dump($sm->listSequences()); + $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; + $sql[] = 'DROP SEQUENCE ' . $sequenceName; + $sql[] = 'ALTER TABLE ' . $quotedName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; } $sql[] = 'CREATE SEQUENCE ' . $sequenceName . From 34e753552909963109d6cb48d48bd6ee1d7f80a2 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 15:06:37 +0200 Subject: [PATCH 23/57] XVIII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 5ef8977d..b3b22127 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -998,7 +998,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri //dump($sm->listSequences()); $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; $sql[] = 'DROP SEQUENCE ' . $sequenceName; - $sql[] = 'ALTER TABLE ' . $quotedName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; + $sql[] = 'ALTER TABLE ' . $quotedTableName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; } $sql[] = 'CREATE SEQUENCE ' . $sequenceName . From 4d1d152840744c4b3335f32102b9190867e19c97 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 15:18:52 +0200 Subject: [PATCH 24/57] xix --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index b3b22127..2ee78b76 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -998,7 +998,7 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri //dump($sm->listSequences()); $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; $sql[] = 'DROP SEQUENCE ' . $sequenceName; - $sql[] = 'ALTER TABLE ' . $quotedTableName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; +// $sql[] = 'ALTER TABLE ' . $quotedTableName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; } $sql[] = 'CREATE SEQUENCE ' . $sequenceName . From 529d4b4991b5a83362f7a0d1a5a0db3f40b949c2 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 18:40:55 +0200 Subject: [PATCH 25/57] XX --- .../dbal/DbalExtension/Oci8Extension.php | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 2ee78b76..1b90c923 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -821,7 +821,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem $sql[] = "ALTER TABLE $db_table ADD $db_field $column_definition"; if ($drupal_field_specs['type'] === 'serial') { - $sql = array_merge($sql, $this->getCreateOrUpdateAutoincrementSql($dbal_schema, $db_field, $db_table)); + $sql = array_merge($sql, $this->getAutoincrementSql($db_field, $db_table)); } if (!$has_primary_key && $db_primary_key_columns) { @@ -875,6 +875,8 @@ public function initAddedField(string $drupal_table_name, string $drupal_field_n * {@inheritdoc} */ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSchema $dbal_schema, $drupal_table_name, $field_name, $field_new_name, array $drupal_field_new_specs, array $keys_new_specs, array $dbal_column_options) { +$this->setDebugging(TRUE); +dump([__METHOD__, $drupal_table_name, $field_name, $field_new_name]); $primary_key_processed_by_extension = TRUE; $unquoted_db_table = $this->connection->getPrefixedTableName($drupal_table_name, FALSE); @@ -891,6 +893,31 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $dbal_primary_key = $dbal_table->getPrimaryKey(); $has_primary_key = (bool) $dbal_primary_key; + // Drop autoincrement setup elements if new field is serial. + if ($new_db_field_is_serial) { + $unquotedSequenceName = $unquoted_db_table . "_SEQ"; + $sequenceName = "\"" . $unquotedSequenceName . "\""; + $pkConstraintName = "\"" . $unquoted_db_table . "_PK\""; + $autoincrementIdentifierName = "\"" . $unquoted_db_table ."_AI_PK\""; + + $sm = $this->getDbalConnection()->createSchemaManager(); + $xx = $sm->introspectSchema(); +dump(['xx', array_keys($xx->getSequences())]); + $sql = []; + if ($xx->hasSequence($sequenceName)) { +dump('HAS SEQ'); + $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; + $sql[] = 'DROP SEQUENCE ' . $sequenceName; + if ($has_primary_key) { + $sql[] = 'ALTER TABLE ' . $db_table . ' DROP CONSTRAINT ' . $pkConstraintName; + } + foreach ($sql as $exec) { + if ($this->getDebugging()) dump($exec); + $this->getDbalConnection()->executeStatement($exec); + } + } + } + $db_primary_key_columns = $dbal_primary_key ? $dbal_primary_key->getColumns() : []; $drop_primary_key = $has_primary_key && (!empty($keys_new_specs['primary key']) || in_array($db_field, $db_primary_key_columns)); if (!empty($keys_new_specs['primary key'])) { @@ -924,8 +951,10 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc } if ($new_db_field_is_serial) { +$this->setDebugging(FALSE); +return TRUE; $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - $autoincrement_sql = $this->getCreateOrUpdateAutoincrementSql($dbal_schema, $new_db_field, $db_table, $prev_max_sequence + 1); + $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); $sql = array_merge($sql, $autoincrement_sql); } @@ -940,11 +969,11 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc } foreach ($sql as $exec) { - //if ($this->getDebugging()) - dump($exec); + if ($this->getDebugging()) dump($exec); $this->getDbalConnection()->executeStatement($exec); } +$this->setDebugging(FALSE); return TRUE; } @@ -980,7 +1009,7 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, } /** @return array */ - private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, string $quotedName, string $quotedTableName, int $start = 1): array { + private function getAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); $unquotedSequenceName = $unquotedTableName . "_SEQ"; @@ -989,18 +1018,6 @@ private function getCreateOrUpdateAutoincrementSql(DbalSchema $dbal_schema, stri $sql = []; -//dump([array_keys($dbal_schema->getSequences()),$sequenceName,$dbal_schema->hasSequence($sequenceName),$unquotedSequenceName,$dbal_schema->hasSequence($unquotedSequenceName)]); -$sm = $this->getDbalConnection()->createSchemaManager(); -$xx = $sm->introspectSchema(); -dump(['xx', array_keys($xx->getSequences())]); - if ($xx->hasSequence($sequenceName)) { -dump('HAS SEQ'); -//dump($sm->listSequences()); - $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; - $sql[] = 'DROP SEQUENCE ' . $sequenceName; -// $sql[] = 'ALTER TABLE ' . $quotedTableName . ' DROP CONSTRAINT ' . $autoincrementIdentifierName; - } - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . ' START WITH ' . $start . ' MINVALUE ' . $start . From 8015d6cf2754696bed9ed9ee486f6de2f146d0ce Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 18:57:24 +0200 Subject: [PATCH 26/57] XXI --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 1b90c923..07d61662 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -908,9 +908,9 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc dump('HAS SEQ'); $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; $sql[] = 'DROP SEQUENCE ' . $sequenceName; - if ($has_primary_key) { - $sql[] = 'ALTER TABLE ' . $db_table . ' DROP CONSTRAINT ' . $pkConstraintName; - } +// if ($has_primary_key) { +// $sql[] = 'ALTER TABLE ' . $db_table . ' DROP CONSTRAINT ' . $pkConstraintName; +// } foreach ($sql as $exec) { if ($this->getDebugging()) dump($exec); $this->getDbalConnection()->executeStatement($exec); From 600216f869b419734f5dc64144e2edb943c1d581 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 19:11:26 +0200 Subject: [PATCH 27/57] XXII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 07d61662..a519bc50 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -950,13 +950,11 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sql[] = "ALTER TABLE $db_table MODIFY $new_db_field NOT NULL"; } - if ($new_db_field_is_serial) { -$this->setDebugging(FALSE); -return TRUE; +/* if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); $sql = array_merge($sql, $autoincrement_sql); - } + }*/ if (!$has_primary_key && $db_primary_key_columns) { $db_pk_constraint = $db_pk_constraint ?? $unquoted_db_table . '_PK'; From 128a739fb3265f4d3fffe19b85ba69fe35a47632 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 21:32:43 +0200 Subject: [PATCH 28/57] XXII --- .../dbal/DbalExtension/Oci8Extension.php | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index a519bc50..dacaad22 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -893,6 +893,24 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $dbal_primary_key = $dbal_table->getPrimaryKey(); $has_primary_key = (bool) $dbal_primary_key; + $db_primary_key_columns = $dbal_primary_key ? $dbal_primary_key->getColumns() : []; + $drop_primary_key = $has_primary_key && (!empty($keys_new_specs['primary key']) || in_array($db_field, $db_primary_key_columns)); + if (!empty($keys_new_specs['primary key'])) { + $db_primary_key_columns = $this->connection->schema()->dbalGetFieldList($keys_new_specs['primary key']); + } + elseif ($db_primary_key_columns && $unquoted_new_db_field !== $unquoted_db_field) { + $key = array_search($db_field, $db_primary_key_columns); + $db_primary_key_columns[$key] = $new_db_field; + } + + // Drop primary key if needed. + if ($drop_primary_key) { + $db_pk_constraint = ''; + $this->delegateDropPrimaryKey($primary_key_processed_by_extension, $db_pk_constraint, $dbal_schema, $drupal_table_name); +dump(['$db_pk_constraint', $db_pk_constraint]); + $has_primary_key = FALSE; + } + // Drop autoincrement setup elements if new field is serial. if ($new_db_field_is_serial) { $unquotedSequenceName = $unquoted_db_table . "_SEQ"; @@ -902,15 +920,12 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sm = $this->getDbalConnection()->createSchemaManager(); $xx = $sm->introspectSchema(); -dump(['xx', array_keys($xx->getSequences())]); +dump(['sequences', array_keys($xx->getSequences())]); $sql = []; if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; $sql[] = 'DROP SEQUENCE ' . $sequenceName; -// if ($has_primary_key) { -// $sql[] = 'ALTER TABLE ' . $db_table . ' DROP CONSTRAINT ' . $pkConstraintName; -// } foreach ($sql as $exec) { if ($this->getDebugging()) dump($exec); $this->getDbalConnection()->executeStatement($exec); @@ -918,22 +933,6 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc } } - $db_primary_key_columns = $dbal_primary_key ? $dbal_primary_key->getColumns() : []; - $drop_primary_key = $has_primary_key && (!empty($keys_new_specs['primary key']) || in_array($db_field, $db_primary_key_columns)); - if (!empty($keys_new_specs['primary key'])) { - $db_primary_key_columns = $this->connection->schema()->dbalGetFieldList($keys_new_specs['primary key']); - } - elseif ($db_primary_key_columns && $unquoted_new_db_field !== $unquoted_db_field) { - $key = array_search($db_field, $db_primary_key_columns); - $db_primary_key_columns[$key] = $new_db_field; - } - - if ($drop_primary_key) { - $db_pk_constraint = ''; - $this->delegateDropPrimaryKey($primary_key_processed_by_extension, $db_pk_constraint, $dbal_schema, $drupal_table_name); - $has_primary_key = FALSE; - } - $temp_column = $this->getLimitedIdentifier(str_replace('-', '', 'tmp' . (new Uuid())->generate())); $not_null = $drupal_field_new_specs['not null'] ?? FALSE; $column_definition = str_replace($db_field, "\"$temp_column\"", $dbal_column_options['columnDefinition']); @@ -1001,6 +1000,7 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, assert(is_object($db_constraint)); $primary_key_asset_name = $db_constraint->name; $exec = "ALTER TABLE $db_table DROP CONSTRAINT \"$primary_key_asset_name\""; + if ($this->getDebugging()) dump($exec); $this->getDbalConnection()->executeStatement($exec); $primary_key_dropped_by_extension = TRUE; return TRUE; From 3369a639139ec9c8548422823f5f495eee80e0b5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 21:48:21 +0200 Subject: [PATCH 29/57] XXIII --- .../dbal/DbalExtension/Oci8Extension.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index dacaad22..be0c9b9c 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -949,17 +949,19 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sql[] = "ALTER TABLE $db_table MODIFY $new_db_field NOT NULL"; } -/* if ($new_db_field_is_serial) { - $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); - $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); - $sql = array_merge($sql, $autoincrement_sql); - }*/ - + // Add primary key if needed. if (!$has_primary_key && $db_primary_key_columns) { $db_pk_constraint = $db_pk_constraint ?? $unquoted_db_table . '_PK'; $sql[] = "ALTER TABLE $db_table ADD CONSTRAINT $db_pk_constraint PRIMARY KEY (" . implode(', ', $db_primary_key_columns) . ")"; } + // Add autoincrement if needed. + if ($new_db_field_is_serial) { + $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); + $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); + $sql = array_merge($sql, $autoincrement_sql); + } + if (isset($drupal_field_new_specs['description'])) { $column_description = $this->connection->getDbalPlatform()->quoteStringLiteral($drupal_field_new_specs['description']); $sql[] = "COMMENT ON COLUMN $db_table.$new_db_field IS " . $column_description; @@ -1029,7 +1031,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName last_Sequence NUMBER; last_InsertID NUMBER; BEGIN - IF (:NEW.' . $quotedName . ' IS NULL OR :NEW.' . $quotedName . ' = 0) THEN + IF (:NEW.' . $quotedName . ' IS NULL) THEN SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; ELSE SELECT NVL(Last_Number, 0) INTO last_Sequence From fae967c7c4f44fdeeb14169fa9cb0b480c8d6ee4 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 22:17:59 +0200 Subject: [PATCH 30/57] xxiv --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index be0c9b9c..87b34729 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' +/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1043,7 +1043,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;'; +END;';*/ return $sql; } From 37f10398cd9eefb3d85ca30d6dc2242112d986f9 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 22:37:20 +0200 Subject: [PATCH 31/57] xxv --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 87b34729..bdc30479 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; -/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + $sql[] = 'CREATE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1043,7 +1043,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;';*/ +END;'; return $sql; } From 82710bbaef41ee1b12abb67ac72a5662225297e7 Mon Sep 17 00:00:00 2001 From: mondrake Date: Sun, 23 Apr 2023 22:55:45 +0200 Subject: [PATCH 32/57] xxvi --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- src/Driver/Database/dbal/Schema.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index bdc30479..be0c9b9c 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; - $sql[] = 'CREATE TRIGGER ' . $autoincrementIdentifierName . ' + $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW diff --git a/src/Driver/Database/dbal/Schema.php b/src/Driver/Database/dbal/Schema.php index 29afa36b..2edf95f3 100644 --- a/src/Driver/Database/dbal/Schema.php +++ b/src/Driver/Database/dbal/Schema.php @@ -719,6 +719,7 @@ public function changeField($table, $field, $field_new, $spec, $keys_new = []) { if (!$this->dbalExtension->delegateChangeField($primary_key_processed_by_extension, $this->dbalSchema(), $table, $field, $field_new, $spec, $keys_new, $dbal_column_options)) { return; } +return; // We need to reload the schema at next get. $this->dbalSchemaForceReload(); // @todo can we just replace the column object in the dbal schema?? From 8a40cb2770c58dba7d8ad394b0d0cf65b4b153d5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 10:04:03 +0200 Subject: [PATCH 33/57] XXVII --- .github/workflows/pr.yml | 2 +- src/Driver/Database/dbal/Schema.php | 2 +- tests/src/Kernel/dbal/SchemaBisTest.php | 253 ++++++++++++++++++++++++ 3 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 tests/src/Kernel/dbal/SchemaBisTest.php diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 89a6cf56..49160c0a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -45,7 +45,7 @@ jobs: php-version: - "8.1" test-args: - - "-v modules/contrib/drudbal/tests/src/Kernel/dbal/SchemaTest.php" + - "-v modules/contrib/drudbal/tests/src/Kernel/dbal/SchemaBisTest.php" # - "--group Database" # - "--group Entity" # - "--group Cache,Config" diff --git a/src/Driver/Database/dbal/Schema.php b/src/Driver/Database/dbal/Schema.php index 2edf95f3..4c50581b 100644 --- a/src/Driver/Database/dbal/Schema.php +++ b/src/Driver/Database/dbal/Schema.php @@ -719,7 +719,7 @@ public function changeField($table, $field, $field_new, $spec, $keys_new = []) { if (!$this->dbalExtension->delegateChangeField($primary_key_processed_by_extension, $this->dbalSchema(), $table, $field, $field_new, $spec, $keys_new, $dbal_column_options)) { return; } -return; + // We need to reload the schema at next get. $this->dbalSchemaForceReload(); // @todo can we just replace the column object in the dbal schema?? diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php new file mode 100644 index 00000000..d246f0a3 --- /dev/null +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -0,0 +1,253 @@ +connection; + assert($connection instanceof DruDbalConnection); + return $connection; + } + + /** + * Returns the DruDbal schema. + */ + private function schema(): DruDbalSchema { + $schema = $this->schema; + assert($schema instanceof DruDbalSchema); + return $schema; + } + + /** + * {@inheritdoc} + */ + public function checkSchemaComment(string $description, string $table, string $column = NULL): void { + $comment = $this->schema()->getComment($table, $column); + // The schema comment truncation for mysql is different. + if ($this->connection()->databaseType() === 'mysql') { + $max_length = $column ? 255 : 60; + $description = Unicode::truncate($description, $max_length, TRUE, TRUE); + } + $this->assertSame($description, $comment, 'The comment matches the schema description.'); + } + + /** + * {@inheritdoc} + */ + protected function assertCollation(): void { + if ($this->connection()->databaseType() === 'mysql') { + // Make sure that varchar fields have the correct collations. + $columns = $this->connection()->query('SHOW FULL COLUMNS FROM {test_table}'); + $string_check = null; + $string_ascii_check = null; + foreach ($columns as $column) { + if ($column->Field == 'test_field_string') { + $string_check = $column->Collation; + } + if ($column->Field == 'test_field_string_ascii') { + $string_ascii_check = $column->Collation; + } + } + $this->assertMatchesRegularExpression('#^(utf8mb4_general_ci|utf8mb4_0900_ai_ci)$#', $string_check, 'test_field_string should have a utf8mb4_general_ci or a utf8mb4_0900_ai_ci collation, but it has not.'); + $this->assertSame('ascii_general_ci', $string_ascii_check, 'test_field_string_ascii should have a ascii_general_ci collation, but it has not.'); + } + } + + /** + * {@inheritdoc} + */ + protected function tryInsertExpectsIntegrityConstraintViolationException(string $tableName): void { + if ($this->connection()->databaseType() !== 'sqlite') { + parent::tryInsertExpectsIntegrityConstraintViolationException($tableName); + } + } + + /** + * Tests that indexes on string fields are limited to 191 characters on MySQL. + * + * @see \Drupal\mysql\Driver\Database\mysql\Schema::getNormalizedIndexes() + */ + public function testIndexLength(): void { + $this->markTestSkipped('test'); + } + + /** + * {@inheritdoc} + */ + public function testTableWithSpecificDataType(): void { + $this->markTestSkipped('test'); + } + + /** + * @covers \Drupal\drudbal\Driver\Database\dbal\Schema::introspectIndexSchema + * + * In this override, we need to change Oracle index names, since they cannot + * exceed the 30 chars limit in Oracle 11. + */ + public function testIntrospectIndexSchema(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests the findTables() method. + */ + public function testFindTables(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests handling of uppercase table names. + */ + public function testUpperCaseTableName(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests adding columns to an existing table with default and initial value. + * + * In this override, we need to change maximum precision in Oracle, that is + * 38, differently from other core databases. + */ + public function testSchemaAddFieldDefaultInitial(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests creating unsigned columns and data integrity thereof. + * + * In this override, we avoid testing insert on the serial column that in + * Drupal core raises an exception, but not in Oracle where a trigger forces + * the value to be next-in-sequence regardless of what is passed in. + */ + public function testUnsignedColumns(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests handling with reserved keywords for naming tables, fields and more. + */ + public function testReservedKeywordsForNaming(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests database interactions. + */ + public function testSchema(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests various schema changes' effect on the table's primary key. + * + * @param array $initial_primary_key + * The initial primary key of the test table. + * @param array $renamed_primary_key + * The primary key of the test table after renaming the test field. + * + * @dataProvider providerTestSchemaCreateTablePrimaryKey + * + * @covers ::addField + * @covers ::changeField + * @covers ::dropField + * @covers ::findPrimaryKeyColumns + */ + public function testSchemaChangePrimaryKey(array $initial_primary_key, array $renamed_primary_key): void { + $this->markTestSkipped('test'); + } + + /** + * Provides test cases for SchemaTest::testSchemaCreateTablePrimaryKey(). + * + * @return array + * An array of test cases for SchemaTest::testSchemaCreateTablePrimaryKey(). + */ + public function providerTestSchemaCreateTablePrimaryKey() { + $tests = []; + + $tests['simple_primary_key'] = [ + 'initial_primary_key' => ['test_field'], + 'renamed_primary_key' => ['test_field_renamed'], + ]; + $tests['composite_primary_key'] = [ + 'initial_primary_key' => ['test_field', 'other_test_field'], + 'renamed_primary_key' => ['test_field_renamed', 'other_test_field'], + ]; + $tests['composite_primary_key_different_order'] = [ + 'initial_primary_key' => ['other_test_field', 'test_field'], + 'renamed_primary_key' => ['other_test_field', 'test_field_renamed'], + ]; + + return $tests; + } + + /** + * Tests an invalid field specification as a primary key on table creation. + */ + public function testInvalidPrimaryKeyOnTableCreation(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests converting an int to a serial when the int column has data. + */ + public function testChangePrimaryKeyToSerial(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests adding an invalid field specification as a primary key. + */ + public function testInvalidPrimaryKeyAddition(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests changing the primary key with an invalid field specification. + */ + public function testInvalidPrimaryKeyChange(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests changing columns between types with default and initial values. + */ + public function testSchemaChangeFieldDefaultInitial(): void { + $this->markTestSkipped('test'); + } + + /** + * @covers ::findPrimaryKeyColumns + */ + public function testFindPrimaryKeyColumns(): void { + $this->markTestSkipped('test'); + } + + /** + * Tests default values after altering table. + */ + public function testDefaultAfterAlter(): void { + $this->markTestSkipped('test'); + } + +} From 2cb3977852facbd50e464d8d4748d633faff4338 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 10:09:39 +0200 Subject: [PATCH 34/57] XXX --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index be0c9b9c..87b34729 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' +/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1043,7 +1043,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;'; +END;';*/ return $sql; } From 853bbd890fce3505b51d0bd3a8110cbc2b2cf6aa Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 16:24:33 +0200 Subject: [PATCH 35/57] XXXI --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 49160c0a..38e47dc3 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,7 +28,7 @@ jobs: services: oracle: - image: gvenzl/oracle-xe:21 + image: gvenzl/oracle-xe:latest-faststart env: ORACLE_PASSWORD: oracle ports: From fca4649d1f6208573989451182ec01ea54dc9e3a Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 16:30:02 +0200 Subject: [PATCH 36/57] XXXII --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 38e47dc3..698f84cc 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,7 +28,7 @@ jobs: services: oracle: - image: gvenzl/oracle-xe:latest-faststart + image: gvenzl/oracle-xe:21.3.0-full-faststart env: ORACLE_PASSWORD: oracle ports: From 20c7cab77f8f2c8d40116b8bc556429b3ff22fe8 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 16:38:59 +0200 Subject: [PATCH 37/57] xxxiii --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 87b34729..be0c9b9c 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; -/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1043,7 +1043,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;';*/ +END;'; return $sql; } From c7a5f55df5a935eb37f545839c515c1f0c514b99 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 17:35:11 +0200 Subject: [PATCH 38/57] xxxiv --- .github/workflows/pr.yml | 2 +- .../dbal/DbalExtension/Oci8Extension.php | 4 +- tests/src/Kernel/dbal/SchemaBisTest.php | 43 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 698f84cc..38e47dc3 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,7 +28,7 @@ jobs: services: oracle: - image: gvenzl/oracle-xe:21.3.0-full-faststart + image: gvenzl/oracle-xe:latest-faststart env: ORACLE_PASSWORD: oracle ports: diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index be0c9b9c..49a9c02b 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' +/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1046,6 +1046,6 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END;'; return $sql; - } + }*/ } diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index d246f0a3..f016f7ab 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -250,4 +250,47 @@ public function testDefaultAfterAlter(): void { $this->markTestSkipped('test'); } + /** + * Tests changing a field length. + */ + public function testChangeSerialFieldLength(): void { + $specification = [ + 'fields' => [ + 'id' => [ + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique ID.', + ], + 'text' => [ + 'type' => 'text', + 'description' => 'A text field', + ], + ], + 'primary key' => ['id'], + ]; + $this->schema->createTable('change_serial_to_big', $specification); + + // Increase the size of the field. + $new_specification = [ + 'size' => 'big', + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique ID.', + ]; + $this->schema->changeField('change_serial_to_big', 'id', 'id', $new_specification); +$this->markTestIncomplete('incomplete'); + $this->assertTrue($this->schema->fieldExists('change_serial_to_big', 'id')); + + // Test if we can actually add a big int. + $id = $this->connection->insert('change_serial_to_big')->fields([ + 'id' => 21474836470, + ])->execute(); + + $id_two = $this->connection->insert('change_serial_to_big')->fields([ + 'text' => 'Testing for ID generation', + ])->execute(); + + $this->assertEquals($id + 1, $id_two); + } + } From f3efe5525620dc895f97d87152896a8ef24b868e Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 17:39:17 +0200 Subject: [PATCH 39/57] xxxv --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 49a9c02b..87b34729 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1043,9 +1043,9 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;'; +END;';*/ return $sql; - }*/ + } } From 7963b7846535800a2dec24117077d782b6749fae Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 17:44:29 +0200 Subject: [PATCH 40/57] xxxv --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 87b34729..be0c9b9c 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1023,7 +1023,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ' MINVALUE ' . $start . ' INCREMENT BY 1'; -/* $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' FOR EACH ROW @@ -1043,7 +1043,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; -END;';*/ +END;'; return $sql; } From b233a6fe1e297f832d146ab0553f03af946ce1f0 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 17:55:28 +0200 Subject: [PATCH 41/57] xxxvii --- .github/workflows/pr.yml | 2 +- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 +++- tests/src/Kernel/dbal/SchemaBisTest.php | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 38e47dc3..c9203cd3 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,7 +28,7 @@ jobs: services: oracle: - image: gvenzl/oracle-xe:latest-faststart + image: gvenzl/oracle-xe:slim-faststart env: ORACLE_PASSWORD: oracle ports: diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index be0c9b9c..821137ca 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -920,7 +920,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sm = $this->getDbalConnection()->createSchemaManager(); $xx = $sm->introspectSchema(); -dump(['sequences', array_keys($xx->getSequences())]); +dump(['sequences_1', array_keys($xx->getSequences())]); $sql = []; if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); @@ -972,6 +972,8 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $this->getDbalConnection()->executeStatement($exec); } +$xx = $sm->introspectSchema(); +dump(['sequences_b', array_keys($xx->getSequences())]); $this->setDebugging(FALSE); return TRUE; } diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index f016f7ab..4b66460e 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -278,8 +278,8 @@ public function testChangeSerialFieldLength(): void { 'description' => 'Primary Key: Unique ID.', ]; $this->schema->changeField('change_serial_to_big', 'id', 'id', $new_specification); -$this->markTestIncomplete('incomplete'); $this->assertTrue($this->schema->fieldExists('change_serial_to_big', 'id')); +$this->markTestIncomplete('incomplete'); // Test if we can actually add a big int. $id = $this->connection->insert('change_serial_to_big')->fields([ From 28b6338a4037cc4ecdda25979a26847ef4d72b85 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 18:16:52 +0200 Subject: [PATCH 42/57] xxxviii --- .github/workflows/oracle.yml | 2 +- .github/workflows/pr.yml | 26 ++++++++++++------------- src/Driver/Database/dbal/Insert.php | 6 +++--- tests/src/Kernel/dbal/SchemaBisTest.php | 4 +++- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml index fa0cfa55..38d61f0b 100644 --- a/.github/workflows/oracle.yml +++ b/.github/workflows/oracle.yml @@ -30,7 +30,7 @@ jobs: services: oracle: - image: gvenzl/oracle-xe:21 + image: gvenzl/oracle-xe:slim-faststart env: ORACLE_PASSWORD: oracle ports: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c9203cd3..8c5d8cd9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -93,19 +93,19 @@ jobs: cp modules/contrib/drudbal/tests/github/install_* . php install_oracle.php - - name: Install Drupal - run: | - vendor/bin/drush site-install standard --db-url=$SIMPLETEST_DB -y - vendor/bin/drush runserver localhost:8080 --default-server=localhost:8080 & - sleep 5s - - - name: Report installation - continue-on-error: true - run: | - php install_report.php - vendor/bin/drush core:status - vendor/bin/drush core:requirements - vendor/bin/drush pml --type=module --no-core +# - name: Install Drupal +# run: | +# vendor/bin/drush site-install standard --db-url=$SIMPLETEST_DB -y +# vendor/bin/drush runserver localhost:8080 --default-server=localhost:8080 & +# sleep 5s + +# - name: Report installation +# continue-on-error: true +# run: | +# php install_report.php +# vendor/bin/drush core:status +# vendor/bin/drush core:requirements +# vendor/bin/drush pml --type=module --no-core - name: Run test ${{ matrix.test-args }} run: vendor/bin/phpunit -c core --color=always ${{ matrix.test-args }} diff --git a/src/Driver/Database/dbal/Insert.php b/src/Driver/Database/dbal/Insert.php index bc295d78..6b19f92f 100644 --- a/src/Driver/Database/dbal/Insert.php +++ b/src/Driver/Database/dbal/Insert.php @@ -101,12 +101,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute([], $this->queryOptions); - try { +/* try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) { + catch (DatabaseObjectNotFoundException $e) {*/ $last_insert_id = 0; - } +// } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, [], $this->queryOptions); diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index 4b66460e..d0233bcc 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -279,12 +279,14 @@ public function testChangeSerialFieldLength(): void { ]; $this->schema->changeField('change_serial_to_big', 'id', 'id', $new_specification); $this->assertTrue($this->schema->fieldExists('change_serial_to_big', 'id')); -$this->markTestIncomplete('incomplete'); // Test if we can actually add a big int. $id = $this->connection->insert('change_serial_to_big')->fields([ 'id' => 21474836470, ])->execute(); +$xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); +dump($xx->fetchAll()); +$this->markTestIncomplete('incomplete'); $id_two = $this->connection->insert('change_serial_to_big')->fields([ 'text' => 'Testing for ID generation', From 50e0c9e572321c68133be8f1e49bfbcaab226218 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 18:23:41 +0200 Subject: [PATCH 43/57] xxxix --- src/Driver/Database/dbal/Insert.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Driver/Database/dbal/Insert.php b/src/Driver/Database/dbal/Insert.php index 6b19f92f..d5c1ab63 100644 --- a/src/Driver/Database/dbal/Insert.php +++ b/src/Driver/Database/dbal/Insert.php @@ -74,12 +74,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute($values, $this->queryOptions); - try { +/* try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) { + catch (DatabaseObjectNotFoundException $e) {*/ $last_insert_id = 0; - } +// } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, $values, $this->queryOptions); @@ -128,12 +128,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute($values, $this->queryOptions); - try { +/* try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) { + catch (DatabaseObjectNotFoundException $e) {*/ $last_insert_id = 0; - } +// } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, $values, $this->queryOptions); From caec6a44ebacd6d199aabf8fd8aeed0c5b34d8e6 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 18:29:00 +0200 Subject: [PATCH 44/57] xl --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 2 +- tests/src/Kernel/dbal/SchemaBisTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 821137ca..15f8d40b 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -920,7 +920,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sm = $this->getDbalConnection()->createSchemaManager(); $xx = $sm->introspectSchema(); -dump(['sequences_1', array_keys($xx->getSequences())]); +dump(['sequences_a', array_keys($xx->getSequences()), array_keys($dbal_schema->getSequences())]); $sql = []; if ($xx->hasSequence($sequenceName)) { dump('HAS SEQ'); diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index d0233bcc..27875c9f 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -279,6 +279,7 @@ public function testChangeSerialFieldLength(): void { ]; $this->schema->changeField('change_serial_to_big', 'id', 'id', $new_specification); $this->assertTrue($this->schema->fieldExists('change_serial_to_big', 'id')); +$this->markTestIncomplete('incomplete'); // Test if we can actually add a big int. $id = $this->connection->insert('change_serial_to_big')->fields([ @@ -286,7 +287,6 @@ public function testChangeSerialFieldLength(): void { ])->execute(); $xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); dump($xx->fetchAll()); -$this->markTestIncomplete('incomplete'); $id_two = $this->connection->insert('change_serial_to_big')->fields([ 'text' => 'Testing for ID generation', From 038c95425baef9ae33d315b697ae7263f9804bb5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 18:43:56 +0200 Subject: [PATCH 45/57] XLI --- .../dbal/DbalExtension/Oci8Extension.php | 20 ++++--------------- src/Driver/Database/dbal/Schema.php | 1 - 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 15f8d40b..0d97a257 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -876,7 +876,6 @@ public function initAddedField(string $drupal_table_name, string $drupal_field_n */ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSchema $dbal_schema, $drupal_table_name, $field_name, $field_new_name, array $drupal_field_new_specs, array $keys_new_specs, array $dbal_column_options) { $this->setDebugging(TRUE); -dump([__METHOD__, $drupal_table_name, $field_name, $field_new_name]); $primary_key_processed_by_extension = TRUE; $unquoted_db_table = $this->connection->getPrefixedTableName($drupal_table_name, FALSE); @@ -907,10 +906,11 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($drop_primary_key) { $db_pk_constraint = ''; $this->delegateDropPrimaryKey($primary_key_processed_by_extension, $db_pk_constraint, $dbal_schema, $drupal_table_name); -dump(['$db_pk_constraint', $db_pk_constraint]); $has_primary_key = FALSE; } + $sql = []; + // Drop autoincrement setup elements if new field is serial. if ($new_db_field_is_serial) { $unquotedSequenceName = $unquoted_db_table . "_SEQ"; @@ -918,18 +918,10 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $pkConstraintName = "\"" . $unquoted_db_table . "_PK\""; $autoincrementIdentifierName = "\"" . $unquoted_db_table ."_AI_PK\""; - $sm = $this->getDbalConnection()->createSchemaManager(); - $xx = $sm->introspectSchema(); -dump(['sequences_a', array_keys($xx->getSequences()), array_keys($dbal_schema->getSequences())]); - $sql = []; - if ($xx->hasSequence($sequenceName)) { -dump('HAS SEQ'); + $currentSchema = $this->getDbalConnection()->createSchemaManager()->introspectSchema(); + if ($currentSchema->hasSequence($sequenceName)) { $sql[] = 'DROP TRIGGER ' . $autoincrementIdentifierName; $sql[] = 'DROP SEQUENCE ' . $sequenceName; - foreach ($sql as $exec) { - if ($this->getDebugging()) dump($exec); - $this->getDbalConnection()->executeStatement($exec); - } } } @@ -940,7 +932,6 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $column_definition = str_replace("NOT NULL", "NULL", $column_definition); } - $sql = []; $sql[] = "ALTER TABLE $db_table ADD \"$temp_column\" $column_definition"; $sql[] = "UPDATE $db_table SET \"$temp_column\" = $db_field"; $sql[] = "ALTER TABLE $db_table DROP COLUMN $db_field"; @@ -972,9 +963,6 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $this->getDbalConnection()->executeStatement($exec); } -$xx = $sm->introspectSchema(); -dump(['sequences_b', array_keys($xx->getSequences())]); -$this->setDebugging(FALSE); return TRUE; } diff --git a/src/Driver/Database/dbal/Schema.php b/src/Driver/Database/dbal/Schema.php index 4c50581b..29afa36b 100644 --- a/src/Driver/Database/dbal/Schema.php +++ b/src/Driver/Database/dbal/Schema.php @@ -719,7 +719,6 @@ public function changeField($table, $field, $field_new, $spec, $keys_new = []) { if (!$this->dbalExtension->delegateChangeField($primary_key_processed_by_extension, $this->dbalSchema(), $table, $field, $field_new, $spec, $keys_new, $dbal_column_options)) { return; } - // We need to reload the schema at next get. $this->dbalSchemaForceReload(); // @todo can we just replace the column object in the dbal schema?? From a9cfe6c0d86a7d5d7be3ed9f61f3c5c1e157ee58 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 18:50:58 +0200 Subject: [PATCH 46/57] XLII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 6 +++--- tests/src/Kernel/dbal/SchemaBisTest.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 0d97a257..7c2b2f85 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1028,9 +1028,9 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName FROM User_Sequences WHERE Sequence_Name = \'' . $unquotedSequenceName . '\'; SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; - WHILE (last_InsertID > last_Sequence) LOOP - SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; - END LOOP; +REM WHILE (last_InsertID > last_Sequence) LOOP +REM SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; +REM END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; END;'; diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index 27875c9f..d0233bcc 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -279,7 +279,6 @@ public function testChangeSerialFieldLength(): void { ]; $this->schema->changeField('change_serial_to_big', 'id', 'id', $new_specification); $this->assertTrue($this->schema->fieldExists('change_serial_to_big', 'id')); -$this->markTestIncomplete('incomplete'); // Test if we can actually add a big int. $id = $this->connection->insert('change_serial_to_big')->fields([ @@ -287,6 +286,7 @@ public function testChangeSerialFieldLength(): void { ])->execute(); $xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); dump($xx->fetchAll()); +$this->markTestIncomplete('incomplete'); $id_two = $this->connection->insert('change_serial_to_big')->fields([ 'text' => 'Testing for ID generation', From 07246e050dd857559edcf1dac1e130d5e694e6c5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 19:04:22 +0200 Subject: [PATCH 47/57] XLIII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 7c2b2f85..aa84c424 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1028,9 +1028,6 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName FROM User_Sequences WHERE Sequence_Name = \'' . $unquotedSequenceName . '\'; SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; -REM WHILE (last_InsertID > last_Sequence) LOOP -REM SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; -REM END LOOP; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; END IF; END;'; From 4b65627c0a054e21f05b60b29cd857f4426cecff Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 20:49:46 +0200 Subject: [PATCH 48/57] XLV --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 9 +++++---- tests/src/Kernel/dbal/SchemaBisTest.php | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index aa84c424..26c93247 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1018,17 +1018,18 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName ON ' . $quotedTableName . ' FOR EACH ROW DECLARE + pragma autonomous_transaction; last_Sequence NUMBER; last_InsertID NUMBER; BEGIN IF (:NEW.' . $quotedName . ' IS NULL) THEN SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; ELSE - SELECT NVL(Last_Number, 0) INTO last_Sequence - FROM User_Sequences - WHERE Sequence_Name = \'' . $unquotedSequenceName . '\'; SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; - SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; + SELECT ' . $sequenceName . '.CURRVAL INTO last_Sequence FROM DUAL; + IF (last_InsertID > last_Sequence) THEN + EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; + END IF; END IF; END;'; diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index d0233bcc..cd404aba 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -286,11 +286,13 @@ public function testChangeSerialFieldLength(): void { ])->execute(); $xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); dump($xx->fetchAll()); -$this->markTestIncomplete('incomplete'); $id_two = $this->connection->insert('change_serial_to_big')->fields([ 'text' => 'Testing for ID generation', ])->execute(); +$xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); +dump($xx->fetchAll()); +$this->markTestIncomplete('incomplete'); $this->assertEquals($id + 1, $id_two); } From dc1b96dd023ebd45a1aaa6b314f3671b8a58159d Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 20:56:32 +0200 Subject: [PATCH 49/57] XLVII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 26c93247..d1f04c33 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1026,8 +1026,8 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; ELSE SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; - SELECT ' . $sequenceName . '.CURRVAL INTO last_Sequence FROM DUAL; - IF (last_InsertID > last_Sequence) THEN + SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; + IF (last_InsertID > (last_Sequence - 1)) THEN EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; END IF; END IF; From 0e07327a9baab1918c64eb2ec88b5995d3dddba0 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 21:07:47 +0200 Subject: [PATCH 50/57] XLVII --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index d1f04c33..649a781f 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1029,6 +1029,7 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; IF (last_InsertID > (last_Sequence - 1)) THEN EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; + EXECUTE IMMEDIATE \'create sequence ' . $sequenceName . ' START WITH \' || last_InsertID || \' MINVALUE \' || last_InsertID || \' INCREMENT BY 1\'; END IF; END IF; END;'; From 5dc840ff993f418055c93b31344b9da76eedb5c1 Mon Sep 17 00:00:00 2001 From: mondrake Date: Mon, 24 Apr 2023 21:15:25 +0200 Subject: [PATCH 51/57] XLIX --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 649a781f..2ccc5cbc 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1028,8 +1028,9 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; IF (last_InsertID > (last_Sequence - 1)) THEN - EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; - EXECUTE IMMEDIATE \'create sequence ' . $sequenceName . ' START WITH \' || last_InsertID || \' MINVALUE \' || last_InsertID || \' INCREMENT BY 1\'; + EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY 100000\'; + SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; + EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY 1\'; END IF; END IF; END;'; @@ -1038,3 +1039,5 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName } } +//EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; +//EXECUTE IMMEDIATE \'create sequence ' . $sequenceName . ' START WITH \' || last_InsertID || \' MINVALUE \' || last_InsertID || \' INCREMENT BY 1\'; From af8af9450a68c15b069e1d2ab6a9c51c2b4caaff Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 10:49:54 +0200 Subject: [PATCH 52/57] L --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 2ccc5cbc..11502918 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1026,9 +1026,9 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; ELSE SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; - SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; - IF (last_InsertID > (last_Sequence - 1)) THEN - EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY 100000\'; + SELECT (' . $sequenceName . '.NEXTVAL - 1) INTO last_Sequence FROM DUAL; + IF (last_InsertID > last_Sequence) THEN + EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY \' || TO_CHAR(last_InsertID - last_Sequence -1); SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY 1\'; END IF; @@ -1039,5 +1039,3 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName } } -//EXECUTE IMMEDIATE \'drop sequence ' . $sequenceName . '\'; -//EXECUTE IMMEDIATE \'create sequence ' . $sequenceName . ' START WITH \' || last_InsertID || \' MINVALUE \' || last_InsertID || \' INCREMENT BY 1\'; From 297a82b2488b53489a3dd33e5a8a2c7ee6319cf7 Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 10:56:33 +0200 Subject: [PATCH 53/57] LI --- .github/workflows/pr.yml | 27 ++++++++++--------- .../dbal/DbalExtension/Oci8Extension.php | 1 - tests/src/Kernel/dbal/SchemaBisTest.php | 1 - 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8c5d8cd9..a72faeda 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -46,6 +46,7 @@ jobs: - "8.1" test-args: - "-v modules/contrib/drudbal/tests/src/Kernel/dbal/SchemaBisTest.php" + - "-v modules/contrib/drudbal/tests/src/Kernel/dbal/SchemaTest.php" # - "--group Database" # - "--group Entity" # - "--group Cache,Config" @@ -93,19 +94,19 @@ jobs: cp modules/contrib/drudbal/tests/github/install_* . php install_oracle.php -# - name: Install Drupal -# run: | -# vendor/bin/drush site-install standard --db-url=$SIMPLETEST_DB -y -# vendor/bin/drush runserver localhost:8080 --default-server=localhost:8080 & -# sleep 5s - -# - name: Report installation -# continue-on-error: true -# run: | -# php install_report.php -# vendor/bin/drush core:status -# vendor/bin/drush core:requirements -# vendor/bin/drush pml --type=module --no-core + - name: Install Drupal + run: | + vendor/bin/drush site-install standard --db-url=$SIMPLETEST_DB -y + vendor/bin/drush runserver localhost:8080 --default-server=localhost:8080 & + sleep 5s + + - name: Report installation + continue-on-error: true + run: | + php install_report.php + vendor/bin/drush core:status + vendor/bin/drush core:requirements + vendor/bin/drush pml --type=module --no-core - name: Run test ${{ matrix.test-args }} run: vendor/bin/phpunit -c core --color=always ${{ matrix.test-args }} diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 11502918..7052e7aa 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -875,7 +875,6 @@ public function initAddedField(string $drupal_table_name, string $drupal_field_n * {@inheritdoc} */ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSchema $dbal_schema, $drupal_table_name, $field_name, $field_new_name, array $drupal_field_new_specs, array $keys_new_specs, array $dbal_column_options) { -$this->setDebugging(TRUE); $primary_key_processed_by_extension = TRUE; $unquoted_db_table = $this->connection->getPrefixedTableName($drupal_table_name, FALSE); diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index cd404aba..f509931c 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -292,7 +292,6 @@ public function testChangeSerialFieldLength(): void { ])->execute(); $xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); dump($xx->fetchAll()); -$this->markTestIncomplete('incomplete'); $this->assertEquals($id + 1, $id_two); } From 1e8ecad3bf25d4e45e424429ae8249e7b1cd64e5 Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 11:02:51 +0200 Subject: [PATCH 54/57] LII --- src/Driver/Database/dbal/Insert.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Driver/Database/dbal/Insert.php b/src/Driver/Database/dbal/Insert.php index d5c1ab63..bc295d78 100644 --- a/src/Driver/Database/dbal/Insert.php +++ b/src/Driver/Database/dbal/Insert.php @@ -74,12 +74,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute($values, $this->queryOptions); -/* try { + try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) {*/ + catch (DatabaseObjectNotFoundException $e) { $last_insert_id = 0; -// } + } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, $values, $this->queryOptions); @@ -101,12 +101,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute([], $this->queryOptions); -/* try { + try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) {*/ + catch (DatabaseObjectNotFoundException $e) { $last_insert_id = 0; -// } + } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, [], $this->queryOptions); @@ -128,12 +128,12 @@ public function execute() { $stmt = $this->connection()->prepareStatement($sql, $this->queryOptions); try { $stmt->execute($values, $this->queryOptions); -/* try { + try { $last_insert_id = $this->connection()->lastInsertId($sequence_name); } - catch (DatabaseObjectNotFoundException $e) {*/ + catch (DatabaseObjectNotFoundException $e) { $last_insert_id = 0; -// } + } } catch (\Exception $e) { $this->connection()->exceptionHandler()->handleExecutionException($e, $stmt, $values, $this->queryOptions); From 2cde7be6587ff6cb01f0f565eb3364a233c97a82 Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 11:26:42 +0200 Subject: [PATCH 55/57] LIII --- .../dbal/DbalExtension/Oci8Extension.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 7052e7aa..5ceb59e8 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -821,6 +821,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem $sql[] = "ALTER TABLE $db_table ADD $db_field $column_definition"; if ($drupal_field_specs['type'] === 'serial') { + $sql[] = $this->getAutoincrementSequenceSql($unquoted_db_table); $sql = array_merge($sql, $this->getAutoincrementSql($db_field, $db_table)); } @@ -910,11 +911,10 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc $sql = []; - // Drop autoincrement setup elements if new field is serial. + // Drop autoincrement setup if new field is serial and setup exists + // already. if ($new_db_field_is_serial) { - $unquotedSequenceName = $unquoted_db_table . "_SEQ"; - $sequenceName = "\"" . $unquotedSequenceName . "\""; - $pkConstraintName = "\"" . $unquoted_db_table . "_PK\""; + $sequenceName = "\"" . $unquoted_db_table . "_SEQ\""; $autoincrementIdentifierName = "\"" . $unquoted_db_table ."_AI_PK\""; $currentSchema = $this->getDbalConnection()->createSchemaManager()->introspectSchema(); @@ -948,6 +948,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc // Add autoincrement if needed. if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); + $sql[] = $this->getAutoincrementSequenceSql($unquoted_db_table, $prev_max_sequence + 1); $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); $sql = array_merge($sql, $autoincrement_sql); } @@ -997,7 +998,11 @@ public function delegateDropPrimaryKey(bool &$primary_key_dropped_by_extension, return TRUE; } - /** @return array */ + private function getAutoincrementSequenceSql(string $unquotedTableName, int $start = 1): string { + return "CREATE SEQUENCE \"{$unquotedTableName}_SEQ\" START WITH {$start} MINVALUE {$start} INCREMENT BY 1"; + } + + /** @return array */ private function getAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); @@ -1007,11 +1012,6 @@ private function getAutoincrementSql(string $quotedName, string $quotedTableName $sql = []; - $sql[] = 'CREATE SEQUENCE ' . $sequenceName . - ' START WITH ' . $start . - ' MINVALUE ' . $start . - ' INCREMENT BY 1'; - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' BEFORE INSERT ON ' . $quotedTableName . ' From 1616d1abd227d565b698a09823f53075246da8bf Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 14:53:30 +0200 Subject: [PATCH 56/57] LIII --- .../dbal/DbalExtension/Oci8Extension.php | 40 +++++++------------ tests/src/Kernel/dbal/SchemaBisTest.php | 4 -- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index 5ceb59e8..bdce3986 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -822,7 +822,7 @@ public function delegateAddField(&$primary_key_processed_by_extension, DbalSchem if ($drupal_field_specs['type'] === 'serial') { $sql[] = $this->getAutoincrementSequenceSql($unquoted_db_table); - $sql = array_merge($sql, $this->getAutoincrementSql($db_field, $db_table)); + $sql[] = $this->getAutoincrementTriggerSql($unquoted_db_table, $unquoted_db_field); } if (!$has_primary_key && $db_primary_key_columns) { @@ -949,8 +949,7 @@ public function delegateChangeField(&$primary_key_processed_by_extension, DbalSc if ($new_db_field_is_serial) { $prev_max_sequence = (int) $this->connection->query("SELECT MAX({$db_field}) FROM {$db_table}")->fetchField(); $sql[] = $this->getAutoincrementSequenceSql($unquoted_db_table, $prev_max_sequence + 1); - $autoincrement_sql = $this->getAutoincrementSql($new_db_field, $db_table, $prev_max_sequence + 1); - $sql = array_merge($sql, $autoincrement_sql); + $sql[] = $this->getAutoincrementTriggerSql($unquoted_db_table, $unquoted_new_db_field); } if (isset($drupal_field_new_specs['description'])) { @@ -1002,39 +1001,30 @@ private function getAutoincrementSequenceSql(string $unquotedTableName, int $sta return "CREATE SEQUENCE \"{$unquotedTableName}_SEQ\" START WITH {$start} MINVALUE {$start} INCREMENT BY 1"; } - /** @return array */ - private function getAutoincrementSql(string $quotedName, string $quotedTableName, int $start = 1): array { - $unquotedTableName = substr($quotedTableName, 1, strlen($quotedTableName) - 2); - $unquotedName = substr($quotedName, 1, strlen($quotedName) - 2); - $unquotedSequenceName = $unquotedTableName . "_SEQ"; - $sequenceName = "\"" . $unquotedSequenceName . "\""; - $autoincrementIdentifierName = "\"" . $unquotedTableName ."_AI_PK\""; - - $sql = []; - - $sql[] = 'CREATE OR REPLACE TRIGGER ' . $autoincrementIdentifierName . ' + private function getAutoincrementTriggerSql(string $unquotedTableName, string $unquotedColumnName): string { + $unquotedSequenceName = $unquotedTableName . '_SEQ'; + return " +CREATE OR REPLACE TRIGGER \"{$unquotedTableName}_AI_PK\" BEFORE INSERT - ON ' . $quotedTableName . ' + ON \"{$unquotedTableName}\" FOR EACH ROW DECLARE pragma autonomous_transaction; last_Sequence NUMBER; last_InsertID NUMBER; BEGIN - IF (:NEW.' . $quotedName . ' IS NULL) THEN - SELECT ' . $sequenceName . '.NEXTVAL INTO :NEW.' . $quotedName . ' FROM DUAL; + IF (:NEW.\"{$unquotedColumnName}\" IS NULL) THEN + SELECT \"{$unquotedSequenceName}\".NEXTVAL INTO :NEW.\"{$unquotedColumnName}\" FROM DUAL; ELSE - SELECT :NEW.' . $quotedName . ' INTO last_InsertID FROM DUAL; - SELECT (' . $sequenceName . '.NEXTVAL - 1) INTO last_Sequence FROM DUAL; + SELECT :NEW.\"{$unquotedColumnName}\" INTO last_InsertID FROM DUAL; + SELECT (\"{$unquotedSequenceName}\".NEXTVAL - 1) INTO last_Sequence FROM DUAL; IF (last_InsertID > last_Sequence) THEN - EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY \' || TO_CHAR(last_InsertID - last_Sequence -1); - SELECT ' . $sequenceName . '.NEXTVAL INTO last_Sequence FROM DUAL; - EXECUTE IMMEDIATE \'alter sequence ' . $sequenceName . ' INCREMENT BY 1\'; + EXECUTE IMMEDIATE \'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY \' || TO_CHAR(last_InsertID - last_Sequence -1); + SELECT \"{$unquotedSequenceName}\".NEXTVAL INTO last_Sequence FROM DUAL; + EXECUTE IMMEDIATE \'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY 1\'; END IF; END IF; -END;'; - - return $sql; +END;"; } } diff --git a/tests/src/Kernel/dbal/SchemaBisTest.php b/tests/src/Kernel/dbal/SchemaBisTest.php index f509931c..edb3eb02 100644 --- a/tests/src/Kernel/dbal/SchemaBisTest.php +++ b/tests/src/Kernel/dbal/SchemaBisTest.php @@ -284,14 +284,10 @@ public function testChangeSerialFieldLength(): void { $id = $this->connection->insert('change_serial_to_big')->fields([ 'id' => 21474836470, ])->execute(); -$xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); -dump($xx->fetchAll()); $id_two = $this->connection->insert('change_serial_to_big')->fields([ 'text' => 'Testing for ID generation', ])->execute(); -$xx = $this->connection->query('SELECT * FROM {change_serial_to_big}'); -dump($xx->fetchAll()); $this->assertEquals($id + 1, $id_two); } From e3539e6372c025d0d095eb9af7f5bdd7d987cc36 Mon Sep 17 00:00:00 2001 From: mondrake Date: Tue, 25 Apr 2023 15:01:11 +0200 Subject: [PATCH 57/57] lv --- src/Driver/Database/dbal/DbalExtension/Oci8Extension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php index bdce3986..86111483 100644 --- a/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php +++ b/src/Driver/Database/dbal/DbalExtension/Oci8Extension.php @@ -1019,9 +1019,9 @@ private function getAutoincrementTriggerSql(string $unquotedTableName, string $u SELECT :NEW.\"{$unquotedColumnName}\" INTO last_InsertID FROM DUAL; SELECT (\"{$unquotedSequenceName}\".NEXTVAL - 1) INTO last_Sequence FROM DUAL; IF (last_InsertID > last_Sequence) THEN - EXECUTE IMMEDIATE \'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY \' || TO_CHAR(last_InsertID - last_Sequence -1); + EXECUTE IMMEDIATE 'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY ' || TO_CHAR(last_InsertID - last_Sequence -1); SELECT \"{$unquotedSequenceName}\".NEXTVAL INTO last_Sequence FROM DUAL; - EXECUTE IMMEDIATE \'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY 1\'; + EXECUTE IMMEDIATE 'alter sequence \"{$unquotedSequenceName}\" INCREMENT BY 1'; END IF; END IF; END;";